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(). */
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;
}
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
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) {
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;
}
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;
label_pair_t *labels;
size_t labels_num;
char *want;
+ int want_err;
} cases[] = {
{
.name = "gauge_metric",
"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",
};
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,
}
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);