diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracer.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracer.java index ae091b65d03..d286c6d1cde 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracer.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracer.java @@ -3,6 +3,7 @@ import static datadog.opentelemetry.shim.trace.OtelConventions.SPAN_KIND_INTERNAL; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; +import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.Tracer; import javax.annotation.ParametersAreNonnullByDefault; @@ -11,9 +12,12 @@ final class OtelTracer implements Tracer { private static final String INSTRUMENTATION_NAME = otelInstrumentationName(); + private final OtelInstrumentationScope instrumentationScope; + private final AgentTracer.TracerAPI tracer; - OtelTracer(@SuppressWarnings("unused") String instrumentationScopeName) { + OtelTracer(OtelInstrumentationScope instrumentationScope) { + this.instrumentationScope = instrumentationScope; this.tracer = AgentTracer.get(); } @@ -24,6 +28,11 @@ public SpanBuilder spanBuilder(String spanName) { return new OtelSpanBuilder(delegate); } + @Override + public String toString() { + return "OtelTracer{instrumentationScope=" + instrumentationScope + "}"; + } + @SuppressWarnings("ConstantConditions") private static String otelInstrumentationName() { // is this the bootstrap shim for drop-in support, or the shim for manual instrumentation? diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java index 00c82c1c552..2db018771e5 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java @@ -2,12 +2,16 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerBuilder; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault final class OtelTracerBuilder implements TracerBuilder { private final OtelTracerProvider tracerProvider; + private final String instrumentationScopeName; + @Nullable private String instrumentationScopeVersion; + @Nullable private String schemaUrl; OtelTracerBuilder(OtelTracerProvider tracerProvider, String instrumentationScopeName) { this.tracerProvider = tracerProvider; @@ -16,18 +20,19 @@ final class OtelTracerBuilder implements TracerBuilder { @Override public TracerBuilder setInstrumentationVersion(String instrumentationScopeVersion) { - // Not supported + this.instrumentationScopeVersion = instrumentationScopeVersion; return this; } @Override public TracerBuilder setSchemaUrl(String schemaUrl) { - // Not supported + this.schemaUrl = schemaUrl; return this; } @Override public Tracer build() { - return tracerProvider.getTracerShim(instrumentationScopeName); + return tracerProvider.getTracerShim( + instrumentationScopeName, instrumentationScopeVersion, schemaUrl); } } diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerProvider.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerProvider.java index c8ac21b4566..1bd76137414 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerProvider.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerProvider.java @@ -1,11 +1,13 @@ package datadog.opentelemetry.shim.trace; +import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope; import datadog.trace.util.Strings; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.TracerBuilder; import io.opentelemetry.api.trace.TracerProvider; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,19 +19,17 @@ public final class OtelTracerProvider implements TracerProvider { public static final TracerProvider INSTANCE = new OtelTracerProvider(); - /** Tracer shims, indexed by instrumentation scope name. */ - private final Map tracers = new ConcurrentHashMap<>(); + /** Tracer shims, indexed by instrumentation scope. */ + private final Map tracers = new ConcurrentHashMap<>(); @Override public Tracer get(String instrumentationScopeName) { - return getTracerShim(instrumentationScopeName); + return getTracerShim(instrumentationScopeName, null, null); } @Override - public Tracer get( - String instrumentationScopeName, - @SuppressWarnings("unused") String instrumentationScopeVersion) { - return getTracerShim(instrumentationScopeName); + public Tracer get(String instrumentationScopeName, String instrumentationScopeVersion) { + return getTracerShim(instrumentationScopeName, instrumentationScopeVersion, null); } @Override @@ -37,11 +37,17 @@ public TracerBuilder tracerBuilder(String instrumentationScopeName) { return new OtelTracerBuilder(this, instrumentationScopeName); } - OtelTracer getTracerShim(String instrumentationScopeName) { + OtelTracer getTracerShim( + String instrumentationScopeName, + @Nullable String instrumentationScopeVersion, + @Nullable String schemaUrl) { if (Strings.isBlank(instrumentationScopeName)) { LOGGER.debug("Tracer requested without instrumentation scope name."); instrumentationScopeName = DEFAULT_TRACER_NAME; } - return tracers.computeIfAbsent(instrumentationScopeName, OtelTracer::new); + return tracers.computeIfAbsent( + new OtelInstrumentationScope( + instrumentationScopeName, instrumentationScopeVersion, schemaUrl), + OtelTracer::new); } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/build.gradle b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/build.gradle index 976cd0970f1..05b71ae483f 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/build.gradle +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/build.gradle @@ -18,6 +18,9 @@ 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 testImplementation group: 'org.skyscreamer', name: 'jsonassert', version: '1.5.1' latestDepTestImplementation group: 'io.opentelemetry', name: 'opentelemetry-api', version: '1+' diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/build.gradle b/dd-java-agent/instrumentation/reactor-core-3.1/build.gradle index 8abbc16918f..e40cffa6d79 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/build.gradle +++ b/dd-java-agent/instrumentation/reactor-core-3.1/build.gradle @@ -17,6 +17,7 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:datadog:tracing:trace-annotation') testImplementation project(':dd-java-agent:instrumentation:reactive-streams-1.0') + testImplementation project(path: ':dd-java-agent:agent-otel:otel-bootstrap', configuration: 'shadow') testImplementation project(':dd-java-agent:instrumentation:opentelemetry:opentelemetry-1.4') testImplementation project(':dd-java-agent:instrumentation:opentelemetry:opentelemetry-annotations-1.20') testImplementation project (':dd-java-agent:instrumentation:opentracing:opentracing-0.32')