summaryrefslogtreecommitdiff
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
parenta31d2c750f1b3fa2a0b718505ae528232cab19a3 (diff)
feature:1.修改文件输出格式2.新增设置metric ratio和invisible属性接口
-rw-r--r--ctest/CMakeLists.txt3
-rw-r--r--inc/fieldstat.h20
-rw-r--r--src/fieldstat.cpp65
-rw-r--r--src/file_output.cpp155
-rw-r--r--src/line_protocol_output.cpp26
-rw-r--r--test/src/CMakeLists.txt5
-rw-r--r--test/src/gtest_dynamic_fieldstat.cpp12
-rw-r--r--test/src/gtest_dynamic_fieldstat_output.cpp4
-rw-r--r--test/src/gtest_fieldstat_interface.cpp201
-rw-r--r--test/src/gtest_fieldstat_output.cpp271
-rw-r--r--test/src/gtest_fieldstat_output_file_instance.cpp236
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