]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
format_stackdriver: Add support for `METRIC_TYPE_FPCOUNTER`.
authorFlorian Forster <octo@collectd.org>
Wed, 31 Jan 2024 07:46:29 +0000 (08:46 +0100)
committerFlorian Forster <octo@collectd.org>
Wed, 31 Jan 2024 13:39:14 +0000 (14:39 +0100)
src/utils/format_stackdriver/format_stackdriver.c
src/utils/format_stackdriver/format_stackdriver_test.c

index 9e9df4cf34ccf08a0317935aa4844dfcc3c770c3..fc434ef12db3857cea8a1cca4432e2585563614d 100644 (file)
@@ -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;
index 8597bcc07f00d4ebfb99a5922e7e04e91ee1d500..b39913a5116bb9be8488b148351b49c5d88955f9 100644 (file)
@@ -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);