Skip to content

Commit 797d8cc

Browse files
committed
Fix the behaviour of asynchronous counters and up-down counters.
Unlike synchronous counters which take the increment/delta value, asynchronous callbacks report the absolute value of the counter.
1 parent 7e99f00 commit 797d8cc

5 files changed

Lines changed: 46 additions & 18 deletions

File tree

dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public DoubleCounter build() {
7979

8080
@Override
8181
public ObservableDoubleMeasurement buildObserver() {
82-
return meter.registerObservableStorage(builder, OtelMetricStorage::newDoubleSumStorage);
82+
return meter.registerObservableStorage(builder, OtelMetricStorage::newDoubleValueStorage);
8383
}
8484

8585
@Override

dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public DoubleUpDownCounter build() {
6565

6666
@Override
6767
public ObservableDoubleMeasurement buildObserver() {
68-
return meter.registerObservableStorage(builder, OtelMetricStorage::newDoubleSumStorage);
68+
return meter.registerObservableStorage(builder, OtelMetricStorage::newDoubleValueStorage);
6969
}
7070

7171
@Override

dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public LongCounter build() {
8585

8686
@Override
8787
public ObservableLongMeasurement buildObserver() {
88-
return meter.registerObservableStorage(builder, OtelMetricStorage::newLongSumStorage);
88+
return meter.registerObservableStorage(builder, OtelMetricStorage::newLongValueStorage);
8989
}
9090

9191
@Override

dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public LongUpDownCounter build() {
7171

7272
@Override
7373
public ObservableLongMeasurement buildObserver() {
74-
return meter.registerObservableStorage(builder, OtelMetricStorage::newLongSumStorage);
74+
return meter.registerObservableStorage(builder, OtelMetricStorage::newLongValueStorage);
7575
}
7676

7777
@Override

dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/java/opentelemetry147/metrics/OpenTelemetryMetricsTest.java

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,13 @@ void testObservableLongCounter() {
212212
assertEquals(1L, points.get("test:observable-long-counter"));
213213
assertEquals(2L, points.get("test:observable-long-counter" + WITH_ATTRS));
214214

215+
// second collect: absolute values are reported, not accumulated
216+
points.clear();
217+
OtelMetricRegistry.INSTANCE.collectMetrics(meterReader);
218+
219+
assertEquals(1L, points.get("test:observable-long-counter"));
220+
assertEquals(2L, points.get("test:observable-long-counter" + WITH_ATTRS));
221+
215222
closeQuietly(observable);
216223
}
217224

@@ -231,6 +238,13 @@ void testObservableDoubleCounter() {
231238
assertEquals(1.2, points.get("test:observable-double-counter"));
232239
assertEquals(3.4, points.get("test:observable-double-counter" + WITH_ATTRS));
233240

241+
// second collect: absolute values are reported, not accumulated
242+
points.clear();
243+
OtelMetricRegistry.INSTANCE.collectMetrics(meterReader);
244+
245+
assertEquals(1.2, points.get("test:observable-double-counter"));
246+
assertEquals(3.4, points.get("test:observable-double-counter" + WITH_ATTRS));
247+
234248
closeQuietly(observable);
235249
}
236250

@@ -249,6 +263,13 @@ void testObservableLongUpDownCounter() {
249263
assertEquals(1L, points.get("test:observable-long-up-down-counter"));
250264
assertEquals(2L, points.get("test:observable-long-up-down-counter" + WITH_ATTRS));
251265

266+
// second collect: absolute values are reported, not accumulated
267+
points.clear();
268+
OtelMetricRegistry.INSTANCE.collectMetrics(meterReader);
269+
270+
assertEquals(1L, points.get("test:observable-long-up-down-counter"));
271+
assertEquals(2L, points.get("test:observable-long-up-down-counter" + WITH_ATTRS));
272+
252273
closeQuietly(observable);
253274
}
254275

@@ -268,6 +289,13 @@ void testObservableDoubleUpDownCounter() {
268289
assertEquals(1.2, points.get("test:observable-double-up-down-counter"));
269290
assertEquals(3.4, points.get("test:observable-double-up-down-counter" + WITH_ATTRS));
270291

292+
// second collect: absolute values are reported, not accumulated
293+
points.clear();
294+
OtelMetricRegistry.INSTANCE.collectMetrics(meterReader);
295+
296+
assertEquals(1.2, points.get("test:observable-double-up-down-counter"));
297+
assertEquals(3.4, points.get("test:observable-double-up-down-counter" + WITH_ATTRS));
298+
271299
closeQuietly(observable);
272300
}
273301

@@ -385,18 +413,18 @@ void testBatchCallback() {
385413
points.clear();
386414
OtelMetricRegistry.INSTANCE.collectMetrics(meterReader);
387415

388-
// delta mode: counters show values added during last collect
416+
// async counters show the count _set_ during last collect
389417
assertEquals(1L, points.get("test:long-counter-observer"));
390418
assertEquals(10L, points.get("test:long-counter-observer" + WITH_ATTRS));
391419
assertEquals(2.3, points.get("test:double-counter-observer"));
392420
assertEquals(20.3, points.get("test:double-counter-observer" + WITH_ATTRS));
393-
// up-down counters stay cumulative: they show the running total
394-
assertEquals(8L, points.get("test:long-up-down-counter-observer"));
395-
assertEquals(80L, points.get("test:long-up-down-counter-observer" + WITH_ATTRS));
396-
assertEquals(11.2, (double) points.get("test:double-up-down-counter-observer"), 0.001);
421+
// async up-down counters also show the count _set_ during last collect
422+
assertEquals(4L, points.get("test:long-up-down-counter-observer"));
423+
assertEquals(40L, points.get("test:long-up-down-counter-observer" + WITH_ATTRS));
424+
assertEquals(5.6, (double) points.get("test:double-up-down-counter-observer"), 0.001);
397425
assertEquals(
398-
101.2, (double) points.get("test:double-up-down-counter-observer" + WITH_ATTRS), 0.001);
399-
// gauges also stay cumulative: they only show latest value
426+
50.6, (double) points.get("test:double-up-down-counter-observer" + WITH_ATTRS), 0.001);
427+
// gauges continue to only show the latest value
400428
assertEquals(7L, points.get("test:long-gauge-observer"));
401429
assertEquals(70L, points.get("test:long-gauge-observer" + WITH_ATTRS));
402430
assertEquals(8.9, points.get("test:double-gauge-observer"));
@@ -407,18 +435,18 @@ void testBatchCallback() {
407435
points.clear();
408436
OtelMetricRegistry.INSTANCE.collectMetrics(meterReader);
409437

410-
// delta mode: no values were added as batchCallback is closed
438+
// delta mode: no counts were set as batchCallback is closed, so no data point
411439
assertNull(points.get("test:long-counter-observer"));
412440
assertNull(points.get("test:long-counter-observer" + WITH_ATTRS));
413441
assertNull(points.get("test:double-counter-observer"));
414442
assertNull(points.get("test:double-counter-observer" + WITH_ATTRS));
415-
// up-down counters stay cumulative: they show the running total
416-
assertEquals(8L, points.get("test:long-up-down-counter-observer"));
417-
assertEquals(80L, points.get("test:long-up-down-counter-observer" + WITH_ATTRS));
418-
assertEquals(11.2, (double) points.get("test:double-up-down-counter-observer"), 0.001);
443+
// up-down counters stay cumulative: they continue to show the last count set
444+
assertEquals(4L, points.get("test:long-up-down-counter-observer"));
445+
assertEquals(40L, points.get("test:long-up-down-counter-observer" + WITH_ATTRS));
446+
assertEquals(5.6, (double) points.get("test:double-up-down-counter-observer"), 0.001);
419447
assertEquals(
420-
101.2, (double) points.get("test:double-up-down-counter-observer" + WITH_ATTRS), 0.001);
421-
// gauges also stay cumulative: they only show latest value
448+
50.6, (double) points.get("test:double-up-down-counter-observer" + WITH_ATTRS), 0.001);
449+
// gauges also stay cumulative: they continue to show the latest value set
422450
assertEquals(7L, points.get("test:long-gauge-observer"));
423451
assertEquals(70L, points.get("test:long-gauge-observer" + WITH_ATTRS));
424452
assertEquals(8.9, points.get("test:double-gauge-observer"));

0 commit comments

Comments
 (0)