diff options
| author | fumingwei <[email protected]> | 2023-04-06 20:55:12 +0800 |
|---|---|---|
| committer | fumingwei <[email protected]> | 2023-04-11 18:40:50 +0800 |
| commit | a31d2c750f1b3fa2a0b718505ae528232cab19a3 (patch) | |
| tree | 832fc745e1f3c61e60849c22772f06b47f133b98 /src | |
| parent | 1e22236b3fdce7446422fedb03594cf09c3d4cfb (diff) | |
bugfix:TSG-14523:修复单独输出prometheus和line protocol数据异常的bugv3.0.2bugfix-promethues-output-zero-value
Diffstat (limited to 'src')
| -rw-r--r-- | src/fieldstat.cpp | 27 | ||||
| -rw-r--r-- | src/fieldstat_dynamic.cpp | 6 | ||||
| -rw-r--r-- | src/fieldstat_internal.h | 6 | ||||
| -rw-r--r-- | src/file_output.cpp | 16 | ||||
| -rw-r--r-- | src/line_protocol_output.cpp | 30 | ||||
| -rw-r--r-- | src/prometheus_output.cpp | 9 |
6 files changed, 59 insertions, 35 deletions
diff --git a/src/fieldstat.cpp b/src/fieldstat.cpp index 0ad0e67..6014600 100644 --- a/src/fieldstat.cpp +++ b/src/fieldstat.cpp @@ -344,6 +344,7 @@ int fieldstat_set_local_output(struct fieldstat_instance *instance, const char * strncpy(instance->local_output_filename, (char *)filename, len_filename); strncpy(instance->local_output_format, (char *)format, len_format); instance->local_output_enable = 1; + instance->output_type |= 8; return 0; } @@ -360,6 +361,7 @@ int fieldstat_set_line_protocol_server(struct fieldstat_instance *instance, cons if(ret == 0) { instance->line_protocol_output_enable = 1; + instance->output_type |= 4; } return ret; @@ -379,6 +381,7 @@ int fieldstat_set_statsd_server(struct fieldstat_instance *instance, const char instance->statsd_server_port = port; instance->statsd_output_enable = 1; + instance->output_type |= 2; return 0; } @@ -460,6 +463,28 @@ long long get_metric_unit_val(struct metric *metric,enum field_calc_algo calc_ty return value; } +long long read_metric_current_value(struct metric *metric) +{ + stat_unit_t* target = NULL; + long long value = 0; + switch(metric->field_type) + { + case FIELD_TYPE_COUNTER: + target = &(metric->counter); + break; + case FIELD_TYPE_GAUGE: + target = &(metric->gauge); + break; + default: + break; + } + + value = threadsafe_counter_read(&(target->changing)); + value += target->accumulated; + + return value; +} + long long hdr_count_le_value(const struct hdr_histogram* h, long long value) { struct hdr_iter iter; @@ -494,7 +519,7 @@ void fieldstat_passive_output(struct fieldstat_instance *instance) if(instance->local_output_enable) { - ret = fieldstat_output_file(instance, interval_ms); + ret = file_output(instance, interval_ms); } if(instance->line_protocol_output_enable) { diff --git a/src/fieldstat_dynamic.cpp b/src/fieldstat_dynamic.cpp index 5a0609e..c10dc56 100644 --- a/src/fieldstat_dynamic.cpp +++ b/src/fieldstat_dynamic.cpp @@ -111,6 +111,7 @@ int fieldstat_dynamic_set_line_protocol_server(struct fieldstat_dynamic_instance if(ret == 0) { instance->line_protocol_output_enable = 1; + instance->output_type |= 4; } return ret; @@ -513,9 +514,8 @@ static long long dynamic_metric_value_read(struct fieldstat_dynamic_instance *in { return 0; } - metric->field_type == FIELD_TYPE_GAUGE - ?value = get_metric_unit_val(metric, FS_CALC_CURRENT, 0) - :value = get_metric_unit_val(metric, FS_CALC_SPEED, 0); + value = read_metric_current_value(metric); + return value; } diff --git a/src/fieldstat_internal.h b/src/fieldstat_internal.h index 58bd58c..eb3b5d0 100644 --- a/src/fieldstat_internal.h +++ b/src/fieldstat_internal.h @@ -194,7 +194,7 @@ struct fieldstat_instance int summary_cnt; struct timespec last_output_time; - + int output_type; // 0b0000:not output, 0b1000:output file, 0b0100:output line_protocol, 0b0010: output statsd, 0b0001: output prometheus }; struct prometheus_endpoint_instance @@ -236,6 +236,7 @@ struct fieldstat_dynamic_instance struct dynamic_metric **n_thread_dynamic_metric; int n_thread; + int output_type; // 0b0000:not output, 0b1000:output file, 0b0100:output line_protocol, 0b0010: output statsd, 0b0001: output prometheus }; @@ -245,12 +246,13 @@ char* __str_dup(const char* str); long long hdr_count_le_value(const struct hdr_histogram* h, long long value); struct metric * get_metric(struct fieldstat_instance *instance, int metric_id); long long get_metric_unit_val(struct metric *metric,enum field_calc_algo calc_type,int is_refer); +long long read_metric_current_value(struct metric *metric); int is_valid_field_name(const char* name); int is_valid_tags(const struct fieldstat_tag *tags, size_t n_tags); struct metric ** read_metric_slot(struct fieldstat_instance *instance, int metric_id); struct metric * metric_new(enum field_type type, const char *field_name, const struct fieldstat_tag tags[], size_t n_tag); void metric_free(struct metric *metric); -int fieldstat_output_file(struct fieldstat_instance *instance,long long interval_ms); +int file_output(struct fieldstat_instance *instance,long long interval_ms); struct table_line * read_table_line(struct table_metric *table, int line_id); int send_udp(int sd, unsigned int dest_ip, unsigned short dest_port, const char * data, int len); int line_protocol_output(struct fieldstat_instance *instance); diff --git a/src/file_output.cpp b/src/file_output.cpp index 3ffea17..d585160 100644 --- a/src/file_output.cpp +++ b/src/file_output.cpp @@ -53,11 +53,6 @@ static int output_file_format_default_type_gauge(struct fieldstat_instance *inst { continue; } - if(metric->is_invisible == 1) - { - value = get_metric_unit_val(metric, FS_CALC_SPEED, 0); - continue; - } value = get_metric_unit_val(metric, FS_CALC_CURRENT, 0); memset(tags_buf, 0, sizeof(tags_buf)); @@ -115,11 +110,6 @@ static int output_file_format_default_type_counter(struct fieldstat_instance *in { continue; } - if(metric->is_invisible == 1) - { - get_metric_unit_val(metric, FS_CALC_CURRENT, 0); - continue; - } metric_id[metric_cnt] = i; metric_cnt++; } @@ -481,8 +471,8 @@ int output_file_format_json(struct fieldstat_instance *instance, int n_cur_metri cJSON_AddStringToObject(tmp_obj, "column_name", metric->table->column_name[metric->table_column_id]); } metric->field_type == FIELD_TYPE_COUNTER - ?cJSON_AddStringToObject(tmp_obj, "type", "gauge") - :cJSON_AddStringToObject(tmp_obj, "type", "counter"); + ?cJSON_AddStringToObject(tmp_obj, "type", "counter") + :cJSON_AddStringToObject(tmp_obj, "type", "gauge"); value = get_metric_unit_val(metric, FS_CALC_CURRENT, 1); cJSON_AddNumberToObject(tmp_obj, "acc", value); value = get_metric_unit_val(metric, FS_CALC_SPEED, 0); @@ -560,7 +550,7 @@ int output_file_format_json(struct fieldstat_instance *instance, int n_cur_metri } -int fieldstat_output_file(struct fieldstat_instance *instance,long long interval_ms) +int file_output(struct fieldstat_instance *instance,long long interval_ms) { int used_len = 0; int current_table_cnt = 0; diff --git a/src/line_protocol_output.cpp b/src/line_protocol_output.cpp index bead3ca..372db3d 100644 --- a/src/line_protocol_output.cpp +++ b/src/line_protocol_output.cpp @@ -84,12 +84,16 @@ static int add_user_tag_set(struct metric *metric, char *line_buf, unsigned int return used_len; } -static long long read_single_metric_value(struct metric *metric) +static long long read_single_metric_value(struct metric *metric, int output_type) { long long value = 0; + int is_refer = 1; + (output_type >= 4 && output_type < 8) + ?is_refer = 0 + :is_refer = 1; metric->field_type == FIELD_TYPE_GAUGE - ?value = get_metric_unit_val(metric, FS_CALC_CURRENT, 0) - :value = get_metric_unit_val(metric, FS_CALC_SPEED, 0); + ?value = get_metric_unit_val(metric, FS_CALC_CURRENT, is_refer) + :value = get_metric_unit_val(metric, FS_CALC_SPEED, is_refer); return value; } @@ -141,12 +145,12 @@ static int add_table_row_field_set(char *column_name[], long long *row_value, in -static int build_single_metric_line_buf(char *instance_name, struct metric *metric, char *line_buf, int line_buf_size) +static int build_single_metric_line_buf(char *instance_name, int output_type, struct metric *metric, char *line_buf, int line_buf_size) { int used_len = 0; long long value = 0; - value = read_single_metric_value(metric); + value = read_single_metric_value(metric, output_type); if(value == 0) { @@ -169,7 +173,7 @@ static int build_single_metric_line_buf(char *instance_name, struct metric *metr } -static int read_table_row_value(struct metric **row_metric, int n_column, long long *out_row_value) +static int read_table_row_value(struct metric **row_metric, int output_type, int n_column, long long *out_row_value) { int i = 0; struct metric *metric = NULL; @@ -182,13 +186,13 @@ static int read_table_row_value(struct metric **row_metric, int n_column, long l for(i = 0; i < n_column; i++) { metric = row_metric[i]; - out_row_value[i] = read_single_metric_value(metric); + out_row_value[i] = read_single_metric_value(metric, output_type); } return 0; } -static int build_table_row_line_buf(char *instance_name, struct table_metric *table, struct metric **row_metric, char *line_buf, int line_buf_size) +static int build_table_row_line_buf(char *instance_name, int output_type, struct table_metric *table, struct metric **row_metric, char *line_buf, int line_buf_size) { int used_len = 0; struct metric *metric = NULL; @@ -199,7 +203,7 @@ static int build_table_row_line_buf(char *instance_name, struct table_metric *ta } long long row_value[table->column_cnt]; - if(-1 == read_table_row_value(row_metric, table->column_cnt, row_value)) + if(-1 == read_table_row_value(row_metric, output_type, table->column_cnt, row_value)) { return 0; } @@ -245,7 +249,7 @@ static void output_line_protocol_single_metric(struct fieldstat_instance *instan } memset(line_buf, 0, sizeof(line_buf)); - used_len = build_single_metric_line_buf(instance->name, metric, line_buf, sizeof(line_buf)); + used_len = build_single_metric_line_buf(instance->name, instance->output_type, metric, line_buf, sizeof(line_buf)); send_line_buf(&instance->line_protocol_output, line_buf, used_len); } @@ -280,7 +284,7 @@ static void output_line_protocol_table_row(struct fieldstat_instance *instance, row_metrics[k] = get_metric(instance, row->metric_id_belong_to_line[k]); } - used_len = build_table_row_line_buf(instance->name, table, row_metrics, line_buf, sizeof(line_buf)); + used_len = build_table_row_line_buf(instance->name, instance->output_type, table, row_metrics, line_buf, sizeof(line_buf)); send_line_buf(&instance->line_protocol_output, line_buf, used_len); } @@ -330,11 +334,11 @@ int line_protocol_dynamic_metric_output(struct fieldstat_dynamic_instance *insta memset(line_buf, 0, sizeof(line_buf)); if(metric->table) { - used_len = build_table_row_line_buf(instance->name, metric->table, metrics, line_buf, sizeof(line_buf)); + used_len = build_table_row_line_buf(instance->name, instance->output_type, metric->table, metrics, line_buf, sizeof(line_buf)); } else { - used_len = build_single_metric_line_buf(instance->name, metric, line_buf, sizeof(line_buf)); + used_len = build_single_metric_line_buf(instance->name, instance->output_type, metric, line_buf, sizeof(line_buf)); } send_line_buf(&instance->line_protocol_output, line_buf, used_len); } diff --git a/src/prometheus_output.cpp b/src/prometheus_output.cpp index 2b605e8..a4e4d88 100644 --- a/src/prometheus_output.cpp +++ b/src/prometheus_output.cpp @@ -129,14 +129,14 @@ static void prometheus_output_uri_list(struct prometheus_endpoint_instance *prom static int prometheus_output_read_metric_tags(struct metric *metric, char *instance_name, char *tags_buf, unsigned int size) { int i = 0;//used_len = 0; - char unescape[STR_LEN_256] = {0}; + char unescape[256] = {0}; int used_len = 0; used_len += snprintf(tags_buf + used_len, size - used_len, "app_name=\"%s\"", instance_name); if(metric->table) { - used_len += snprintf(tags_buf + used_len, size - used_len, ",line_name=\"%s\"", metric->field_name); + used_len += snprintf(tags_buf + used_len, size - used_len, ",table_name=\"%s\",line_name=\"%s\"", metric->table->name, metric->field_name); } for(i = 0; i < (int)metric->n_tag; i++) @@ -322,7 +322,9 @@ static int prometheus_get_instance_metric_playload(struct fieldstat_instance *in { case FIELD_TYPE_COUNTER: case FIELD_TYPE_GAUGE: - value = get_metric_unit_val(metric, FS_CALC_CURRENT, 1); + instance->output_type == 1 + ?value = get_metric_unit_val(metric, FS_CALC_CURRENT, 0) + :value = get_metric_unit_val(metric, FS_CALC_CURRENT, 1); append_offset += snprintf(new_payload + append_offset, new_payload_size - append_offset, "%s{%s} %lld\n", @@ -443,6 +445,7 @@ int fieldstat_enable_prometheus_output(struct fieldstat_instance *instance) fs_instance_id = g_prometheus_endpoint_instance.fs_instance_cnt++; g_prometheus_endpoint_instance.fs_instance[fs_instance_id] = instance; + instance->output_type |= 1; return 0; } |
