From: Florian Forster Date: Wed, 31 Jan 2024 07:46:29 +0000 (+0100) Subject: format_stackdriver: Add support for `METRIC_TYPE_FPCOUNTER`. X-Git-Tag: collectd-6.0.0.rc2~6^2~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c69b288e6a2d44d26031e9f421106ae3ca9bcd11;p=thirdparty%2Fcollectd.git format_stackdriver: Add support for `METRIC_TYPE_FPCOUNTER`. --- diff --git a/src/utils/format_stackdriver/format_stackdriver.c b/src/utils/format_stackdriver/format_stackdriver.c index 9e9df4cf3..fc434ef12 100644 --- a/src/utils/format_stackdriver/format_stackdriver.c +++ b/src/utils/format_stackdriver/format_stackdriver.c @@ -134,16 +134,24 @@ static int format_typed_value(yajl_gen gen, metric_t const *m, switch (m->family->type) { case METRIC_TYPE_GAUGE: { - int status = json_string(gen, "doubleValue"); - if (status != 0) + int status = json_string(gen, "doubleValue") || + (int)yajl_gen_double(gen, m->value.gauge); + if (status != 0) { return status; + } + break; + } + case METRIC_TYPE_FPCOUNTER: { + /* Counter resets are handled in format_time_series(). */ + assert(m->value.fpcounter >= start_value.fpcounter); - status = (int)yajl_gen_double(gen, (double)m->value.gauge); - if (status != yajl_gen_status_ok) + fpcounter_t diff = m->value.fpcounter - start_value.fpcounter; + int status = + json_string(gen, "doubleValue") || (int)yajl_gen_double(gen, diff); + if (status != 0) { return status; - - yajl_gen_map_close(gen); - return 0; + } + break; } case METRIC_TYPE_COUNTER: { /* Counter resets are handled in format_time_series(). */ @@ -160,8 +168,7 @@ static int format_typed_value(yajl_gen gen, metric_t const *m, break; } case METRIC_TYPE_UNTYPED: - default: - ERROR("format_typed_value: invalid metric type: %d", m->family->type); + ERROR("format_typed_value: invalid metric type %d.", m->family->type); return EINVAL; } @@ -179,14 +186,14 @@ static int format_typed_value(yajl_gen gen, metric_t const *m, static int format_metric_kind(yajl_gen gen, metric_t const *m) { switch (m->family->type) { case METRIC_TYPE_GAUGE: - case METRIC_TYPE_UNTYPED: return json_string(gen, "GAUGE"); case METRIC_TYPE_COUNTER: + case METRIC_TYPE_FPCOUNTER: return json_string(gen, "CUMULATIVE"); - default: - ERROR("format_metric_kind: unknown value type %d.", m->family->type); - return EINVAL; + case METRIC_TYPE_UNTYPED: } + ERROR("format_metric_kind: invalid metric type %d.", m->family->type); + return EINVAL; } /* ValueType @@ -199,14 +206,14 @@ static int format_metric_kind(yajl_gen gen, metric_t const *m) { static int format_value_type(yajl_gen gen, metric_t const *m) { switch (m->family->type) { case METRIC_TYPE_GAUGE: - case METRIC_TYPE_UNTYPED: + case METRIC_TYPE_FPCOUNTER: return json_string(gen, "DOUBLE"); case METRIC_TYPE_COUNTER: return json_string(gen, "INT64"); - default: - ERROR("format_value_type: unknown value type %d.", m->family->type); - return EINVAL; + case METRIC_TYPE_UNTYPED: } + ERROR("format_metric_kind: invalid metric type %d.", m->family->type); + return EINVAL; } static int metric_type(strbuf_t *buf, metric_t const *m) { @@ -264,7 +271,8 @@ static int format_time_interval(yajl_gen gen, metric_t const *m, if (status != 0) return status; - if (m->family->type == METRIC_TYPE_COUNTER) { + if (m->family->type == METRIC_TYPE_COUNTER || + m->family->type == METRIC_TYPE_FPCOUNTER) { int status = json_string(gen, "startTime") || json_time(gen, start_time); if (status != 0) return status; @@ -377,6 +385,7 @@ static int format_time_series(yajl_gen gen, metric_t const *m, } break; case METRIC_TYPE_COUNTER: + case METRIC_TYPE_FPCOUNTER: // for cumulative metrics the interval must not be zero. if (start.time == m->time) { return EAGAIN; diff --git a/src/utils/format_stackdriver/format_stackdriver_test.c b/src/utils/format_stackdriver/format_stackdriver_test.c index 8597bcc07..b39913a51 100644 --- a/src/utils/format_stackdriver/format_stackdriver_test.c +++ b/src/utils/format_stackdriver/format_stackdriver_test.c @@ -32,6 +32,7 @@ DEF_TEST(sd_format_metric_descriptor) { label_pair_t *labels; size_t labels_num; char *want; + int want_err; } cases[] = { { .name = "gauge_metric", @@ -47,12 +48,17 @@ DEF_TEST(sd_format_metric_descriptor) { "counter_metric\",\"metricKind\":\"CUMULATIVE\"," "\"valueType\":\"INT64\",\"labels\":[]}", }, + { + .name = "fpcounter_metric", + .type = METRIC_TYPE_FPCOUNTER, + .want = "{\"type\":\"custom.googleapis.com/collectd/" + "fpcounter_metric\",\"metricKind\":\"CUMULATIVE\"," + "\"valueType\":\"DOUBLE\",\"labels\":[]}", + }, { .name = "untyped_metric", .type = METRIC_TYPE_UNTYPED, - .want = "{\"type\":\"custom.googleapis.com/collectd/" - "untyped_metric\",\"metricKind\":\"GAUGE\",\"valueType\":" - "\"DOUBLE\",\"labels\":[]}", + .want_err = 1, }, { .name = "metric_with_labels", @@ -78,6 +84,7 @@ DEF_TEST(sd_format_metric_descriptor) { }; for (size_t i = 0; i < (sizeof(cases) / sizeof(cases[0])); i++) { + printf("## Case %zu: %s\n", i, cases[i].name); metric_family_t fam = { .name = cases[i].name, .type = cases[i].type, @@ -91,7 +98,11 @@ DEF_TEST(sd_format_metric_descriptor) { } strbuf_t buf = STRBUF_CREATE; - EXPECT_EQ_INT(0, sd_format_metric_descriptor(&buf, &m)); + EXPECT_EQ_INT(cases[i].want_err, sd_format_metric_descriptor(&buf, &m)); + if (cases[i].want_err) { + continue; + } + EXPECT_EQ_STR(cases[i].want, buf.ptr); STRBUF_DESTROY(buf);