diff options
| author | fumingwei <[email protected]> | 2023-05-04 17:14:26 +0800 |
|---|---|---|
| committer | fumingwei <[email protected]> | 2023-05-11 20:20:44 +0800 |
| commit | e414bbf8a5255b6af6f22a3fd99331aec239c8c8 (patch) | |
| tree | ff2b8e9d87798bbeee7d0574549aa60f8b6ef81d /src | |
| parent | a31d2c750f1b3fa2a0b718505ae528232cab19a3 (diff) | |
feature:1.修改文件输出格式2.新增设置metric ratio和invisible属性接口
Diffstat (limited to 'src')
| -rw-r--r-- | src/fieldstat.cpp | 65 | ||||
| -rw-r--r-- | src/file_output.cpp | 155 | ||||
| -rw-r--r-- | src/line_protocol_output.cpp | 26 |
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)); |
