summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorfumingwei <[email protected]>2023-05-29 14:04:57 +0800
committerfumingwei <[email protected]>2023-06-02 10:41:12 +0800
commit2b6a1bfd1a6c41fb71b59dd50f62d2c3f4688fa8 (patch)
treea4bc90b8a752dee1f42bfda1b313cb824d1ed0ff /test
parentd5389fb9f1cf48f413eb6cd7baad27a57efe2274 (diff)
bugfix:新增historgam和summary line protocol输出
Diffstat (limited to 'test')
-rw-r--r--test/src/gtest_fieldstat_interface.cpp52
-rw-r--r--test/src/gtest_fieldstat_output.cpp951
2 files changed, 1003 insertions, 0 deletions
diff --git a/test/src/gtest_fieldstat_interface.cpp b/test/src/gtest_fieldstat_interface.cpp
index 600314f..48ebb9a 100644
--- a/test/src/gtest_fieldstat_interface.cpp
+++ b/test/src/gtest_fieldstat_interface.cpp
@@ -564,6 +564,58 @@ TEST(FeildStatAPI, SetMetricInvisible)
fieldstat_instance_free(instance);
}
+TEST(FeildStatAPI, RegisterSummary)
+{
+ int ret = 0;
+ struct fieldstat_instance * instance = NULL;
+ const char * quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+
+ instance = fieldstat_instance_new("maat");
+
+ ret = fieldstat_register_summary(instance, "latency", NULL, 0, quantiles, 1, 5, 2, 0);
+ EXPECT_EQ(0, ret);
+
+ ret = fieldstat_register_summary(instance, "latency", NULL, 0, quantiles, -1, 5, 2, 0);
+ EXPECT_EQ(-1, ret);
+
+ ret = fieldstat_register_summary(instance, "latency", NULL, 0, quantiles, 2, 3, 2, 0);
+ EXPECT_EQ(-1, ret);
+
+ ret = fieldstat_register_summary(instance, "latency", NULL, 0, quantiles, 1, 5, 10, 0);
+ EXPECT_EQ(-1, ret);
+
+ ret = fieldstat_register_summary(instance, "latency", NULL, 0, quantiles, 1, 5, 2, 2);
+ EXPECT_EQ(-1, ret);
+
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatAPI, RegisterHistogram)
+{
+ int ret = 0;
+ struct fieldstat_instance * instance = NULL;
+ const char * quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+
+ instance = fieldstat_instance_new("maat");
+
+ ret = fieldstat_register_histogram(instance, "latency", NULL, 0, quantiles, 1, 5, 2, 0);
+ EXPECT_EQ(0, ret);
+
+ ret = fieldstat_register_histogram(instance, "latency", NULL, 0, quantiles, -1, 5, 2, 0);
+ EXPECT_EQ(-1, ret);
+
+ ret = fieldstat_register_histogram(instance, "latency", NULL, 0, quantiles, 2, 3, 2, 0);
+ EXPECT_EQ(-1, ret);
+
+ ret = fieldstat_register_histogram(instance, "latency", NULL, 0, quantiles, 1, 5, 10, 0);
+ EXPECT_EQ(-1, ret);
+
+ ret = fieldstat_register_histogram(instance, "latency", NULL, 0, quantiles, 1, 5, 2, 2);
+ EXPECT_EQ(-1, ret);
+
+ fieldstat_instance_free(instance);
+}
+
int main(int argc, char *argv[])
{
diff --git a/test/src/gtest_fieldstat_output.cpp b/test/src/gtest_fieldstat_output.cpp
index 634017d..a7e92d0 100644
--- a/test/src/gtest_fieldstat_output.cpp
+++ b/test/src/gtest_fieldstat_output.cpp
@@ -718,6 +718,957 @@ TEST(FeildStatOutput, OutputFileAndPrometheusAndLineProtocol)
}
+TEST(FeildStatOutput, SummaryOutputFile)
+{
+ int metric_id = -1;
+ const char *quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+ const char *output_file = "/tmp/fieldstat.txt";
+ const char *compared_data_line = "hit_rate 10 50"
+ " 80 90 95"
+ " 99 100 1"
+ " 50.50 28.87 100\n";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+
+ struct fieldstat_instance *instance = fieldstat_instance_new("maat");
+ fieldstat_set_local_output(instance, "/tmp/fieldstat.txt", "default");
+
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 100, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ sleep(1);
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ sleep(2);
+
+ fp = fopen(output_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ if(n_line == 2)
+ {
+ EXPECT_STREQ(compared_data_line, read_line);
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(4, n_line);
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, SummaryOutputLineProtocol)
+{
+ int metric_id = -1;
+ const char * quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+
+ const char *telegraf_file = "/tmp/metrics.out";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+ cJSON *cjson_metric = NULL;
+ cJSON *cjson_tags = NULL;
+ char *cjson_metric_str = NULL;
+ const char *compared_data = "{\"fields\":{\"P10\":10,\"P50\":50,"
+ "\"P80\":80,\"P90\":90,\"P95\":95,"
+ "\"P99\":99,\"avg\":50.500000,\"cnt\":100,"
+ "\"max\":100,\"min\":1,\"stddev\":28.870000},"
+ "\"name\":\"hit_rate\",\"tags\":"
+ "{\"app_name\":\"maat\"}}";
+
+ struct fieldstat_instance * instance = NULL;
+
+ instance = fieldstat_instance_new("maat");
+ fieldstat_set_line_protocol_server(instance, "127.0.0.1", 8700);
+
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 100, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ system("cat /dev/null > /tmp/metrics.out");
+ sleep(1);
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ sleep(2);
+
+ fp = fopen(telegraf_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ cjson_metric = cJSON_Parse(read_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(compared_data, cjson_metric_str);
+ free(cjson_metric_str);
+ cjson_metric_str = NULL;
+ }
+ cJSON_Delete(cjson_metric);
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(1, n_line);
+
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, SummaryOutputPrometheus)
+{
+ int metric_id = -1;
+ const char * quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+
+
+ const char *prometheus_file = "/tmp/prometheus.txt";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+ const char *compared_p10 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.10\"} 10\n";
+ const char *compared_p50 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.50\"} 50\n";
+ const char *compared_p80 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.80\"} 80\n";
+ const char *compared_p90 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.90\"} 90\n";
+ const char *compared_p95 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.95\"} 95\n";
+ const char *compared_p99 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.99\"} 99\n";
+ const char *compared_cnt = "maat_hit_rate_count{app_name=\"maat\"} 100\n";
+ const char *compared_sum = "maat_hit_rate_sum{app_name=\"maat\"} 5050\n";
+
+ struct fieldstat_instance * instance = NULL;
+
+ instance = fieldstat_instance_new("maat");
+ fieldstat_global_enable_prometheus_endpoint(9023, NULL);
+ fieldstat_enable_prometheus_output(instance);
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 100, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ system("cat /dev/null > /tmp/prometheus.txt");
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ system("curl -s http://127.0.0.1:9023/metrics -o /tmp/prometheus.txt");
+
+
+ fp = fopen(prometheus_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ switch(n_line)
+ {
+ case 0:
+ EXPECT_STREQ(compared_p10, read_line);
+ break;
+ case 1:
+ EXPECT_STREQ(compared_p50, read_line);
+ break;
+ case 2:
+ EXPECT_STREQ(compared_p80, read_line);
+ break;
+ case 3:
+ EXPECT_STREQ(compared_p90, read_line);
+ break;
+ case 4:
+ EXPECT_STREQ(compared_p95, read_line);
+ break;
+ case 5:
+ EXPECT_STREQ(compared_p99, read_line);
+ break;
+ case 6:
+ EXPECT_STREQ(compared_cnt, read_line);
+ break;
+ case 7:
+ EXPECT_STREQ(compared_sum, read_line);
+ break;
+ default:
+ break;
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(8, n_line);
+ fieldstat_global_disable_prometheus_endpoint();
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, HistogramOutputFile)
+{
+ int metric_id = -1;
+ const char *upper_inclusive_bounds = "10,50,80,90,95,99";
+ const char *output_file = "/tmp/fieldstat.txt";
+ const char *compared_data_line = "hit_rate 10 50"
+ " 80 90 95"
+ " 99 100 1"
+ " 50.50 28.87 100\n";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+
+ struct fieldstat_instance *instance = fieldstat_instance_new("maat");
+ fieldstat_set_local_output(instance, "/tmp/fieldstat.txt", "default");
+
+ metric_id = fieldstat_register_histogram(instance, "hit_rate", NULL, 0,
+ upper_inclusive_bounds, 1, 100, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ sleep(1);
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ sleep(2);
+
+ fp = fopen(output_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ if(n_line == 2)
+ {
+ EXPECT_STREQ(compared_data_line, read_line);
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(4, n_line);
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, HistogramOutputLineProtocol)
+{
+ int metric_id = -1;
+ const char *upper_inclusive_bounds = "10,50,80,90,95,99";
+
+ const char *telegraf_file = "/tmp/metrics.out";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+ cJSON *cjson_metric = NULL;
+ cJSON *cjson_tags = NULL;
+ char *cjson_metric_str = NULL;
+ const char *compared_data = "{\"fields\":{\"avg\":50.500000,\"cnt\":100,"
+ "\"le10\":10,\"le50\":50,\"le80\":80,"
+ "\"le90\":90,\"le95\":95,\"le99\":99,"
+ "\"max\":100,\"min\":1,\"stddev\":28.870000},"
+ "\"name\":\"hit_rate\",\"tags\":"
+ "{\"app_name\":\"maat\"}}";
+
+ struct fieldstat_instance * instance = NULL;
+
+ instance = fieldstat_instance_new("maat");
+ fieldstat_set_line_protocol_server(instance, "127.0.0.1", 8700);
+
+ metric_id = fieldstat_register_histogram(instance, "hit_rate", NULL, 0,
+ upper_inclusive_bounds, 1, 100, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ system("cat /dev/null > /tmp/metrics.out");
+ sleep(1);
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ sleep(2);
+
+ fp = fopen(telegraf_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ cjson_metric = cJSON_Parse(read_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(compared_data, cjson_metric_str);
+ free(cjson_metric_str);
+ cjson_metric_str = NULL;
+ }
+ cJSON_Delete(cjson_metric);
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(1, n_line);
+
+ fieldstat_instance_free(instance);
+}
+
+
+TEST(FeildStatOutput, HistogramOutputPrometheus)
+{
+ int metric_id = -1;
+ const char *upper_inclusive_bounds = "10,50,80,90,95,99";
+
+ const char *prometheus_file = "/tmp/prometheus.txt";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+ const char *compared_le10 = "maat_hit_rate_bucket{app_name=\"maat\",le=\"10.00\"} 10\n";
+ const char *compared_le50 = "maat_hit_rate_bucket{app_name=\"maat\",le=\"50.00\"} 50\n";
+ const char *compared_le80 = "maat_hit_rate_bucket{app_name=\"maat\",le=\"80.00\"} 80\n";
+ const char *compared_le90 = "maat_hit_rate_bucket{app_name=\"maat\",le=\"90.00\"} 90\n";
+ const char *compared_le95 = "maat_hit_rate_bucket{app_name=\"maat\",le=\"95.00\"} 95\n";
+ const char *compared_le99 = "maat_hit_rate_bucket{app_name=\"maat\",le=\"99.00\"} 99\n";
+ const char *compared_cnt = "maat_hit_rate_count{app_name=\"maat\"} 100\n";
+ const char *compared_sum = "maat_hit_rate_sum{app_name=\"maat\"} 5050\n";
+
+ struct fieldstat_instance * instance = NULL;
+
+ instance = fieldstat_instance_new("maat");
+ fieldstat_global_enable_prometheus_endpoint(9024, NULL);
+ fieldstat_enable_prometheus_output(instance);
+ metric_id = fieldstat_register_histogram(instance, "hit_rate", NULL, 0,
+ upper_inclusive_bounds, 1, 100, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ sleep(1);
+ system("cat /dev/null > /tmp/prometheus.txt");
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ system("curl -s http://127.0.0.1:9024/metrics -o /tmp/prometheus.txt");
+
+
+ fp = fopen(prometheus_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ switch(n_line)
+ {
+ case 0:
+ EXPECT_STREQ(compared_le10, read_line);
+ break;
+ case 1:
+ EXPECT_STREQ(compared_le50, read_line);
+ break;
+ case 2:
+ EXPECT_STREQ(compared_le80, read_line);
+ break;
+ case 3:
+ EXPECT_STREQ(compared_le90, read_line);
+ break;
+ case 4:
+ EXPECT_STREQ(compared_le95, read_line);
+ break;
+ case 5:
+ EXPECT_STREQ(compared_le99, read_line);
+ break;
+ case 6:
+ EXPECT_STREQ(compared_cnt, read_line);
+ break;
+ case 7:
+ EXPECT_STREQ(compared_sum, read_line);
+ break;
+ default:
+ break;
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(8, n_line);
+ fieldstat_global_disable_prometheus_endpoint();
+ fieldstat_instance_free(instance);
+}
+
+
+TEST(FeildStatOutput, SummaryOutputFileCurrent)
+{
+ int metric_id = -1;
+ const char *quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+ const char *output_file = "/tmp/fieldstat.txt";
+ const char *compared_data_line = "hit_rate 20 100"
+ " 160 180 190"
+ " 198 200 1"
+ " 100.50 57.73 200\n";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+
+ struct fieldstat_instance *instance = fieldstat_instance_new("maat");
+ fieldstat_set_local_output(instance, "/tmp/fieldstat.txt", "default");
+
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 200, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ sleep(1);
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ sleep(2);
+ for(int i = 0; i < 100; i++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 101);
+ }
+ sleep(2);
+ fp = fopen(output_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ if(n_line == 2)
+ {
+ EXPECT_STREQ(compared_data_line, read_line);
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(4, n_line);
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, SummaryOutputFileChange)
+{
+ int metric_id = -1;
+ const char *quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+ const char *output_file = "/tmp/fieldstat.txt";
+ const char *compared_data_line = "hit_rate 110 150"
+ " 180 190 195"
+ " 199 200 101"
+ " 150.50 28.87 100\n";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+
+ struct fieldstat_instance *instance = fieldstat_instance_new("maat");
+ fieldstat_set_local_output(instance, "/tmp/fieldstat.txt", "default");
+
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 200, 2, 1);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ sleep(1);
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ sleep(2);
+ for(int i = 0; i < 100; i++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 101);
+ }
+ sleep(2);
+ fp = fopen(output_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ if(n_line == 2)
+ {
+ EXPECT_STREQ(compared_data_line, read_line);
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(4, n_line);
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, SummaryOutputLineProtocolCurrent)
+{
+ int metric_id = -1;
+ const char * quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+
+ const char *telegraf_file = "/tmp/metrics.out";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+ cJSON *cjson_metric = NULL;
+ cJSON *cjson_tags = NULL;
+ char *cjson_metric_str = NULL;
+
+ const char *compared_line0 = "{\"fields\":{\"P10\":10,\"P50\":50,"
+ "\"P80\":80,\"P90\":90,\"P95\":95,"
+ "\"P99\":99,\"avg\":50.500000,"
+ "\"cnt\":100,\"max\":100,\"min\":1,"
+ "\"stddev\":28.870000},\"name\":"
+ "\"hit_rate\",\"tags\":{\"app_name\""
+ ":\"maat\"}}";
+
+ const char *compared_line1 = "{\"fields\":{\"P10\":20,\"P50\":100,"
+ "\"P80\":160,\"P90\":180,\"P95\":190,"
+ "\"P99\":198,\"avg\":100.500000,"
+ "\"cnt\":200,\"max\":200,\"min\":1,"
+ "\"stddev\":57.730000},\"name\":"
+ "\"hit_rate\",\"tags\":{\"app_name\""
+ ":\"maat\"}}";
+
+
+
+ struct fieldstat_instance * instance = NULL;
+
+ instance = fieldstat_instance_new("maat");
+ fieldstat_set_line_protocol_server(instance, "127.0.0.1", 8700);
+
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 100, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ system("cat /dev/null > /tmp/metrics.out");
+ sleep(1);
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ sleep(2);
+
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 101);
+ }
+ sleep(2);
+
+ fp = fopen(telegraf_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ cjson_metric = cJSON_Parse(read_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)
+ {
+ if(n_line == 0)
+ {
+ EXPECT_STREQ(compared_line0, cjson_metric_str);
+ }
+ if(n_line == 1)
+ {
+ EXPECT_STREQ(compared_line1, cjson_metric_str);
+ }
+ free(cjson_metric_str);
+ cjson_metric_str = NULL;
+ }
+ cJSON_Delete(cjson_metric);
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(2, n_line);
+
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, SummaryOutputLineProtocolChange)
+{
+ int metric_id = -1;
+ const char * quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+
+ const char *telegraf_file = "/tmp/metrics.out";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+ cJSON *cjson_metric = NULL;
+ cJSON *cjson_tags = NULL;
+ char *cjson_metric_str = NULL;
+
+ const char *compared_line0 = "{\"fields\":{\"P10\":10,\"P50\":50,"
+ "\"P80\":80,\"P90\":90,\"P95\":95,"
+ "\"P99\":99,\"avg\":50.500000,"
+ "\"cnt\":100,\"max\":100,\"min\":1,"
+ "\"stddev\":28.870000},\"name\":"
+ "\"hit_rate\",\"tags\":{\"app_name\""
+ ":\"maat\"}}";
+
+ const char *compared_line1 = "{\"fields\":{\"P10\":110,\"P50\":150,"
+ "\"P80\":180,\"P90\":190,\"P95\":195,"
+ "\"P99\":199,\"avg\":150.500000,"
+ "\"cnt\":100,\"max\":200,\"min\":101,"
+ "\"stddev\":28.870000},\"name\":"
+ "\"hit_rate\",\"tags\":{\"app_name\""
+ ":\"maat\"}}";
+
+
+
+ struct fieldstat_instance * instance = NULL;
+
+ instance = fieldstat_instance_new("maat");
+ fieldstat_set_line_protocol_server(instance, "127.0.0.1", 8700);
+
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 100, 2, 1);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ system("cat /dev/null > /tmp/metrics.out");
+ sleep(1);
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ sleep(2);
+
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 101);
+ }
+ sleep(2);
+
+ fp = fopen(telegraf_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ cjson_metric = cJSON_Parse(read_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)
+ {
+ if(n_line == 0)
+ {
+ EXPECT_STREQ(compared_line0, cjson_metric_str);
+ }
+ if(n_line == 1)
+ {
+ EXPECT_STREQ(compared_line1, cjson_metric_str);
+ }
+ free(cjson_metric_str);
+ cjson_metric_str = NULL;
+ }
+ cJSON_Delete(cjson_metric);
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(2, n_line);
+
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, SummaryOutputPrometheusCurrent)
+{
+ int metric_id = -1;
+ const char * quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+
+ const char *prometheus_file = "/tmp/prometheus.txt";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+ const char *compared_p10_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.10\"} 10\n";
+ const char *compared_p50_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.50\"} 50\n";
+ const char *compared_p80_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.80\"} 80\n";
+ const char *compared_p90_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.90\"} 90\n";
+ const char *compared_p95_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.95\"} 95\n";
+ const char *compared_p99_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.99\"} 99\n";
+ const char *compared_cnt_0 = "maat_hit_rate_count{app_name=\"maat\"} 100\n";
+ const char *compared_sum_0 = "maat_hit_rate_sum{app_name=\"maat\"} 5050\n";
+ const char *compared_p10_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.10\"} 20\n";
+ const char *compared_p50_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.50\"} 100\n";
+ const char *compared_p80_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.80\"} 160\n";
+ const char *compared_p90_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.90\"} 180\n";
+ const char *compared_p95_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.95\"} 190\n";
+ const char *compared_p99_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.99\"} 198\n";
+ const char *compared_cnt_1 = "maat_hit_rate_count{app_name=\"maat\"} 200\n";
+ const char *compared_sum_1 = "maat_hit_rate_sum{app_name=\"maat\"} 20100\n";
+
+ struct fieldstat_instance * instance = NULL;
+
+ instance = fieldstat_instance_new("maat");
+ fieldstat_global_enable_prometheus_endpoint(9026, NULL);
+ fieldstat_enable_prometheus_output(instance);
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 100, 2, 0);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ system("cat /dev/null > /tmp/prometheus.txt");
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ system("curl -s http://127.0.0.1:9026/metrics -o /tmp/prometheus.txt");
+
+ fp = fopen(prometheus_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ switch(n_line)
+ {
+ case 0:
+ EXPECT_STREQ(compared_p10_0, read_line);
+ break;
+ case 1:
+ EXPECT_STREQ(compared_p50_0, read_line);
+ break;
+ case 2:
+ EXPECT_STREQ(compared_p80_0, read_line);
+ break;
+ case 3:
+ EXPECT_STREQ(compared_p90_0, read_line);
+ break;
+ case 4:
+ EXPECT_STREQ(compared_p95_0, read_line);
+ break;
+ case 5:
+ EXPECT_STREQ(compared_p99_0, read_line);
+ break;
+ case 6:
+ EXPECT_STREQ(compared_cnt_0, read_line);
+ break;
+ case 7:
+ EXPECT_STREQ(compared_sum_0, read_line);
+ break;
+ default:
+ break;
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(8, n_line);
+
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 101);
+ }
+ sleep(1);
+ n_line = 0;
+ system("curl -s http://127.0.0.1:9026/metrics -o /tmp/prometheus.txt");
+ fp = fopen(prometheus_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ switch(n_line)
+ {
+ case 0:
+ EXPECT_STREQ(compared_p10_1, read_line);
+ break;
+ case 1:
+ EXPECT_STREQ(compared_p50_1, read_line);
+ break;
+ case 2:
+ EXPECT_STREQ(compared_p80_1, read_line);
+ break;
+ case 3:
+ EXPECT_STREQ(compared_p90_1, read_line);
+ break;
+ case 4:
+ EXPECT_STREQ(compared_p95_1, read_line);
+ break;
+ case 5:
+ EXPECT_STREQ(compared_p99_1, read_line);
+ break;
+ case 6:
+ EXPECT_STREQ(compared_cnt_1, read_line);
+ break;
+ case 7:
+ EXPECT_STREQ(compared_sum_1, read_line);
+ break;
+ default:
+ break;
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(8, n_line);
+
+ fieldstat_global_disable_prometheus_endpoint();
+ fieldstat_instance_free(instance);
+}
+
+TEST(FeildStatOutput, SummaryOutputPrometheusChange)
+{
+ int metric_id = -1;
+ const char * quantiles = "0.1,0.5,0.8,0.9,0.95,0.99";
+
+ const char *prometheus_file = "/tmp/prometheus.txt";
+ FILE *fp;
+ char read_line[2048] = {0};
+ int n_line = 0;
+ const char *compared_p10_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.10\"} 10\n";
+ const char *compared_p50_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.50\"} 50\n";
+ const char *compared_p80_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.80\"} 80\n";
+ const char *compared_p90_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.90\"} 90\n";
+ const char *compared_p95_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.95\"} 95\n";
+ const char *compared_p99_0 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.99\"} 99\n";
+ const char *compared_cnt_0 = "maat_hit_rate_count{app_name=\"maat\"} 100\n";
+ const char *compared_sum_0 = "maat_hit_rate_sum{app_name=\"maat\"} 5050\n";
+ const char *compared_p10_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.10\"} 20\n";
+ const char *compared_p50_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.50\"} 100\n";
+ const char *compared_p80_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.80\"} 160\n";
+ const char *compared_p90_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.90\"} 180\n";
+ const char *compared_p95_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.95\"} 190\n";
+ const char *compared_p99_1 = "maat_hit_rate{app_name=\"maat\",quantile=\"0.99\"} 198\n";
+ const char *compared_cnt_1 = "maat_hit_rate_count{app_name=\"maat\"} 200\n";
+ const char *compared_sum_1 = "maat_hit_rate_sum{app_name=\"maat\"} 20100\n";
+
+ struct fieldstat_instance * instance = NULL;
+
+ instance = fieldstat_instance_new("maat");
+ fieldstat_global_enable_prometheus_endpoint(9027, NULL);
+ fieldstat_enable_prometheus_output(instance);
+ metric_id = fieldstat_register_summary(instance, "hit_rate", NULL, 0,
+ quantiles, 1, 100, 2, 1);
+ EXPECT_EQ(0, metric_id);
+ fieldstat_instance_start(instance);
+ system("cat /dev/null > /tmp/prometheus.txt");
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 1);
+ }
+ system("curl -s http://127.0.0.1:9027/metrics -o /tmp/prometheus.txt");
+
+ fp = fopen(prometheus_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ switch(n_line)
+ {
+ case 0:
+ EXPECT_STREQ(compared_p10_0, read_line);
+ break;
+ case 1:
+ EXPECT_STREQ(compared_p50_0, read_line);
+ break;
+ case 2:
+ EXPECT_STREQ(compared_p80_0, read_line);
+ break;
+ case 3:
+ EXPECT_STREQ(compared_p90_0, read_line);
+ break;
+ case 4:
+ EXPECT_STREQ(compared_p95_0, read_line);
+ break;
+ case 5:
+ EXPECT_STREQ(compared_p99_0, read_line);
+ break;
+ case 6:
+ EXPECT_STREQ(compared_cnt_0, read_line);
+ break;
+ case 7:
+ EXPECT_STREQ(compared_sum_0, read_line);
+ break;
+ default:
+ break;
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(8, n_line);
+
+ for(int i = 0; i < 100; i ++)
+ {
+ fieldstat_value_set(instance, metric_id, i + 101);
+ }
+ sleep(1);
+ n_line = 0;
+ system("curl -s http://127.0.0.1:9027/metrics -o /tmp/prometheus.txt");
+ fp = fopen(prometheus_file, "r");
+ EXPECT_NE(nullptr, fp);
+ while(!feof(fp))
+ {
+ if(NULL == fgets(read_line, sizeof(read_line), fp))
+ {
+ continue;
+ }
+ switch(n_line)
+ {
+ case 0:
+ EXPECT_STREQ(compared_p10_1, read_line);
+ break;
+ case 1:
+ EXPECT_STREQ(compared_p50_1, read_line);
+ break;
+ case 2:
+ EXPECT_STREQ(compared_p80_1, read_line);
+ break;
+ case 3:
+ EXPECT_STREQ(compared_p90_1, read_line);
+ break;
+ case 4:
+ EXPECT_STREQ(compared_p95_1, read_line);
+ break;
+ case 5:
+ EXPECT_STREQ(compared_p99_1, read_line);
+ break;
+ case 6:
+ EXPECT_STREQ(compared_cnt_1, read_line);
+ break;
+ case 7:
+ EXPECT_STREQ(compared_sum_1, read_line);
+ break;
+ default:
+ break;
+ }
+ n_line++;
+ }
+ fclose(fp);
+ EXPECT_EQ(8, n_line);
+
+ fieldstat_global_disable_prometheus_endpoint();
+ fieldstat_instance_free(instance);
+}
int main(int argc, char *argv[])
{