summaryrefslogtreecommitdiff
path: root/app/src/monit.c
blob: 9361440706ad39282089a5fc87d026d9a20a329e (plain)
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
/* \brief Ӧ��״̬����������
*
* \author Lu Qiuwen<[email protected]>
* \date 2016-11-30
*/

#include <mr_common.h>
#include <mr_rtdev.h>
#include <mrapp.h>

#include "cJSON.h"

static cJSON * __create_uint64_array(const uint64_t * value, int nr_value)
{
	struct cJSON * uint64_array = cJSON_CreateArray();
	for (int i = 0; i < nr_value; i++)
		cJSON_AddItemToArray(uint64_array, cJSON_CreateNumber(value[i]));
	return uint64_array;
}

static cJSON * __create_raw_device_stats(struct rtdev_app_desc * dev_desc)
{
	struct rtdev_stat_info _stat_info;
	mr_rtdev_app_stats_get(dev_desc, &_stat_info);

	struct cJSON * j_raw_device_stats = cJSON_CreateObject();
	unsigned int nr_rx_stream = dev_desc->nr_rx_stream;
	unsigned int nr_tx_stream = dev_desc->nr_tx_stream;

#define __JOIN_RAW_DEVICE_STATS_ITEM(item, streams)		do {		\
	cJSON_AddItemToObject(j_raw_device_stats, #item,				\
	__create_uint64_array(_stat_info.item, streams));				\
} while(0)

	__JOIN_RAW_DEVICE_STATS_ITEM(rx_on_line, nr_rx_stream);
	__JOIN_RAW_DEVICE_STATS_ITEM(rx_deliver, nr_rx_stream);
	__JOIN_RAW_DEVICE_STATS_ITEM(rx_missed, nr_rx_stream);
	__JOIN_RAW_DEVICE_STATS_ITEM(tx_on_line, nr_tx_stream);
	__JOIN_RAW_DEVICE_STATS_ITEM(tx_deliver, nr_tx_stream);
	__JOIN_RAW_DEVICE_STATS_ITEM(tx_missed, nr_tx_stream);
	__JOIN_RAW_DEVICE_STATS_ITEM(ftx_on_line, nr_tx_stream);
	__JOIN_RAW_DEVICE_STATS_ITEM(ftx_deliver, nr_tx_stream);
	__JOIN_RAW_DEVICE_STATS_ITEM(ftx_missed, nr_tx_stream);
	return j_raw_device_stats;
}

// ����ʱԭʼ�����豸ͳ�Ƽ���
static cJSON * monit_raw_device(struct mrapp_instance * instance)
{
	struct cJSON * j_raw_device_array = cJSON_CreateArray();
	for(int i = 0; i < RTE_DIM(instance->raw_socket); i++)
	{
		struct raw_socket * socket = instance->raw_socket[i];
		if (socket == NULL) continue;

		cJSON * j_raw_device = cJSON_CreateObject();
		cJSON_AddStringToObject(j_raw_device, "symbol", socket->devsym);
		cJSON_AddNumberToObject(j_raw_device, "rxstreams", socket->nr_rxstream);
		cJSON_AddNumberToObject(j_raw_device, "txstreams", socket->nr_txstream);
		cJSON_AddItemToObject(j_raw_device, "stats", __create_raw_device_stats(socket->rtdev_desc));
		cJSON_AddItemToArray(j_raw_device_array, j_raw_device);
	}

	return j_raw_device_array;
}

static cJSON * monit_app_info(struct mrapp_instance * instance)
{
	struct cJSON * j_root = cJSON_CreateObject();
	cJSON_AddStringToObject(j_root, "symbol", instance->appsym);
	return j_root;
}

static cJSON * monit_root(struct mrapp_instance * instance)
{
	struct cJSON * j_root = cJSON_CreateObject();
	cJSON_AddItemToObject(j_root, "appinfo", monit_app_info(instance));
	cJSON_AddItemToObject(j_root, "raw", monit_raw_device(instance));
	return j_root;
}

int mrapp_monit_loop(struct mrapp_instance * instance)
{
	FILE * fp_monit = fopen(instance->monit_file_path, "w");
	if(fp_monit == NULL)
	{
		MR_LOG(INFO, MRLIB, "Open monit result file %s failed: %s \n", 
			instance->monit_file_path, strerror(errno));
		return 0;
	}

	cJSON * j_root = monit_root(instance);
	char * str_json_print = cJSON_Print(j_root);
	fprintf(fp_monit, "%s", str_json_print);
	free(j_root);
	fclose(fp_monit);
	return 0;
}