#include #include #include #include #include "log.h" #include "global_metrics.h" enum SCE_STAT_FIELD { // device_nf STAT_DEVICE_NF_RX_PKT, STAT_DEVICE_NF_RX_B, STAT_DEVICE_NF_TX_PKT, STAT_DEVICE_NF_TX_B, STAT_KEE_PKT_DOWN_RX_PKT, STAT_KEE_PKT_DOWN_RX_B, STAT_KEE_PKT_DOWN_TX_PKT, STAT_KEE_PKT_DOWN_TX_B, // device_endpoint_vxlan STAT_DEVICE_ENDPOINT_VXLAN_RX_PKT, STAT_DEVICE_ENDPOINT_VXLAN_RX_B, STAT_DEVICE_ENDPOINT_VXLAN_TX_PKT, STAT_DEVICE_ENDPOINT_VXLAN_TX_B, STAT_KEE_PKT_UP_RX_PKT, STAT_KEE_PKT_UP_RX_B, STAT_KEE_PKT_UP_TX_DROP_PKT, STAT_KEE_PKT_UP_TX_DROP_B, // device_endpoint_vlan STAT_DEVICE_ENDPOINT_VLAN_RX_PKT, STAT_DEVICE_ENDPOINT_VLAN_RX_B, STAT_DEVICE_ENDPOINT_VLAN_TX_PKT, STAT_DEVICE_ENDPOINT_VLAN_TX_B, STAT_DEVICE_ENDPOINT_VXLAN_DROP_PKT, STAT_DEVICE_ENDPOINT_VXLAN_DROP_B, STAT_DEVICE_ENDPOINT_VLAN_DROP_PKT, STAT_DEVICE_ENDPOINT_VLAN_DROP_B, // data_pkt_metrics STAT_DATA_PKT_MIRR_BYPASS_PKT, STAT_DATA_PKT_MIRR_BYPASS_B, STAT_DATA_PKT_MIRR_BLOCK_PKT, STAT_DATA_PKT_MIRR_BLOCK_B, STAT_DATA_PKT_MIRR_RX_DROP_PKT, STAT_DATA_PKT_MIRR_RX_DROP_B, STAT_DATA_PKT_MIRR_TX_PKT, STAT_DATA_PKT_MIRR_TX_B, STAT_DATA_PKT_STEE_BYPASS_PKT, STAT_DATA_PKT_STEE_BYPASS_B, STAT_DATA_PKT_STEE_BLOCK_PKT, STAT_DATA_PKT_STEE_BLOCK_B, STAT_DATA_PKT_STEE_RX_PKT, STAT_DATA_PKT_STEE_RX_B, STAT_DATA_PKT_STEE_TX_PKT, STAT_DATA_PKT_STEE_TX_B, STAT_DATA_PKT_MISS_SESS_PKT, STAT_DATA_PKT_MISS_SESS_B, STAT_DATA_PKT_ERROR_BYPASS_PKT, STAT_DATA_PKT_ERROR_BYPASS_B, STAT_DATA_PKT_ERROR_BLOCK_PKT, STAT_DATA_PKT_ERROR_BLOCK_B, // sf_status_metrics STAT_SF_STATUS_ACTIVE, STAT_SF_STATUS_INACTIVE, // ctrl_pkt_metrics STAT_CTRL_PKT_RX_PKT, STAT_CTRL_PKT_RX_B, STAT_CTRL_PKT_TX_PKT, STAT_CTRL_PKT_TX_B, STAT_CTRL_PKT_OPENING, STAT_CTRL_PKT_ACTIVE, STAT_CTRL_PKT_CLOSING, STAT_CTRL_PKT_RESETALL, STAT_CTRL_PKT_ERROR, // sf_session_metrics STAT_SF_SESSION_NUM, STAT_SF_SESSION_LOG, // max STAT_MAX, }; static const char *stat_map[] = { // device_nf [STAT_DEVICE_NF_RX_PKT] = "dev_nf_rx_P", [STAT_DEVICE_NF_RX_B] = "dev_nf_rx_B", [STAT_DEVICE_NF_TX_PKT] = "dev_nf_tx_P", [STAT_DEVICE_NF_TX_B] = "dev_nf_tx_B", [STAT_KEE_PKT_DOWN_RX_PKT] = "kee_d_rx_P", [STAT_KEE_PKT_DOWN_RX_B] = "kee_d_rx_B", [STAT_KEE_PKT_DOWN_TX_PKT] = "kee_d_tx_P", [STAT_KEE_PKT_DOWN_TX_B] = "kee_d_tx_B", // device_endpoint_vxlan [STAT_DEVICE_ENDPOINT_VXLAN_RX_PKT] = "dev_l3_rx_P", [STAT_DEVICE_ENDPOINT_VXLAN_RX_B] = "dev_l3_rx_B", [STAT_DEVICE_ENDPOINT_VXLAN_TX_PKT] = "dev_l3_tx_P", [STAT_DEVICE_ENDPOINT_VXLAN_TX_B] = "dev_l3_tx_B", [STAT_KEE_PKT_UP_RX_PKT] = "kee_u_rx_P", [STAT_KEE_PKT_UP_RX_B] = "kee_u_rx_B", [STAT_KEE_PKT_UP_TX_DROP_PKT] = "kee_u_rxdop_P", [STAT_KEE_PKT_UP_TX_DROP_B] = "kee_u_rxdop_B", // device_endpoint_vlan [STAT_DEVICE_ENDPOINT_VLAN_RX_PKT] = "dev_l2_rx_P", [STAT_DEVICE_ENDPOINT_VLAN_RX_B] = "dev_l2_rx_B", [STAT_DEVICE_ENDPOINT_VLAN_TX_PKT] = "dev_l2_tx_P", [STAT_DEVICE_ENDPOINT_VLAN_TX_B] = "dev_l2_tx_B", [STAT_DEVICE_ENDPOINT_VXLAN_DROP_PKT] = "dev_l3_dop_P", [STAT_DEVICE_ENDPOINT_VXLAN_DROP_B] = "dev_l3_dop_B", [STAT_DEVICE_ENDPOINT_VLAN_DROP_PKT] = "dev_l2_dop_P", [STAT_DEVICE_ENDPOINT_VLAN_DROP_B] = "dev_l2_dop_B", // data_pkt_metrics [STAT_DATA_PKT_MIRR_BYPASS_PKT] = "mirr_bypass_P", [STAT_DATA_PKT_MIRR_BYPASS_B] = "mirr_bypass_B", [STAT_DATA_PKT_MIRR_BLOCK_PKT] = "mirr_block_P", [STAT_DATA_PKT_MIRR_BLOCK_B] = "mirr_block_B", [STAT_DATA_PKT_MIRR_RX_DROP_PKT] = "mirr_rxdop_P", [STAT_DATA_PKT_MIRR_RX_DROP_B] = "mirr_rxdop_B", [STAT_DATA_PKT_MIRR_TX_PKT] = "mirro_tx_P", [STAT_DATA_PKT_MIRR_TX_B] = "mirro_tx_B", [STAT_DATA_PKT_STEE_BYPASS_PKT] = "stee_bypass_P", [STAT_DATA_PKT_STEE_BYPASS_B] = "stee_bypass_B", [STAT_DATA_PKT_STEE_BLOCK_PKT] = "stee_block_P", [STAT_DATA_PKT_STEE_BLOCK_B] = "stee_block_B", [STAT_DATA_PKT_STEE_RX_PKT] = "stee_rx_P", [STAT_DATA_PKT_STEE_RX_B] = "stee_rx_B", [STAT_DATA_PKT_STEE_TX_PKT] = "stee_tx_P", [STAT_DATA_PKT_STEE_TX_B] = "stee_tx_B", [STAT_DATA_PKT_MISS_SESS_PKT] = "miss_sess_P", [STAT_DATA_PKT_MISS_SESS_B] = "miss_sess_B", [STAT_DATA_PKT_ERROR_BYPASS_PKT] = "err_bypass_P", [STAT_DATA_PKT_ERROR_BYPASS_B] = "err_bypass_B", [STAT_DATA_PKT_ERROR_BLOCK_PKT] = "err_block_P", [STAT_DATA_PKT_ERROR_BLOCK_B] = "err_block_B", // sf_status_metrics [STAT_SF_STATUS_ACTIVE] = "sf_active", [STAT_SF_STATUS_INACTIVE] = "sf_inactive", // ctrl_pkt_metrics [STAT_CTRL_PKT_RX_PKT] = "ctrl_rx_P", [STAT_CTRL_PKT_RX_B] = "ctrl_rx_B", [STAT_CTRL_PKT_TX_PKT] = "ctrl_tx_P", [STAT_CTRL_PKT_TX_B] = "ctrl_tx_B", [STAT_CTRL_PKT_OPENING] = "ctrl_opening", [STAT_CTRL_PKT_ACTIVE] = "ctrl_active", [STAT_CTRL_PKT_CLOSING] = "ctrl_closing", [STAT_CTRL_PKT_RESETALL] = "ctrl_resetall", [STAT_CTRL_PKT_ERROR] = "ctrl_error", // sf_session_metrics [STAT_SF_SESSION_NUM] = "curr_sessions", [STAT_SF_SESSION_LOG] = "session_logs", [STAT_MAX] = NULL}; static void global_metrics_parse_config(const char *profile, struct metrics_config *config) { MESA_load_profile_string_def(profile, "STAT", "output_file", config->output_file, sizeof(config->output_file), "log/sce.fs2"); MESA_load_profile_string_def(profile, "STAT", "statsd_server", config->statsd_server, sizeof(config->statsd_server), "127.0.0.1"); MESA_load_profile_int_def(profile, "STAT", "statsd_port", &(config->statsd_port), 8100); MESA_load_profile_int_def(profile, "STAT", "statsd_format", &(config->statsd_format), 1); // FS_OUTPUT_STATSD=1, FS_OUTPUT_INFLUX_LINE=2 MESA_load_profile_int_def(profile, "STAT", "statsd_cycle", &(config->statsd_cycle), 1); MESA_load_profile_int_def(profile, "STAT", "prometheus_listen_port", &(config->prometheus_listen_port), 9001); MESA_load_profile_string_def(profile, "STAT", "prometheus_listen_url", config->prometheus_listen_url, sizeof(config->prometheus_listen_url), "/sce_prometheus"); if (config->statsd_format != 1 && config->statsd_format != 2) { config->statsd_format = 1; } LOG_DEBUG("STAT->output_file : %s", config->output_file); LOG_DEBUG("STAT->statsd_server : %s", config->statsd_server); LOG_DEBUG("STAT->statsd_port : %d", config->statsd_port); LOG_DEBUG("STAT->statsd_format : %d", config->statsd_format); LOG_DEBUG("STAT->statsd_cycle : %d", config->statsd_cycle); LOG_DEBUG("STAT->prometheus_listen_port : %d", config->prometheus_listen_port); LOG_DEBUG("STAT->prometheus_listen_url : %s", config->prometheus_listen_url); } struct global_metrics *global_metrics_create(const char *profile, int thread_num) { struct global_metrics *global_metrics = (struct global_metrics *)calloc(1, sizeof(struct global_metrics)); assert(global_metrics != NULL); global_metrics->thread_num = thread_num; global_metrics->thread_metrics_flag = (int *)calloc(global_metrics->thread_num, sizeof(int)); global_metrics->thread_metrics_cache = (struct thread_metrics *)calloc(global_metrics->thread_num, sizeof(struct thread_metrics)); global_metrics_parse_config(profile, &global_metrics->config); FS_library_set_prometheus_port(global_metrics->config.prometheus_listen_port); FS_library_set_prometheus_url_path(global_metrics->config.prometheus_listen_url); FS_library_init(); int value = 0; global_metrics->fs_handle = FS_create_handle(); // TODO memleak no free() API FS_set_para(global_metrics->fs_handle, APP_NAME, "SCE", 3); FS_set_para(global_metrics->fs_handle, OUTPUT_DEVICE, global_metrics->config.output_file, strlen(global_metrics->config.output_file)); value = 1; FS_set_para(global_metrics->fs_handle, OUTPUT_PROMETHEUS, &value, sizeof(value)); value = 1; FS_set_para(global_metrics->fs_handle, PRINT_MODE, &value, sizeof(value)); value = 0; FS_set_para(global_metrics->fs_handle, CREATE_THREAD, &value, sizeof(value)); if (strlen(global_metrics->config.statsd_server) > 0 && global_metrics->config.statsd_port != 0) { FS_set_para(global_metrics->fs_handle, STATS_SERVER_IP, global_metrics->config.statsd_server, strlen(global_metrics->config.statsd_server)); FS_set_para(global_metrics->fs_handle, STATS_SERVER_PORT, &(global_metrics->config.statsd_port), sizeof(global_metrics->config.statsd_port)); FS_set_para(global_metrics->fs_handle, STATS_FORMAT, &global_metrics->config.statsd_format, sizeof(global_metrics->config.statsd_format)); } if (STAT_MAX >= (sizeof(global_metrics->fs_id) / sizeof(global_metrics->fs_id[0]))) { LOG_ERROR("field stat has insufficient space to store fs_id, and supports a maximum of %lu fsids, but %d is needed ", (sizeof(global_metrics->fs_id) / sizeof(global_metrics->fs_id[0])), STAT_MAX); global_metrics_destory(global_metrics); return NULL; } for (int i = 0; i < STAT_MAX; i++) { global_metrics->fs_id[i] = FS_register(global_metrics->fs_handle, FS_STYLE_FIELD, FS_CALC_CURRENT, stat_map[i]); } FS_start(global_metrics->fs_handle); return global_metrics; } void global_metrics_destory(struct global_metrics *global_metrics) { if (global_metrics) { if (global_metrics->thread_metrics_flag) { free(global_metrics->thread_metrics_flag); global_metrics->thread_metrics_flag = NULL; } if (global_metrics->thread_metrics_cache) { free(global_metrics->thread_metrics_cache); global_metrics->thread_metrics_cache = NULL; } FS_library_destroy(); free(global_metrics); global_metrics = NULL; } } #define THREAD_METRICS_CACHE_IS_FREE 0 #define THREAD_METRICS_CACHE_IS_BUSY 0xf void global_metrics_update(struct global_metrics *global_metrics, struct thread_metrics *thread_metrics, int thread_id) { if (ATOMIC_READ(&(global_metrics->thread_metrics_flag[thread_id])) == THREAD_METRICS_CACHE_IS_FREE) { struct thread_metrics *ptr_metrics = &global_metrics->thread_metrics_cache[thread_id]; memcpy(ptr_metrics, thread_metrics, sizeof(struct thread_metrics)); memset(thread_metrics, 0, sizeof(struct thread_metrics)); ATOMIC_SET(&(global_metrics->thread_metrics_flag[thread_id]), THREAD_METRICS_CACHE_IS_BUSY); } } void global_metrics_dump(struct global_metrics *global_metrics) { struct thread_metrics *sum = &global_metrics->sum; for (int i = 0; i < global_metrics->thread_num; i++) { if (ATOMIC_READ(&(global_metrics->thread_metrics_flag[i])) == THREAD_METRICS_CACHE_IS_BUSY) { struct thread_metrics *thread = &global_metrics->thread_metrics_cache[i]; sum->nf_rx.n_pkts += thread->nf_rx.n_pkts; sum->nf_rx.n_bytes += thread->nf_rx.n_bytes; sum->nf_tx.n_pkts += thread->nf_tx.n_pkts; sum->nf_tx.n_bytes += thread->nf_tx.n_bytes; sum->endpoint_vxlan_rx.n_pkts += thread->endpoint_vxlan_rx.n_pkts; sum->endpoint_vxlan_rx.n_bytes += thread->endpoint_vxlan_rx.n_bytes; sum->endpoint_vxlan_tx.n_pkts += thread->endpoint_vxlan_tx.n_pkts; sum->endpoint_vxlan_tx.n_bytes += thread->endpoint_vxlan_tx.n_bytes; sum->endpoint_vxlan_drop.n_pkts += thread->endpoint_vxlan_drop.n_pkts; sum->endpoint_vxlan_drop.n_bytes += thread->endpoint_vxlan_drop.n_bytes; sum->endpoint_vlan_rx.n_pkts += thread->endpoint_vlan_rx.n_pkts; sum->endpoint_vlan_rx.n_bytes += thread->endpoint_vlan_rx.n_bytes; sum->endpoint_vlan_tx.n_pkts += thread->endpoint_vlan_tx.n_pkts; sum->endpoint_vlan_tx.n_bytes += thread->endpoint_vlan_tx.n_bytes; sum->endpoint_vlan_drop.n_pkts += thread->endpoint_vlan_drop.n_pkts; sum->endpoint_vlan_drop.n_bytes += thread->endpoint_vlan_drop.n_bytes; sum->mirr_bypass.n_pkts += thread->mirr_bypass.n_pkts; sum->mirr_bypass.n_bytes += thread->mirr_bypass.n_bytes; sum->mirr_block.n_pkts += thread->mirr_block.n_pkts; sum->mirr_block.n_bytes += thread->mirr_block.n_bytes; sum->mirr_rx_drop.n_pkts += thread->mirr_rx_drop.n_pkts; sum->mirr_rx_drop.n_bytes += thread->mirr_rx_drop.n_bytes; sum->mirr_tx.n_pkts += thread->mirr_tx.n_pkts; sum->mirr_tx.n_bytes += thread->mirr_tx.n_bytes; sum->stee_bypass.n_pkts += thread->stee_bypass.n_pkts; sum->stee_bypass.n_bytes += thread->stee_bypass.n_bytes; sum->stee_block.n_pkts += thread->stee_block.n_pkts; sum->stee_block.n_bytes += thread->stee_block.n_bytes; sum->stee_rx.n_pkts += thread->stee_rx.n_pkts; sum->stee_rx.n_bytes += thread->stee_rx.n_bytes; sum->stee_tx.n_pkts += thread->stee_tx.n_pkts; sum->stee_tx.n_bytes += thread->stee_tx.n_bytes; sum->miss_sess.n_pkts += thread->miss_sess.n_pkts; sum->miss_sess.n_bytes += thread->miss_sess.n_bytes; sum->error_bypass.n_pkts += thread->error_bypass.n_pkts; sum->error_bypass.n_bytes += thread->error_bypass.n_bytes; sum->error_block.n_pkts += thread->error_block.n_pkts; sum->error_block.n_bytes += thread->error_block.n_bytes; sum->ctrl_rx.n_pkts += thread->ctrl_rx.n_pkts; sum->ctrl_rx.n_bytes += thread->ctrl_rx.n_bytes; sum->ctrl_tx.n_pkts += thread->ctrl_tx.n_pkts; sum->ctrl_tx.n_bytes += thread->ctrl_tx.n_bytes; sum->ctrl_opening += thread->ctrl_opening; sum->ctrl_active += thread->ctrl_active; sum->ctrl_closing += thread->ctrl_closing; sum->ctrl_resetall += thread->ctrl_resetall; sum->ctrl_error += thread->ctrl_error; sum->downlink_rx.n_pkts += thread->downlink_rx.n_pkts; sum->downlink_rx.n_bytes += thread->downlink_rx.n_bytes; sum->downlink_tx.n_pkts += thread->downlink_tx.n_pkts; sum->downlink_tx.n_bytes += thread->downlink_tx.n_bytes; sum->uplink_rx.n_pkts += thread->uplink_rx.n_pkts; sum->uplink_rx.n_bytes += thread->uplink_rx.n_bytes; sum->uplink_tx_drop.n_pkts += thread->uplink_tx_drop.n_pkts; sum->uplink_tx_drop.n_bytes += thread->uplink_tx_drop.n_bytes; sum->sf_active += thread->sf_active; sum->sf_inactive += thread->sf_inactive; sum->session_num += thread->session_num; sum->session_log += thread->session_log; memset(thread, 0, sizeof(struct thread_metrics)); ATOMIC_SET(&(global_metrics->thread_metrics_flag[i]), THREAD_METRICS_CACHE_IS_FREE); } } // device_metrics FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_NF_RX_PKT], 0, FS_OP_SET, sum->nf_rx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_NF_RX_B], 0, FS_OP_SET, sum->nf_rx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_NF_TX_PKT], 0, FS_OP_SET, sum->nf_tx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_NF_TX_B], 0, FS_OP_SET, sum->nf_tx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VXLAN_RX_PKT], 0, FS_OP_SET, sum->endpoint_vxlan_rx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VXLAN_RX_B], 0, FS_OP_SET, sum->endpoint_vxlan_rx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VXLAN_TX_PKT], 0, FS_OP_SET, sum->endpoint_vxlan_tx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VXLAN_TX_B], 0, FS_OP_SET, sum->endpoint_vxlan_tx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VXLAN_DROP_PKT], 0, FS_OP_SET, sum->endpoint_vxlan_drop.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VXLAN_DROP_B], 0, FS_OP_SET, sum->endpoint_vxlan_drop.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VLAN_RX_PKT], 0, FS_OP_SET, sum->endpoint_vlan_rx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VLAN_RX_B], 0, FS_OP_SET, sum->endpoint_vlan_rx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VLAN_TX_PKT], 0, FS_OP_SET, sum->endpoint_vlan_tx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VLAN_TX_B], 0, FS_OP_SET, sum->endpoint_vlan_tx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VLAN_DROP_PKT], 0, FS_OP_SET, sum->endpoint_vlan_drop.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DEVICE_ENDPOINT_VLAN_DROP_B], 0, FS_OP_SET, sum->endpoint_vlan_drop.n_bytes); // data_pkt_metrics FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MIRR_BYPASS_PKT], 0, FS_OP_SET, sum->mirr_bypass.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MIRR_BYPASS_B], 0, FS_OP_SET, sum->mirr_bypass.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MIRR_BLOCK_PKT], 0, FS_OP_SET, sum->mirr_block.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MIRR_BLOCK_B], 0, FS_OP_SET, sum->mirr_block.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MIRR_RX_DROP_PKT], 0, FS_OP_SET, sum->mirr_rx_drop.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MIRR_RX_DROP_B], 0, FS_OP_SET, sum->mirr_rx_drop.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MIRR_TX_PKT], 0, FS_OP_SET, sum->mirr_tx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MIRR_TX_B], 0, FS_OP_SET, sum->mirr_tx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_STEE_BYPASS_PKT], 0, FS_OP_SET, sum->stee_bypass.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_STEE_BYPASS_B], 0, FS_OP_SET, sum->stee_bypass.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_STEE_BLOCK_PKT], 0, FS_OP_SET, sum->stee_block.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_STEE_BLOCK_B], 0, FS_OP_SET, sum->stee_block.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_STEE_RX_PKT], 0, FS_OP_SET, sum->stee_rx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_STEE_RX_B], 0, FS_OP_SET, sum->stee_rx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_STEE_TX_PKT], 0, FS_OP_SET, sum->stee_tx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_STEE_TX_B], 0, FS_OP_SET, sum->stee_tx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MISS_SESS_PKT], 0, FS_OP_SET, sum->miss_sess.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_MISS_SESS_B], 0, FS_OP_SET, sum->miss_sess.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_ERROR_BYPASS_PKT], 0, FS_OP_SET, sum->error_bypass.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_ERROR_BYPASS_B], 0, FS_OP_SET, sum->error_bypass.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_ERROR_BLOCK_PKT], 0, FS_OP_SET, sum->error_block.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_DATA_PKT_ERROR_BLOCK_B], 0, FS_OP_SET, sum->error_block.n_bytes); // ctrl_pkt_metrics FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_RX_PKT], 0, FS_OP_SET, sum->ctrl_rx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_RX_B], 0, FS_OP_SET, sum->ctrl_rx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_TX_PKT], 0, FS_OP_SET, sum->ctrl_tx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_TX_B], 0, FS_OP_SET, sum->ctrl_tx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_OPENING], 0, FS_OP_SET, sum->ctrl_opening); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_ACTIVE], 0, FS_OP_SET, sum->ctrl_active); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_CLOSING], 0, FS_OP_SET, sum->ctrl_closing); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_RESETALL], 0, FS_OP_SET, sum->ctrl_resetall); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_CTRL_PKT_ERROR], 0, FS_OP_SET, sum->ctrl_error); // keepalived_pkt_metrics FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_KEE_PKT_DOWN_RX_PKT], 0, FS_OP_SET, sum->downlink_rx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_KEE_PKT_DOWN_RX_B], 0, FS_OP_SET, sum->downlink_rx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_KEE_PKT_DOWN_TX_PKT], 0, FS_OP_SET, sum->downlink_tx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_KEE_PKT_DOWN_TX_B], 0, FS_OP_SET, sum->downlink_tx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_KEE_PKT_UP_RX_PKT], 0, FS_OP_SET, sum->uplink_rx.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_KEE_PKT_UP_RX_B], 0, FS_OP_SET, sum->uplink_rx.n_bytes); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_KEE_PKT_UP_TX_DROP_PKT], 0, FS_OP_SET, sum->uplink_tx_drop.n_pkts); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_KEE_PKT_UP_TX_DROP_B], 0, FS_OP_SET, sum->uplink_tx_drop.n_bytes); // sf_status_metrics FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_SF_STATUS_ACTIVE], 0, FS_OP_SET, sum->sf_active); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_SF_STATUS_INACTIVE], 0, FS_OP_SET, sum->sf_inactive); // sf_session_metrics FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_SF_SESSION_NUM], 0, FS_OP_SET, sum->session_num); FS_operate(global_metrics->fs_handle, global_metrics->fs_id[STAT_SF_SESSION_LOG], 0, FS_OP_SET, sum->session_log); FS_passive_output(global_metrics->fs_handle); }