summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfumingwei <[email protected]>2023-04-06 20:55:12 +0800
committerfumingwei <[email protected]>2023-04-11 18:40:50 +0800
commita31d2c750f1b3fa2a0b718505ae528232cab19a3 (patch)
tree832fc745e1f3c61e60849c22772f06b47f133b98 /src
parent1e22236b3fdce7446422fedb03594cf09c3d4cfb (diff)
bugfix:TSG-14523:修复单独输出prometheus和line protocol数据异常的bugv3.0.2bugfix-promethues-output-zero-value
Diffstat (limited to 'src')
-rw-r--r--src/fieldstat.cpp27
-rw-r--r--src/fieldstat_dynamic.cpp6
-rw-r--r--src/fieldstat_internal.h6
-rw-r--r--src/file_output.cpp16
-rw-r--r--src/line_protocol_output.cpp30
-rw-r--r--src/prometheus_output.cpp9
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;
}