diff --git a/.circleci/config.continue.yml.j2 b/.circleci/config.continue.yml.j2 index d26930f2cca..a3faffeafd0 100644 --- a/.circleci/config.continue.yml.j2 +++ b/.circleci/config.continue.yml.j2 @@ -36,7 +36,7 @@ instrumentation_modules: &instrumentation_modules "dd-java-agent/instrumentation debugger_modules: &debugger_modules "dd-java-agent/agent-debugger|dd-java-agent/agent-bootstrap|dd-java-agent/agent-builder|internal-api|communication|dd-trace-core" profiling_modules: &profiling_modules "dd-java-agent/agent-profiling" -default_system_tests_commit: &default_system_tests_commit 380d8deb4dd86369e30827ae3d908400c91d2d3e +default_system_tests_commit: &default_system_tests_commit 121787cbd6b3e5bc2840a0d5df17ecfb45566837 parameters: nightly: diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java index 2c33d88bd3c..9bcec9e8aec 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java @@ -69,7 +69,9 @@ public AgentSpan afterStart(final AgentSpan span) { if (spanType() != null) { span.setSpanType(spanType()); } - span.setTag(Tags.COMPONENT, component()); + final CharSequence component = component(); + span.setTag(Tags.COMPONENT, component); + span.context().setIntegrationName(component); if (traceAnalyticsEnabled) { span.setMetric(DDTags.ANALYTICS_SAMPLE_RATE, traceAnalyticsSampleRate); } diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/BaseDecoratorTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/BaseDecoratorTest.groovy index 5cd64c11304..b94b7013f39 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/BaseDecoratorTest.groovy +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/BaseDecoratorTest.groovy @@ -2,6 +2,7 @@ package datadog.trace.bootstrap.instrumentation.decorator import datadog.trace.bootstrap.instrumentation.api.AgentSpan +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities import datadog.trace.bootstrap.instrumentation.api.Tags import datadog.trace.test.util.DDSpecification @@ -16,6 +17,7 @@ class BaseDecoratorTest extends DDSpecification { def errorPriority = null as Byte def span = Mock(AgentSpan) + def spanContext = Mock(AgentSpanContext) def "test afterStart"() { when: @@ -24,6 +26,8 @@ class BaseDecoratorTest extends DDSpecification { then: 1 * span.setSpanType(decorator.spanType()) 1 * span.setTag(Tags.COMPONENT, "test-component") + 1 * span.context() >> spanContext + 1 * spanContext.setIntegrationName("test-component") _ * span.setTag(_, _) // Want to allow other calls from child implementations. _ * span.setMeasured(true) _ * span.setMetric(_, _) diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/ClientDecoratorTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/ClientDecoratorTest.groovy index 7276c6ce0c5..5153eeb09e0 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/ClientDecoratorTest.groovy +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/ClientDecoratorTest.groovy @@ -2,6 +2,7 @@ package datadog.trace.bootstrap.instrumentation.decorator import datadog.trace.api.DDTags import datadog.trace.bootstrap.instrumentation.api.AgentSpan +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.Tags class ClientDecoratorTest extends BaseDecoratorTest { @@ -11,6 +12,7 @@ class ClientDecoratorTest extends BaseDecoratorTest { def "test afterStart"() { setup: def decorator = newDecorator((String) serviceName) + def spanContext = Mock(AgentSpanContext) when: decorator.afterStart(span) @@ -21,6 +23,8 @@ class ClientDecoratorTest extends BaseDecoratorTest { } 1 * span.setMeasured(true) 1 * span.setTag(Tags.COMPONENT, "test-component") + 1 * span.context() >> spanContext + 1 * spanContext.setIntegrationName("test-component") 1 * span.setTag(Tags.SPAN_KIND, "client") 1 * span.setSpanType(decorator.spanType()) 1 * span.setMetric(DDTags.ANALYTICS_SAMPLE_RATE, 1.0) diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/DBTypeProcessingDatabaseClientDecoratorTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/DBTypeProcessingDatabaseClientDecoratorTest.groovy index e1181a31ddd..5e4e3d7d33f 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/DBTypeProcessingDatabaseClientDecoratorTest.groovy +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/DBTypeProcessingDatabaseClientDecoratorTest.groovy @@ -24,6 +24,8 @@ class DBTypeProcessingDatabaseClientDecoratorTest extends ClientDecoratorTest { } 1 * span.setMeasured(true) 1 * span.setTag(Tags.COMPONENT, "test-component") + 1 * span.context() >> spanContext + 1 * spanContext.setIntegrationName("test-component") 1 * span.setTag(Tags.SPAN_KIND, "client") 1 * span.setSpanType("test-type") 1 * span.setServiceName("test-db") diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecoratorTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecoratorTest.groovy index 30d6ff6fe94..e0ecce67b8e 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecoratorTest.groovy +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecoratorTest.groovy @@ -2,6 +2,7 @@ package datadog.trace.bootstrap.instrumentation.decorator import datadog.trace.api.DDTags import datadog.trace.bootstrap.instrumentation.api.AgentSpan +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.Tags import static datadog.trace.api.config.TraceInstrumentationConfig.DB_CLIENT_HOST_SPLIT_BY_HOST @@ -15,6 +16,7 @@ class DatabaseClientDecoratorTest extends ClientDecoratorTest { def "test afterStart"() { setup: def decorator = newDecorator((String) serviceName) + def spanContext = Mock(AgentSpanContext) when: decorator.afterStart(span) @@ -25,6 +27,8 @@ class DatabaseClientDecoratorTest extends ClientDecoratorTest { } 1 * span.setMeasured(true) 1 * span.setTag(Tags.COMPONENT, "test-component") + 1 * span.context() >> spanContext + 1 * spanContext.setIntegrationName("test-component") 1 * span.setTag(Tags.SPAN_KIND, "client") 1 * span.setSpanType("test-type") 1 * span.setMetric(DDTags.ANALYTICS_SAMPLE_RATE, 1.0) diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/ServerDecoratorTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/ServerDecoratorTest.groovy index 049b2724d70..9eeb1b19e77 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/ServerDecoratorTest.groovy +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/ServerDecoratorTest.groovy @@ -2,6 +2,7 @@ package datadog.trace.bootstrap.instrumentation.decorator import datadog.trace.bootstrap.instrumentation.api.AgentSpan +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import static datadog.trace.api.DDTags.ANALYTICS_SAMPLE_RATE import static datadog.trace.api.DDTags.LANGUAGE_TAG_KEY @@ -15,12 +16,16 @@ class ServerDecoratorTest extends BaseDecoratorTest { def "test afterStart"() { def decorator = newDecorator() + def spanContext = Mock(AgentSpanContext) + when: decorator.afterStart(span) then: 1 * span.setTag(LANGUAGE_TAG_KEY, LANGUAGE_TAG_VALUE) 1 * span.setTag(COMPONENT, "test-component") + 1 * span.context() >> spanContext + 1 * spanContext.setIntegrationName("test-component") 1 * span.setTag(SPAN_KIND, "server") 1 * span.setSpanType(decorator.spanType()) if (decorator.traceAnalyticsEnabled) { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/decorator/TestDecoratorImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/decorator/TestDecoratorImpl.java index c75c85b3b9b..de2ab526728 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/decorator/TestDecoratorImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/decorator/TestDecoratorImpl.java @@ -51,6 +51,7 @@ public AgentSpan afterStart(final AgentSpan span) { span.setTag(DDTags.HOST_VCPU_COUNT, cpuCount); span.setTag(Tags.TEST_TYPE, testType()); span.setTag(Tags.COMPONENT, component()); + span.context().setIntegrationName(component()); span.setTag(Tags.TEST_SESSION_NAME, sessionName); for (final Map.Entry ciTag : ciTags.entrySet()) { diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/decorator/TestDecoratorImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/decorator/TestDecoratorImplTest.groovy index 6cc4bc1ce6b..d1d415428df 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/decorator/TestDecoratorImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/decorator/TestDecoratorImplTest.groovy @@ -3,23 +3,27 @@ package datadog.trace.civisibility.decorator import datadog.trace.api.DDTags import datadog.trace.api.sampling.PrioritySampling import datadog.trace.bootstrap.instrumentation.api.AgentSpan +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.Tags import spock.lang.Specification class TestDecoratorImplTest extends Specification { def span = Mock(AgentSpan) + def context = Mock(AgentSpanContext) + def "test afterStart"() { setup: def decorator = new TestDecoratorImpl("test-component", "session-name", "test-command", ["ci-tag-1": "value", "ci-tag-2": "another value"]) - when: decorator.afterStart(span) then: 1 * span.setTag(Tags.TEST_SESSION_NAME, "session-name") 1 * span.setTag(Tags.COMPONENT, "test-component") + 1 * span.context() >> context + 1 * context.setIntegrationName("test-component") 1 * span.setTag(Tags.TEST_TYPE, decorator.testType()) 1 * span.setSamplingPriority(PrioritySampling.SAMPLER_KEEP) 1 * span.setTag(DDTags.ORIGIN_KEY, decorator.origin()) @@ -44,6 +48,8 @@ class TestDecoratorImplTest extends Specification { decorator.afterStart(span) then: + 1 * span.context() >> context + 1 * context.setIntegrationName("test-component") 1 * span.setTag(Tags.TEST_SESSION_NAME, expectedSessionName) where: diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index 9cfcc134d87..01ba099838d 100644 --- a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -12,7 +12,7 @@ abstract class CiVisibilitySmokeTest extends Specification { def baseTemplatesPath = CiVisibilitySmokeTest.classLoader.getResource(projectName).toURI().schemeSpecificPart.replace('build/resources/test', 'src/test/resources') CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements) } else { - CiVisibilityTestUtils.assertData(projectName, events, coverages, additionalReplacements, []) + CiVisibilityTestUtils.assertData(projectName, events, coverages, additionalReplacements,["content.meta.['_dd.integration']"]) } } diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy index 1a513d080e7..dea0be4fa61 100644 --- a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy +++ b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy @@ -55,7 +55,8 @@ abstract class CiVisibilityTestUtils { ] // ignored tags on assertion and fixture build - static final List IGNORED_TAGS = LibraryCapability.values().toList().stream().map(c -> "content.meta.['${c.asTag()}']").collect(Collectors.toList()) + static final List IGNORED_TAGS = LibraryCapability.values().toList().stream().map(c -> "content.meta.['${c.asTag()}']").collect(Collectors.toList()) + + ["content.meta.['_dd.integration']"] static final List COVERAGE_DYNAMIC_PATHS = [path("test_session_id"), path("test_suite_id"), path("span_id"),] diff --git a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpan.java b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpan.java index 095801ef95e..01b8dca7115 100644 --- a/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpan.java +++ b/dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelSpan.java @@ -43,6 +43,7 @@ public OtelSpan(AgentSpan delegate) { } this.statusCode = UNSET; this.recording = true; + delegate.context().setIntegrationName("otel"); } public static Span invalid() { diff --git a/dd-java-agent/instrumentation/cxf-2.1/src/latestDepTest/groovy/CxfContextPropagationTest.groovy b/dd-java-agent/instrumentation/cxf-2.1/src/latestDepTest/groovy/CxfContextPropagationTest.groovy index e944eb4f587..cdb32555132 100644 --- a/dd-java-agent/instrumentation/cxf-2.1/src/latestDepTest/groovy/CxfContextPropagationTest.groovy +++ b/dd-java-agent/instrumentation/cxf-2.1/src/latestDepTest/groovy/CxfContextPropagationTest.groovy @@ -75,6 +75,7 @@ class CxfContextPropagationTest extends AgentTestRunner { "$InstrumentationTags.SERVLET_PATH" "/test" "$Tags.HTTP_USER_AGENT" String "$Tags.HTTP_CLIENT_IP" "127.0.0.1" + withCustomIntegrationName("jetty-server") defaultTags() } } diff --git a/dd-java-agent/instrumentation/cxf-2.1/src/test/groovy/CxfContextPropagationTest.groovy b/dd-java-agent/instrumentation/cxf-2.1/src/test/groovy/CxfContextPropagationTest.groovy index 98eb0be56e6..9125854d559 100644 --- a/dd-java-agent/instrumentation/cxf-2.1/src/test/groovy/CxfContextPropagationTest.groovy +++ b/dd-java-agent/instrumentation/cxf-2.1/src/test/groovy/CxfContextPropagationTest.groovy @@ -73,6 +73,7 @@ class CxfContextPropagationTest extends AgentTestRunner { "servlet.path" { it == null || it == "/test" } "$Tags.HTTP_USER_AGENT" String "$Tags.HTTP_CLIENT_IP" "127.0.0.1" + withCustomIntegrationName("jetty-server") defaultTags() } } diff --git a/dd-java-agent/instrumentation/dropwizard/dropwizard-views/src/main/java/datadog/trace/instrumentation/dropwizard/view/DropwizardViewInstrumentation.java b/dd-java-agent/instrumentation/dropwizard/dropwizard-views/src/main/java/datadog/trace/instrumentation/dropwizard/view/DropwizardViewInstrumentation.java index 5e76a1427af..e185ba86d60 100644 --- a/dd-java-agent/instrumentation/dropwizard/dropwizard-views/src/main/java/datadog/trace/instrumentation/dropwizard/view/DropwizardViewInstrumentation.java +++ b/dd-java-agent/instrumentation/dropwizard/dropwizard-views/src/main/java/datadog/trace/instrumentation/dropwizard/view/DropwizardViewInstrumentation.java @@ -70,6 +70,7 @@ public static AgentScope onEnter( return null; } final AgentSpan span = startSpan("view.render").setTag(Tags.COMPONENT, "dropwizard-view"); + span.context().setIntegrationName("dropwizard-view"); span.setResourceName("View " + view.getTemplateName()); return activateSpan(span); } diff --git a/dd-java-agent/instrumentation/dropwizard/src/test/groovy/DropwizardTest.groovy b/dd-java-agent/instrumentation/dropwizard/src/test/groovy/DropwizardTest.groovy index e4b0d724808..9c41ac9a979 100644 --- a/dd-java-agent/instrumentation/dropwizard/src/test/groovy/DropwizardTest.groovy +++ b/dd-java-agent/instrumentation/dropwizard/src/test/groovy/DropwizardTest.groovy @@ -93,6 +93,11 @@ class DropwizardTest extends HttpServerTest { return "/${endpoint.relativeRawPath()}" } + @Override + String expectedIntegrationName() { + "java-web-servlet" + } + @Override boolean hasHandlerSpan() { true diff --git a/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/groovy/FinatraServer270Test.groovy b/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/groovy/FinatraServer270Test.groovy index 9142c9eacc9..f5294fe4b49 100644 --- a/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/groovy/FinatraServer270Test.groovy +++ b/dd-java-agent/instrumentation/finatra-2.9/src/latestDepTest/groovy/FinatraServer270Test.groovy @@ -25,6 +25,11 @@ class FinatraServer270Test extends HttpServerTest { } } + @Override + String expectedIntegrationName() { + "netty" + } + @Override HttpServer startServer(int port) { HttpServer testServer = new FinatraServer() diff --git a/dd-java-agent/instrumentation/finatra-2.9/src/test/groovy/FinatraServerTest.groovy b/dd-java-agent/instrumentation/finatra-2.9/src/test/groovy/FinatraServerTest.groovy index c1a0cae0384..85a92c857c4 100644 --- a/dd-java-agent/instrumentation/finatra-2.9/src/test/groovy/FinatraServerTest.groovy +++ b/dd-java-agent/instrumentation/finatra-2.9/src/test/groovy/FinatraServerTest.groovy @@ -76,6 +76,11 @@ abstract class FinatraServerTest extends HttpServerTest { return false } + @Override + String expectedIntegrationName() { + "netty" + } + void handlerSpan(TraceAssert trace, ServerEndpoint endpoint = SUCCESS) { def errorEndpoint = endpoint == EXCEPTION || endpoint == ERROR trace.span { diff --git a/dd-java-agent/instrumentation/jakarta-rs-annotations-3/src/test/groovy/JakartaRsAnnotations3InstrumentationTest.groovy b/dd-java-agent/instrumentation/jakarta-rs-annotations-3/src/test/groovy/JakartaRsAnnotations3InstrumentationTest.groovy index 2e866d9e204..b9f7dfba8e6 100644 --- a/dd-java-agent/instrumentation/jakarta-rs-annotations-3/src/test/groovy/JakartaRsAnnotations3InstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jakarta-rs-annotations-3/src/test/groovy/JakartaRsAnnotations3InstrumentationTest.groovy @@ -59,6 +59,7 @@ class JakartaRsAnnotations3InstrumentationTest extends AgentTestRunner { tags { "$Tags.COMPONENT" "jakarta-rs" "$Tags.HTTP_ROUTE" name.split(" ").last() + withCustomIntegrationName(null) defaultTags() } } diff --git a/dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/ProcessImplStartAdvice.java b/dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/ProcessImplStartAdvice.java index 028f4f22eea..70feb96924d 100644 --- a/dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/ProcessImplStartAdvice.java +++ b/dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/ProcessImplStartAdvice.java @@ -22,6 +22,7 @@ public static AgentSpan startSpan(@Advice.Argument(0) final String[] command) th span.setSpanType("system"); span.setResourceName(ProcessImplInstrumentationHelpers.determineResource(command)); span.setTag("component", "subprocess"); + span.context().setIntegrationName("subprocess"); ProcessImplInstrumentationHelpers.setTags(span, command); ProcessImplInstrumentationHelpers.cmdiRaspCheck(command); return span; diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-1/src/test/groovy/JaxRsAnnotations1InstrumentationTest.groovy b/dd-java-agent/instrumentation/jax-rs-annotations-1/src/test/groovy/JaxRsAnnotations1InstrumentationTest.groovy index 30854a300f2..bb594d64145 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-1/src/test/groovy/JaxRsAnnotations1InstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jax-rs-annotations-1/src/test/groovy/JaxRsAnnotations1InstrumentationTest.groovy @@ -59,6 +59,7 @@ class JaxRsAnnotations1InstrumentationTest extends AgentTestRunner { tags { "$Tags.COMPONENT" "jax-rs" "$Tags.HTTP_ROUTE" name.split(" ").last() + withCustomIntegrationName(null) defaultTags() } } diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-1/src/test/groovy/JerseyTest.groovy b/dd-java-agent/instrumentation/jax-rs-annotations-1/src/test/groovy/JerseyTest.groovy index 522eb3dd420..8bedeff5232 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-1/src/test/groovy/JerseyTest.groovy +++ b/dd-java-agent/instrumentation/jax-rs-annotations-1/src/test/groovy/JerseyTest.groovy @@ -35,6 +35,7 @@ class JerseyTest extends AgentTestRunner { tags { "$Tags.COMPONENT" "jax-rs" "$Tags.HTTP_ROUTE" expectedResourceName.split(" ").last() + withCustomIntegrationName(null) defaultTags() } } @@ -78,6 +79,7 @@ class JerseyTest extends AgentTestRunner { tags { "$Tags.COMPONENT" "jax-rs" "$Tags.HTTP_ROUTE" parentResourceName.split(" ").last() + withCustomIntegrationName(null) defaultTags() } } diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/nestedTest/groovy/NestedResourcesTest.groovy b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/nestedTest/groovy/NestedResourcesTest.groovy index 0edf9c3273f..c720d556c64 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/nestedTest/groovy/NestedResourcesTest.groovy +++ b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/nestedTest/groovy/NestedResourcesTest.groovy @@ -44,6 +44,7 @@ class NestedResourcesTest extends AgentTestRunner { tags { "$Tags.COMPONENT" "jax-rs" "$Tags.HTTP_ROUTE" "/admin/realms" + withCustomIntegrationName(null) defaultTags() } } diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/test/groovy/JaxRsAnnotations2InstrumentationTest.groovy b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/test/groovy/JaxRsAnnotations2InstrumentationTest.groovy index e51d641b356..4ee074d4c9e 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/test/groovy/JaxRsAnnotations2InstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/test/groovy/JaxRsAnnotations2InstrumentationTest.groovy @@ -59,6 +59,7 @@ class JaxRsAnnotations2InstrumentationTest extends AgentTestRunner { tags { "$Tags.COMPONENT" "jax-rs" "$Tags.HTTP_ROUTE" name.split(" ").last() + withCustomIntegrationName(null) defaultTags() } } diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/test/groovy/JaxRsFilterTest.groovy b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/test/groovy/JaxRsFilterTest.groovy index 590acbde6b5..a2de27b8339 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/test/groovy/JaxRsFilterTest.groovy +++ b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/test/groovy/JaxRsFilterTest.groovy @@ -63,6 +63,7 @@ abstract class JaxRsFilterTest extends AgentTestRunner { if (httpRoute) { "$Tags.HTTP_ROUTE" httpRoute } + withCustomIntegrationName(null) defaultTags() } } @@ -123,6 +124,7 @@ abstract class JaxRsFilterTest extends AgentTestRunner { tags { "$Tags.COMPONENT" "jax-rs" "$Tags.HTTP_ROUTE" resource + withCustomIntegrationName(null) defaultTags() } } diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java index 392d97836e5..1df3ab2d359 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java @@ -241,6 +241,7 @@ private AgentSpan withQueryInfo(AgentSpan span, DBQueryInfo info, CharSequence c } else { span.setResourceName(DB_QUERY); } + span.context().setIntegrationName(component); return span.setTag(Tags.COMPONENT, component); } diff --git a/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java b/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java index a3c91e1f6f1..d0bbfec9372 100644 --- a/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java +++ b/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java @@ -201,6 +201,7 @@ public boolean beforeStep(Step step, ScenarioRuntime sr) { String stepName = step.getPrefix() + " " + step.getText(); span.setResourceName(stepName); span.setTag(Tags.COMPONENT, "karate"); + span.context().setIntegrationName("karate"); span.setTag("step.name", stepName); span.setTag("step.startLine", step.getLine()); span.setTag("step.endLine", step.getEndLine()); diff --git a/dd-java-agent/instrumentation/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/ChannelFutureListenerInstrumentation.java b/dd-java-agent/instrumentation/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/ChannelFutureListenerInstrumentation.java index 83d8be8db3e..4a211023143 100644 --- a/dd-java-agent/instrumentation/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/ChannelFutureListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/ChannelFutureListenerInstrumentation.java @@ -5,6 +5,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.instrumentation.netty38.server.NettyHttpServerDecorator.DECORATE; +import static datadog.trace.instrumentation.netty38.server.NettyHttpServerDecorator.NETTY; import static datadog.trace.instrumentation.netty38.server.NettyHttpServerDecorator.NETTY_CONNECT; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -107,6 +108,7 @@ public static AgentScope activateScope(@Advice.Argument(0) final ChannelFuture f final AgentScope parentScope = continuation.activate(); final AgentSpan errorSpan = startSpan(NETTY_CONNECT).setTag(Tags.COMPONENT, "netty"); + errorSpan.context().setIntegrationName(NETTY); try (final AgentScope scope = activateSpan(errorSpan)) { DECORATE.onError(errorSpan, cause); DECORATE.beforeFinish(errorSpan); diff --git a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/ChannelFutureListenerInstrumentation.java b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/ChannelFutureListenerInstrumentation.java index daa684df187..e0b426f7697 100644 --- a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/ChannelFutureListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/ChannelFutureListenerInstrumentation.java @@ -5,6 +5,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.instrumentation.netty40.AttributeKeys.CONNECT_PARENT_CONTINUATION_ATTRIBUTE_KEY; +import static datadog.trace.instrumentation.netty40.server.NettyHttpServerDecorator.NETTY; import static datadog.trace.instrumentation.netty40.server.NettyHttpServerDecorator.NETTY_CONNECT; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -92,6 +93,7 @@ public static AgentScope activateScope(@Advice.Argument(0) final ChannelFuture f final AgentScope parentScope = continuation.activate(); final AgentSpan errorSpan = startSpan(NETTY_CONNECT).setTag(Tags.COMPONENT, "netty"); + errorSpan.context().setIntegrationName(NETTY); try (final AgentScope scope = activateSpan(errorSpan)) { NettyHttpServerDecorator.DECORATE.onError(errorSpan, cause); NettyHttpServerDecorator.DECORATE.beforeFinish(errorSpan); diff --git a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/ChannelFutureListenerInstrumentation.java b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/ChannelFutureListenerInstrumentation.java index df528d3cf44..c810b6ac96b 100644 --- a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/ChannelFutureListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/ChannelFutureListenerInstrumentation.java @@ -5,6 +5,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.instrumentation.netty41.AttributeKeys.CONNECT_PARENT_CONTINUATION_ATTRIBUTE_KEY; +import static datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator.NETTY; import static datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator.NETTY_CONNECT; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -92,6 +93,7 @@ public static AgentScope activateScope(@Advice.Argument(0) final ChannelFuture f final AgentScope parentScope = continuation.activate(); final AgentSpan errorSpan = startSpan(NETTY_CONNECT).setTag(Tags.COMPONENT, "netty"); + errorSpan.context().setIntegrationName(NETTY); try (final AgentScope scope = activateSpan(errorSpan)) { NettyHttpServerDecorator.DECORATE.onError(errorSpan, cause); NettyHttpServerDecorator.DECORATE.beforeFinish(errorSpan); diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelTracer.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelTracer.java index 0ba050f2ad3..5d4bccb6244 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelTracer.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelTracer.java @@ -162,7 +162,9 @@ public Span.Builder setStartTimestamp(final long startTimestamp) { @Override public Span startSpan() { - return converter.toSpan(delegate.start()); + final AgentSpan agentSpan = delegate.start(); + agentSpan.context().setIntegrationName("otel"); + return converter.toSpan(agentSpan); } } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy index 8e6e50527e8..e577e503658 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy @@ -82,6 +82,7 @@ class OpenTelemetryTest extends AgentTestRunner { } defaultTags() } + assert span.context().integrationName == "otel" } } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14Test.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14Test.groovy index 3f52a661c80..170d679885e 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14Test.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14Test.groovy @@ -535,6 +535,7 @@ class OpenTelemetry14Test extends AgentTestRunner { "empty-array" "" } } + assert span.context().integrationName == "otel" } } } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTTracer.java b/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTTracer.java index 7074a62b377..1a121799024 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTTracer.java +++ b/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTTracer.java @@ -151,12 +151,15 @@ public Span startManual() { @Override public Span start() { final AgentSpan agentSpan = delegate.start(); + agentSpan.context().setIntegrationName("opentracing"); return converter.toSpan(agentSpan); } @Override public Scope startActive(final boolean finishSpanOnClose) { - return converter.toScope(tracer.activateManualSpan(delegate.start()), finishSpanOnClose); + final AgentSpan agentSpan = delegate.start(); + agentSpan.context().setIntegrationName("opentracing"); + return converter.toScope(tracer.activateManualSpan(agentSpan), finishSpanOnClose); } } } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy b/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy index 4671338e56f..5f3293d9033 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy +++ b/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy @@ -29,7 +29,6 @@ import spock.lang.Subject import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopContinuation -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class OpenTracing31Test extends AgentTestRunner { @@ -113,6 +112,7 @@ class OpenTracing31Test extends AgentTestRunner { } defaultTags(addReference != null) } + assert span.context().integrationName == "opentracing" } } } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTTracer.java b/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTTracer.java index 83094d05722..ab4e2ebea92 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTTracer.java +++ b/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTTracer.java @@ -173,12 +173,15 @@ public Span startManual() { @Override public Span start() { final AgentSpan agentSpan = delegate.start(); + agentSpan.context().setIntegrationName("opentracing"); return converter.toSpan(agentSpan); } @Override public Scope startActive(final boolean finishSpanOnClose) { - return converter.toScope(tracer.activateManualSpan(delegate.start()), finishSpanOnClose); + final AgentSpan agentSpan = delegate.start(); + agentSpan.context().setIntegrationName("opentracing"); + return converter.toScope(tracer.activateManualSpan(agentSpan), finishSpanOnClose); } } } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy b/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy index bb815ca9153..dabe3865275 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy +++ b/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy @@ -34,7 +34,6 @@ import static datadog.trace.api.sampling.SamplingMechanism.AGENT_RATE import static datadog.trace.api.sampling.SamplingMechanism.DEFAULT import static datadog.trace.api.sampling.SamplingMechanism.MANUAL import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopContinuation -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class OpenTracing32Test extends AgentTestRunner { @@ -118,6 +117,7 @@ class OpenTracing32Test extends AgentTestRunner { } defaultTags(addReference != null) } + assert span.context().integrationName == "opentracing" } } } diff --git a/dd-java-agent/instrumentation/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/VertxSqlClientDecorator.java b/dd-java-agent/instrumentation/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/VertxSqlClientDecorator.java index 951fa69ebb5..f583033e647 100644 --- a/dd-java-agent/instrumentation/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/VertxSqlClientDecorator.java +++ b/dd-java-agent/instrumentation/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/VertxSqlClientDecorator.java @@ -100,7 +100,7 @@ public AgentSpan startAndDecorateSpanForStatement( span.setResourceName(DB_QUERY); } span.setTag(Tags.COMPONENT, component); - + span.context().setIntegrationName(component); return span; } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/asserts/TagsAssert.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/asserts/TagsAssert.groovy index 8db86d22f01..b36e61fe784 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/asserts/TagsAssert.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/asserts/TagsAssert.groovy @@ -46,6 +46,11 @@ class TagsAssert { tag(DDTags.PEER_SERVICE_SOURCE, { SpanNaming.instance().namingSchema().peerService().supports() ? it == sourceTag : it == null }) } + def withCustomIntegrationName(String integrationName) { + assertedTags.add(DDTags.DD_INTEGRATION) + assert tags[DDTags.DD_INTEGRATION]?.toString() == integrationName + } + def defaultTagsNoPeerService(boolean distributedRootSpan = false) { defaultTags(distributedRootSpan, false) } @@ -93,6 +98,9 @@ class TagsAssert { DDTags.REQUIRED_CODE_ORIGIN_TAGS.each { assertedTags.add(it) } + if (assertedTags.add(DDTags.DD_INTEGRATION) && tags[Tags.COMPONENT] != null) { + assert tags[Tags.COMPONENT].toString() == tags[DDTags.DD_INTEGRATION].toString() + } assert tags["thread.name"] != null assert tags["thread.id"] != null diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy index 529a41510e7..d13e9cc2544 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy @@ -413,6 +413,15 @@ abstract class HttpServerTest extends WithHttpServer { false } + /** + * To be set if the integration name (_dd.integration) differs from the component. + * This happen when the controller integration modify the parent component name (i.e. jaxrs) + * @return + */ + String expectedIntegrationName() { + null + } + @Override int version() { return 0 @@ -2189,6 +2198,7 @@ abstract class HttpServerTest extends WithHttpServer { def expectedStatus = expectedStatus(endpoint) def expectedQueryTag = expectedQueryTag(endpoint) def expectedUrl = expectedUrl(endpoint, address) + def expectedIntegrationName = expectedIntegrationName() trace.span { serviceName expectedServiceName() operationName operation() @@ -2236,6 +2246,9 @@ abstract class HttpServerTest extends WithHttpServer { if ({ isDataStreamsEnabled() }) { "$DDTags.PATHWAY_HASH" { String } } + if (expectedIntegrationName != null) { + withCustomIntegrationName(expectedIntegrationName) + } // OkHttp never sends the fragment in the request. // if (endpoint.fragment) { // "$DDTags.HTTP_FRAGMENT" endpoint.fragment diff --git a/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java b/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java index 1556fef030c..8df03a13011 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java @@ -99,4 +99,5 @@ public class DDTags { public static final String DECISION_MAKER_SERVICE = "_dd.dm.service"; public static final String DECISION_MAKER_RESOURCE = "_dd.dm.resource"; public static final String PROCESS_TAGS = "_dd.tags.process"; + public static final String DD_INTEGRATION = "_dd.integration"; } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java index 783bc02bfd2..1277b16aa7b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java @@ -85,6 +85,7 @@ public class DDSpanContext private final UTF8BytesString threadName; private volatile short httpStatusCode; + private CharSequence integrationName; /** * Tags are associated to the current span, they will not propagate to the children span. @@ -880,6 +881,15 @@ public void processTagsAndBaggage( } } + @Override + public void setIntegrationName(CharSequence integrationName) { + this.integrationName = integrationName; + } + + public CharSequence getIntegrationName() { + return integrationName; + } + @Override public String toString() { final StringBuilder s = diff --git a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/IntegrationAdder.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/IntegrationAdder.java new file mode 100644 index 00000000000..79db1f22998 --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/IntegrationAdder.java @@ -0,0 +1,23 @@ +package datadog.trace.core.tagprocessor; + +import static datadog.trace.api.DDTags.DD_INTEGRATION; + +import datadog.trace.bootstrap.instrumentation.api.AgentSpanLink; +import datadog.trace.core.DDSpanContext; +import java.util.List; +import java.util.Map; + +public class IntegrationAdder implements TagsPostProcessor { + + @Override + public Map processTags( + Map unsafeTags, DDSpanContext spanContext, List spanLinks) { + final CharSequence instrumentationName = spanContext.getIntegrationName(); + if (instrumentationName != null) { + unsafeTags.put(DD_INTEGRATION, instrumentationName); + } else { + unsafeTags.remove(DD_INTEGRATION); + } + return unsafeTags; + } +} diff --git a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/TagsPostProcessorFactory.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/TagsPostProcessorFactory.java index 2812bdb8479..1753a52af4a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/TagsPostProcessorFactory.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/TagsPostProcessorFactory.java @@ -32,6 +32,7 @@ private static TagsPostProcessor create() { if (Config.get().isAddSpanPointers("aws")) { processors.add(new SpanPointersProcessor()); } + processors.add(new IntegrationAdder()); return new PostProcessorChain( processors.toArray(processors.toArray(new TagsPostProcessor[0]))); } diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/tagprocessor/IntegrationAdderTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/tagprocessor/IntegrationAdderTest.groovy new file mode 100644 index 00000000000..1e044aebfec --- /dev/null +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/tagprocessor/IntegrationAdderTest.groovy @@ -0,0 +1,26 @@ +package datadog.trace.core.tagprocessor + + +import datadog.trace.core.DDSpanContext +import datadog.trace.test.util.DDSpecification + +class IntegrationAdderTest extends DDSpecification { + def "should add or remove _dd.integration when set (#isSet) on the span context"() { + setup: + def calculator = new IntegrationAdder() + def spanContext = Mock(DDSpanContext) + + when: + + def enrichedTags = calculator.processTags(["_dd.integration": "bad"], spanContext, []) + + then: + 1 * spanContext.getIntegrationName() >> (isSet ? "test" : null) + + and: + assert enrichedTags == (isSet ? ["_dd.integration": "test"] : [:]) + + where: + isSet << [true, false] + } +} diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java index fdea6629942..31d1a279a2c 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java @@ -656,6 +656,7 @@ public Span startManual() { @Override public Span start() { final AgentSpan agentSpan = delegate.start(); + agentSpan.context().setIntegrationName("opentracing"); return converter.toSpan(agentSpan); } diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy index 7d4ccfb0761..a102429011b 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy @@ -64,6 +64,7 @@ class OpenTracingAPITest extends DDSpecification { operationName "someOperation" resourceName "someOperation" tags { + "$DDTags.DD_INTEGRATION" "opentracing" defaultTags() } } @@ -74,7 +75,7 @@ class OpenTracingAPITest extends DDSpecification { def "span with builder"() { when: Span testSpan = tracer.buildSpan("someOperation") - .withTag(Tags.COMPONENT, "test-component") + .withTag(Tags.COMPONENT, "opentracing") .withTag("someBoolean", true) .withTag("someNumber", 1) .withTag(DDTags.SERVICE_NAME, "someService") @@ -100,7 +101,8 @@ class OpenTracingAPITest extends DDSpecification { operationName "someOperation" resourceName "someOperation" tags { - "$datadog.trace.bootstrap.instrumentation.api.Tags.COMPONENT" "test-component" + "$datadog.trace.bootstrap.instrumentation.api.Tags.COMPONENT" "opentracing" + "$DDTags.DD_INTEGRATION" "opentracing" "someBoolean" true "someNumber" 1 defaultTags() @@ -122,7 +124,7 @@ class OpenTracingAPITest extends DDSpecification { when: testSpan.setTag(DDTags.SERVICE_NAME, "someService") - testSpan.setTag(Tags.COMPONENT, "test-component") + testSpan.setTag(Tags.COMPONENT, "opentracing") testSpan.setTag("someBoolean", true) testSpan.setTag("someNumber", 1) testSpan.setOperationName("someOtherOperation") @@ -141,7 +143,8 @@ class OpenTracingAPITest extends DDSpecification { operationName("someOtherOperation") resourceName "someOtherOperation" tags { - "$datadog.trace.bootstrap.instrumentation.api.Tags.COMPONENT" "test-component" + "$datadog.trace.bootstrap.instrumentation.api.Tags.COMPONENT" "opentracing" + "$DDTags.DD_INTEGRATION" "opentracing" "someBoolean" true "someNumber" 1 defaultTags() @@ -205,6 +208,7 @@ class OpenTracingAPITest extends DDSpecification { operationName "someOperation" resourceName "someOperation" tags { + "$DDTags.DD_INTEGRATION" "opentracing" defaultTags() } } @@ -214,6 +218,7 @@ class OpenTracingAPITest extends DDSpecification { resourceName "someOperation2" childOf(span(0)) tags { + "$DDTags.DD_INTEGRATION" null defaultTags() } } @@ -258,6 +263,7 @@ class OpenTracingAPITest extends DDSpecification { operationName "someOperation" resourceName "someOperation" tags { + "$DDTags.DD_INTEGRATION" "opentracing" defaultTags() } } diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpanContext.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpanContext.java index fd05ab149db..9b993077444 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpanContext.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpanContext.java @@ -53,6 +53,8 @@ public interface AgentSpanContext { default void mergePathwayContext(PathwayContext pathwayContext) {} + default void setIntegrationName(CharSequence componentName) {} + /** * Gets whether the span context used is part of the local trace or from another service *