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 | |
| parent | a31d2c750f1b3fa2a0b718505ae528232cab19a3 (diff) | |
feature:1.修改文件输出格式2.新增设置metric ratio和invisible属性接口
| -rw-r--r-- | ctest/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | inc/fieldstat.h | 20 | ||||
| -rw-r--r-- | src/fieldstat.cpp | 65 | ||||
| -rw-r--r-- | src/file_output.cpp | 155 | ||||
| -rw-r--r-- | src/line_protocol_output.cpp | 26 | ||||
| -rw-r--r-- | test/src/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | test/src/gtest_dynamic_fieldstat.cpp | 12 | ||||
| -rw-r--r-- | test/src/gtest_dynamic_fieldstat_output.cpp | 4 | ||||
| -rw-r--r-- | test/src/gtest_fieldstat_interface.cpp | 201 | ||||
| -rw-r--r-- | test/src/gtest_fieldstat_output.cpp | 271 | ||||
| -rw-r--r-- | test/src/gtest_fieldstat_output_file_instance.cpp | 236 |
11 files changed, 833 insertions, 165 deletions
diff --git a/ctest/CMakeLists.txt b/ctest/CMakeLists.txt index c25ad35..a20b703 100644 --- a/ctest/CMakeLists.txt +++ b/ctest/CMakeLists.txt @@ -8,6 +8,7 @@ add_test(NAME COPY_GTEST_INTERFACE_BINARY COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/ add_test(NAME COPY_GTEST_OUTPUT_BINARY COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/test/src/gtest_fieldstat_output ${CMAKE_BINARY_DIR}/testing/") add_test(NAME COPY_GTEST_DYNAMIC_BINARY COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/test/src/gtest_dynamic_fieldstat ${CMAKE_BINARY_DIR}/testing/") add_test(NAME COPY_GTEST_DYNAMIC_OUTPUT_BINARY COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/test/src/gtest_dynamic_fieldstat_output ${CMAKE_BINARY_DIR}/testing/") +add_test(NAME COPY_GTEST_OUTPUT_FILE_INSTANCE_BINARY COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/test/src/gtest_fieldstat_output_file_instance ${CMAKE_BINARY_DIR}/testing/") set(GTEST_RUN_DIR ${CMAKE_BINARY_DIR}/testing) #add_test(NAME GTEST_RULE COMMAND gtest_rule WORKING_DIRECTORY ${GTEST_RUN_DIR}) @@ -15,4 +16,4 @@ add_test(NAME GTEST_FIELDSTAT_INTERFACE COMMAND gtest_fieldstat_interface WORKIN add_test(NAME GTEST_FIELDSTAT_OUTPUT COMMAND gtest_fieldstat_output WORKING_DIRECTORY ${GTEST_RUN_DIR}) add_test(NAME GTEST_DYNAMIC_FIELDSTAT COMMAND gtest_dynamic_fieldstat WORKING_DIRECTORY ${GTEST_RUN_DIR}) add_test(NAME GTEST_DYNAMIC_FIELDSTAT_OUTPUT COMMAND gtest_dynamic_fieldstat_output WORKING_DIRECTORY ${GTEST_RUN_DIR}) - +add_test(NAME GTEST_FIELDSTAT_OUTPUT_FILE_INSTANCE COMMAND gtest_fieldstat_output_file_instance WORKING_DIRECTORY ${GTEST_RUN_DIR}) diff --git a/inc/fieldstat.h b/inc/fieldstat.h index 5312549..157b68e 100644 --- a/inc/fieldstat.h +++ b/inc/fieldstat.h @@ -349,16 +349,32 @@ void fieldstat_dynamic_instance_free(struct fieldstat_dynamic_instance *instance */ long long fieldstat_dynamic_table_metric_value_get(struct fieldstat_dynamic_instance *instance, int table_id, unsigned int column_id, const char *row_name, const struct fieldstat_tag tags[], size_t n_tags, int thread_id); /** - * fieldstat dynamic instance metric value set operate. metirc type in[gauge, counter] + * fieldstat dynamic instance metric value get operate. metirc type in[gauge, counter] * @param instance The fieldstat dynamic instance. * @param field_name The metric field name. - * @param value The set value. * @param tags The tag array. * @param n_tag Size of tags[] * @param thread_id The thread id of the call. * @return long long value. */ long long fieldstat_dynamic_metric_value_get(struct fieldstat_dynamic_instance *instance, const char *field_name, const struct fieldstat_tag tags[], size_t n_tags, int thread_id); +/** + * fieldstat set metric ratio parameter. + * @param instance The fieldstat instance. + * @param metric_id The metric id need to set ratio. + * @param numerator_metric_id The metric id as numerator. + * @param denominator_metric_id The metric id as denominator. + * @return -1 is failed. 0 is success. + */ +int fieldstat_set_metric_ratio_para(struct fieldstat_instance *instance, int metric_id, int numerator_metric_id, int denominator_metric_id, int output_scaling); + +/** + * fieldstat set metric invisible parameter. + * @param instance The fieldstat instance. + * @param metric_id The metric id need to set invisible. + * @return -1 is failed. 0 is success. + */ +int fieldstat_set_metric_invisible_para(struct fieldstat_instance *instance, int metric_id); #ifdef __cplusplus } 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)); diff --git a/test/src/CMakeLists.txt b/test/src/CMakeLists.txt index 044eb5d..03311e2 100644 --- a/test/src/CMakeLists.txt +++ b/test/src/CMakeLists.txt @@ -16,4 +16,7 @@ add_executable(gtest_dynamic_fieldstat ${SRC} gtest_dynamic_fieldstat.cpp) target_link_libraries(gtest_dynamic_fieldstat gtest-static) add_executable(gtest_dynamic_fieldstat_output ${SRC} gtest_dynamic_fieldstat_output.cpp) -target_link_libraries(gtest_dynamic_fieldstat_output gtest-static)
\ No newline at end of file +target_link_libraries(gtest_dynamic_fieldstat_output gtest-static) + +add_executable(gtest_fieldstat_output_file_instance ${SRC} gtest_fieldstat_output_file_instance.cpp) +target_link_libraries(gtest_fieldstat_output_file_instance gtest-static)
\ No newline at end of file diff --git a/test/src/gtest_dynamic_fieldstat.cpp b/test/src/gtest_dynamic_fieldstat.cpp index c58d4f3..748ed15 100644 --- a/test/src/gtest_dynamic_fieldstat.cpp +++ b/test/src/gtest_dynamic_fieldstat.cpp @@ -1766,7 +1766,7 @@ TEST(FeildStatDynamicAPI, FieldStatDynamicInstanceIncrbyMultiMetric) { int ret = 0; int n_thread = 64; - int n_loops = 1000; + int n_loops = 100; struct dynamic_metric *dyn_metric, *tmp_dyn_metric; struct dynamic_metric **head = NULL; @@ -1909,7 +1909,7 @@ TEST(FeildStatDynamicAPI, FieldStatDynamicInstanceDecrbyMultiMetric) { int ret = 0; int n_thread = 64; - int n_loops = 1000; + int n_loops = 100; struct dynamic_metric *dyn_metric, *tmp_dyn_metric; struct dynamic_metric **head = NULL; @@ -2053,7 +2053,7 @@ TEST(FeildStatDynamicAPI, FieldStatDynamicInstanceSetMultiMetric) { int ret = 0; int n_thread = 64; - int n_loops = 1000; + int n_loops = 100; struct dynamic_metric *dyn_metric, *tmp_dyn_metric; struct dynamic_metric **head = NULL; @@ -2202,7 +2202,7 @@ TEST(FeildStatDynamicAPI, FieldStatDynamicInstanceMultiIncrbyMultiMetric) { int ret = 0; int n_thread = 64; - int n_loops = 1000; + int n_loops = 100; struct dynamic_metric *dyn_metric, *tmp_dyn_metric; struct dynamic_metric **head = NULL; @@ -2348,7 +2348,7 @@ TEST(FeildStatDynamicAPI, FieldStatDynamicInstanceMultiDecrbyMultiMetric) { int ret = 0; int n_thread = 64; - int n_loops = 1000; + int n_loops = 100; struct dynamic_metric *dyn_metric, *tmp_dyn_metric; struct dynamic_metric **head = NULL; @@ -2493,7 +2493,7 @@ TEST(FeildStatDynamicAPI, FieldStatDynamicInstanceMultiSetMultiMetric) { int ret = 0; int n_thread = 64; - int n_loops = 1000; + int n_loops = 100; struct dynamic_metric *dyn_metric, *tmp_dyn_metric; struct dynamic_metric **head = NULL; diff --git a/test/src/gtest_dynamic_fieldstat_output.cpp b/test/src/gtest_dynamic_fieldstat_output.cpp index fb066c4..eb694bd 100644 --- a/test/src/gtest_dynamic_fieldstat_output.cpp +++ b/test/src/gtest_dynamic_fieldstat_output.cpp @@ -73,9 +73,7 @@ TEST(FeildStatDynamicAPI, FieldStatDynamicInstanceMultiIncrby) { int ret = 0; int n_thread = 64; - int n_loops = 100000; - - long long value = 0; + int n_loops = 10000; const char *column_name[] = {"packages", "bytes"}; enum field_type column_type[] = {FIELD_TYPE_COUNTER, FIELD_TYPE_COUNTER}; diff --git a/test/src/gtest_fieldstat_interface.cpp b/test/src/gtest_fieldstat_interface.cpp index 558f267..58a5128 100644 --- a/test/src/gtest_fieldstat_interface.cpp +++ b/test/src/gtest_fieldstat_interface.cpp @@ -332,7 +332,208 @@ TEST(FeildStatAPI, FieldStatLineProtocolOutputTableMetric) EXPECT_EQ(n_line, n_loops); fieldstat_instance_free(instance); +} + +TEST(FeildStatAPI, SetMetricRatioPara) +{ + int ret = 0; + struct fieldstat_instance * instance = NULL; + int table_id = -1; + int output_metric_ids[10] = {0}; + FILE *fp; + int n_line = 0; + int n_loops = 5; + char line[2048] = {0}; + cJSON *cjson_metric = NULL; + cJSON *cjson_tags = NULL; + char *cjson_metric_str = NULL; + + const char *output_file_path = "/tmp/fieldstat.txt"; + const char *output_telegraf_path = "/tmp/metrics.out"; + const char *table_column_name[] = {"rule", "reg/v6", "stream", "IN_Bps", "cpu_us", "PROC_Bps", "IN_Tps", "PROC_Tps","hit_cnt", "hit_rate"}; + const char *compared_file_output = "Sum 0" + " 0 0.00e+00 5.00e+02" + " 5.00e+00 5.00e+01 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00\n"; + + const char *compare = "{\"fields\":{\"IN_Bps\":1000,\"IN_Tps\":0,\"PROC_Tps\":0,\"cpu_us\":10," + "\"hit_cnt\":0,\"hit_rate\":0,\"reg/v6\":0,\"rule\":0,\"stream\":0}," + "\"name\":\"Sum\",\"tags\":{\"app_name\":\"maat\",\"table_name\":\"maat_info\"}}"; + + + enum field_type table_column_type[10] = {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}; + + instance = fieldstat_instance_new("maat"); + EXPECT_STREQ("maat", instance->name); + + table_id = fieldstat_register_table(instance, "maat_info", table_column_name, table_column_type, sizeof(table_column_name)/sizeof(table_column_name[0])); + EXPECT_EQ(0, table_id); + ret = fieldstat_register_table_row(instance, table_id, "Sum", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_set_metric_ratio_para(instance, output_metric_ids[5], output_metric_ids[3], output_metric_ids[4], 1); + EXPECT_EQ(0, ret); + ret = fieldstat_set_local_output(instance, output_file_path, "default"); + EXPECT_EQ(0, ret); + ret = fieldstat_set_line_protocol_server(instance, "127.0.0.1", 8600); + EXPECT_EQ(0, ret); + ret = system("cat /dev/null > /tmp/metrics.out"); + EXPECT_EQ(0, ret); + fieldstat_instance_start(instance); + fieldstat_value_incrby(instance, output_metric_ids[3], 1000); + fieldstat_value_incrby(instance, output_metric_ids[4], 10); + sleep(3); + + fp = fopen("/tmp/fieldstat.txt", "r"); + EXPECT_NE(nullptr, fp); + + while(!feof(fp)) + { + if(NULL == fgets(line, sizeof(line), fp)) + { + continue; + } + if(n_line == 3) + { + EXPECT_STREQ(compared_file_output, line); + } + n_line++; + } + fclose(fp); + EXPECT_EQ(n_line, n_loops); + + fp = fopen(output_telegraf_path, "r"); + EXPECT_NE(nullptr, fp); + n_line = 0; + + while(!feof(fp)) + { + if(NULL == fgets(line, sizeof(line), fp)) + { + continue; + } + cjson_metric = cJSON_Parse(line); + EXPECT_NE(nullptr, cjson_metric); + cJSON_DeleteItemFromObject(cjson_metric, "timestamp"); + + cjson_tags = cJSON_GetObjectItem(cjson_metric, "tags"); + EXPECT_NE(nullptr, cjson_tags); + cJSON_DeleteItemFromObject(cjson_tags, "host"); + cjson_metric_str = cJSON_PrintUnformatted(cjson_metric); + EXPECT_NE(nullptr, cjson_metric_str); + if(cjson_metric_str) + { + EXPECT_STREQ(compare, cjson_metric_str); + free(cjson_metric_str); + cjson_metric_str = NULL; + } + cJSON_Delete(cjson_metric); + n_line++; + } + fclose(fp); + + fieldstat_instance_free(instance); +} + +TEST(FeildStatAPI, SetMetricInvisible) +{ + int ret = 0; + struct fieldstat_instance * instance = NULL; + int table_id = -1; + int output_metric_ids[10] = {0}; + FILE *fp; + int n_line = 0; + int n_loops = 5; + char line[2048] = {0}; + cJSON *cjson_metric = NULL; + cJSON *cjson_tags = NULL; + char *cjson_metric_str = NULL; + + const char *output_file_path = "/tmp/fieldstat.txt"; + const char *output_telegraf_path = "/tmp/metrics.out"; + const char *table_column_name[] = {"rule", "reg/v6", "stream", "IN_Bps", "cpu_us", "PROC_Bps", "IN_Tps", "PROC_Tps","hit_cnt", "hit_rate"}; + const char *compared_file_output = "Sum " + " 0 0 0.00e+00" + " 5.00e+02 5.00e+01 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00\n"; + + const char *compare = "{\"fields\":{\"IN_Bps\":1000,\"IN_Tps\":0,\"PROC_Tps\":0," + "\"hit_cnt\":0,\"hit_rate\":0,\"reg/v6\":0,\"rule\":0,\"stream\":0}," + "\"name\":\"Sum\",\"tags\":{\"app_name\":\"maat\",\"table_name\":\"maat_info\"}}"; + + + enum field_type table_column_type[10] = {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}; + + instance = fieldstat_instance_new("maat"); + EXPECT_STREQ("maat", instance->name); + + table_id = fieldstat_register_table(instance, "maat_info", table_column_name, table_column_type, sizeof(table_column_name)/sizeof(table_column_name[0])); + EXPECT_EQ(0, table_id); + ret = fieldstat_register_table_row(instance, table_id, "Sum", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_set_metric_ratio_para(instance, output_metric_ids[5], output_metric_ids[3], output_metric_ids[4], 1); + EXPECT_EQ(0, ret); + ret = fieldstat_set_metric_invisible_para(instance, output_metric_ids[4]); + EXPECT_EQ(0, ret); + ret = fieldstat_set_local_output(instance, output_file_path, "default"); + EXPECT_EQ(0, ret); + ret = fieldstat_set_line_protocol_server(instance, "127.0.0.1", 8600); + EXPECT_EQ(0, ret); + ret = system("cat /dev/null > /tmp/metrics.out"); + EXPECT_EQ(0, ret); + fieldstat_instance_start(instance); + fieldstat_value_incrby(instance, output_metric_ids[3], 1000); + fieldstat_value_incrby(instance, output_metric_ids[4], 10); + sleep(3); + + fp = fopen("/tmp/fieldstat.txt", "r"); + EXPECT_NE(nullptr, fp); + + while(!feof(fp)) + { + if(NULL == fgets(line, sizeof(line), fp)) + { + continue; + } + if(n_line == 3) + { + EXPECT_STREQ(compared_file_output, line); + } + n_line++; + } + fclose(fp); + EXPECT_EQ(n_line, n_loops); + + fp = fopen(output_telegraf_path, "r"); + EXPECT_NE(nullptr, fp); + n_line = 0; + + while(!feof(fp)) + { + if(NULL == fgets(line, sizeof(line), fp)) + { + continue; + } + cjson_metric = cJSON_Parse(line); + EXPECT_NE(nullptr, cjson_metric); + cJSON_DeleteItemFromObject(cjson_metric, "timestamp"); + + cjson_tags = cJSON_GetObjectItem(cjson_metric, "tags"); + EXPECT_NE(nullptr, cjson_tags); + cJSON_DeleteItemFromObject(cjson_tags, "host"); + cjson_metric_str = cJSON_PrintUnformatted(cjson_metric); + EXPECT_NE(nullptr, cjson_metric_str); + if(cjson_metric_str) + { + EXPECT_STREQ(compare, cjson_metric_str); + free(cjson_metric_str); + cjson_metric_str = NULL; + } + cJSON_Delete(cjson_metric); + n_line++; + } + fclose(fp); + fieldstat_instance_free(instance); } diff --git a/test/src/gtest_fieldstat_output.cpp b/test/src/gtest_fieldstat_output.cpp index 9ae18de..852ad10 100644 --- a/test/src/gtest_fieldstat_output.cpp +++ b/test/src/gtest_fieldstat_output.cpp @@ -10,7 +10,7 @@ extern struct prometheus_endpoint_instance g_prometheus_endpoint_instance; TEST(FeildStatOutput, OutputFile) { int ret = 0; - int n_loops = 4; + int n_loops = 5; struct fieldstat_instance * instance = NULL; int table_id = -1; FILE *fp; @@ -19,33 +19,37 @@ TEST(FeildStatOutput, OutputFile) int output_metric_ids[54] = {0}; const char *output_file_path = "/tmp/fieldstat.txt"; - const char *table_column = "network_activity new_conn_num established_conn_num" - " close_conn_num total_in_bytes total_out_bytes total_in_packets " - "total_out_packets default_conn_num default_in_bytes default_out_bytes " - "default_in_packets default_out_packets allow_conn_num allow_in_bytes " - "allow_out_bytes allow_in_packets allow_out_packets deny_conn_num " - "deny_in_bytes deny_out_bytes deny_in_packets deny_out_packets monitor_conn_num " - "monitor_in_bytes monitor_out_bytes monitor_in_packets monitor_out_packets intercept_conn_num " - "intercept_in_bytes intercept_out_bytes intercept_in_packets intercept_out_packets " - "ipv4_in_packets ipv4_in_bytes ipv4_out_packetsipv4_out_bytes ipv6_in_packets ipv6_in_bytes " - "ipv6_out_packets ipv6_out_bytes tcp_conn_num tcp_in_packets tcp_in_bytes tcp_out_packets " - "tcp_out_bytes udp_conn_num udp_in_packets udp_in_bytes udp_out_packets udp_out_bytes " - "alert_bytes block_bytes pinning_num maybe_pinning_num not_pinning_num\n"; + const char *compared_table_name = "table name: network_activity\n"; + const char *compared_table_column = " new_conn_num established_conn_nu" + " close_conn_num total_in_bytes total_out_bytes total_in_packets" + " total_out_packets default_conn_num default_in_bytes default_out_bytes" + " default_in_packets default_out_packets allow_conn_num allow_in_bytes" + " allow_out_bytes allow_in_packets allow_out_packets deny_conn_num" + " deny_in_bytes deny_out_bytes deny_in_packets deny_out_packets" + " monitor_conn_num monitor_in_bytes monitor_out_bytes monitor_in_packets" + " monitor_out_packets intercept_conn_num intercept_in_bytes intercept_out_bytes" + " intercept_in_packet intercept_out_packe ipv4_in_packets ipv4_in_bytes" + " ipv4_out_packetsipv ipv6_in_packets ipv6_in_bytes ipv6_out_packets" + " ipv6_out_bytes tcp_conn_num tcp_in_packets tcp_in_bytes" + " tcp_out_packets tcp_out_bytes udp_conn_num udp_in_packets" + " udp_in_bytes udp_out_packets udp_out_bytes alert_bytes" + " block_bytes pinning_num maybe_pinning_num not_pinning_num\n"; - const char *table_row_value = "TRAFFIC 1000 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 \n"; + const char *compared_table_row_value = "TRAFFIC 5.00e+02 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00\n"; + const char *table_column_name[] = {"new_conn_num", "established_conn_num", "close_conn_num", "total_in_bytes", "total_out_bytes", "total_in_packets", "total_out_packets", "default_conn_num", "default_in_bytes", "default_out_bytes", "default_in_packets", "default_out_packets", "allow_conn_num", @@ -81,11 +85,15 @@ TEST(FeildStatOutput, OutputFile) } if(n_line == 1) { - EXPECT_STREQ(table_column, read_line_buf); + EXPECT_STREQ(compared_table_name, read_line_buf); } if(n_line == 2) { - EXPECT_STREQ(table_row_value, read_line_buf); + EXPECT_STREQ(compared_table_column, read_line_buf); + } + if(n_line == 3) + { + EXPECT_STREQ(compared_table_row_value, read_line_buf); } n_line++; } @@ -259,34 +267,36 @@ TEST(FeildStatOutput, OutputFileAndLineProtocol) cJSON *cjson_tags = NULL; const char *output_file_path = "/tmp/fieldstat.txt"; - const char *table_column = "network_activity new_conn_num established_conn_num" - " close_conn_num total_in_bytes total_out_bytes total_in_packets " - "total_out_packets default_conn_num default_in_bytes default_out_bytes " - "default_in_packets default_out_packets allow_conn_num allow_in_bytes " - "allow_out_bytes allow_in_packets allow_out_packets deny_conn_num " - "deny_in_bytes deny_out_bytes deny_in_packets deny_out_packets monitor_conn_num " - "monitor_in_bytes monitor_out_bytes monitor_in_packets monitor_out_packets intercept_conn_num " - "intercept_in_bytes intercept_out_bytes intercept_in_packets intercept_out_packets " - "ipv4_in_packets ipv4_in_bytes ipv4_out_packetsipv4_out_bytes ipv6_in_packets ipv6_in_bytes " - "ipv6_out_packets ipv6_out_bytes tcp_conn_num tcp_in_packets tcp_in_bytes tcp_out_packets " - "tcp_out_bytes udp_conn_num udp_in_packets udp_in_bytes udp_out_packets udp_out_bytes " - "alert_bytes block_bytes pinning_num maybe_pinning_num not_pinning_num\n"; + const char *compared_table_name = "table name: network_activity\n"; + const char *compared_table_column = " new_conn_num established_conn_nu" + " close_conn_num total_in_bytes total_out_bytes total_in_packets" + " total_out_packets default_conn_num default_in_bytes default_out_bytes" + " default_in_packets default_out_packets allow_conn_num allow_in_bytes" + " allow_out_bytes allow_in_packets allow_out_packets deny_conn_num" + " deny_in_bytes deny_out_bytes deny_in_packets deny_out_packets" + " monitor_conn_num monitor_in_bytes monitor_out_bytes monitor_in_packets" + " monitor_out_packets intercept_conn_num intercept_in_bytes intercept_out_bytes" + " intercept_in_packet intercept_out_packe ipv4_in_packets ipv4_in_bytes" + " ipv4_out_packetsipv ipv6_in_packets ipv6_in_bytes ipv6_out_packets" + " ipv6_out_bytes tcp_conn_num tcp_in_packets tcp_in_bytes" + " tcp_out_packets tcp_out_bytes udp_conn_num udp_in_packets" + " udp_in_bytes udp_out_packets udp_out_bytes alert_bytes" + " block_bytes pinning_num maybe_pinning_num not_pinning_num\n"; - const char *table_row_value = "TRAFFIC 1000 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 \n"; - + const char *compared_table_row_value = "TRAFFIC 5.00e+02 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00\n"; const char *compare = "{\"fields\":{\"alert_bytes\":0,\"allow_conn_num\":0,\"allow_in_bytes\":0,\"allow_in_packets\":0,\"allow_out_bytes\":0,"\ "\"allow_out_packets\":0,\"block_bytes\":0,\"close_conn_num\":0,\"default_conn_num\":0,\"default_in_bytes\":0,"\ @@ -327,7 +337,7 @@ TEST(FeildStatOutput, OutputFileAndLineProtocol) EXPECT_EQ(12, instance->output_type); ret = system("cat /dev/null > /tmp/metrics.out"); - ret = system("cat /dev/null > /tmp/fieldstat.txt"); + //ret = system("cat /dev/null > /tmp/fieldstat.txt"); fieldstat_instance_start(instance); fieldstat_value_incrby(instance, output_metric_ids[0], 1000); sleep(3); @@ -364,7 +374,7 @@ TEST(FeildStatOutput, OutputFileAndLineProtocol) fp = fopen("/tmp/fieldstat.txt", "r"); EXPECT_NE(nullptr, fp); n_line = 0; - n_loops = 4; + n_loops = 5; while(!feof(fp)) { @@ -374,11 +384,15 @@ TEST(FeildStatOutput, OutputFileAndLineProtocol) } if(n_line == 1) { - EXPECT_STREQ(table_column, read_line_buf); + EXPECT_STREQ(compared_table_name, read_line_buf); } if(n_line == 2) { - EXPECT_STREQ(table_row_value, read_line_buf); + EXPECT_STREQ(compared_table_column, read_line_buf); + } + if(n_line == 3) + { + EXPECT_STREQ(compared_table_row_value, read_line_buf); } n_line++; } @@ -404,35 +418,36 @@ TEST(FeildStatOutput, OutputFileAndPrometheus) const char *prometheus_output_path = "/tmp/prometheus.txt"; const char *file_output_path = "/tmp/fieldstat.txt"; const char *prometheus_output_result = "tsg_statistic_new_conn_num{app_name=\"tsg_statistic\",table_name=\"network_activity\",line_name=\"TRAFFIC\"} 1000\n"; - const char *table_column = "network_activity new_conn_num established_conn_num" - " close_conn_num total_in_bytes total_out_bytes total_in_packets " - "total_out_packets default_conn_num default_in_bytes default_out_bytes " - "default_in_packets default_out_packets allow_conn_num allow_in_bytes " - "allow_out_bytes allow_in_packets allow_out_packets deny_conn_num " - "deny_in_bytes deny_out_bytes deny_in_packets deny_out_packets monitor_conn_num " - "monitor_in_bytes monitor_out_bytes monitor_in_packets monitor_out_packets intercept_conn_num " - "intercept_in_bytes intercept_out_bytes intercept_in_packets intercept_out_packets " - "ipv4_in_packets ipv4_in_bytes ipv4_out_packetsipv4_out_bytes ipv6_in_packets ipv6_in_bytes " - "ipv6_out_packets ipv6_out_bytes tcp_conn_num tcp_in_packets tcp_in_bytes tcp_out_packets " - "tcp_out_bytes udp_conn_num udp_in_packets udp_in_bytes udp_out_packets udp_out_bytes " - "alert_bytes block_bytes pinning_num maybe_pinning_num not_pinning_num\n"; + const char *compared_table_name = "table name: network_activity\n"; + const char *compared_table_column = " new_conn_num established_conn_nu" + " close_conn_num total_in_bytes total_out_bytes total_in_packets" + " total_out_packets default_conn_num default_in_bytes default_out_bytes" + " default_in_packets default_out_packets allow_conn_num allow_in_bytes" + " allow_out_bytes allow_in_packets allow_out_packets deny_conn_num" + " deny_in_bytes deny_out_bytes deny_in_packets deny_out_packets" + " monitor_conn_num monitor_in_bytes monitor_out_bytes monitor_in_packets" + " monitor_out_packets intercept_conn_num intercept_in_bytes intercept_out_bytes" + " intercept_in_packet intercept_out_packe ipv4_in_packets ipv4_in_bytes" + " ipv4_out_packetsipv ipv6_in_packets ipv6_in_bytes ipv6_out_packets" + " ipv6_out_bytes tcp_conn_num tcp_in_packets tcp_in_bytes" + " tcp_out_packets tcp_out_bytes udp_conn_num udp_in_packets" + " udp_in_bytes udp_out_packets udp_out_bytes alert_bytes" + " block_bytes pinning_num maybe_pinning_num not_pinning_num\n"; - const char *table_row_value = "TRAFFIC 1000 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 \n"; - - + const char *compared_table_row_value = "TRAFFIC 5.00e+02 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00\n"; const char *table_column_name[] = {"new_conn_num", "established_conn_num", "close_conn_num", "total_in_bytes", "total_out_bytes", "total_in_packets", "total_out_packets", "default_conn_num", "default_in_bytes", "default_out_bytes", "default_in_packets", "default_out_packets", "allow_conn_num", @@ -460,7 +475,7 @@ TEST(FeildStatOutput, OutputFileAndPrometheus) EXPECT_EQ(9, instance->output_type); ret = system("cat /dev/null > /tmp/prometheus.txt"); - ret = system("cat /dev/null > /tmp/fieldstat.txt"); + //ret = system("cat /dev/null > /tmp/fieldstat.txt"); fieldstat_instance_start(instance); fieldstat_value_incrby(instance, output_metric_ids[0], 1000); sleep(3); @@ -470,7 +485,7 @@ TEST(FeildStatOutput, OutputFileAndPrometheus) fp = fopen("/tmp/fieldstat.txt", "r"); EXPECT_NE(nullptr, fp); n_line = 0; - n_loops = 4; + n_loops = 5; while(!feof(fp)) { @@ -480,11 +495,15 @@ TEST(FeildStatOutput, OutputFileAndPrometheus) } if(n_line == 1) { - EXPECT_STREQ(table_column, line); + EXPECT_STREQ(compared_table_name, line); } if(n_line == 2) { - EXPECT_STREQ(table_row_value, line); + EXPECT_STREQ(compared_table_column, line); + } + if(n_line == 3) + { + EXPECT_STREQ(compared_table_row_value, line); } n_line++; } @@ -527,33 +546,37 @@ TEST(FeildStatOutput, OutputFileAndPrometheusAndLineProtocol) const char *file_output_path = "/tmp/fieldstat.txt"; const char *telegraf_output_file = "/tmp/metrics.out"; const char *prometheus_output_result = "tsg_statistic_new_conn_num{app_name=\"tsg_statistic\",table_name=\"network_activity\",line_name=\"TRAFFIC\"} 1000\n"; - const char *table_column = "network_activity new_conn_num established_conn_num" - " close_conn_num total_in_bytes total_out_bytes total_in_packets " - "total_out_packets default_conn_num default_in_bytes default_out_bytes " - "default_in_packets default_out_packets allow_conn_num allow_in_bytes " - "allow_out_bytes allow_in_packets allow_out_packets deny_conn_num " - "deny_in_bytes deny_out_bytes deny_in_packets deny_out_packets monitor_conn_num " - "monitor_in_bytes monitor_out_bytes monitor_in_packets monitor_out_packets intercept_conn_num " - "intercept_in_bytes intercept_out_bytes intercept_in_packets intercept_out_packets " - "ipv4_in_packets ipv4_in_bytes ipv4_out_packetsipv4_out_bytes ipv6_in_packets ipv6_in_bytes " - "ipv6_out_packets ipv6_out_bytes tcp_conn_num tcp_in_packets tcp_in_bytes tcp_out_packets " - "tcp_out_bytes udp_conn_num udp_in_packets udp_in_bytes udp_out_packets udp_out_bytes " - "alert_bytes block_bytes pinning_num maybe_pinning_num not_pinning_num\n"; + const char *compared_table_name = "table name: network_activity\n"; + const char *compared_table_column = " new_conn_num established_conn_nu" + " close_conn_num total_in_bytes total_out_bytes total_in_packets" + " total_out_packets default_conn_num default_in_bytes default_out_bytes" + " default_in_packets default_out_packets allow_conn_num allow_in_bytes" + " allow_out_bytes allow_in_packets allow_out_packets deny_conn_num" + " deny_in_bytes deny_out_bytes deny_in_packets deny_out_packets" + " monitor_conn_num monitor_in_bytes monitor_out_bytes monitor_in_packets" + " monitor_out_packets intercept_conn_num intercept_in_bytes intercept_out_bytes" + " intercept_in_packet intercept_out_packe ipv4_in_packets ipv4_in_bytes" + " ipv4_out_packetsipv ipv6_in_packets ipv6_in_bytes ipv6_out_packets" + " ipv6_out_bytes tcp_conn_num tcp_in_packets tcp_in_bytes" + " tcp_out_packets tcp_out_bytes udp_conn_num udp_in_packets" + " udp_in_bytes udp_out_packets udp_out_bytes alert_bytes" + " block_bytes pinning_num maybe_pinning_num not_pinning_num\n"; - const char *table_row_value = "TRAFFIC 1000 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 " - "0 0 0 0 \n"; + const char *compared_table_row_value = "TRAFFIC 5.00e+02 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00" + " 0.00e+00 0.00e+00 0.00e+00 0.00e+00\n"; + @@ -600,7 +623,7 @@ TEST(FeildStatOutput, OutputFileAndPrometheusAndLineProtocol) EXPECT_EQ(9, instance->output_type); ret = system("cat /dev/null > /tmp/prometheus.txt"); - ret = system("cat /dev/null > /tmp/fieldstat.txt"); + //ret = system("cat /dev/null > /tmp/fieldstat.txt"); fieldstat_instance_start(instance); fieldstat_value_incrby(instance, output_metric_ids[0], 1000); sleep(3); @@ -610,7 +633,7 @@ TEST(FeildStatOutput, OutputFileAndPrometheusAndLineProtocol) fp = fopen("/tmp/fieldstat.txt", "r"); EXPECT_NE(nullptr, fp); n_line = 0; - n_loops = 4; + n_loops = 5; while(!feof(fp)) { @@ -620,11 +643,15 @@ TEST(FeildStatOutput, OutputFileAndPrometheusAndLineProtocol) } if(n_line == 1) { - EXPECT_STREQ(table_column, line); + EXPECT_STREQ(compared_table_name, line); } if(n_line == 2) { - EXPECT_STREQ(table_row_value, line); + EXPECT_STREQ(compared_table_column, line); + } + if(n_line == 3) + { + EXPECT_STREQ(compared_table_row_value, line); } n_line++; } diff --git a/test/src/gtest_fieldstat_output_file_instance.cpp b/test/src/gtest_fieldstat_output_file_instance.cpp new file mode 100644 index 0000000..3a171de --- /dev/null +++ b/test/src/gtest_fieldstat_output_file_instance.cpp @@ -0,0 +1,236 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <gtest/gtest.h> +#include "fieldstat.h" +#include "fieldstat_internal.h" + +extern struct prometheus_endpoint_instance g_prometheus_endpoint_instance; + +TEST(FeildStatOutput, OutputMaatTable) +{ + int ret = 0; + struct fieldstat_instance * instance = NULL; + int table_id = -1; + int output_metric_ids[54] = {0}; + FILE *fp; + int n_line = 0; + int n_loops = 48; + char line[2048] = {0}; + + const char *output_file_path = "/tmp/fieldstat.txt"; + const char *table_column_name[] = {"rule", "reg", "v6", "stream", "scan_cnt", "scan_bytes", "scan_cpu_time", "hit_cnt"}; + const char *compared_table_row = "PXY_PROFILE_RUN_SCRIPT" + " 9223372036854775807 0 0 0" + " 0 0 0 0\n"; + + enum field_type table_column_type[8] = {FIELD_TYPE_GAUGE, FIELD_TYPE_GAUGE, FIELD_TYPE_GAUGE, FIELD_TYPE_GAUGE, FIELD_TYPE_GAUGE, FIELD_TYPE_GAUGE, FIELD_TYPE_GAUGE, FIELD_TYPE_GAUGE}; + + instance = fieldstat_instance_new("maat"); + EXPECT_STREQ("maat", instance->name); + + table_id = fieldstat_register_table(instance, "maat_info", table_column_name, table_column_type, sizeof(table_column_name)/sizeof(table_column_name[0])); + EXPECT_EQ(0, table_id); + ret = fieldstat_register_table_row(instance, table_id, "Sum", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_CTRL_COMPILE", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "GROUP_PXY_CTRL_COMPILE_RELATION", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "GROUP_GROUP_RELATION", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_IP", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_URL", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_HTTP_URL", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_FQDN", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_FQDN_CAT", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_HTTP_HOST", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_HTTP_HOST_CAT", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_HTTP_SIGNATURE", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_HTTP_REQ_HDR", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_HTTP_RES_HDR", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_KEYWORDS", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_HTTP_REQ_BODY", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_HTTP_RES_BODY", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_SUBSCRIBER_ID", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_APP_ID", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_SECURITY_SOURCE_ADDR", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_SECURITY_DESTINATION_ADDR", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_CACHE_COMPILE", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_CACHE_GROUP", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_CACHE_HTTP_URL", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_CACHE_HTTP_COOKIE", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_PROFILE_TRUSTED_CA_CERT", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_OBJ_TRUSTED_CA_CRL", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_PROFILE_RESPONSE_PAGES", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_PROFILE_HIJACK_FILES", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_PROFILE_INSERT_SCRIPTS", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_SECURITY_COMPILE", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_PROFILE_TRAFFIC_MIRROR", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_PROFILE_DECRYPTION", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_AS_NUMBER", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_SECURITY_SOURCE_ASN", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_SECURITY_DESTINATION_ASN", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_OBJ_GEO_LOCATION", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_SECURITY_SOURCE_LOCATION", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_SECURITY_DESTINATION_LOCATION", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_DOH_QNAME", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_DOH_HOST", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "TSG_FIELD_DOH_HOST_CAT", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_SSL_FINGERPRINT", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + ret = fieldstat_register_table_row(instance, table_id, "PXY_PROFILE_RUN_SCRIPTS", NULL, 0, output_metric_ids); + EXPECT_EQ(0, ret); + + ret = fieldstat_set_local_output(instance, output_file_path, "default"); + EXPECT_EQ(0, ret); + fieldstat_instance_start(instance); + fieldstat_value_incrby(instance, output_metric_ids[0], 9223372036854775807); + sleep(3); + + fp = fopen("/tmp/fieldstat.txt", "r"); + EXPECT_NE(nullptr, fp); + + while(!feof(fp)) + { + if(NULL == fgets(line, sizeof(line), fp)) + { + continue; + } + if(n_line == 46) + { + EXPECT_STREQ(compared_table_row, line); + } + n_line++; + } + fclose(fp); + EXPECT_EQ(n_line, n_loops); + + fieldstat_instance_free(instance); +} + +TEST(FeildStatOutput, OutputMaatGaugeType) +{ + int ret = 0; + struct fieldstat_instance * instance = NULL; + int metric_id = -1; + FILE *fp; + int n_line = 0; + int n_loops = 6; + char line[2048] = {0}; + + const char *output_file_path = "/tmp/fieldstat.txt"; + const char *compared_row = " version: 922 threads: 0 tables: 0 plug_cached: 0 plug_acc: 0 group: 0 \n"; + + instance = fieldstat_instance_new("maat"); + EXPECT_STREQ("maat", instance->name); + + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "version", NULL, 0); + EXPECT_EQ(0, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "threads", NULL, 0); + EXPECT_EQ(1, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "tables", NULL, 0); + EXPECT_EQ(2, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "plug_cached", NULL, 0); + EXPECT_EQ(3, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "plug_acc", NULL, 0); + EXPECT_EQ(4, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "group", NULL, 0); + EXPECT_EQ(5, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "not_grp", NULL, 0); + EXPECT_EQ(6, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "compile", NULL, 0); + EXPECT_EQ(7, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "garbage_num", NULL, 0); + EXPECT_EQ(8, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "outer_mid", NULL, 0); + EXPECT_EQ(9, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "z_stream", NULL, 0); + EXPECT_EQ(10, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "nt_grp_hit", NULL, 0); + EXPECT_EQ(11, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "scan_bytes", NULL, 0); + EXPECT_EQ(12, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "scan_times", NULL, 0); + EXPECT_EQ(13, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "update_err", NULL, 0); + EXPECT_EQ(14, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "scan_error", NULL, 0); + EXPECT_EQ(15, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "cmd_commit", NULL, 0); + EXPECT_EQ(16, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "cmd_in_q", NULL, 0); + EXPECT_EQ(17, metric_id); + metric_id = fieldstat_register(instance, FIELD_TYPE_GAUGE, "line_cmd/s", NULL, 0); + EXPECT_EQ(18, metric_id); + + ret = fieldstat_set_local_output(instance, output_file_path, "default"); + EXPECT_EQ(0, ret); + fieldstat_instance_start(instance); + fieldstat_value_incrby(instance, 0, 922); + sleep(3); + + fp = fopen("/tmp/fieldstat.txt", "r"); + EXPECT_NE(nullptr, fp); + + while(!feof(fp)) + { + if(NULL == fgets(line, sizeof(line), fp)) + { + continue; + } + if(n_line == 1) + { + EXPECT_STREQ(compared_row, line); + } + n_line++; + } + fclose(fp); + EXPECT_EQ(n_line, n_loops); + + fieldstat_instance_free(instance); +} + +int main(int argc, char *argv[]) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}
\ No newline at end of file |
