From 4fe90d3197316bd0aaf4aaad2db2dac73e7edbc0 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Sun, 15 Mar 2026 22:23:15 +0000 Subject: [PATCH 1/8] Reuse OtelInstrumentationScope --- .../trace/bootstrap/otel/common}/OtelInstrumentationScope.java | 2 +- .../main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java | 2 +- .../datadog/opentelemetry/shim/metrics/OtelMeterProvider.java | 2 +- .../opentelemetry/shim/metrics/export/OtelMetricsVisitor.java | 2 +- .../opentelemetry/opentelemetry-1.47/build.gradle | 2 ++ .../opentelemetry147/OpenTelemetryMetricsInstrumentation.java | 1 - .../src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/common}/OtelInstrumentationScope.java (97%) diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/OtelInstrumentationScope.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/common/OtelInstrumentationScope.java similarity index 97% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/OtelInstrumentationScope.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/common/OtelInstrumentationScope.java index 95decf41bc7..a1b5e238f22 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/OtelInstrumentationScope.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/common/OtelInstrumentationScope.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim; +package datadog.trace.bootstrap.otel.common; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import java.util.Objects; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java index a90637ceaaf..90de71cbf32 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java @@ -4,9 +4,9 @@ import static java.util.stream.Collectors.toList; import static java.util.stream.Stream.concat; -import datadog.opentelemetry.shim.OtelInstrumentationScope; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.opentelemetry.shim.metrics.export.OtelMeterVisitor; +import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; import io.opentelemetry.api.metrics.BatchCallback; import io.opentelemetry.api.metrics.DoubleGaugeBuilder; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java index 2943f19914e..53f615ffcd0 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java @@ -1,7 +1,7 @@ package datadog.opentelemetry.shim.metrics; -import datadog.opentelemetry.shim.OtelInstrumentationScope; import datadog.opentelemetry.shim.metrics.export.OtelMetricsVisitor; +import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; import datadog.trace.util.Strings; import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.MeterBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMetricsVisitor.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMetricsVisitor.java index 5f8245a6180..ae1e136b954 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMetricsVisitor.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMetricsVisitor.java @@ -1,6 +1,6 @@ package datadog.opentelemetry.shim.metrics.export; -import datadog.opentelemetry.shim.OtelInstrumentationScope; +import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; public interface OtelMetricsVisitor { /** Visits a meter created by the OpenTelemetry API. */ diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/build.gradle b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/build.gradle index bd1bd5a6a8a..dfa52b381ce 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/build.gradle +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/build.gradle @@ -18,6 +18,8 @@ dependencies { implementation project(':dd-java-agent:agent-otel:otel-shim') + testImplementation project(path: ':dd-java-agent:agent-otel:otel-bootstrap', configuration: 'shadow') + testImplementation group: 'io.opentelemetry', name: 'opentelemetry-api', version: openTelemetryVersion latestDepTestImplementation group: 'io.opentelemetry', name: 'opentelemetry-api', version: '1+' } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java index 2c56c049d8c..e563cf65563 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java @@ -61,7 +61,6 @@ public boolean onlyMatchKnownTypes() { @Override public String[] helperClassNames() { return new String[] { - "datadog.opentelemetry.shim.OtelInstrumentationScope", "datadog.opentelemetry.shim.metrics.OtelMeter", "datadog.opentelemetry.shim.metrics.OtelMeterBuilder", "datadog.opentelemetry.shim.metrics.OtelMeterProvider", diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy index 1de27c38b86..2c93601871e 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy @@ -2,7 +2,7 @@ package opentelemetry147.metrics import static io.opentelemetry.api.common.AttributeKey.stringKey -import datadog.opentelemetry.shim.OtelInstrumentationScope +import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope import datadog.opentelemetry.shim.metrics.OtelInstrumentDescriptor import datadog.opentelemetry.shim.metrics.OtelMeterProvider import datadog.opentelemetry.shim.metrics.data.OtelDoublePoint From 066d459f66acb5bbe6bc12a5e403fb390d1e2ace Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Sun, 15 Mar 2026 22:48:41 +0000 Subject: [PATCH 2/8] Reuse OtelInstrumentBuilder/Descriptor/Type --- .../otel}/metrics/OtelInstrumentBuilder.java | 22 ++++++++++--------- .../metrics/OtelInstrumentDescriptor.java | 2 +- .../otel}/metrics/OtelInstrumentType.java | 2 +- .../shim/metrics/OtelDoubleCounter.java | 5 +++-- .../shim/metrics/OtelDoubleGauge.java | 5 +++-- .../shim/metrics/OtelDoubleHistogram.java | 5 +++-- .../shim/metrics/OtelDoubleUpDownCounter.java | 5 +++-- .../shim/metrics/OtelLongCounter.java | 5 +++-- .../shim/metrics/OtelLongGauge.java | 5 +++-- .../shim/metrics/OtelLongHistogram.java | 5 +++-- .../shim/metrics/OtelLongUpDownCounter.java | 5 +++-- .../opentelemetry/shim/metrics/OtelMeter.java | 2 ++ .../shim/metrics/data/OtelMetricStorage.java | 4 ++-- .../shim/metrics/export/OtelMeterVisitor.java | 2 +- .../OpenTelemetryMetricsInstrumentation.java | 3 --- .../metrics/MetricsTest.groovy | 2 +- 16 files changed, 44 insertions(+), 35 deletions(-) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/OtelInstrumentBuilder.java (82%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/OtelInstrumentDescriptor.java (98%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/OtelInstrumentType.java (82%) diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentBuilder.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentBuilder.java similarity index 82% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentBuilder.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentBuilder.java index 14f7cfec256..7381e061984 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentBuilder.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentBuilder.java @@ -1,8 +1,8 @@ -package datadog.opentelemetry.shim.metrics; +package datadog.trace.bootstrap.otel.metrics; import javax.annotation.Nullable; -final class OtelInstrumentBuilder { +public final class OtelInstrumentBuilder { private final String instrumentName; private final OtelInstrumentType instrumentType; private final boolean longValues; @@ -17,7 +17,8 @@ final class OtelInstrumentBuilder { * @param instrumentType the type of the instrument * @return new instrument builder */ - static OtelInstrumentBuilder ofLongs(String instrumentName, OtelInstrumentType instrumentType) { + public static OtelInstrumentBuilder ofLongs( + String instrumentName, OtelInstrumentType instrumentType) { return new OtelInstrumentBuilder(instrumentName, instrumentType, true); } @@ -28,7 +29,7 @@ static OtelInstrumentBuilder ofLongs(String instrumentName, OtelInstrumentType i * @param instrumentType the type of the instrument * @return new instrument builder */ - static OtelInstrumentBuilder ofLongs( + public static OtelInstrumentBuilder ofLongs( OtelInstrumentBuilder builder, OtelInstrumentType instrumentType) { return new OtelInstrumentBuilder(builder.instrumentName, instrumentType, true); } @@ -40,7 +41,8 @@ static OtelInstrumentBuilder ofLongs( * @param instrumentType the type of the instrument * @return new instrument builder */ - static OtelInstrumentBuilder ofDoubles(String instrumentName, OtelInstrumentType instrumentType) { + public static OtelInstrumentBuilder ofDoubles( + String instrumentName, OtelInstrumentType instrumentType) { return new OtelInstrumentBuilder(instrumentName, instrumentType, false); } @@ -51,7 +53,7 @@ static OtelInstrumentBuilder ofDoubles(String instrumentName, OtelInstrumentType * @param instrumentType the type of the instrument * @return new instrument builder */ - static OtelInstrumentBuilder ofDoubles( + public static OtelInstrumentBuilder ofDoubles( OtelInstrumentBuilder builder, OtelInstrumentType instrumentType) { return new OtelInstrumentBuilder(builder.instrumentName, instrumentType, false); } @@ -63,20 +65,20 @@ private OtelInstrumentBuilder( this.longValues = longValues; } - void setDescription(String description) { + public void setDescription(String description) { this.description = description; } - void setUnit(String unit) { + public void setUnit(String unit) { this.unit = unit; } - OtelInstrumentDescriptor descriptor() { + public OtelInstrumentDescriptor descriptor() { return new OtelInstrumentDescriptor( instrumentName, instrumentType, longValues, description, unit); } - OtelInstrumentDescriptor observableDescriptor() { + public OtelInstrumentDescriptor observableDescriptor() { return new OtelInstrumentDescriptor( instrumentName, observableType(instrumentType), longValues, description, unit); } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentDescriptor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentDescriptor.java similarity index 98% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentDescriptor.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentDescriptor.java index 045cabea0de..c6b80bcf42b 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentDescriptor.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentDescriptor.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics; +package datadog.trace.bootstrap.otel.metrics; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import java.util.Locale; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentType.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentType.java similarity index 82% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentType.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentType.java index 95cc54d5f71..9a072c95e57 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrumentType.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrumentType.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics; +package datadog.trace.bootstrap.otel.metrics; public enum OtelInstrumentType { // same order as io.opentelemetry.sdk.metrics.InstrumentType diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java index fa63a720d9f..bc6c9ff9379 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java @@ -1,9 +1,10 @@ package datadog.opentelemetry.shim.metrics; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder.ofDoubles; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentType.COUNTER; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.COUNTER; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleCounter; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java index 1399e75cd20..f61c1503763 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java @@ -1,9 +1,10 @@ package datadog.opentelemetry.shim.metrics; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder.ofDoubles; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentType.GAUGE; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.GAUGE; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleGauge; import io.opentelemetry.api.metrics.DoubleGaugeBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java index 6f849f2b2ba..909459c73f4 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java @@ -1,12 +1,13 @@ package datadog.opentelemetry.shim.metrics; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder.ofDoubles; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentType.HISTOGRAM; import static datadog.opentelemetry.shim.metrics.data.OtelMetricStorage.newHistogramStorage; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.HISTOGRAM; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.relocate.api.RatelimitedLogger; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.opentelemetry.api.common.Attributes; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java index 41af785540c..4fe9ccba411 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java @@ -1,9 +1,10 @@ package datadog.opentelemetry.shim.metrics; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder.ofDoubles; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentType.UP_DOWN_COUNTER; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.UP_DOWN_COUNTER; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleUpDownCounter; import io.opentelemetry.api.metrics.DoubleUpDownCounterBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java index b9ea0468e38..5fedb377a89 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java @@ -1,9 +1,10 @@ package datadog.opentelemetry.shim.metrics; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder.ofLongs; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentType.COUNTER; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.COUNTER; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleCounterBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java index 01aefde2db8..48643198606 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java @@ -1,9 +1,10 @@ package datadog.opentelemetry.shim.metrics; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder.ofLongs; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentType.GAUGE; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.GAUGE; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.LongGauge; import io.opentelemetry.api.metrics.LongGaugeBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java index ddc52d2dbf2..21752c0b22b 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java @@ -1,12 +1,13 @@ package datadog.opentelemetry.shim.metrics; import static datadog.opentelemetry.shim.metrics.OtelDoubleHistogram.Builder.validateBoundaries; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder.ofLongs; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentType.HISTOGRAM; import static datadog.opentelemetry.shim.metrics.data.OtelMetricStorage.newHistogramStorage; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.HISTOGRAM; import static java.util.stream.Collectors.toList; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.relocate.api.RatelimitedLogger; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.opentelemetry.api.common.Attributes; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java index 0fe94c76bc2..df23263b1ec 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java @@ -1,9 +1,10 @@ package datadog.opentelemetry.shim.metrics; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder.ofLongs; -import static datadog.opentelemetry.shim.metrics.OtelInstrumentType.UP_DOWN_COUNTER; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; +import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.UP_DOWN_COUNTER; import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleUpDownCounterBuilder; import io.opentelemetry.api.metrics.LongUpDownCounter; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java index 90de71cbf32..e58d81fb3c1 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java @@ -7,6 +7,8 @@ import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.opentelemetry.shim.metrics.export.OtelMeterVisitor; import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; import io.opentelemetry.api.metrics.BatchCallback; import io.opentelemetry.api.metrics.DoubleGaugeBuilder; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java index 9f102e9b06c..b179c9f5018 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java @@ -1,11 +1,11 @@ package datadog.opentelemetry.shim.metrics.data; -import datadog.opentelemetry.shim.metrics.OtelInstrumentDescriptor; -import datadog.opentelemetry.shim.metrics.OtelInstrumentType; import datadog.opentelemetry.shim.metrics.export.OtelInstrumentVisitor; import datadog.trace.api.Config; import datadog.trace.api.config.OtlpConfig; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentType; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.common.Attributes; import java.util.List; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMeterVisitor.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMeterVisitor.java index 311d2666a0f..fbde2e6cf6b 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMeterVisitor.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMeterVisitor.java @@ -1,6 +1,6 @@ package datadog.opentelemetry.shim.metrics.export; -import datadog.opentelemetry.shim.metrics.OtelInstrumentDescriptor; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; public interface OtelMeterVisitor { /** Visits an instrument created by the meter. */ diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java index e563cf65563..88b42bb29f0 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java @@ -64,9 +64,6 @@ public String[] helperClassNames() { "datadog.opentelemetry.shim.metrics.OtelMeter", "datadog.opentelemetry.shim.metrics.OtelMeterBuilder", "datadog.opentelemetry.shim.metrics.OtelMeterProvider", - "datadog.opentelemetry.shim.metrics.OtelInstrumentType", - "datadog.opentelemetry.shim.metrics.OtelInstrumentDescriptor", - "datadog.opentelemetry.shim.metrics.OtelInstrumentBuilder", "datadog.opentelemetry.shim.metrics.OtelInstrument", "datadog.opentelemetry.shim.metrics.data.OtelPoint", "datadog.opentelemetry.shim.metrics.data.OtelAggregator", diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy index 2c93601871e..ecda92fc8d9 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy @@ -3,7 +3,7 @@ package opentelemetry147.metrics import static io.opentelemetry.api.common.AttributeKey.stringKey import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope -import datadog.opentelemetry.shim.metrics.OtelInstrumentDescriptor +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor import datadog.opentelemetry.shim.metrics.OtelMeterProvider import datadog.opentelemetry.shim.metrics.data.OtelDoublePoint import datadog.opentelemetry.shim.metrics.data.OtelHistogramPoint From 0d8ccd12bb885153e9a3410d2b5f66e1ed90cc3d Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Sun, 15 Mar 2026 22:38:29 +0000 Subject: [PATCH 3/8] Refactor OtelMetricStorage so the same instance can aggregate metrics using OTel attributes from both bootstrap and application classpaths --- .../shim/metrics/data/OtelMetricStorage.java | 13 ++++++------- .../shim/metrics/export/OtelInstrumentVisitor.java | 3 +-- .../opentelemetry147/metrics/MetricsTest.groovy | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java index b179c9f5018..775a40dc5e2 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java @@ -35,7 +35,7 @@ public final class OtelMetricStorage { private final OtelInstrumentDescriptor descriptor; private final boolean resetOnCollect; - private final Function aggregatorSupplier; + private final Function aggregatorSupplier; private volatile Recording currentRecording; // only used with DELTA temporality @@ -98,7 +98,7 @@ public OtelInstrumentDescriptor getDescriptor() { return descriptor; } - public void recordLong(long value, Attributes attributes) { + public void recordLong(long value, Object attributes) { if (resetOnCollect) { Recording recording = acquireRecordingForWrite(); try { @@ -112,7 +112,7 @@ public void recordLong(long value, Attributes attributes) { } } - public void recordDouble(double value, Attributes attributes) { + public void recordDouble(double value, Object attributes) { if (Double.isNaN(value)) { LOGGER.debug( "Instrument {} has recorded measurement Not-a-Number (NaN) value with attributes {}. Dropping measurement.", @@ -133,8 +133,7 @@ public void recordDouble(double value, Attributes attributes) { } } - private OtelAggregator aggregator( - Map aggregators, Attributes attributes) { + private OtelAggregator aggregator(Map aggregators, Object attributes) { Objects.requireNonNull(attributes, "attributes"); OtelAggregator aggregator = aggregators.get(attributes); if (null != aggregator) { @@ -188,7 +187,7 @@ private void doCollectAndReset(OtelInstrumentVisitor visitor) { Thread.yield(); // other threads are still writing to this recording } - Map aggregators = recording.aggregators; + Map aggregators = recording.aggregators; // avoid churn: only remove empty aggregators if we're over cardinality if (aggregators.size() >= CARDINALITY_LIMIT) { @@ -233,7 +232,7 @@ private void releaseRecordingAfterWrite(Recording recording) { private static final int WRITER = 2; static final class Recording { - final Map aggregators; + final Map aggregators; transient volatile int activity; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelInstrumentVisitor.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelInstrumentVisitor.java index 6067761e9aa..10dc96ba99c 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelInstrumentVisitor.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelInstrumentVisitor.java @@ -1,9 +1,8 @@ package datadog.opentelemetry.shim.metrics.export; import datadog.opentelemetry.shim.metrics.data.OtelPoint; -import io.opentelemetry.api.common.Attributes; public interface OtelInstrumentVisitor { /** Visits a data point collected by the instrument. */ - void visitPoint(Attributes attributes, OtelPoint point); + void visitPoint(Object attributes, OtelPoint point); } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy index ecda92fc8d9..f15acc04025 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy @@ -442,7 +442,7 @@ class MetricsTest extends InstrumentationSpecification { } @Override - void visitPoint(Attributes attributes, OtelPoint point) { + void visitPoint(Object attributes, OtelPoint point) { def key = scopeName + ':' + instrumentName if (!attributes.isEmpty()) { key = key + '@' + attributes.asMap() From 5c9c0b0790cf2eca54c106d0baef93d5331d7bff Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Sun, 15 Mar 2026 22:58:03 +0000 Subject: [PATCH 4/8] Reuse OtelMetricStorage --- .../otel}/metrics/data/OtelAggregator.java | 2 +- .../otel}/metrics/data/OtelDoublePoint.java | 2 +- .../otel}/metrics/data/OtelDoubleSum.java | 2 +- .../otel}/metrics/data/OtelDoubleValue.java | 2 +- .../otel}/metrics/data/OtelHistogramPoint.java | 2 +- .../otel}/metrics/data/OtelHistogramSketch.java | 2 +- .../otel}/metrics/data/OtelLongPoint.java | 2 +- .../bootstrap/otel}/metrics/data/OtelLongSum.java | 2 +- .../otel}/metrics/data/OtelLongValue.java | 2 +- .../otel}/metrics/data/OtelMetricStorage.java | 4 ++-- .../bootstrap/otel/metrics/data/OtelPoint.java | 3 +++ .../metrics/export/OtelInstrumentVisitor.java | 4 ++-- .../otel}/metrics/export/OtelMeterVisitor.java | 2 +- .../otel}/metrics/export/OtelMetricsVisitor.java | 2 +- .../shim/metrics/OtelDoubleCounter.java | 2 +- .../shim/metrics/OtelDoubleGauge.java | 2 +- .../shim/metrics/OtelDoubleHistogram.java | 4 ++-- .../shim/metrics/OtelDoubleUpDownCounter.java | 2 +- .../shim/metrics/OtelInstrument.java | 2 +- .../shim/metrics/OtelLongCounter.java | 2 +- .../opentelemetry/shim/metrics/OtelLongGauge.java | 2 +- .../shim/metrics/OtelLongHistogram.java | 4 ++-- .../shim/metrics/OtelLongUpDownCounter.java | 2 +- .../opentelemetry/shim/metrics/OtelMeter.java | 4 ++-- .../shim/metrics/OtelMeterProvider.java | 2 +- .../shim/metrics/OtelObservableMeasurement.java | 2 +- .../shim/metrics/data/OtelPoint.java | 3 --- .../OpenTelemetryMetricsInstrumentation.java | 15 --------------- .../opentelemetry147/metrics/MetricsTest.groovy | 14 +++++++------- 29 files changed, 40 insertions(+), 55 deletions(-) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelAggregator.java (93%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelDoublePoint.java (74%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelDoubleSum.java (87%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelDoubleValue.java (83%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelHistogramPoint.java (90%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelHistogramSketch.java (96%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelLongPoint.java (73%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelLongSum.java (87%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelLongValue.java (83%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/data/OtelMetricStorage.java (98%) create mode 100644 dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelPoint.java rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/export/OtelInstrumentVisitor.java (58%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/export/OtelMeterVisitor.java (81%) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/export/OtelMetricsVisitor.java (81%) delete mode 100644 dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelPoint.java diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelAggregator.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelAggregator.java similarity index 93% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelAggregator.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelAggregator.java index 282186ef36d..8a5efde2b91 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelAggregator.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelAggregator.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; /** Common behaviour shared across all aggregators. */ abstract class OtelAggregator { diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoublePoint.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoublePoint.java similarity index 74% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoublePoint.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoublePoint.java index 0404543b538..02bcfad2872 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoublePoint.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoublePoint.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; public final class OtelDoublePoint extends OtelPoint { public final double value; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoubleSum.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoubleSum.java similarity index 87% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoubleSum.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoubleSum.java index d1dd1ae6a62..9423a34ba85 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoubleSum.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoubleSum.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; import java.util.concurrent.atomic.DoubleAdder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoubleValue.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoubleValue.java similarity index 83% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoubleValue.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoubleValue.java index 9bf5f8e6b98..e7d3f185f5e 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelDoubleValue.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelDoubleValue.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; final class OtelDoubleValue extends OtelAggregator { private volatile double value; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelHistogramPoint.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelHistogramPoint.java similarity index 90% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelHistogramPoint.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelHistogramPoint.java index efa6cdd3c7a..fbab7b960cf 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelHistogramPoint.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelHistogramPoint.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; import java.util.List; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelHistogramSketch.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelHistogramSketch.java similarity index 96% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelHistogramSketch.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelHistogramSketch.java index 7fc0f182bac..28923193b4f 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelHistogramSketch.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelHistogramSketch.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; import datadog.metrics.api.Histogram; import java.util.List; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongPoint.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongPoint.java similarity index 73% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongPoint.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongPoint.java index 453f60eab31..19a5ac71fcf 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongPoint.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongPoint.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; public final class OtelLongPoint extends OtelPoint { public final long value; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongSum.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongSum.java similarity index 87% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongSum.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongSum.java index 91da9c054bb..d7b2e240fca 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongSum.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongSum.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; import java.util.concurrent.atomic.LongAdder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongValue.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongValue.java similarity index 83% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongValue.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongValue.java index 31e1719a89c..19fbc254790 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelLongValue.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelLongValue.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; final class OtelLongValue extends OtelAggregator { private volatile long value; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricStorage.java similarity index 98% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricStorage.java index 775a40dc5e2..97d9f31e410 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelMetricStorage.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricStorage.java @@ -1,11 +1,11 @@ -package datadog.opentelemetry.shim.metrics.data; +package datadog.trace.bootstrap.otel.metrics.data; -import datadog.opentelemetry.shim.metrics.export.OtelInstrumentVisitor; import datadog.trace.api.Config; import datadog.trace.api.config.OtlpConfig; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentType; +import datadog.trace.bootstrap.otel.metrics.export.OtelInstrumentVisitor; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.common.Attributes; import java.util.List; diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelPoint.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelPoint.java new file mode 100644 index 00000000000..abf0353157c --- /dev/null +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelPoint.java @@ -0,0 +1,3 @@ +package datadog.trace.bootstrap.otel.metrics.data; + +public abstract class OtelPoint {} diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelInstrumentVisitor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelInstrumentVisitor.java similarity index 58% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelInstrumentVisitor.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelInstrumentVisitor.java index 10dc96ba99c..a61a198ee4c 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelInstrumentVisitor.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelInstrumentVisitor.java @@ -1,6 +1,6 @@ -package datadog.opentelemetry.shim.metrics.export; +package datadog.trace.bootstrap.otel.metrics.export; -import datadog.opentelemetry.shim.metrics.data.OtelPoint; +import datadog.trace.bootstrap.otel.metrics.data.OtelPoint; public interface OtelInstrumentVisitor { /** Visits a data point collected by the instrument. */ diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMeterVisitor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMeterVisitor.java similarity index 81% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMeterVisitor.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMeterVisitor.java index fbde2e6cf6b..101b378477d 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMeterVisitor.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMeterVisitor.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.export; +package datadog.trace.bootstrap.otel.metrics.export; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMetricsVisitor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricsVisitor.java similarity index 81% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMetricsVisitor.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricsVisitor.java index ae1e136b954..ee79ab622c5 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/export/OtelMetricsVisitor.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricsVisitor.java @@ -1,4 +1,4 @@ -package datadog.opentelemetry.shim.metrics.export; +package datadog.trace.bootstrap.otel.metrics.export; import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java index bc6c9ff9379..6984f41842f 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java @@ -3,8 +3,8 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.COUNTER; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleCounter; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java index f61c1503763..571b15cfb5a 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java @@ -3,8 +3,8 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.GAUGE; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleGauge; import io.opentelemetry.api.metrics.DoubleGaugeBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java index 909459c73f4..86b9b199ddb 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java @@ -1,13 +1,13 @@ package datadog.opentelemetry.shim.metrics; -import static datadog.opentelemetry.shim.metrics.data.OtelMetricStorage.newHistogramStorage; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.HISTOGRAM; +import static datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage.newHistogramStorage; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.opentelemetry.api.common.Attributes; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java index 4fe9ccba411..da51e384378 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java @@ -3,8 +3,8 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.UP_DOWN_COUNTER; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleUpDownCounter; import io.opentelemetry.api.metrics.DoubleUpDownCounterBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrument.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrument.java index 3b7e727550d..d7f81e55e2a 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrument.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrument.java @@ -1,6 +1,6 @@ package datadog.opentelemetry.shim.metrics; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; /** Ensure all instruments implement the same equivalency. */ abstract class OtelInstrument { diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java index 5fedb377a89..c041c3b9763 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java @@ -3,8 +3,8 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.COUNTER; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleCounterBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java index 48643198606..b61b79c5689 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java @@ -3,8 +3,8 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.GAUGE; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.LongGauge; import io.opentelemetry.api.metrics.LongGaugeBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java index 21752c0b22b..eb33584d166 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java @@ -1,13 +1,13 @@ package datadog.opentelemetry.shim.metrics; import static datadog.opentelemetry.shim.metrics.OtelDoubleHistogram.Builder.validateBoundaries; -import static datadog.opentelemetry.shim.metrics.data.OtelMetricStorage.newHistogramStorage; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.HISTOGRAM; +import static datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage.newHistogramStorage; import static java.util.stream.Collectors.toList; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.opentelemetry.api.common.Attributes; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java index df23263b1ec..9eef6d00327 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java @@ -3,8 +3,8 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.UP_DOWN_COUNTER; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleUpDownCounterBuilder; import io.opentelemetry.api.metrics.LongUpDownCounter; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java index e58d81fb3c1..607674abb79 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java @@ -4,11 +4,11 @@ import static java.util.stream.Collectors.toList; import static java.util.stream.Stream.concat; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; -import datadog.opentelemetry.shim.metrics.export.OtelMeterVisitor; import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.export.OtelMeterVisitor; import io.opentelemetry.api.metrics.BatchCallback; import io.opentelemetry.api.metrics.DoubleGaugeBuilder; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java index 53f615ffcd0..41e72fe152f 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java @@ -1,7 +1,7 @@ package datadog.opentelemetry.shim.metrics; -import datadog.opentelemetry.shim.metrics.export.OtelMetricsVisitor; import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; +import datadog.trace.bootstrap.otel.metrics.export.OtelMetricsVisitor; import datadog.trace.util.Strings; import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.MeterBuilder; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelObservableMeasurement.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelObservableMeasurement.java index 3143acb9039..01b7c617c66 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelObservableMeasurement.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelObservableMeasurement.java @@ -1,6 +1,6 @@ package datadog.opentelemetry.shim.metrics; -import datadog.opentelemetry.shim.metrics.data.OtelMetricStorage; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelPoint.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelPoint.java deleted file mode 100644 index 1c0a8afd070..00000000000 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/data/OtelPoint.java +++ /dev/null @@ -1,3 +0,0 @@ -package datadog.opentelemetry.shim.metrics.data; - -public abstract class OtelPoint {} diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java index 88b42bb29f0..2c7333bd199 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java @@ -65,21 +65,6 @@ public String[] helperClassNames() { "datadog.opentelemetry.shim.metrics.OtelMeterBuilder", "datadog.opentelemetry.shim.metrics.OtelMeterProvider", "datadog.opentelemetry.shim.metrics.OtelInstrument", - "datadog.opentelemetry.shim.metrics.data.OtelPoint", - "datadog.opentelemetry.shim.metrics.data.OtelAggregator", - "datadog.opentelemetry.shim.metrics.data.OtelDoublePoint", - "datadog.opentelemetry.shim.metrics.data.OtelDoubleSum", - "datadog.opentelemetry.shim.metrics.data.OtelDoubleValue", - "datadog.opentelemetry.shim.metrics.data.OtelHistogramPoint", - "datadog.opentelemetry.shim.metrics.data.OtelHistogramSketch", - "datadog.opentelemetry.shim.metrics.data.OtelLongPoint", - "datadog.opentelemetry.shim.metrics.data.OtelLongSum", - "datadog.opentelemetry.shim.metrics.data.OtelLongValue", - "datadog.opentelemetry.shim.metrics.data.OtelMetricStorage", - "datadog.opentelemetry.shim.metrics.data.OtelMetricStorage$Recording", - "datadog.opentelemetry.shim.metrics.export.OtelInstrumentVisitor", - "datadog.opentelemetry.shim.metrics.export.OtelMeterVisitor", - "datadog.opentelemetry.shim.metrics.export.OtelMetricsVisitor", "datadog.opentelemetry.shim.metrics.OtelDoubleCounter", "datadog.opentelemetry.shim.metrics.OtelDoubleCounter$Builder", "datadog.opentelemetry.shim.metrics.OtelDoubleGauge", diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy index f15acc04025..0b82837b68d 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy @@ -5,13 +5,13 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor import datadog.opentelemetry.shim.metrics.OtelMeterProvider -import datadog.opentelemetry.shim.metrics.data.OtelDoublePoint -import datadog.opentelemetry.shim.metrics.data.OtelHistogramPoint -import datadog.opentelemetry.shim.metrics.data.OtelLongPoint -import datadog.opentelemetry.shim.metrics.data.OtelPoint -import datadog.opentelemetry.shim.metrics.export.OtelInstrumentVisitor -import datadog.opentelemetry.shim.metrics.export.OtelMeterVisitor -import datadog.opentelemetry.shim.metrics.export.OtelMetricsVisitor +import datadog.trace.bootstrap.otel.metrics.data.OtelDoublePoint +import datadog.trace.bootstrap.otel.metrics.data.OtelHistogramPoint +import datadog.trace.bootstrap.otel.metrics.data.OtelLongPoint +import datadog.trace.bootstrap.otel.metrics.data.OtelPoint +import datadog.trace.bootstrap.otel.metrics.export.OtelInstrumentVisitor +import datadog.trace.bootstrap.otel.metrics.export.OtelMeterVisitor +import datadog.trace.bootstrap.otel.metrics.export.OtelMetricsVisitor import datadog.trace.agent.test.InstrumentationSpecification import io.opentelemetry.api.GlobalOpenTelemetry import io.opentelemetry.api.common.Attributes From 6ee53ad7eb16cbd8b0875dea121acb9fdb3d2a06 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Sun, 15 Mar 2026 23:03:38 +0000 Subject: [PATCH 5/8] Reuse OtelInstrument --- .../trace/bootstrap/otel}/metrics/OtelInstrument.java | 8 ++++---- .../opentelemetry/shim/metrics/OtelDoubleCounter.java | 1 + .../opentelemetry/shim/metrics/OtelDoubleGauge.java | 1 + .../opentelemetry/shim/metrics/OtelDoubleHistogram.java | 1 + .../shim/metrics/OtelDoubleUpDownCounter.java | 1 + .../opentelemetry/shim/metrics/OtelLongCounter.java | 1 + .../datadog/opentelemetry/shim/metrics/OtelLongGauge.java | 1 + .../opentelemetry/shim/metrics/OtelLongHistogram.java | 1 + .../opentelemetry/shim/metrics/OtelLongUpDownCounter.java | 1 + .../OpenTelemetryMetricsInstrumentation.java | 1 - 10 files changed, 12 insertions(+), 5 deletions(-) rename dd-java-agent/agent-otel/{otel-shim/src/main/java/datadog/opentelemetry/shim => otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel}/metrics/OtelInstrument.java (77%) diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrument.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrument.java similarity index 77% rename from dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrument.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrument.java index d7f81e55e2a..010c463dde0 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelInstrument.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/OtelInstrument.java @@ -1,12 +1,12 @@ -package datadog.opentelemetry.shim.metrics; +package datadog.trace.bootstrap.otel.metrics; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; /** Ensure all instruments implement the same equivalency. */ -abstract class OtelInstrument { - final OtelMetricStorage storage; +public abstract class OtelInstrument { + protected final OtelMetricStorage storage; - OtelInstrument(OtelMetricStorage storage) { + protected OtelInstrument(OtelMetricStorage storage) { this.storage = storage; } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java index 6984f41842f..c9f11a29207 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleCounter.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.COUNTER; +import datadog.trace.bootstrap.otel.metrics.OtelInstrument; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java index 571b15cfb5a..31df22eb688 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleGauge.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.GAUGE; +import datadog.trace.bootstrap.otel.metrics.OtelInstrument; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import io.opentelemetry.api.common.Attributes; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java index 86b9b199ddb..94d161a1849 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleHistogram.java @@ -6,6 +6,7 @@ import static java.util.Arrays.asList; import static java.util.Collections.emptyList; +import datadog.trace.bootstrap.otel.metrics.OtelInstrument; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java index da51e384378..4a25c3f095a 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelDoubleUpDownCounter.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofDoubles; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.UP_DOWN_COUNTER; +import datadog.trace.bootstrap.otel.metrics.OtelInstrument; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import io.opentelemetry.api.common.Attributes; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java index c041c3b9763..4d8c1c4603f 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongCounter.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.COUNTER; +import datadog.trace.bootstrap.otel.metrics.OtelInstrument; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java index b61b79c5689..594dd2147bb 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongGauge.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.GAUGE; +import datadog.trace.bootstrap.otel.metrics.OtelInstrument; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import io.opentelemetry.api.common.Attributes; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java index eb33584d166..3a200f0ee7d 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongHistogram.java @@ -6,6 +6,7 @@ import static datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage.newHistogramStorage; import static java.util.stream.Collectors.toList; +import datadog.trace.bootstrap.otel.metrics.OtelInstrument; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import datadog.trace.relocate.api.RatelimitedLogger; diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java index 9eef6d00327..209b9e7265d 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelLongUpDownCounter.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder.ofLongs; import static datadog.trace.bootstrap.otel.metrics.OtelInstrumentType.UP_DOWN_COUNTER; +import datadog.trace.bootstrap.otel.metrics.OtelInstrument; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; import io.opentelemetry.api.common.Attributes; diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java index 2c7333bd199..305dd9f0f66 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/main/java/datadog/trace/instrumentation/opentelemetry147/OpenTelemetryMetricsInstrumentation.java @@ -64,7 +64,6 @@ public String[] helperClassNames() { "datadog.opentelemetry.shim.metrics.OtelMeter", "datadog.opentelemetry.shim.metrics.OtelMeterBuilder", "datadog.opentelemetry.shim.metrics.OtelMeterProvider", - "datadog.opentelemetry.shim.metrics.OtelInstrument", "datadog.opentelemetry.shim.metrics.OtelDoubleCounter", "datadog.opentelemetry.shim.metrics.OtelDoubleCounter$Builder", "datadog.opentelemetry.shim.metrics.OtelDoubleGauge", From fbed4e457b4da6c2781948fb6d6eba2960796e7e Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Mon, 16 Mar 2026 00:10:00 +0000 Subject: [PATCH 6/8] Introduce shared OtelMetricRegistry to track metrics by instrumentation scope. This will allow metrics produced by drop-in support and the OTel API to coexist. --- .../otel/metrics/data/OtelMetricRegistry.java | 74 +++++++++++++++++++ .../otel/metrics/data/OtelMetricStorage.java | 8 +- .../otel/metrics/data/OtelObservable.java | 5 ++ .../otel/metrics/export/OtelMeterVisitor.java | 8 -- ...entVisitor.java => OtelMetricVisitor.java} | 5 +- .../metrics/export/OtelMetricsVisitor.java | 5 +- .../export/OtelScopedMetricsVisitor.java | 9 +++ .../opentelemetry/shim/metrics/OtelMeter.java | 33 ++------- .../shim/metrics/OtelMeterProvider.java | 5 -- .../shim/metrics/OtelObservableCallback.java | 6 +- .../metrics/MetricsTest.groovy | 49 ++++++------ 11 files changed, 134 insertions(+), 73 deletions(-) create mode 100644 dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricRegistry.java create mode 100644 dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelObservable.java delete mode 100644 dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMeterVisitor.java rename dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/{OtelInstrumentVisitor.java => OtelMetricVisitor.java} (54%) create mode 100644 dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelScopedMetricsVisitor.java diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricRegistry.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricRegistry.java new file mode 100644 index 00000000000..95e21423f92 --- /dev/null +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricRegistry.java @@ -0,0 +1,74 @@ +package datadog.trace.bootstrap.otel.metrics.data; + +import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; +import datadog.trace.bootstrap.otel.metrics.export.OtelMetricsVisitor; +import datadog.trace.bootstrap.otel.metrics.export.OtelScopedMetricsVisitor; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +/** Tracks metric storage and observable callbacks by instrumentation scope. */ +public final class OtelMetricRegistry { + public static final OtelMetricRegistry INSTANCE = new OtelMetricRegistry(); + + private final Map> + scopedStorage = new ConcurrentHashMap<>(); + + private final Map> scopedObservables = + new ConcurrentHashMap<>(); + + public OtelMetricStorage registerStorage( + OtelInstrumentationScope instrumentationScope, + OtelInstrumentDescriptor descriptor, + Function storageFactory) { + return scopedStorage + .computeIfAbsent(instrumentationScope, unused -> new ConcurrentHashMap<>()) + .computeIfAbsent(descriptor, storageFactory); + } + + public void registerObservable( + OtelInstrumentationScope instrumentationScope, OtelObservable observable) { + List observables = + scopedObservables.computeIfAbsent(instrumentationScope, unused -> new ArrayList<>()); + synchronized (observables) { + observables.add(observable); + } + } + + public boolean unregisterObservable( + OtelInstrumentationScope instrumentationScope, OtelObservable observable) { + List observables = scopedObservables.get(instrumentationScope); + if (observables == null) { + return false; + } + synchronized (observables) { + return observables.remove(observable); + } + } + + public void collectMetrics(OtelMetricsVisitor visitor) { + scopedStorage.forEach( + (scope, storage) -> + collectScopedMetrics(scope, storage, visitor.visitScopedMetrics(scope))); + } + + private void collectScopedMetrics( + OtelInstrumentationScope instrumentationScope, + Map storage, + OtelScopedMetricsVisitor visitor) { + List observables = scopedObservables.get(instrumentationScope); + if (observables != null) { + // take local snapshot of current observables + List observablesCopy; + synchronized (observables) { + observablesCopy = new ArrayList<>(observables); + } + // must observe measurements outside of lock + observablesCopy.forEach(OtelObservable::observeMeasurements); + } + storage.forEach((descriptor, s) -> s.collectMetric(visitor.visitMetric(descriptor))); + } +} diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricStorage.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricStorage.java index 97d9f31e410..fcffa0abf52 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricStorage.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelMetricStorage.java @@ -5,7 +5,7 @@ import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentType; -import datadog.trace.bootstrap.otel.metrics.export.OtelInstrumentVisitor; +import datadog.trace.bootstrap.otel.metrics.export.OtelMetricVisitor; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.common.Attributes; import java.util.List; @@ -149,7 +149,7 @@ private OtelAggregator aggregator(Map aggregators, Objec return aggregators.computeIfAbsent(attributes, aggregatorSupplier); } - public void collect(OtelInstrumentVisitor visitor) { + public void collectMetric(OtelMetricVisitor visitor) { if (resetOnCollect) { doCollectAndReset(visitor); } else { @@ -158,7 +158,7 @@ public void collect(OtelInstrumentVisitor visitor) { } /** Collect data for CUMULATIVE temporality, keeping aggregators for future writes. */ - private void doCollect(OtelInstrumentVisitor visitor) { + private void doCollect(OtelMetricVisitor visitor) { // no need to hold writers back if we are not resetting metrics on collect currentRecording.aggregators.forEach( (attributes, aggregator) -> { @@ -173,7 +173,7 @@ private void doCollect(OtelInstrumentVisitor visitor) { * *

Each collect request toggles between two groups of aggregators: current / previous. */ - private void doCollectAndReset(OtelInstrumentVisitor visitor) { + private void doCollectAndReset(OtelMetricVisitor visitor) { // capture _current_ recording for collection, its aggregators will be reset at the end final Recording recording = currentRecording; diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelObservable.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelObservable.java new file mode 100644 index 00000000000..47bda02b086 --- /dev/null +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/data/OtelObservable.java @@ -0,0 +1,5 @@ +package datadog.trace.bootstrap.otel.metrics.data; + +public abstract class OtelObservable { + protected abstract void observeMeasurements(); +} diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMeterVisitor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMeterVisitor.java deleted file mode 100644 index 101b378477d..00000000000 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMeterVisitor.java +++ /dev/null @@ -1,8 +0,0 @@ -package datadog.trace.bootstrap.otel.metrics.export; - -import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; - -public interface OtelMeterVisitor { - /** Visits an instrument created by the meter. */ - OtelInstrumentVisitor visitInstrument(OtelInstrumentDescriptor descriptor); -} diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelInstrumentVisitor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricVisitor.java similarity index 54% rename from dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelInstrumentVisitor.java rename to dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricVisitor.java index a61a198ee4c..cf3bbb7ddf5 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelInstrumentVisitor.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricVisitor.java @@ -2,7 +2,8 @@ import datadog.trace.bootstrap.otel.metrics.data.OtelPoint; -public interface OtelInstrumentVisitor { - /** Visits a data point collected by the instrument. */ +/** A visitor to visit a metric in an instrumentation scope. */ +public interface OtelMetricVisitor { + /** Visits a data point in the metric. */ void visitPoint(Object attributes, OtelPoint point); } diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricsVisitor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricsVisitor.java index ee79ab622c5..746486f6176 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricsVisitor.java +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelMetricsVisitor.java @@ -2,7 +2,8 @@ import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; +/** A visitor to visit OpenTelemetry metrics. */ public interface OtelMetricsVisitor { - /** Visits a meter created by the OpenTelemetry API. */ - OtelMeterVisitor visitMeter(OtelInstrumentationScope scope); + /** Visits metrics produced by an instrumentation scope. */ + OtelScopedMetricsVisitor visitScopedMetrics(OtelInstrumentationScope scope); } diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelScopedMetricsVisitor.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelScopedMetricsVisitor.java new file mode 100644 index 00000000000..4603138c1db --- /dev/null +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/metrics/export/OtelScopedMetricsVisitor.java @@ -0,0 +1,9 @@ +package datadog.trace.bootstrap.otel.metrics.export; + +import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; + +/** A visitor to visit metrics produced by an instrumentation scope. */ +public interface OtelScopedMetricsVisitor { + /** Visits a metric in the instrumentation scope. */ + OtelMetricVisitor visitMetric(OtelInstrumentDescriptor descriptor); +} diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java index 607674abb79..1befb5a1b6b 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeter.java @@ -7,8 +7,8 @@ import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentBuilder; import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor; +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricRegistry; import datadog.trace.bootstrap.otel.metrics.data.OtelMetricStorage; -import datadog.trace.bootstrap.otel.metrics.export.OtelMeterVisitor; import io.opentelemetry.api.metrics.BatchCallback; import io.opentelemetry.api.metrics.DoubleGaugeBuilder; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; @@ -17,10 +17,7 @@ import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.api.metrics.ObservableMeasurement; -import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import java.util.function.Function; import java.util.regex.Pattern; @@ -42,11 +39,6 @@ final class OtelMeter implements Meter { private final OtelInstrumentationScope instrumentationScope; - private final Map storage = - new ConcurrentHashMap<>(); - - private final List observables = new ArrayList<>(); - OtelMeter(OtelInstrumentationScope instrumentationScope) { this.instrumentationScope = instrumentationScope; } @@ -104,14 +96,16 @@ public String toString() { OtelMetricStorage registerStorage( OtelInstrumentBuilder builder, Function storageFactory) { - return storage.computeIfAbsent(builder.descriptor(), storageFactory); + return OtelMetricRegistry.INSTANCE.registerStorage( + instrumentationScope, builder.descriptor(), storageFactory); } OtelObservableMeasurement registerObservableStorage( OtelInstrumentBuilder builder, Function storageFactory) { return new OtelObservableMeasurement( - storage.computeIfAbsent(builder.observableDescriptor(), storageFactory)); + OtelMetricRegistry.INSTANCE.registerStorage( + instrumentationScope, builder.observableDescriptor(), storageFactory)); } OtelObservableCallback registerObservableCallback(Consumer callback, M measurement) { @@ -122,25 +116,12 @@ OtelObservableCallback registerObservableCallback(Consumer callback, M me OtelObservableCallback registerObservableCallback( Runnable callback, List measurements) { OtelObservableCallback observable = new OtelObservableCallback(this, callback, measurements); - synchronized (observables) { - observables.add(observable); - } + OtelMetricRegistry.INSTANCE.registerObservable(instrumentationScope, observable); return observable; } boolean unregisterObservableCallback(OtelObservableCallback observable) { - synchronized (observables) { - return observables.remove(observable); - } - } - - void collect(OtelMeterVisitor visitor) { - List observablesCopy; - synchronized (observables) { - observablesCopy = new ArrayList<>(observables); - } - observablesCopy.forEach(OtelObservableCallback::observeMeasurements); - storage.forEach((descriptor, storage) -> storage.collect(visitor.visitInstrument(descriptor))); + return OtelMetricRegistry.INSTANCE.unregisterObservable(instrumentationScope, observable); } private static boolean validInstrumentName(@Nullable String instrumentName) { diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java index 41e72fe152f..f900a8b446f 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelMeterProvider.java @@ -1,7 +1,6 @@ package datadog.opentelemetry.shim.metrics; import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; -import datadog.trace.bootstrap.otel.metrics.export.OtelMetricsVisitor; import datadog.trace.util.Strings; import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.MeterBuilder; @@ -33,10 +32,6 @@ public MeterBuilder meterBuilder(String instrumentationScopeName) { return new OtelMeterBuilder(this, instrumentationScopeName); } - public void collectMetrics(OtelMetricsVisitor visitor) { - meters.forEach((scope, meter) -> meter.collect(visitor.visitMeter(scope))); - } - OtelMeter getMeterShim( String instrumentationScopeName, @Nullable String instrumentationScopeVersion, diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelObservableCallback.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelObservableCallback.java index e51edde0b4e..27fc36f318b 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelObservableCallback.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/metrics/OtelObservableCallback.java @@ -1,5 +1,6 @@ package datadog.opentelemetry.shim.metrics; +import datadog.trace.bootstrap.otel.metrics.data.OtelObservable; import datadog.trace.relocate.api.RatelimitedLogger; import io.opentelemetry.api.metrics.BatchCallback; import io.opentelemetry.api.metrics.ObservableDoubleCounter; @@ -13,7 +14,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class OtelObservableCallback +final class OtelObservableCallback extends OtelObservable implements ObservableDoubleCounter, ObservableLongCounter, ObservableDoubleGauge, @@ -37,7 +38,8 @@ final class OtelObservableCallback this.measurements = measurements; } - void observeMeasurements() { + @Override + public void observeMeasurements() { measurements.forEach(OtelObservableMeasurement::activate); try { callback.run(); diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy index 0b82837b68d..274567a27fa 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/src/test/groovy/opentelemetry147/metrics/MetricsTest.groovy @@ -2,17 +2,18 @@ package opentelemetry147.metrics import static io.opentelemetry.api.common.AttributeKey.stringKey +import datadog.opentelemetry.shim.metrics.OtelMeterProvider +import datadog.trace.agent.test.InstrumentationSpecification import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope import datadog.trace.bootstrap.otel.metrics.OtelInstrumentDescriptor -import datadog.opentelemetry.shim.metrics.OtelMeterProvider import datadog.trace.bootstrap.otel.metrics.data.OtelDoublePoint import datadog.trace.bootstrap.otel.metrics.data.OtelHistogramPoint import datadog.trace.bootstrap.otel.metrics.data.OtelLongPoint +import datadog.trace.bootstrap.otel.metrics.data.OtelMetricRegistry import datadog.trace.bootstrap.otel.metrics.data.OtelPoint -import datadog.trace.bootstrap.otel.metrics.export.OtelInstrumentVisitor -import datadog.trace.bootstrap.otel.metrics.export.OtelMeterVisitor +import datadog.trace.bootstrap.otel.metrics.export.OtelMetricVisitor import datadog.trace.bootstrap.otel.metrics.export.OtelMetricsVisitor -import datadog.trace.agent.test.InstrumentationSpecification +import datadog.trace.bootstrap.otel.metrics.export.OtelScopedMetricsVisitor import io.opentelemetry.api.GlobalOpenTelemetry import io.opentelemetry.api.common.Attributes import spock.lang.Shared @@ -49,7 +50,7 @@ class MetricsTest extends InstrumentationSpecification { when: counter.add(1) counter.add(2, someAttributes) - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:long-counter'] == 1 @@ -66,7 +67,7 @@ class MetricsTest extends InstrumentationSpecification { when: counter.add(1.2) counter.add(3.4, someAttributes) - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:double-counter'] == 1.2 @@ -82,7 +83,7 @@ class MetricsTest extends InstrumentationSpecification { when: counter.add(1) counter.add(2, someAttributes) - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:long-up-down-counter'] == 1 @@ -99,7 +100,7 @@ class MetricsTest extends InstrumentationSpecification { when: counter.add(1.2) counter.add(3.4, someAttributes) - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:double-up-down-counter'] == 1.2 @@ -116,7 +117,7 @@ class MetricsTest extends InstrumentationSpecification { when: counter.set(1) counter.set(2, someAttributes) - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:long-gauge'] == 1 @@ -132,7 +133,7 @@ class MetricsTest extends InstrumentationSpecification { when: counter.set(1.2) counter.set(3.4, someAttributes) - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:double-gauge'] == 1.2 @@ -150,7 +151,7 @@ class MetricsTest extends InstrumentationSpecification { histogram.record(1) histogram.record(24) histogram.record(101, someAttributes) - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:long-histogram'] == [2.0, [0.0, 5.0, 10.0, 25.0], [0.0, 1.0, 0.0, 1.0], 25.0] @@ -167,7 +168,7 @@ class MetricsTest extends InstrumentationSpecification { histogram.record(1.2) histogram.record(24.5) histogram.record(101.2, someAttributes) - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:double-histogram'] == [2.0, [0.0, 5.0, 10.0, 25.0], [0.0, 1.0, 0.0, 1.0], 25.7] @@ -184,7 +185,7 @@ class MetricsTest extends InstrumentationSpecification { } when: - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:observable-long-counter'] == 1 @@ -205,7 +206,7 @@ class MetricsTest extends InstrumentationSpecification { } when: - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:observable-double-counter'] == 1.2 @@ -225,7 +226,7 @@ class MetricsTest extends InstrumentationSpecification { } when: - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:observable-long-up-down-counter'] == 1 @@ -246,7 +247,7 @@ class MetricsTest extends InstrumentationSpecification { } when: - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:observable-double-up-down-counter'] == 1.2 @@ -267,7 +268,7 @@ class MetricsTest extends InstrumentationSpecification { } when: - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:observable-long-gauge'] == 1 @@ -287,7 +288,7 @@ class MetricsTest extends InstrumentationSpecification { } when: - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:observable-double-gauge'] == 1.2 @@ -360,7 +361,7 @@ class MetricsTest extends InstrumentationSpecification { }, null) when: - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: points['test:long-counter-observer'] == 1 @@ -379,7 +380,7 @@ class MetricsTest extends InstrumentationSpecification { when: points.clear() // this should invoke batchCallback again - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: // delta mode: counters show values added during last collect @@ -402,7 +403,7 @@ class MetricsTest extends InstrumentationSpecification { batchCallback.close() points.clear() // batchCallback will not be invoked as it it closed - meterProvider.collectMetrics(meterReader) + OtelMetricRegistry.INSTANCE.collectMetrics(meterReader) then: // delta mode: no values were added as batchCallback is closed @@ -425,18 +426,18 @@ class MetricsTest extends InstrumentationSpecification { noopCallback.close() } - class MeterReader implements OtelMetricsVisitor, OtelMeterVisitor, OtelInstrumentVisitor { + class MeterReader implements OtelMetricsVisitor, OtelScopedMetricsVisitor, OtelMetricVisitor { def scopeName def instrumentName @Override - OtelMeterVisitor visitMeter(OtelInstrumentationScope scope) { + OtelScopedMetricsVisitor visitScopedMetrics(OtelInstrumentationScope scope) { scopeName = scope.name return this } @Override - OtelInstrumentVisitor visitInstrument(OtelInstrumentDescriptor descriptor) { + OtelMetricVisitor visitMetric(OtelInstrumentDescriptor descriptor) { instrumentName = descriptor.name return this } From 2496111db3ad6d4301cb0f3c836fa35811111f9a Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Mon, 16 Mar 2026 14:27:51 +0000 Subject: [PATCH 7/8] Let muzzle know about the otel-bootstrap classes that will end up on the bootstrap classpath --- .../opentelemetry/opentelemetry-1.47/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/build.gradle b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/build.gradle index dfa52b381ce..09e7d555af6 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/build.gradle +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.47/build.gradle @@ -18,6 +18,7 @@ dependencies { implementation project(':dd-java-agent:agent-otel:otel-shim') + muzzleBootstrap project(path: ':dd-java-agent:agent-otel:otel-bootstrap', configuration: 'shadow') testImplementation project(path: ':dd-java-agent:agent-otel:otel-bootstrap', configuration: 'shadow') testImplementation group: 'io.opentelemetry', name: 'opentelemetry-api', version: openTelemetryVersion From c7bbdccacfbbc2e5d8c1aee8d4a7faf40e36ccf5 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Mon, 16 Mar 2026 23:06:04 +0000 Subject: [PATCH 8/8] Rebuild cached muzzle boot/tool classloaders if either class-path is extended mid-build (Needed for the extra muzzleBootstrap entry in opentelemetry-1.47 to take effect in CI) --- .../gradle/plugin/muzzle/MuzzleAction.kt | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/MuzzleAction.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/MuzzleAction.kt index d9d1793ca55..b01c9845054 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/MuzzleAction.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/MuzzleAction.kt @@ -9,10 +9,14 @@ import java.net.URLClassLoader abstract class MuzzleAction : WorkAction { companion object { private val lock = Any() - private var bootCL: ClassLoader? = null - private var toolCL: ClassLoader? = null + @Volatile + private var lastBootCL: ClassLoader? = null + @Volatile + private var lastToolCL: ClassLoader? = null @Volatile private var lastBuildStamp: Long = 0 + @Volatile + private var lastBuildPathCount: Int = 0 fun createClassLoader(cp: FileCollection, parent: ClassLoader = ClassLoader.getSystemClassLoader()): ClassLoader { val urls = cp.map { it.toURI().toURL() }.toTypedArray() @@ -22,12 +26,21 @@ abstract class MuzzleAction : WorkAction { override fun execute() { val buildStamp = parameters.buildStartedTime.get() - if (bootCL == null || toolCL == null || lastBuildStamp < buildStamp) { + val buildPathCount = parameters.bootstrapClassPath.count() + parameters.toolingClassPath.count() + var bootCL : ClassLoader? = lastBootCL + var toolCL : ClassLoader? = lastToolCL + // cache boot and tool classloaders for each run; rebuild if either class-path is extended mid-build + if (bootCL == null || toolCL == null || lastBuildStamp < buildStamp || lastBuildPathCount < buildPathCount) { synchronized(lock) { - if (bootCL == null || toolCL == null || lastBuildStamp < buildStamp) { + bootCL = lastBootCL + toolCL = lastToolCL + if (bootCL == null || toolCL == null || lastBuildStamp < buildStamp || lastBuildPathCount < buildPathCount) { bootCL = createClassLoader(parameters.bootstrapClassPath) toolCL = createClassLoader(parameters.toolingClassPath, bootCL!!) + lastBootCL = bootCL + lastToolCL = toolCL lastBuildStamp = buildStamp + lastBuildPathCount = buildPathCount } } }