summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfumingwei <[email protected]>2023-05-04 17:14:26 +0800
committerfumingwei <[email protected]>2023-05-11 20:20:44 +0800
commite414bbf8a5255b6af6f22a3fd99331aec239c8c8 (patch)
treeff2b8e9d87798bbeee7d0574549aa60f8b6ef81d /src
parenta31d2c750f1b3fa2a0b718505ae528232cab19a3 (diff)
feature:1.修改文件输出格式2.新增设置metric ratio和invisible属性接口
Diffstat (limited to 'src')
-rw-r--r--src/fieldstat.cpp65
-rw-r--r--src/file_output.cpp155
-rw-r--r--src/line_protocol_output.cpp26
3 files changed, 216 insertions, 30 deletions
diff --git a/src/fieldstat.cpp b/src/fieldstat.cpp
index 6014600..0caa896 100644
--- a/src/fieldstat.cpp
+++ b/src/fieldstat.cpp
@@ -1074,3 +1074,68 @@ void disable_line_protocol_output(struct line_protocol_output *line_protocol_out
}
return;
}
+
+
+int fieldstat_set_metric_ratio_para(struct fieldstat_instance *instance, int metric_id, int numerator_metric_id, int denominator_metric_id, int output_scaling)
+{
+ struct metric *metric = NULL;
+ struct metric *metric_n = NULL;
+ struct metric *metric_d = NULL;
+ if(instance->running == 1)
+ {
+ return -1;
+ }
+ if(metric_id >= instance->metric_cnt || numerator_metric_id >= instance->metric_cnt ||denominator_metric_id >= instance->metric_cnt)
+ {
+ return -1;
+ }
+
+ metric = get_metric(instance, metric_id);
+ metric_n = get_metric(instance, numerator_metric_id);
+ metric_d = get_metric(instance, denominator_metric_id);
+
+ if(metric->field_type != FIELD_TYPE_GAUGE && metric->field_type != FIELD_TYPE_COUNTER)
+ {
+ return -1;
+ }
+
+ if(metric_n->field_type != FIELD_TYPE_GAUGE && metric_n->field_type != FIELD_TYPE_COUNTER)
+ {
+ return -1;
+ }
+
+ if(metric_d->field_type != FIELD_TYPE_GAUGE && metric_d->field_type != FIELD_TYPE_COUNTER)
+ {
+ return -1;
+ }
+ if(output_scaling == 0)
+ {
+ return -1;
+ }
+
+ metric->is_ratio = 1;
+ metric->numerator_id = numerator_metric_id;
+ metric->denominator_id = denominator_metric_id;
+ metric->output_scaling = output_scaling;
+
+ return 0;
+}
+
+
+int fieldstat_set_metric_invisible_para(struct fieldstat_instance *instance, int metric_id)
+{
+ struct metric *metric = NULL;
+ if(instance->running == 1)
+ {
+ return -1;
+ }
+ if(metric_id >= instance->metric_cnt)
+ {
+ return -1;
+ }
+
+ metric = get_metric(instance, metric_id);
+ metric->is_invisible = 1;
+
+ return 0;
+} \ No newline at end of file
diff --git a/src/file_output.cpp b/src/file_output.cpp
index d585160..7416c1f 100644
--- a/src/file_output.cpp
+++ b/src/file_output.cpp
@@ -30,11 +30,41 @@ static int append_tags_to_print_buf(char *tag_key[], char *tag_value[], size_t n
return used_len;
}
+
+static double get_ratio_value(struct fieldstat_instance *instance, struct metric *metric, enum field_calc_algo calc_type)
+{
+ long long value_n=0,value_d=0;
+ double ratio=0.0;
+ struct metric *metric_n = get_metric(instance, metric->numerator_id);
+ struct metric *metric_d = get_metric(instance, metric->denominator_id);
+
+ value_n = get_metric_unit_val(metric_n, calc_type, 1);
+ value_d = get_metric_unit_val(metric_d, calc_type, 1);
+
+ if(value_d == 0)
+ {
+ ratio = 0.0;
+ }
+ else
+ {
+ if(metric->output_scaling > 0)
+ {
+ ratio = ((double)value_n * metric->output_scaling / value_d);
+ }
+ else
+ {
+ ratio = ((double)value_n / (value_d * metric->output_scaling * -1));
+ }
+ }
+ return ratio;
+}
+
static int output_file_format_default_type_gauge(struct fieldstat_instance *instance, int current_metric_cnt,long long interval_ms, char *print_buf, unsigned int size)
{
int i = 0, j = 0;
int used_len = 0;
long long value = 0;
+ double ratio = 0.0;
struct metric *metric = NULL;
char tags_buf[1024] = {0};
@@ -49,21 +79,41 @@ static int output_file_format_default_type_gauge(struct fieldstat_instance *inst
{
continue;
}
+ if(metric->is_invisible == 1)
+ {
+ get_metric_unit_val(metric, FS_CALC_CURRENT, 0);
+ continue;
+ }
if(metric->table)
{
continue;
}
- value = get_metric_unit_val(metric, FS_CALC_CURRENT, 0);
memset(tags_buf, 0, sizeof(tags_buf));
append_tags_to_print_buf(metric->tag_key, metric->tag_value, metric->n_tag, tags_buf, sizeof(tags_buf));
- used_len += snprintf(print_buf + used_len,
- size - used_len,
- "%s %s: %-10lld\t",
- metric->field_name,
- tags_buf,
- value
- );
+ if(metric->is_ratio == 0)
+ {
+ value = get_metric_unit_val(metric, FS_CALC_CURRENT, 0);
+ used_len += snprintf(print_buf + used_len,
+ size - used_len,
+ "%12s%s: %-10lld",
+ metric->field_name,
+ tags_buf,
+ value
+ );
+ }
+ else
+ {
+ ratio = get_ratio_value(instance, metric, FS_CALC_CURRENT);
+ used_len += snprintf(print_buf + used_len,
+ size - used_len,
+ "%12s%s: %-10.2e",
+ metric->field_name,
+ tags_buf,
+ ratio
+ );
+ }
+
j++;
if(j == STATUS_PER_LINE)
{
@@ -90,6 +140,7 @@ static int output_file_format_default_type_counter(struct fieldstat_instance *in
int used_len = 0;
int metric_cnt = 0;
long long value = 0;
+ double ratio = 0;
struct metric *metric = NULL;
int metric_id[INIT_STAT_FIELD_NUM] = {0};
char tags_buf[1024];
@@ -106,6 +157,11 @@ 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_SPEED, 0);
+ continue;
+ }
if(metric->table)
{
continue;
@@ -137,9 +193,16 @@ static int output_file_format_default_type_counter(struct fieldstat_instance *in
for(j=0; j < FIELD_PER_LINE && i+j < metric_cnt; j++)
{
metric = get_metric(instance, metric_id[i+j]);
- value = get_metric_unit_val(metric,FS_CALC_CURRENT, 1);
-
- used_len += snprintf(print_buf + used_len, size - used_len, "%10lld\t", value);
+ if(metric->is_ratio == 0)
+ {
+ value = get_metric_unit_val(metric,FS_CALC_CURRENT, 1);
+ used_len += snprintf(print_buf + used_len, size - used_len, "%10lld\t", value);
+ }
+ else
+ {
+ ratio = get_ratio_value(instance, metric, FS_CALC_CURRENT);
+ used_len += snprintf(print_buf + used_len, size - used_len, "%10.2f\t", ratio);
+ }
}
used_len += snprintf(print_buf + used_len, size - used_len, "\nspeed/s\t");
@@ -147,13 +210,25 @@ static int output_file_format_default_type_counter(struct fieldstat_instance *in
for(j = 0; j<FIELD_PER_LINE&&i+j<metric_cnt; j++)
{
metric = get_metric(instance, metric_id[i+j]);
- value = get_metric_unit_val(metric,FS_CALC_SPEED, 0);
+ if(metric->is_ratio == 0)
+ {
+ value = get_metric_unit_val(metric,FS_CALC_SPEED, 0);
+ used_len += snprintf(print_buf + used_len,
+ size - used_len,
+ "%10lld\t",
+ value*1000/interval_ms
+ );
+ }
+ else
+ {
+ ratio = get_ratio_value(instance, metric, FS_CALC_SPEED);
+ used_len += snprintf(print_buf + used_len,
+ size - used_len,
+ "%10.2f\t",
+ ratio*1000/interval_ms
+ );
- used_len += snprintf(print_buf + used_len,
- size - used_len,
- "%10lld\t",
- value*1000/interval_ms
- );
+ }
}
i += (j-1);
@@ -183,15 +258,17 @@ static int output_file_format_default_table(struct fieldstat_instance *instance,
struct metric *metric = NULL;
long long value = 0;
int used_len = 0;
+ double ratio = 0.0;
for(i = 0; i < current_table_cnt; i++) //per table
{
table = instance->table_metrics[i];
- used_len += snprintf(print_buf + used_len, size - used_len, "%-20s\t\t", table->name);
+ used_len += snprintf(print_buf + used_len, size - used_len, "table name: %-s\n", table->name);
+ used_len += snprintf(print_buf + used_len, size - used_len, "%-22.22s", " ");
for(j = 0; j < table->column_cnt; j ++)
{
//print table column
- used_len += snprintf(print_buf + used_len, size - used_len, "\t%10s", table->column_name[j]);
+ used_len += snprintf(print_buf + used_len, size - used_len, "%20.19s", table->column_name[j]);
}
for(j = 0; j < tables_line_cnt[i]; j++) //per line
{
@@ -201,7 +278,7 @@ static int output_file_format_default_table(struct fieldstat_instance *instance,
continue;
}
//print table line name + tag
- used_len += snprintf(print_buf + used_len, size - used_len, "\n%s ", line->name);
+ used_len += snprintf(print_buf + used_len, size - used_len, "\n%-22.22s", line->name);
used_len += append_tags_to_print_buf(line->tag_key, line->tag_value, line->n_tag,
print_buf + used_len, size - used_len);
@@ -211,10 +288,40 @@ static int output_file_format_default_table(struct fieldstat_instance *instance,
//print table metric value
metric_id = line->metric_id_belong_to_line[k];
metric = get_metric(instance,metric_id);
- value = get_metric_unit_val(metric, FS_CALC_CURRENT, 0);
-
- used_len += snprintf(print_buf + used_len, size - used_len, "%10lld\t", value);
-
+ if(metric->is_invisible == 1)
+ {
+ continue;
+ }
+ switch(metric->field_type)
+ {
+ case FIELD_TYPE_GAUGE:
+ if(metric->is_ratio == 0)
+ {
+ value = get_metric_unit_val(metric, FS_CALC_CURRENT, 0);
+ used_len += snprintf(print_buf + used_len, size - used_len, "%20lld", value);
+ }
+ else
+ {
+ ratio = get_ratio_value(instance, metric, FS_CALC_CURRENT);
+ used_len += snprintf(print_buf + used_len, size - used_len, "%20.2e", ratio);
+ }
+ break;
+
+ case FIELD_TYPE_COUNTER:
+ if(metric->is_ratio == 0)
+ {
+ value = get_metric_unit_val(metric, FS_CALC_SPEED, 0);
+ used_len += snprintf(print_buf + used_len, size - used_len, "%20.2e", (double)value*1000/interval_ms);
+ }
+ else
+ {
+ ratio = get_ratio_value(instance, metric, FS_CALC_SPEED);
+ used_len += snprintf(print_buf + used_len, size - used_len, "%20.2e", (double)ratio*1000/interval_ms);
+ }
+ break;
+ default:
+ break;
+ }
}
}
diff --git a/src/line_protocol_output.cpp b/src/line_protocol_output.cpp
index 372db3d..3b8ef00 100644
--- a/src/line_protocol_output.cpp
+++ b/src/line_protocol_output.cpp
@@ -173,9 +173,10 @@ static int build_single_metric_line_buf(char *instance_name, int output_type, st
}
-static int read_table_row_value(struct metric **row_metric, int output_type, int n_column, long long *out_row_value)
+static int read_table_row(struct metric **row_metric, char *column_name[], int output_type, int n_column, char *out_column_name[], long long *out_row_value)
{
int i = 0;
+ int n_send = 0;
struct metric *metric = NULL;
if(row_metric == NULL || n_column < 1)
@@ -186,9 +187,15 @@ static int read_table_row_value(struct metric **row_metric, int output_type, int
for(i = 0; i < n_column; i++)
{
metric = row_metric[i];
- out_row_value[i] = read_single_metric_value(metric, output_type);
+ if(metric->is_ratio == 1 || metric->is_invisible == 1)
+ {
+ continue;
+ }
+ out_row_value[n_send] = read_single_metric_value(metric, output_type);
+ out_column_name[n_send] = column_name[i];
+ n_send++;
}
- return 0;
+ return n_send;
}
@@ -196,19 +203,22 @@ static int build_table_row_line_buf(char *instance_name, int output_type, struct
{
int used_len = 0;
struct metric *metric = NULL;
+ int n_send = 0;
if(table->column_cnt <= 0)
{
return 0;
}
long long row_value[table->column_cnt];
+ char *column_name[table->column_cnt];
+ n_send = read_table_row(row_metric, table->column_name, output_type, table->column_cnt, column_name, row_value);
- if(-1 == read_table_row_value(row_metric, output_type, table->column_cnt, row_value))
+ if(n_send < 1)
{
return 0;
}
- if(1 != is_send_table_row(row_value, table->column_cnt))
+ if(1 != is_send_table_row(row_value, n_send))
{
return 0;
}
@@ -223,7 +233,7 @@ static int build_table_row_line_buf(char *instance_name, int output_type, struct
used_len += snprintf(line_buf + used_len, line_buf_size - used_len, " ");
- used_len += add_table_row_field_set(table->column_name, row_value, table->column_cnt, line_buf + used_len, line_buf_size - used_len);
+ used_len += add_table_row_field_set(column_name, row_value, n_send, line_buf + used_len, line_buf_size - used_len);
used_len += snprintf(line_buf + used_len, line_buf_size - used_len, "\n");
@@ -247,6 +257,10 @@ static void output_line_protocol_single_metric(struct fieldstat_instance *instan
{
continue;
}
+ if(metric->is_ratio == 1)
+ {
+ continue;
+ }
memset(line_buf, 0, sizeof(line_buf));
used_len = build_single_metric_line_buf(instance->name, instance->output_type, metric, line_buf, sizeof(line_buf));