From: Florian Forster Date: Fri, 22 Dec 2023 22:39:58 +0000 (+0100) Subject: write_prometheus plugin: Translate between resource attributes and target labels. X-Git-Tag: 6.0.0-rc0~23^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3a87705b6f3f46373d04517e86674531fc112ed;p=thirdparty%2Fcollectd.git write_prometheus plugin: Translate between resource attributes and target labels. * `service.name` → `job` * `service.instance.id` → `instance` --- diff --git a/src/write_prometheus.c b/src/write_prometheus.c index 9c1040fcd..8a0e35f7e 100644 --- a/src/write_prometheus.c +++ b/src/write_prometheus.c @@ -77,17 +77,27 @@ static struct MHD_Daemon *httpd; static cdtime_t staleness_delta = PROMETHEUS_DEFAULT_STALENESS_DELTA; static int format_label_set(strbuf_t *buf, label_set_t const *labels, - char const *prefix, bool first_label) { + char const *prefix, bool translate, + bool first_label) { int status = 0; for (size_t i = 0; i < labels->num; i++) { if (!first_label) { status = status || strbuf_print(buf, ","); } + char const *name = labels->ptr[i].name; + if (translate) { + if (strcmp("service.name", name) == 0) { + name = "job"; + } else if (strcmp("service.instance.id", name) == 0) { + name = "instance"; + } + } + status = status || strbuf_print_restricted(buf, prefix, VALID_LABEL_CHARS, '_'); - status = status || strbuf_print_restricted(buf, labels->ptr[i].name, - VALID_LABEL_CHARS, '_'); + status = + status || strbuf_print_restricted(buf, name, VALID_LABEL_CHARS, '_'); status = status || strbuf_print(buf, "=\""); status = status || strbuf_print_escaped(buf, labels->ptr[i].value, "\\\"\n\r\t", '\\'); @@ -114,10 +124,10 @@ static int format_metric(strbuf_t *buf, metric_t const *m) { bool first_label = true; if (resource->num != 0) { status = status || format_label_set(buf, resource, RESOURCE_LABEL_PREFIX, - first_label); + true, first_label); first_label = false; } - status = status || format_label_set(buf, &m->label, "", first_label); + status = status || format_label_set(buf, &m->label, "", false, first_label); return status || strbuf_print(buf, "}"); } @@ -186,16 +196,9 @@ void target_info(strbuf_t *buf, label_set_t resource) { strbuf_print(buf, "# TYPE target info\n"); strbuf_print(buf, "# HELP target Target metadata\n"); - metric_t m = { - .family = - &(metric_family_t){ - .name = "target_info", - }, - .label = resource, - }; - format_metric(buf, &m); - - strbuf_print(buf, " 1\n"); + strbuf_print(buf, "target_info{"); + format_label_set(buf, &resource, "", true, true); + strbuf_print(buf, "} 1\n"); } static void format_text(strbuf_t *buf) { diff --git a/src/write_prometheus_test.c b/src/write_prometheus_test.c index 54a67ca78..83aab7ee8 100644 --- a/src/write_prometheus_test.c +++ b/src/write_prometheus_test.c @@ -169,6 +169,28 @@ DEF_TEST(target_info) { "# HELP target Target metadata\n" "target_info{foo=\"bar\"} 1\n", }, + { + .name = "service.name gets translated to job", + .resource = + { + .ptr = &(label_pair_t){"service.name", "unittest"}, + .num = 1, + }, + .want = "# TYPE target info\n" + "# HELP target Target metadata\n" + "target_info{job=\"unittest\"} 1\n", + }, + { + .name = "service.instance.id gets translated to instance", + .resource = + { + .ptr = &(label_pair_t){"service.instance.id", "42"}, + .num = 1, + }, + .want = "# TYPE target info\n" + "# HELP target Target metadata\n" + "target_info{instance=\"42\"} 1\n", + }, }; for (size_t i = 0; i < STATIC_ARRAY_SIZE(cases); i++) {