From d6ea233bc9c29822b95bc90788c0b333e5b2ce13 Mon Sep 17 00:00:00 2001 From: typotter Date: Thu, 9 Apr 2026 10:24:11 -0600 Subject: [PATCH] Fix feature_flag.evaluations metric count always being zero The OTel SDK defaults to DELTA temporality for counters. The Datadog agent converts OTLP delta monotonic sums to rate metrics by dividing by the export interval (10s). Five evaluations in under 1s produce ~0.5, which rounds to zero in the points payload. Force CUMULATIVE temporality on the OtlpHttpMetricExporter so the agent receives an absolute count rather than a rate, making test_ffe_eval_metric_count reliable. --- .../java/datadog/trace/api/openfeature/FlagEvalMetrics.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java index 1810ba353df..be812871956 100644 --- a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java +++ b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import java.io.Closeable; import java.time.Duration; @@ -54,7 +55,10 @@ class FlagEvalMetrics implements Closeable { } OtlpHttpMetricExporter exporter = - OtlpHttpMetricExporter.builder().setEndpoint(endpoint).build(); + OtlpHttpMetricExporter.builder() + .setEndpoint(endpoint) + .setAggregationTemporalitySelector(AggregationTemporalitySelector.alwaysCumulative()) + .build(); PeriodicMetricReader reader = PeriodicMetricReader.builder(exporter).setInterval(EXPORT_INTERVAL).build();