1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#include "monit.h"
#include "config.h"
#include "job_ctx.h"
#include <cjson/cJSON.h>
#include <pthread.h>
static struct monit * monit = NULL;
static void monit_dump();
static void * monit_loop(void * args);
void monit_init(unsigned int thread_num)
{
monit = calloc(1, sizeof(struct monit) + thread_num * sizeof(struct record_saving_stat));
DP_TRACE_VERIFY(monit != NULL, "calloc failed.");
monit->nr_stat = thread_num;
pthread_t tid;
int ret = pthread_create(&tid, NULL, monit_loop, NULL);
DP_TRACE_VERIFY(ret == 0, "failed to create thread for monit_loop.return value:%d", ret);
}
struct record_saving_stat * record_saving_stat_point_get(unsigned int thread_id)
{
assert(thread_id < monit->nr_stat);
return &monit->savint_stats[thread_id];
}
static cJSON * monit_current_job_running()
{
struct cJSON * j_job_running_info = cJSON_CreateObject();
char job_runnig_str[512];
int len = snprintf(job_runnig_str, sizeof(job_runnig_str), "%s", "[");
for (int i = 0; i < DP_TRACE_JOB_NUM_MAX; i++)
{
job_bitmap_t job_id = index_to_job_id(i);
int uesd = is_job_id_used(job_id);
char * normal_format = "%d,";
char * last_format = "%d";
char * fromat = normal_format;
if (i == DP_TRACE_JOB_NUM_MAX - 1)
{
fromat = last_format;
}
len += snprintf(job_runnig_str + len, sizeof(job_runnig_str) - len, fromat, uesd);
}
len += snprintf(job_runnig_str + len, sizeof(job_runnig_str) - len, "%s", "]");
cJSON_AddStringToObject(j_job_running_info, "current_job_index", job_runnig_str);
return j_job_running_info;
}
static void monit_dump()
{
const struct config * conf = global_config_get();
struct record_saving_stat total_stat = {};
for (unsigned int i = 0; i < monit->nr_stat; i++)
{
total_stat.recv_success += monit->savint_stats[i].recv_success;
total_stat.init_old_packet_drop += monit->savint_stats[i].init_old_packet_drop;
total_stat.ctrlbuf_drop += monit->savint_stats[i].ctrlbuf_drop;
total_stat.save_failed_at_job_deleted += monit->savint_stats[i].save_failed_at_job_deleted;
total_stat.save_failed_at_mutex_lock += monit->savint_stats[i].save_failed_at_mutex_lock;
total_stat.save_to_kafka_failed_at_decode_messagepack +=
monit->savint_stats[i].save_to_kafka_failed_at_decode_messagepack;
total_stat.save_to_kafka_failed_at_send += monit->savint_stats[i].save_to_kafka_failed_at_send;
total_stat.save_to_kafka_success += monit->savint_stats[i].save_to_kafka_success;
total_stat.save_to_file_failed_at_decode_to_str += monit->savint_stats[i].save_to_file_failed_at_decode_to_str;
total_stat.save_to_file_failed_at_pcapng_open += monit->savint_stats[i].save_to_file_failed_at_pcapng_open;
total_stat.save_to_file_failed_at_pcapng_format += monit->savint_stats[i].save_to_file_failed_at_pcapng_format;
total_stat.save_to_file_failed_at_write_to_disk += monit->savint_stats[i].save_to_file_failed_at_write_to_disk;
total_stat.save_to_file_success += monit->savint_stats[i].save_to_file_success;
}
struct cJSON * json_root = cJSON_CreateObject();
cJSON_AddNumberToObject(json_root, "recv_success", total_stat.recv_success);
cJSON_AddNumberToObject(json_root, "init_old_packet_drop", total_stat.init_old_packet_drop);
cJSON_AddNumberToObject(json_root, "ctrlbuf_drop", total_stat.ctrlbuf_drop);
cJSON_AddNumberToObject(json_root, "save_failed_at_job_deleted", total_stat.save_failed_at_job_deleted);
cJSON_AddNumberToObject(json_root, "save_failed_at_mutex_lock", total_stat.save_failed_at_mutex_lock);
cJSON_AddNumberToObject(json_root, "save_to_kafka_failed_at_decode_messagepack",
total_stat.save_to_kafka_failed_at_decode_messagepack);
cJSON_AddNumberToObject(json_root, "save_to_kafka_failed_at_send", total_stat.save_to_kafka_failed_at_send);
cJSON_AddNumberToObject(json_root, "save_to_kafka_success", total_stat.save_to_kafka_success);
cJSON_AddNumberToObject(json_root, "save_to_file_failed_at_decode_to_str",
total_stat.save_to_file_failed_at_decode_to_str);
cJSON_AddNumberToObject(json_root, "save_to_file_failed_at_pcapng_open",
total_stat.save_to_file_failed_at_pcapng_open);
cJSON_AddNumberToObject(json_root, "save_to_file_failed_at_pcapng_format",
total_stat.save_to_file_failed_at_pcapng_format);
cJSON_AddNumberToObject(json_root, "save_to_file_failed_at_write_to_disk",
total_stat.save_to_file_failed_at_write_to_disk);
cJSON_AddNumberToObject(json_root, "save_to_file_success", total_stat.save_to_file_success);
cJSON_AddItemToObject(json_root, "current_job", monit_current_job_running());
char * str_json_print = cJSON_Print(json_root);
FILE * fp_monit = fopen(conf->monit_file_path, "w");
if (fp_monit == NULL)
{
dzlog_warn("monit file %s open failed, cannot dump program stat info : %s", conf->monit_file_path,
strerror(errno));
return;
}
fprintf(fp_monit, "%s", str_json_print);
cJSON_Delete(json_root);
free(str_json_print);
fclose(fp_monit);
return;
}
static void * monit_loop(void * args)
{
pthread_detach(pthread_self());
while (1)
{
monit_dump();
sleep(1);
}
}
|