diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelConventions.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelConventions.java index d04dd831467..a328a63140f 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelConventions.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelConventions.java @@ -35,6 +35,7 @@ public final class OtelConventions { static final String SPAN_KIND_INTERNAL = "internal"; static final String OPERATION_NAME_SPECIFIC_ATTRIBUTE = "operation.name"; + static final String SPAN_TYPE = "span.type"; static final String ANALYTICS_EVENT_SPECIFIC_ATTRIBUTES = "analytics.event"; static final String HTTP_RESPONSE_STATUS_CODE_ATTRIBUTE = "http.response.status_code"; @@ -110,6 +111,9 @@ public static boolean applyReservedAttribute(AgentSpan span, AttributeKey } else if (ANALYTICS_EVENT_SPECIFIC_ATTRIBUTES.equals(name) && value instanceof String) { span.setMetric(ANALYTICS_SAMPLE_RATE, parseBoolean((String) value) ? 1 : 0); return true; + } else if (SPAN_TYPE.equals(name) && value instanceof String) { + span.setSpanType((CharSequence) value); + return true; } case BOOLEAN: if (ANALYTICS_EVENT_SPECIFIC_ATTRIBUTES.equals(name) && value instanceof Boolean) { diff --git a/dd-java-agent/instrumentation/guava-10.0/src/test/groovy/GuavaAsyncResultExtensionTest.groovy b/dd-java-agent/instrumentation/guava-10.0/src/test/groovy/GuavaAsyncResultExtensionTest.groovy index 883e3cd1b71..042a193fb06 100644 --- a/dd-java-agent/instrumentation/guava-10.0/src/test/groovy/GuavaAsyncResultExtensionTest.groovy +++ b/dd-java-agent/instrumentation/guava-10.0/src/test/groovy/GuavaAsyncResultExtensionTest.groovy @@ -48,6 +48,7 @@ class GuavaAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -74,6 +75,7 @@ class GuavaAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -104,6 +106,7 @@ class GuavaAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/build.gradle b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/build.gradle index 0d8d3d01ac6..f84949c26d3 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/build.gradle +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/build.gradle @@ -18,6 +18,7 @@ dependencies { compileOnly group: 'io.opentelemetry.instrumentation', name: 'opentelemetry-instrumentation-annotations', version: openTelemetryVersion compileOnly group: 'com.google.auto.value', name: 'auto-value-annotations', version: '1.6.6' + implementation project(':dd-java-agent:agent-otel:otel-shim') testImplementation group: 'io.opentelemetry', name: 'opentelemetry-api', version: openTelemetryVersion testImplementation group: 'io.opentelemetry.instrumentation', name: 'opentelemetry-instrumentation-annotations', version: openTelemetryVersion latest1xDepTestImplementation group: 'io.opentelemetry.instrumentation', name: 'opentelemetry-instrumentation-annotations', version: '1+' diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/latestDepTest/groovy/WithSpanAnnotationLatestDepTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/latestDepTest/groovy/WithSpanAnnotationLatestDepTest.groovy index 43aa0eab4cf..0352df09aa4 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/latestDepTest/groovy/WithSpanAnnotationLatestDepTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/latestDepTest/groovy/WithSpanAnnotationLatestDepTest.groovy @@ -25,6 +25,7 @@ class WithSpanAnnotationLatestDepTest extends WithSpanAnnotationTest { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanAnnotationInstrumentation.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanAnnotationInstrumentation.java index 8d73d56a9cf..de8c5ba30e9 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanAnnotationInstrumentation.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanAnnotationInstrumentation.java @@ -43,6 +43,8 @@ public String[] helperClassNames() { return new String[] { this.packageName + ".WithSpanDecorator", this.packageName + ".WithSpanDecorator$1", // Switch over enum generated class + "datadog.opentelemetry.shim.trace.OtelConventions", + "datadog.opentelemetry.shim.trace.OtelConventions$1", }; } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanDecorator.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanDecorator.java index 3211aeecad0..01e9575777e 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanDecorator.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/main/java/datadog/trace/instrumentation/opentelemetry/annotations/WithSpanDecorator.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.opentelemetry.annotations; +import static datadog.opentelemetry.shim.trace.OtelConventions.toSpanKindTagValue; import static datadog.trace.api.DDSpanTypes.HTTP_CLIENT; import static datadog.trace.api.DDSpanTypes.HTTP_SERVER; import static datadog.trace.api.DDSpanTypes.MESSAGE_CONSUMER; import static datadog.trace.api.DDSpanTypes.MESSAGE_PRODUCER; +import static datadog.trace.bootstrap.instrumentation.api.Tags.SPAN_KIND; import static java.lang.Math.min; import datadog.trace.api.InstrumenterConfig; @@ -55,12 +57,13 @@ protected CharSequence component() { public AgentSpan startMethodSpan(Method method) { CharSequence operationName = null; CharSequence spanType = null; + SpanKind kind = null; boolean inheritContext = true; WithSpan withSpanAnnotation = method.getAnnotation(WithSpan.class); if (withSpanAnnotation != null) { operationName = withSpanAnnotation.value(); - spanType = convertToSpanType(withSpanAnnotation.kind()); + kind = withSpanAnnotation.kind(); if (INHERIT_CONTEXT_MH != null) { try { inheritContext = (boolean) INHERIT_CONTEXT_MH.invokeExact(withSpanAnnotation); @@ -82,8 +85,9 @@ public AgentSpan startMethodSpan(Method method) { final AgentSpan span = spanBuilder.start(); DECORATE.afterStart(span); - if (spanType != null) { - span.setSpanType(spanType); + if (kind != null) { + span.setSpanType(convertToSpanType(kind)); + span.setTag(SPAN_KIND, toSpanKindTagValue(kind)); } if (InstrumenterConfig.get().isMethodMeasured(method)) { span.setMeasured(true); diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/groovy/SpanAttributeAnnotationTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/groovy/SpanAttributeAnnotationTest.groovy index 653018f5434..4f88ed5128a 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/groovy/SpanAttributeAnnotationTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/groovy/SpanAttributeAnnotationTest.groovy @@ -26,6 +26,7 @@ class SpanAttributeAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" "custom-tag" value } } @@ -57,6 +58,7 @@ class SpanAttributeAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" "custom-tag1" "param1" "custom-tag2" "param2" } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/groovy/WithSpanAnnotationTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/groovy/WithSpanAnnotationTest.groovy index 67dad26b858..3383ce539ca 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/groovy/WithSpanAnnotationTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-annotations-1.20/src/test/groovy/WithSpanAnnotationTest.groovy @@ -30,6 +30,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -52,6 +53,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -75,18 +77,19 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" kindTag } } } } where: - kind | type - 'SERVER' | DDSpanTypes.HTTP_SERVER - 'CLIENT' | DDSpanTypes.HTTP_CLIENT - 'PRODUCER' | DDSpanTypes.MESSAGE_PRODUCER - 'CONSUMER' | DDSpanTypes.MESSAGE_CONSUMER - 'INTERNAL' | null + kind | type | kindTag + 'SERVER' | DDSpanTypes.HTTP_SERVER | Tags.SPAN_KIND_SERVER + 'CLIENT' | DDSpanTypes.HTTP_CLIENT | Tags.SPAN_KIND_CLIENT + 'PRODUCER' | DDSpanTypes.MESSAGE_PRODUCER | Tags.SPAN_KIND_PRODUCER + 'CONSUMER' | DDSpanTypes.MESSAGE_CONSUMER | Tags.SPAN_KIND_CONSUMER + 'INTERNAL' | null | Tags.SPAN_KIND_INTERNAL kindName = kind.substring(0, 1) + kind.substring(1).toLowerCase() } @@ -109,6 +112,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(error.class, error.getMessage()) } } @@ -129,6 +133,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -156,6 +161,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -186,6 +192,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } @@ -214,6 +221,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -244,6 +252,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } @@ -267,6 +276,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } diff --git a/dd-java-agent/instrumentation/reactive-streams/src/test/groovy/ReactiveStreamsAsyncResultExtensionTest.groovy b/dd-java-agent/instrumentation/reactive-streams/src/test/groovy/ReactiveStreamsAsyncResultExtensionTest.groovy index b04fc0a3ae8..4756753f032 100644 --- a/dd-java-agent/instrumentation/reactive-streams/src/test/groovy/ReactiveStreamsAsyncResultExtensionTest.groovy +++ b/dd-java-agent/instrumentation/reactive-streams/src/test/groovy/ReactiveStreamsAsyncResultExtensionTest.groovy @@ -33,6 +33,7 @@ class ReactiveStreamsAsyncResultExtensionTest extends InstrumentationSpecificati tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -63,6 +64,7 @@ class ReactiveStreamsAsyncResultExtensionTest extends InstrumentationSpecificati tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } @@ -92,6 +94,7 @@ class ReactiveStreamsAsyncResultExtensionTest extends InstrumentationSpecificati tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -121,6 +124,7 @@ class ReactiveStreamsAsyncResultExtensionTest extends InstrumentationSpecificati tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } span { @@ -130,6 +134,7 @@ class ReactiveStreamsAsyncResultExtensionTest extends InstrumentationSpecificati tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/groovy/ReactorAsyncResultExtensionTest.groovy b/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/groovy/ReactorAsyncResultExtensionTest.groovy index fc54ca54063..92b0b42f720 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/groovy/ReactorAsyncResultExtensionTest.groovy +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/groovy/ReactorAsyncResultExtensionTest.groovy @@ -49,6 +49,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -79,6 +80,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } @@ -107,6 +109,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -134,6 +137,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -164,6 +168,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } @@ -192,6 +197,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/test/groovy/ReactorAsyncResultExtensionTest.groovy b/dd-java-agent/instrumentation/reactor-core-3.1/src/test/groovy/ReactorAsyncResultExtensionTest.groovy index b5c52f95918..5765cf21319 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/test/groovy/ReactorAsyncResultExtensionTest.groovy +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/test/groovy/ReactorAsyncResultExtensionTest.groovy @@ -48,6 +48,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -78,6 +79,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } @@ -106,6 +108,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -133,6 +136,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -163,6 +167,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } @@ -191,6 +196,7 @@ class ReactorAsyncResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } diff --git a/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/test/groovy/RxJava2ResultExtensionTest.groovy b/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/test/groovy/RxJava2ResultExtensionTest.groovy index 0f731b15fe5..37b58be4453 100644 --- a/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/test/groovy/RxJava2ResultExtensionTest.groovy +++ b/dd-java-agent/instrumentation/rxjava/rxjava-2.0/src/test/groovy/RxJava2ResultExtensionTest.groovy @@ -34,6 +34,7 @@ class RxJava2ResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } } @@ -73,6 +74,7 @@ class RxJava2ResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" errorTags(expectedException) } } @@ -110,6 +112,7 @@ class RxJava2ResultExtensionTest extends InstrumentationSpecification { tags { defaultTags() "$Tags.COMPONENT" "opentelemetry" + "$Tags.SPAN_KIND" "internal" } } }