From 6d084a014147a3e4283d5964d865e8396be6a64d Mon Sep 17 00:00:00 2001 From: Owen Smith Date: Sat, 13 Jan 2024 23:44:06 +0000 Subject: [PATCH] Avoid off-spec openmetrics exposition when exemplars have empty labels Will fix https://github.com/prometheus/client_golang/issues/1333 Signed-off-by: Owen Smith --- expfmt/openmetrics_create.go | 2 +- expfmt/openmetrics_create_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/expfmt/openmetrics_create.go b/expfmt/openmetrics_create.go index 21cdddcf..6f2c8986 100644 --- a/expfmt/openmetrics_create.go +++ b/expfmt/openmetrics_create.go @@ -350,7 +350,7 @@ func writeOpenMetricsSample( return written, err } } - if exemplar != nil { + if exemplar != nil && len(exemplar.Label) > 0 { n, err = writeExemplar(w, exemplar) written += n if err != nil { diff --git a/expfmt/openmetrics_create_test.go b/expfmt/openmetrics_create_test.go index ab1e8616..5fa25c78 100644 --- a/expfmt/openmetrics_create_test.go +++ b/expfmt/openmetrics_create_test.go @@ -417,6 +417,31 @@ foos_total 42.0 }, out: `# HELP name doc string # TYPE name counter +`, + }, + // 9: Simple Counter with exemplar that has empty label set: + // ignore the exemplar, since OpenMetrics spec requires labels. + { + in: &dto.MetricFamily{ + Name: proto.String("foos_total"), + Help: proto.String("Number of foos."), + Type: dto.MetricType_COUNTER.Enum(), + Metric: []*dto.Metric{ + { + Counter: &dto.Counter{ + Value: proto.Float64(42), + Exemplar: &dto.Exemplar{ + Label: []*dto.LabelPair{}, + Value: proto.Float64(1), + Timestamp: openMetricsTimestamp, + }, + }, + }, + }, + }, + out: `# HELP foos Number of foos. +# TYPE foos counter +foos_total 42.0 `, }, }