summaryrefslogtreecommitdiff
path: root/app/src/monit.c
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2016-12-08 21:13:04 +0800
committerQiuwen Lu <[email protected]>2016-12-08 21:13:04 +0800
commit7ea9ff387d4266042e6469f678a7828b211ae590 (patch)
treeb60339d3e62b0d7d87545ff230cdd03a67a81604 /app/src/monit.c
parente7312311de94cc2c99ea44631d73dcd87ba1adbf (diff)
修正大于32核心服务器上的线程绑定问题,增加了每个应用的统计详情输出
Diffstat (limited to 'app/src/monit.c')
-rw-r--r--app/src/monit.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/app/src/monit.c b/app/src/monit.c
new file mode 100644
index 0000000..9361440
--- /dev/null
+++ b/app/src/monit.c
@@ -0,0 +1,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;
+} \ No newline at end of file