mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2024-12-26 21:05:00 +02:00
Fix exemplars being added to gauge metrics in the prometheus exporter (#5912)
Prometheus Gauge metrics don't support exemplars and while `addGaugeMetric()` doesn't add them, `addSumMetric()` will if the metric is monotonic. This causes the prometheus client to throw an error: ``` * error collecting metric Desc{fqName: "http_server_request_body_size_bytes", help: "Measures size of RPC request messages (uncompressed).", constLabels: {}, variableLabels: {net_protocol_name,net_protocol_version,http_method,http_route,http_scheme,net_host_name,net_host_port,otel_scope_name,otel_scope_version}}: cannot inject exemplar into Gauge, Summary or Untyped ``` --------- Co-authored-by: Damien Mathieu <42@dmathieu.com> Co-authored-by: David Ashpole <dashpole@google.com>
This commit is contained in:
parent
30c4a9a330
commit
664a075380
@ -21,6 +21,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
||||
### Fixed
|
||||
|
||||
- Global MeterProvider registration unwraps global instrument Observers, the undocumented Unwrap() methods are now private. (#5881)
|
||||
- Fix `go.opentelemetry.io/otel/exporters/prometheus` trying to add exemplars to Gauge metrics, which is unsupported. (#5912)
|
||||
|
||||
### Changed
|
||||
|
||||
|
@ -277,7 +277,11 @@ func addSumMetric[N int64 | float64](ch chan<- prometheus.Metric, sum metricdata
|
||||
otel.Handle(err)
|
||||
continue
|
||||
}
|
||||
m = addExemplars(m, dp.Exemplars)
|
||||
// GaugeValues don't support Exemplars at this time
|
||||
// https://github.com/prometheus/client_golang/blob/aef8aedb4b6e1fb8ac1c90790645169125594096/prometheus/metric.go#L199
|
||||
if valueType != prometheus.GaugeValue {
|
||||
m = addExemplars(m, dp.Exemplars)
|
||||
}
|
||||
ch <- m
|
||||
}
|
||||
}
|
||||
|
@ -431,6 +431,42 @@ func TestPrometheusExporter(t *testing.T) {
|
||||
counter.Add(ctx, 5, otelmetric.WithAttributeSet(attrs2))
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "non-monotonic sum does not add exemplars",
|
||||
expectedFile: "testdata/non_monotonic_sum_does_not_add_exemplars.txt",
|
||||
recordMetrics: func(ctx context.Context, meter otelmetric.Meter) {
|
||||
sc := trace.NewSpanContext(trace.SpanContextConfig{
|
||||
SpanID: trace.SpanID{0o1},
|
||||
TraceID: trace.TraceID{0o1},
|
||||
TraceFlags: trace.FlagsSampled,
|
||||
})
|
||||
ctx = trace.ContextWithSpanContext(ctx, sc)
|
||||
opt := otelmetric.WithAttributes(
|
||||
attribute.Key("A").String("B"),
|
||||
attribute.Key("C").String("D"),
|
||||
attribute.Key("E").Bool(true),
|
||||
attribute.Key("F").Int(42),
|
||||
)
|
||||
counter, err := meter.Float64UpDownCounter(
|
||||
"foo",
|
||||
otelmetric.WithDescription("a simple up down counter"),
|
||||
otelmetric.WithUnit("s"),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
counter.Add(ctx, 5, opt)
|
||||
counter.Add(ctx, 10.3, opt)
|
||||
counter.Add(ctx, 9, opt)
|
||||
counter.Add(ctx, -1, opt)
|
||||
|
||||
attrs2 := attribute.NewSet(
|
||||
attribute.Key("A").String("D"),
|
||||
attribute.Key("C").String("B"),
|
||||
attribute.Key("E").Bool(true),
|
||||
attribute.Key("F").Int(42),
|
||||
)
|
||||
counter.Add(ctx, 5, otelmetric.WithAttributeSet(attrs2))
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
|
10
exporters/prometheus/testdata/non_monotonic_sum_does_not_add_exemplars.txt
vendored
Normal file
10
exporters/prometheus/testdata/non_monotonic_sum_does_not_add_exemplars.txt
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
# HELP foo_seconds a simple up down counter
|
||||
# TYPE foo_seconds gauge
|
||||
foo_seconds{A="B",C="D",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 23.3
|
||||
foo_seconds{A="D",C="B",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 5
|
||||
# HELP otel_scope_info Instrumentation Scope metadata
|
||||
# TYPE otel_scope_info gauge
|
||||
otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1
|
||||
# HELP target_info Target metadata
|
||||
# TYPE target_info gauge
|
||||
target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1
|
Loading…
Reference in New Issue
Block a user