diff --git a/src/cmt_encode_prometheus.c b/src/cmt_encode_prometheus.c index b5f7614..8e3bfd0 100644 --- a/src/cmt_encode_prometheus.c +++ b/src/cmt_encode_prometheus.c @@ -373,7 +373,11 @@ static cfl_sds_t bucket_value_to_string(double val) len = snprintf(str, 64, "%g", val); cfl_sds_len_set(str, len); - if (!strchr(str, '.')) { + /* + * Append .0 only when there is no decimal point and the number + * is not in scientific notation. + */ + if (!strchr(str, '.') && !strchr(str, 'e')) { cfl_sds_cat_safe(&str, ".0", 2); } diff --git a/tests/histogram.c b/tests/histogram.c index d5fc80b..2ffb8cc 100644 --- a/tests/histogram.c +++ b/tests/histogram.c @@ -109,6 +109,45 @@ static void prometheus_encode_test(struct cmt *cmt) cmt_encode_prometheus_destroy(buf); } +void test_histogram_scientific_notation_bucket_label() +{ + uint64_t ts; + cfl_sds_t buf; + struct cmt *cmt; + struct cmt_histogram *h; + struct cmt_histogram_buckets *buckets; + + cmt_initialize(); + + ts = 0; + cmt = cmt_create(); + TEST_CHECK(cmt != NULL); + + buckets = cmt_histogram_buckets_create(1, 100000000.0); + TEST_CHECK(buckets != NULL); + + h = cmt_histogram_create(cmt, + "cm", "encoding", "scientific_bucket", + "Histogram scientific bucket label", + buckets, + 0, NULL); + TEST_CHECK(h != NULL); + + cmt_histogram_observe(h, ts, 42.0, 0, NULL); + + buf = cmt_encode_prometheus_create(cmt, CMT_TRUE); + TEST_CHECK(buf != NULL); + if (buf != NULL) { + TEST_CHECK(strstr(buf, + "cm_encoding_scientific_bucket_bucket{le=\"1e+08\"} 1 0") != NULL); + TEST_CHECK(strstr(buf, + "cm_encoding_scientific_bucket_bucket{le=\"1e+08.0\"}") == NULL); + cmt_encode_prometheus_destroy(buf); + } + + cmt_destroy(cmt); +} + void test_histogram() { @@ -206,6 +245,7 @@ void test_set_defaults() } TEST_LIST = { + {"scientific_notation_bucket_label", test_histogram_scientific_notation_bucket_label}, {"histogram" , test_histogram}, {"set_defaults", test_set_defaults}, { 0 }