diff options
| author | liuchang <[email protected]> | 2023-05-29 10:16:32 +0000 |
|---|---|---|
| committer | liuchang <[email protected]> | 2023-05-29 10:16:32 +0000 |
| commit | 66ea2254660e40f055668cfe1f8df3dc24e60475 (patch) | |
| tree | e64a953738cc44836c46166c280c4d08971d9a28 /shaping/src/shaper_global_stat.cpp | |
| parent | 57efeb63d5769c9f1b92b1266780968ad1c30d78 (diff) | |
add async statistics for global metric
Diffstat (limited to 'shaping/src/shaper_global_stat.cpp')
| -rw-r--r-- | shaping/src/shaper_global_stat.cpp | 284 |
1 files changed, 204 insertions, 80 deletions
diff --git a/shaping/src/shaper_global_stat.cpp b/shaping/src/shaper_global_stat.cpp index ef915d1..37138b1 100644 --- a/shaping/src/shaper_global_stat.cpp +++ b/shaping/src/shaper_global_stat.cpp @@ -8,74 +8,73 @@ #include "shaper.h" #include "shaper_global_stat.h" -struct shaper_global_stat_conf { - int enable_backgroud_thread; - int output_interval_ms; -}; - -static int shaper_global_stat_conf_load(struct shaper_global_stat_conf *conf) +static int shaper_global_stat_conf_load(struct shaping_global_stat *stat) { - memset(conf, 0, sizeof(struct shaper_global_stat_conf)); - - MESA_load_profile_int_def(SHAPING_GLOBAL_CONF_FILE, "METRIC", "FIELDSTAT_OUTPUT_INTERVAL_MS", &conf->output_interval_ms, 500); - MESA_load_profile_int_def(SHAPING_GLOBAL_CONF_FILE, "METRIC", "FIELDSTAT_ENABLE_BACKGRUND_THREAD", &conf->enable_backgroud_thread, 1); + MESA_load_profile_int_def(SHAPING_GLOBAL_CONF_FILE, "METRIC", "GLOBAL_STAT_OUTPUT_INTERVAL_S", &stat->output_interval_s, 1); return 0; } + +static void shaper_global_stat_fieldstat_reg(struct shaping_global_stat *stat) +{ + stat->column_ids[CURR_SESSION_NUM_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_GAUGE, "curr_session_num", NULL, 0); + stat->column_ids[QUEUEING_PKTS_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_GAUGE, "curr_queueing_pkts", NULL, 0); + stat->column_ids[QUEUEING_BYTES_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_GAUGE, "curr_queueing_bytes", NULL, 0); + + stat->column_ids[CTRL_ERR_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "ctrl_error", NULL, 0); + stat->column_ids[CTRL_OPENING_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "ctrl_opening", NULL, 0); + stat->column_ids[CTRL_ACTIVE_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "ctrl_active", NULL, 0); + stat->column_ids[CTRL_CLOSE_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "ctrl_close", NULL, 0); + stat->column_ids[CTRL_RESETALL_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "ctrl_resetall", NULL, 0); + stat->column_ids[SESSION_LOG_SEND_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "session_log_send", NULL, 0); + + stat->column_ids[ASYNC_INVOKE_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "swarmkv_async_invoke", NULL, 0); + stat->column_ids[ASYNC_CALLBACK_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "swarmkv_async_callback", NULL, 0); + stat->column_ids[ASYNC_TCONSUME_FAILED] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "swarmkv_tconsume_failed", NULL, 0); + stat->column_ids[ASYNC_HINCRBY_FAILED] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "swarmkv_hincrby_failed", NULL, 0); + stat->column_ids[ASYNC_HMGET_FAILED] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "swarmkv_hmget_failed", NULL, 0); + + stat->column_ids[RX_PKTS_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "rx_pkts", NULL, 0); + stat->column_ids[RX_BYTES_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "rx_bytes", NULL, 0); + stat->column_ids[TX_PKTS_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "tx_pkts", NULL, 0); + stat->column_ids[TX_BYTES_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "tx_bytes", NULL, 0); + stat->column_ids[DROP_PKTS_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "drop_pkts", NULL, 0); + stat->column_ids[DROP_BYTES_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "drop_bytes", NULL, 0); + + stat->column_ids[HIT_POLICY_RX_PKTS_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "hit_policy_rx_pkts", NULL, 0); + stat->column_ids[HIT_POLICY_RX_BYTES_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "hit_policy_rx_bytes", NULL, 0); + stat->column_ids[HIT_POLICY_TX_PKTS_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "hit_policy_tx_pkts", NULL, 0); + stat->column_ids[HIT_POLICY_TX_BYTES_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "hit_policy_tx_bytes", NULL, 0); + stat->column_ids[HIT_POLICY_DROP_PKTS_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "hit_policy_drop_pkts", NULL, 0); + stat->column_ids[HIT_POLICY_DROP_BYTES_IDX] = fieldstat_register(stat->instance, FIELD_TYPE_COUNTER, "hit_policy_drop_bytes", NULL, 0); + + return; +} + struct shaping_global_stat* shaper_global_stat_init() { struct shaping_global_stat *stat = NULL; int column_num; - struct shaper_global_stat_conf conf; - const char *column_name[] = {"rx_pkts", "rx_bytes", "tx_pkts", "tx_bytes", "queueing_pkts", - "queueing_bytes", "drop_pkts", "drop_bytes", "hit_policy_pkts", "hit_policy_bytes", - "ctrl_pkts", "ctrl_opening_pkts", "ctrl_active_pkts", "ctrl_close_pkts", "ctrl_resetall_pkts", - "curr_session_num", "session_log_send_num"}; - enum field_type column_type[] = {FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, FIELD_TYPE_GAUGE, - FIELD_TYPE_GAUGE, FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, - FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER, - FIELD_TYPE_GAUGE, FIELD_TYPE_COUNTER}; - - column_num = sizeof(column_name)/sizeof(column_name[0]); - if (column_num != GLOBAL_STAT_COLUNM_IDX_MAX) { - LOG_ERROR("%s: shaping globat init fieldstat failed, column_num %d != index num %d", LOG_TAG_STAT, column_num, GLOBAL_STAT_COLUNM_IDX_MAX); - goto ERROR; - } - if (shaper_global_stat_conf_load(&conf) != 0) { + stat = (struct shaping_global_stat*)calloc(1, sizeof(struct shaping_global_stat)); + + if (shaper_global_stat_conf_load(stat) != 0) { LOG_ERROR("%s: shaping init metric conf failed", LOG_TAG_STAT); goto ERROR; } - - stat = (struct shaping_global_stat*)calloc(1, sizeof(struct shaping_global_stat)); + stat->instance = fieldstat_instance_new("shaping_global"); if (stat->instance == NULL) { LOG_ERROR("%s: shaping global init fieldstat instance failed", LOG_TAG_STAT); goto ERROR; } - stat->table_id = fieldstat_register_table(stat->instance, "shaping_global_metrics", column_name, column_type, column_num); - if (stat->table_id < 0) { - LOG_ERROR("%s: shaping global fieldstat register table failed", LOG_TAG_STAT); - goto ERROR; - } - - if (fieldstat_register_table_row(stat->instance, stat->table_id, "shaping_global_metric_row", NULL, 0, stat->column_ids) != 0) { - LOG_ERROR("%s: shaping global fieldstat register table row failed", LOG_TAG_STAT); - goto ERROR; - } + shaper_global_stat_fieldstat_reg(stat); - if (conf.enable_backgroud_thread == 0) { - fieldstat_disable_background_thread(stat->instance); - } + fieldstat_disable_background_thread(stat->instance); fieldstat_set_local_output(stat->instance, "shaping_global_metric", "json"); - if (fieldstat_set_output_interval(stat->instance, conf.output_interval_ms) != 0) { - LOG_ERROR("%s: shaping global set fieldstat output interval failed", LOG_TAG_STAT); - goto ERROR; - } - if (fieldstat_global_enable_prometheus_endpoint(9007, NULL) != 0) { LOG_ERROR("%s: shaping global fieldstat enable prometheus endpoint failed", LOG_TAG_STAT); goto ERROR; @@ -114,103 +113,228 @@ void shaper_global_stat_destroy(struct shaping_global_stat *stat) return; } -void shaper_global_stat_throughput_inc(struct shaping_global_stat *stat, enum shaping_global_stat_dir dir, int pkt_len) +void shaper_global_stat_curr_session_inc(struct shaping_global_stat *stat) { - if (dir == SHAPING_GLOBAL_STAT_RX) { - fieldstat_value_incrby(stat->instance, stat->column_ids[RX_PKTS_IDX], 1); - fieldstat_value_incrby(stat->instance, stat->column_ids[RX_BYTES_IDX], pkt_len); - } else { - fieldstat_value_incrby(stat->instance, stat->column_ids[TX_PKTS_IDX], 1); - fieldstat_value_incrby(stat->instance, stat->column_ids[TX_BYTES_IDX], pkt_len); - } + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->curr_session_num, 1, __ATOMIC_RELAXED); return; } -void shaper_global_stat_drop_inc(struct shaping_global_stat *stat, int pkt_len) +void shaper_global_stat_curr_session_dec(struct shaping_global_stat *stat) { - fieldstat_value_incrby(stat->instance, stat->column_ids[DROP_PKTS_IDX], 1); - fieldstat_value_incrby(stat->instance, stat->column_ids[DROP_BYTES_IDX], pkt_len); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_sub_fetch(&local_stat_data->curr_session_num, 1, __ATOMIC_RELAXED); return; } void shaper_global_stat_queueing_inc(struct shaping_global_stat *stat, int pkt_len) { - fieldstat_value_incrby(stat->instance, stat->column_ids[QUEUEING_PKTS_IDX], 1); - fieldstat_value_incrby(stat->instance, stat->column_ids[QUEUEING_BYTES_IDX], pkt_len); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->queueing_pkts, 1, __ATOMIC_RELAXED); + __atomic_add_fetch(&local_stat_data->queueing_bytes, pkt_len, __ATOMIC_RELAXED); return; } void shaper_global_stat_queueing_dec(struct shaping_global_stat *stat, int pkt_len) { - fieldstat_value_decrby(stat->instance, stat->column_ids[QUEUEING_PKTS_IDX], 1); - fieldstat_value_decrby(stat->instance, stat->column_ids[QUEUEING_BYTES_IDX], pkt_len); - - return; -} + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; -void shaper_global_stat_hit_policy_inc(struct shaping_global_stat *stat, int pkt_len) -{ - fieldstat_value_incrby(stat->instance, stat->column_ids[HIT_POLICY_PKTS], 1); - fieldstat_value_incrby(stat->instance, stat->column_ids[HIT_POLICY_BYTES], pkt_len); + __atomic_sub_fetch(&local_stat_data->queueing_pkts, 1, __ATOMIC_RELAXED); + __atomic_sub_fetch(&local_stat_data->queueing_bytes, pkt_len, __ATOMIC_RELAXED); return; } -void shaper_global_stat_ctrlpkt_inc(struct shaping_global_stat *stat) +void shaper_global_stat_ctrlpkt_err_inc(struct shaping_global_stat *stat) { - fieldstat_value_incrby(stat->instance, stat->column_ids[CTRL_PKTS_IDX], 1); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->ctrl_error, 1, __ATOMIC_RELAXED); return; } void shaper_global_stat_ctrlpkt_opening_inc(struct shaping_global_stat *stat) { - fieldstat_value_incrby(stat->instance, stat->column_ids[CTRL_OPENING_PKTS_IDX], 1); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->ctrl_opening, 1, __ATOMIC_RELAXED); return; } void shaper_global_stat_ctrlpkt_active_inc(struct shaping_global_stat *stat) { - fieldstat_value_incrby(stat->instance, stat->column_ids[CTRL_ACTIVE_PKTS_IDX], 1); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->ctrl_active, 1, __ATOMIC_RELAXED); return; } void shaper_global_stat_ctrlpkt_close_inc(struct shaping_global_stat *stat) { - fieldstat_value_incrby(stat->instance, stat->column_ids[CTRL_CLOSE_PKTS_IDX], 1); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->ctrl_close, 1, __ATOMIC_RELAXED); return; } void shaper_global_stat_ctrlpkt_resetall_inc(struct shaping_global_stat *stat) { - fieldstat_value_incrby(stat->instance, stat->column_ids[CTRL_RESETALL_PKTS_IDX], 1); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->ctrl_resetall, 1, __ATOMIC_RELAXED); return; } -void shaper_global_stat_curr_session_inc(struct shaping_global_stat *stat) +void shaper_global_stat_session_log_send_num_inc(struct shaping_global_stat *stat) { - fieldstat_value_incrby(stat->instance, stat->column_ids[CURR_SESSION_NUM_IDX], 1); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->session_log_send, 1, __ATOMIC_RELAXED); return; } -void shaper_global_stat_curr_session_dec(struct shaping_global_stat *stat) +void shaper_global_stat_async_invoke_inc(struct shaping_global_stat *stat) { - fieldstat_value_decrby(stat->instance, stat->column_ids[CURR_SESSION_NUM_IDX], 1); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->async_invoke, 1, __ATOMIC_RELAXED); return; } -void shaper_global_stat_session_log_send_num_inc(struct shaping_global_stat *stat) +void shaper_global_stat_async_callback_inc(struct shaping_global_stat *stat) +{ + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->async_callback, 1, __ATOMIC_RELAXED); + + return; +} + +void shaper_global_stat_async_tconsume_failed_inc(struct shaping_global_stat *stat) +{ + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->async_tconsume_failed, 1, __ATOMIC_RELAXED); + + return; +} + +void shaper_global_stat_async_hincrby_failed_inc(struct shaping_global_stat *stat) +{ + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->async_hincrby_failed, 1, __ATOMIC_RELAXED); + + return; +} + +void shaper_global_stat_async_hmget_failed_inc(struct shaping_global_stat *stat) { - fieldstat_value_incrby(stat->instance, stat->column_ids[SESSION_LOG_SEND_NUM], 1); + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + + __atomic_add_fetch(&local_stat_data->async_hmget_failed, 1, __ATOMIC_RELAXED); + + return; +} + +void shaper_global_stat_throughput_inc(struct shaping_global_stat *stat, enum shaping_global_stat_dir dir, int pkt_len) +{ + struct shaping_global_stat_traffic_data *data = &stat->local_stat_data.all_traffic; + if (dir == SHAPING_GLOBAL_STAT_RX) { + __atomic_add_fetch(&data->rx_pkts, 1, __ATOMIC_RELAXED); + __atomic_add_fetch(&data->rx_bytes, pkt_len, __ATOMIC_RELAXED); + } else { + __atomic_add_fetch(&data->tx_pkts, 1, __ATOMIC_RELAXED); + __atomic_add_fetch(&data->tx_bytes, pkt_len, __ATOMIC_RELAXED); + } return; +} + +void shaper_global_stat_drop_inc(struct shaping_global_stat *stat, int pkt_len) +{ + struct shaping_global_stat_traffic_data *data = &stat->local_stat_data.all_traffic; + + __atomic_add_fetch(&data->drop_pkts, 1, __ATOMIC_RELAXED); + __atomic_add_fetch(&data->drop_bytes, pkt_len, __ATOMIC_RELAXED); + + return; +} + +void shaper_global_stat_hit_policy_throughput_inc(struct shaping_global_stat *stat, enum shaping_global_stat_dir dir, int pkt_len) +{ + struct shaping_global_stat_traffic_data *data = &stat->local_stat_data.hit_policy_traffic; + + if (dir == SHAPING_GLOBAL_STAT_RX) { + __atomic_add_fetch(&data->rx_pkts, 1, __ATOMIC_RELAXED); + __atomic_add_fetch(&data->rx_bytes, pkt_len, __ATOMIC_RELAXED); + } else { + __atomic_add_fetch(&data->tx_pkts, 1, __ATOMIC_RELAXED); + __atomic_add_fetch(&data->tx_bytes, pkt_len, __ATOMIC_RELAXED); + } + + return; +} + +void shaper_global_stat_hit_policy_drop_inc(struct shaping_global_stat *stat, int pkt_len) +{ + struct shaping_global_stat_traffic_data *data = &stat->local_stat_data.hit_policy_traffic; + + __atomic_add_fetch(&data->drop_pkts, 1, __ATOMIC_RELAXED); + __atomic_add_fetch(&data->drop_bytes, pkt_len, __ATOMIC_RELAXED); + + return; +} + +void shaper_global_stat_refresh(struct shaping_global_stat *stat) +{ + struct shaping_global_stat_data *local_stat_data = &stat->local_stat_data; + struct shaping_global_stat_traffic_data *all_traffic_data = &stat->local_stat_data.all_traffic; + struct shaping_global_stat_traffic_data *hit_policy_traffic_data = &stat->local_stat_data.hit_policy_traffic; + + fieldstat_value_set(stat->instance, stat->column_ids[CURR_SESSION_NUM_IDX], local_stat_data->curr_session_num); + fieldstat_value_set(stat->instance, stat->column_ids[QUEUEING_PKTS_IDX], local_stat_data->queueing_pkts); + fieldstat_value_set(stat->instance, stat->column_ids[QUEUEING_BYTES_IDX], local_stat_data->queueing_bytes); + + fieldstat_value_set(stat->instance, stat->column_ids[CTRL_ERR_IDX], local_stat_data->ctrl_error); + fieldstat_value_set(stat->instance, stat->column_ids[CTRL_OPENING_IDX], local_stat_data->ctrl_opening); + fieldstat_value_set(stat->instance, stat->column_ids[CTRL_ACTIVE_IDX], local_stat_data->ctrl_active); + fieldstat_value_set(stat->instance, stat->column_ids[CTRL_CLOSE_IDX], local_stat_data->ctrl_close); + fieldstat_value_set(stat->instance, stat->column_ids[CTRL_RESETALL_IDX], local_stat_data->ctrl_resetall); + fieldstat_value_set(stat->instance, stat->column_ids[SESSION_LOG_SEND_IDX], local_stat_data->session_log_send); + + fieldstat_value_set(stat->instance, stat->column_ids[ASYNC_INVOKE_IDX], local_stat_data->async_invoke); + fieldstat_value_set(stat->instance, stat->column_ids[ASYNC_CALLBACK_IDX], local_stat_data->async_callback); + fieldstat_value_set(stat->instance, stat->column_ids[ASYNC_TCONSUME_FAILED], local_stat_data->async_tconsume_failed); + fieldstat_value_set(stat->instance, stat->column_ids[ASYNC_HINCRBY_FAILED], local_stat_data->async_hincrby_failed); + fieldstat_value_set(stat->instance, stat->column_ids[ASYNC_HMGET_FAILED], local_stat_data->async_hmget_failed); + + fieldstat_value_set(stat->instance, stat->column_ids[RX_PKTS_IDX], all_traffic_data->rx_pkts); + fieldstat_value_set(stat->instance, stat->column_ids[RX_BYTES_IDX], all_traffic_data->rx_bytes); + fieldstat_value_set(stat->instance, stat->column_ids[TX_PKTS_IDX], all_traffic_data->tx_pkts); + fieldstat_value_set(stat->instance, stat->column_ids[TX_BYTES_IDX], all_traffic_data->tx_bytes); + fieldstat_value_set(stat->instance, stat->column_ids[DROP_PKTS_IDX], all_traffic_data->drop_pkts); + fieldstat_value_set(stat->instance, stat->column_ids[DROP_BYTES_IDX], all_traffic_data->drop_pkts); + + fieldstat_value_set(stat->instance, stat->column_ids[HIT_POLICY_RX_PKTS_IDX], hit_policy_traffic_data->rx_pkts); + fieldstat_value_set(stat->instance, stat->column_ids[HIT_POLICY_RX_BYTES_IDX], hit_policy_traffic_data->rx_bytes); + fieldstat_value_set(stat->instance, stat->column_ids[HIT_POLICY_TX_PKTS_IDX], hit_policy_traffic_data->tx_pkts); + fieldstat_value_set(stat->instance, stat->column_ids[HIT_POLICY_TX_BYTES_IDX], hit_policy_traffic_data->tx_bytes); + fieldstat_value_set(stat->instance, stat->column_ids[HIT_POLICY_DROP_PKTS_IDX], hit_policy_traffic_data->drop_pkts); + fieldstat_value_set(stat->instance, stat->column_ids[HIT_POLICY_DROP_BYTES_IDX], hit_policy_traffic_data->drop_bytes); + + fieldstat_passive_output(stat->instance); }
\ No newline at end of file |
