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 50f67fccc4f..bcb5898f988 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 @@ -67,7 +67,7 @@ class FlagEvalMetrics implements Closeable { OtlpHttpMetricExporter exporter = OtlpHttpMetricExporter.builder() .setEndpoint(endpoint) - .setAggregationTemporalitySelector(AggregationTemporalitySelector.alwaysCumulative()) + .setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()) .build(); PeriodicMetricReader reader = diff --git a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsTest.java b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsTest.java index cec9b2d0eb7..9d870b0c03c 100644 --- a/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsTest.java +++ b/products/feature-flagging/feature-flagging-api/src/test/java/datadog/trace/api/openfeature/FlagEvalMetricsTest.java @@ -13,6 +13,7 @@ import io.opentelemetry.sdk.metrics.data.AggregationTemporality; import io.opentelemetry.sdk.metrics.data.LongPointData; import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; import java.util.Collection; import org.junit.jupiter.api.Test; @@ -145,11 +146,14 @@ void shutdownClearsCounter() { } @Test - void multipleRecordCallsAccumulateCumulativelyInExportedMetrics() { - // InMemoryMetricReader defaults to cumulative temporality. This validates that N record() - // calls produce a cumulative sum of N, matching the alwaysCumulative() selector configured - // on the production OTLP exporter in FlagEvalMetrics. - InMemoryMetricReader reader = InMemoryMetricReader.create(); + void multipleRecordCallsAccumulateWithDeltaTemporality() { + // Use delta temporality to match the deltaPreferred() selector configured on the production + // OTLP exporter in FlagEvalMetrics. Delta temporality exports only increments since last + // collection, which is what OTLP receivers expect. + InMemoryMetricReader reader = + InMemoryMetricReader.builder() + .setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()) + .build(); SdkMeterProvider provider = SdkMeterProvider.builder().registerMetricReader(reader).build(); try (FlagEvalMetrics metrics = new FlagEvalMetrics(provider)) { @@ -165,12 +169,12 @@ void multipleRecordCallsAccumulateCumulativelyInExportedMetrics() { .orElseThrow(() -> new AssertionError("feature_flag.evaluations metric not found")); assertEquals( - AggregationTemporality.CUMULATIVE, + AggregationTemporality.DELTA, metric.getLongSumData().getAggregationTemporality(), - "Exported metric must use CUMULATIVE temporality"); + "Exported metric must use DELTA temporality"); LongPointData point = metric.getLongSumData().getPoints().iterator().next(); - assertEquals(5L, point.getValue(), "5 record() calls must produce a cumulative sum of 5"); + assertEquals(5L, point.getValue(), "5 record() calls must produce a delta sum of 5"); } }