diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/ClientDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/ClientDecorator.java index 5c3dd0aaae6..970152979be 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/ClientDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/ClientDecorator.java @@ -13,8 +13,9 @@ protected String spanKind() { @Override public AgentSpan afterStart(final AgentSpan span) { - if (service() != null) { - span.setServiceName(service()); + final String service = service(); + if (service != null) { + span.setServiceName(service, component()); } span.setTag(Tags.SPAN_KIND, spanKind()); diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java index e04e3cdbc08..e8af5f2b5de 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java @@ -76,7 +76,7 @@ public AgentSpan onConnection(final AgentSpan span, final CONNECTION connection) span.setTag(Tags.PEER_HOSTNAME, hostName); if (Config.get().isDbClientSplitByHost()) { - span.setServiceName(hostName.toString()); + span.setServiceName(hostName.toString(), component()); } } } @@ -88,7 +88,7 @@ protected AgentSpan onInstance(final AgentSpan span, final String dbInstance) { span.setTag(Tags.DB_INSTANCE, dbInstance); String serviceName = dbClientService(dbInstance); if (null != serviceName) { - span.setServiceName(serviceName); + span.setServiceName(serviceName, component()); } } return span; diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/UriBasedClientDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/UriBasedClientDecorator.java index ca593f78e8e..0ab130eab19 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/UriBasedClientDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/UriBasedClientDecorator.java @@ -19,7 +19,7 @@ public void onURI(@Nonnull final AgentSpan span, @Nonnull final URI uri) { if (null != host && !host.isEmpty()) { span.setTag(Tags.PEER_HOSTNAME, host); if (Config.get().isHttpClientSplitByDomain() && host.charAt(0) >= 'A') { - span.setServiceName(host); + span.setServiceName(host, component()); } if (port > 0) { setPeerPort(span, port); 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 b94b7013f39..9135441c735 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 @@ -31,7 +31,7 @@ class BaseDecoratorTest extends DDSpecification { _ * span.setTag(_, _) // Want to allow other calls from child implementations. _ * span.setMeasured(true) _ * span.setMetric(_, _) - _ * span.setServiceName(_) + _ * span.setServiceName(_, _) _ * span.setOperationName(_) _ * span.setSamplingPriority(_) 0 * _ 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 5153eeb09e0..fd9c3744463 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 @@ -19,7 +19,7 @@ class ClientDecoratorTest extends BaseDecoratorTest { then: if (serviceName != null) { - 1 * span.setServiceName(serviceName) + 1 * span.setServiceName(serviceName, "test-component") } 1 * span.setMeasured(true) 1 * span.setTag(Tags.COMPONENT, "test-component") 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 5e4e3d7d33f..3fd0b8b8fec 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 @@ -20,7 +20,7 @@ class DBTypeProcessingDatabaseClientDecoratorTest extends ClientDecoratorTest { then: if (serviceName != null) { - 1 * span.setServiceName(serviceName) + 1 * span.setServiceName(serviceName, "test-component") } 1 * span.setMeasured(true) 1 * span.setTag(Tags.COMPONENT, "test-component") 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 e0ecce67b8e..a861d718ef3 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 @@ -23,7 +23,7 @@ class DatabaseClientDecoratorTest extends ClientDecoratorTest { then: if (serviceName != null) { - 1 * span.setServiceName(serviceName) + 1 * span.setServiceName(serviceName, "test-component") } 1 * span.setMeasured(true) 1 * span.setTag(Tags.COMPONENT, "test-component") @@ -58,11 +58,11 @@ class DatabaseClientDecoratorTest extends ClientDecoratorTest { 1 * span.setTag(Tags.PEER_HOSTNAME, session.hostname) } if (instanceTypeSuffix && renameByInstance && session.instance) { - 1 * span.setServiceName(session.instance + "-" + decorator.dbType()) + 1 * span.setServiceName(session.instance + "-" + decorator.dbType(), _) } else if (renameByInstance && session.instance) { - 1 * span.setServiceName(session.instance) + 1 * span.setServiceName(session.instance, _) } else if (renameByHost) { - 1 * span.setServiceName(session.hostname) + 1 * span.setServiceName(session.hostname, _) } } 0 * _ diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorTest.groovy index bd98bc53226..1bc83457bd0 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorTest.groovy +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorTest.groovy @@ -72,7 +72,7 @@ class HttpClientDecoratorTest extends ClientDecoratorTest { 1 * span.setTag(Tags.PEER_PORT, req.url.port) 1 * span.setResourceName({ it as String == req.method.toUpperCase() + " " + req.path }, ResourceNamePriorities.HTTP_PATH_NORMALIZER) if (renameService) { - 1 * span.setServiceName(req.url.host) + 1 * span.setServiceName(req.url.host, _) } 1 * span.traceConfig() >> AgentTracer.traceConfig() } @@ -147,7 +147,7 @@ class HttpClientDecoratorTest extends ClientDecoratorTest { then: if (expectedServiceName) { - 1 * span.setServiceName(expectedServiceName) + 1 * span.setServiceName(expectedServiceName, _) } if (url != null) { 1 * span.setResourceName(_, _) diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy index 7db4f70a272..49706d42044 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy @@ -13,6 +13,7 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpanLink import datadog.trace.core.DDSpan import java.util.concurrent.ConcurrentHashMap +import javax.annotation.Nonnull /** * Decorator for {@link AgentSpan} that keeps track of the decorated span's finish location. @@ -344,6 +345,11 @@ class TrackingSpanDecorator implements AgentSpan { return delegate.setServiceName(serviceName) } + @Override + void setServiceName(@Nonnull String serviceName, @Nonnull CharSequence source) { + delegate.setServiceName(serviceName, source) + } + @Override CharSequence getResourceName() { return delegate.getResourceName() diff --git a/dd-java-agent/instrumentation/aerospike-4.0/src/main/java/datadog/trace/instrumentation/aerospike4/AerospikeClientDecorator.java b/dd-java-agent/instrumentation/aerospike-4.0/src/main/java/datadog/trace/instrumentation/aerospike4/AerospikeClientDecorator.java index 96f4f8e031d..3f929be0183 100644 --- a/dd-java-agent/instrumentation/aerospike-4.0/src/main/java/datadog/trace/instrumentation/aerospike4/AerospikeClientDecorator.java +++ b/dd-java-agent/instrumentation/aerospike-4.0/src/main/java/datadog/trace/instrumentation/aerospike4/AerospikeClientDecorator.java @@ -81,7 +81,7 @@ public AgentSpan onConnection( } span.setTag(Tags.DB_INSTANCE, instanceName); if (Config.get().isDbClientSplitByInstance()) { - span.setServiceName(instanceName); + span.setServiceName(instanceName, component()); } } diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsSdkClientDecorator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsSdkClientDecorator.java index afc8db3a43e..e2a56e73500 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsSdkClientDecorator.java +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-1.11/src/main/java/datadog/trace/instrumentation/aws/v0/AwsSdkClientDecorator.java @@ -44,6 +44,8 @@ public class AwsSdkClientDecorator extends HttpClientDecorator= 'A') { - span.setServiceName(host); + span.setServiceName(host, component()); } if (port > 0) { setPeerPort(span, port); diff --git a/dd-java-agent/instrumentation/axis2-1.3/src/test/groovy/datadog/trace/instrumentation/axis2/AxisEngineTest.groovy b/dd-java-agent/instrumentation/axis2-1.3/src/test/groovy/datadog/trace/instrumentation/axis2/AxisEngineTest.groovy index d5437d36c13..6d4a59058cf 100644 --- a/dd-java-agent/instrumentation/axis2-1.3/src/test/groovy/datadog/trace/instrumentation/axis2/AxisEngineTest.groovy +++ b/dd-java-agent/instrumentation/axis2-1.3/src/test/groovy/datadog/trace/instrumentation/axis2/AxisEngineTest.groovy @@ -388,6 +388,7 @@ class AxisEngineTest extends InstrumentationSpecification { } topLevel parentSpan == null tags { + serviceNameSource null defaultTags() } } @@ -414,6 +415,7 @@ class AxisEngineTest extends InstrumentationSpecification { "error.stack" String } "$Tags.COMPONENT" "axis2" + serviceNameSource null defaultTags() } } diff --git a/dd-java-agent/instrumentation/axis2-1.3/src/test/groovy/datadog/trace/instrumentation/axis2/AxisTransportForkedTest.groovy b/dd-java-agent/instrumentation/axis2-1.3/src/test/groovy/datadog/trace/instrumentation/axis2/AxisTransportForkedTest.groovy index 4993fdba6cd..01fdc79c50e 100644 --- a/dd-java-agent/instrumentation/axis2-1.3/src/test/groovy/datadog/trace/instrumentation/axis2/AxisTransportForkedTest.groovy +++ b/dd-java-agent/instrumentation/axis2-1.3/src/test/groovy/datadog/trace/instrumentation/axis2/AxisTransportForkedTest.groovy @@ -133,6 +133,8 @@ class AxisTransportForkedTest extends InstrumentationSpecification { } topLevel parentSpan == null tags { + // manual tracing + serviceNameSource null defaultTags() } } @@ -159,6 +161,7 @@ class AxisTransportForkedTest extends InstrumentationSpecification { "error.stack" String } "$Tags.COMPONENT" "axis2" + serviceNameSource null defaultTags() } } @@ -197,6 +200,7 @@ class AxisTransportForkedTest extends InstrumentationSpecification { "$Tags.HTTP_STATUS" 200 "$Tags.PEER_HOSTNAME" "my-host" "$Tags.PEER_PORT" 8080 + serviceNameSource null defaultTags() } } diff --git a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationNewOpNameForkedTest.groovy b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationNewOpNameForkedTest.groovy index fbdbce573f7..6d5b29df1c3 100644 --- a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationNewOpNameForkedTest.groovy +++ b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationNewOpNameForkedTest.groovy @@ -27,6 +27,7 @@ class TraceAnnotationNewOpNameForkedTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -49,6 +50,7 @@ class TraceAnnotationNewOpNameForkedTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } diff --git a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationsAsyncTest.groovy b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationsAsyncTest.groovy index 059760f92ed..1529023b7b0 100644 --- a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationsAsyncTest.groovy +++ b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationsAsyncTest.groovy @@ -31,6 +31,7 @@ class TraceAnnotationsAsyncTest extends InstrumentationSpecification { resourceName "SayTracedHello.sayHelloFuture" operationName "trace.annotation" tags { + serviceNameSource null defaultTags() "$Tags.COMPONENT" "trace" } diff --git a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationsTest.groovy b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationsTest.groovy index 6af0e9b0ef7..0c95361bbc3 100644 --- a/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationsTest.groovy +++ b/dd-java-agent/instrumentation/datadog/tracing/trace-annotation/src/test/groovy/TraceAnnotationsTest.groovy @@ -26,6 +26,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -50,6 +51,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -73,6 +75,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -97,6 +100,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -119,6 +123,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -130,6 +135,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -141,6 +147,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -163,6 +170,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -174,6 +182,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -185,6 +194,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -207,6 +217,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -218,6 +229,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -229,6 +241,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -254,6 +267,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored true tags { "$Tags.COMPONENT" "trace" + serviceNameSource null errorTags(error.class) defaultTags() } @@ -280,6 +294,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored true tags { "$Tags.COMPONENT" "trace" + serviceNameSource null errorTags(error.class) defaultTags() } @@ -301,6 +316,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { operationName "trace.annotation" tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -326,6 +342,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { operationName "trace.annotation" tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -335,6 +352,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { operationName "trace.annotation" tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -372,6 +390,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -384,6 +403,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -421,6 +441,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { measured false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -433,6 +454,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { measured true tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -445,6 +467,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { measured false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -481,6 +504,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -492,6 +516,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } @@ -505,6 +530,7 @@ class TraceAnnotationsTest extends InstrumentationSpecification { errored false tags { "$Tags.COMPONENT" "trace" + serviceNameSource null defaultTags() } } diff --git a/dd-java-agent/instrumentation/google-pubsub-1.116/src/test/groovy/PubSubTest.groovy b/dd-java-agent/instrumentation/google-pubsub-1.116/src/test/groovy/PubSubTest.groovy index 688d8dc51af..8c467b364f9 100644 --- a/dd-java-agent/instrumentation/google-pubsub-1.116/src/test/groovy/PubSubTest.groovy +++ b/dd-java-agent/instrumentation/google-pubsub-1.116/src/test/groovy/PubSubTest.groovy @@ -81,6 +81,10 @@ abstract class PubSubTest extends VersionedNamingTestBase { abstract String operationForProducer() + protected boolean expectsServiceNameSource() { + false + } + Object createMessageReceiver(final CountDownLatch latch) { return new MessageReceiver() { @Override @@ -174,6 +178,7 @@ abstract class PubSubTest extends VersionedNamingTestBase { o1[0].localRootSpan.getTag(Tags.SPAN_KIND) <=> o2[0].localRootSpan.getTag(Tags.SPAN_KIND) }, ] as Comparator) { + final boolean expectsServiceNameSource = expectsServiceNameSource() trace(shadowGrpcSpans() ? 2 : 3) { sortSpansByStart() basicSpan(it, "parent") @@ -191,6 +196,9 @@ abstract class PubSubTest extends VersionedNamingTestBase { if ({ isDataStreamsEnabled() }) { "$DDTags.PATHWAY_HASH" { String } } + if (expectsServiceNameSource) { + serviceNameSource "java-google-pubsub" + } defaultTagsNoPeerService() } } @@ -223,6 +231,9 @@ abstract class PubSubTest extends VersionedNamingTestBase { if ({ isDataStreamsEnabled() }) { "$DDTags.PATHWAY_HASH" { String } } + if (expectsServiceNameSource) { + serviceNameSource "java-google-pubsub" + } defaultTags(true) } } @@ -315,6 +326,11 @@ class PubSubNamingV0NoLegacyTracingForkedTest extends PubSubNamingV0Test { injectSysConfig("dd.google-pubsub.legacy.tracing.enabled", "false") } + @Override + protected boolean expectsServiceNameSource() { + true + } + @Override String service() { "A-service" diff --git a/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleInstrumentation.java b/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleInstrumentation.java index da0545b0fb1..bc6957b5fbb 100644 --- a/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleInstrumentation.java +++ b/dd-java-agent/instrumentation/jboss/jboss-modules-1.3/src/main/java/datadog/trace/instrumentation/jbossmodules/ModuleInstrumentation.java @@ -21,8 +21,10 @@ @AutoService(InstrumenterModule.class) public final class ModuleInstrumentation extends InstrumenterModule.Tracing implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + private static final String JBOSS_MODULES = "jboss-modules"; + public ModuleInstrumentation() { - super("classloading", "jboss-modules"); + super("classloading", JBOSS_MODULES); } @Override @@ -164,7 +166,8 @@ public static class CaptureModuleNameAdvice { public static void afterConstruct(@Advice.This final Module module) { final String name = ModuleNameHelper.extractDeploymentName(module.getClassLoader()); if (name != null && !name.isEmpty()) { - ClassloaderConfigurationOverrides.withPinnedServiceName(module.getClassLoader(), name); + ClassloaderConfigurationOverrides.withPinnedServiceName( + module.getClassLoader(), name, JBOSS_MODULES); } } } 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 629443f431a..a307d026d98 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 @@ -402,7 +402,7 @@ public void setApplicationName(AgentSpan span, Connection connection) { protected void postProcessServiceAndOperationName( AgentSpan span, DatabaseClientDecorator.NamingEntry namingEntry) { if (namingEntry.getService() != null) { - span.setServiceName(namingEntry.getService()); + span.setServiceName(namingEntry.getService(), component()); } span.setOperationName(namingEntry.getOperation()); } diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSDecorator.java b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSDecorator.java index 190b0e7fa57..87fbfc55fc7 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSDecorator.java +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/main/java/datadog/trace/instrumentation/jms/JMSDecorator.java @@ -188,7 +188,7 @@ public void onTimeInQueue(AgentSpan span, CharSequence resourceName, String serv span.setResourceName(resourceName); } if (null != serviceName) { - span.setServiceName(serviceName); + span.setServiceName(serviceName, component()); } } diff --git a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/test/groovy/TimeInQueueForkedTest.groovy b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/test/groovy/TimeInQueueForkedTest.groovy index 49855bf7492..15e1aa4edb7 100644 --- a/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/test/groovy/TimeInQueueForkedTest.groovy +++ b/dd-java-agent/instrumentation/jms/javax-jms-1.1/src/test/groovy/TimeInQueueForkedTest.groovy @@ -651,6 +651,9 @@ abstract class TimeInQueueForkedTestBase extends VersionedNamingTestBase { tags { "$Tags.COMPONENT" "jms" "$Tags.SPAN_KIND" Tags.SPAN_KIND_PRODUCER + // when not using the legacy tracing the service is set to DD_SERVICE + // while it should just not be set at all. + serviceNameSource "jms" defaultTagsNoPeerService() } } @@ -679,6 +682,9 @@ abstract class TimeInQueueForkedTestBase extends VersionedNamingTestBase { if (!isTimestampDisabled) { "$InstrumentationTags.RECORD_QUEUE_TIME_MS" { it >= 0 } } + // when not using the legacy tracing the service is set to DD_SERVICE + // while it should just not be set at all. + serviceNameSource "jms" defaultTags(false) } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/latestDepTest/groovy/KafkaClientTestBase.groovy b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/latestDepTest/groovy/KafkaClientTestBase.groovy index 0c64d6bd9ab..ac69faff20a 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/latestDepTest/groovy/KafkaClientTestBase.groovy +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/latestDepTest/groovy/KafkaClientTestBase.groovy @@ -296,6 +296,7 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } else { parent() } + final boolean isV0 = version() == 0 tags { "$Tags.COMPONENT" "java-kafka" "$Tags.SPAN_KIND" Tags.SPAN_KIND_PRODUCER @@ -318,6 +319,11 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } } peerServiceFrom(InstrumentationTags.KAFKA_BOOTSTRAP_SERVERS) + if (isV0) { + // in v0 the service name is always set to DD_SERVICE while it should just be unset as v1 + // this is a buggy behaviour that could not be easily fixed. + serviceNameSource "java-kafka" + } defaultTags() } } @@ -367,6 +373,7 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } else { parent() } + final boolean isV0 = version() == 0 tags { "$Tags.COMPONENT" "java-kafka" "$Tags.SPAN_KIND" Tags.SPAN_KIND_CONSUMER @@ -383,6 +390,11 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { if ({ isDataStreamsEnabled() }) { "$DDTags.PATHWAY_HASH" { String } } + if (isV0) { + // in v0 the service name is always set to DD_SERVICE while it should just be unset as v1 + // this is a buggy behaviour that could not be easily fixed. + serviceNameSource "java-kafka" + } defaultTags(distributedRootSpan) } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaDecorator.java b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaDecorator.java index c463cada1a0..c26166c1689 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaDecorator.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaDecorator.java @@ -145,7 +145,7 @@ public void onTimeInQueue(final AgentSpan span, final ConsumerRecord record) { String topic = record.topic() == null ? "kafka" : record.topic(); span.setResourceName(topic); if (Config.get().isMessageBrokerSplitByDestination()) { - span.setServiceName(topic); + span.setServiceName(topic, component()); } } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/test/groovy/KafkaClientTestBase.groovy b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/test/groovy/KafkaClientTestBase.groovy index bd9df3a4101..dab3a6b678a 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/test/groovy/KafkaClientTestBase.groovy +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/test/groovy/KafkaClientTestBase.groovy @@ -1076,6 +1076,7 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } else { parent() } + final boolean isV0 = version() == 0 tags { "$Tags.COMPONENT" "java-kafka" "$Tags.SPAN_KIND" Tags.SPAN_KIND_PRODUCER @@ -1098,6 +1099,11 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } } peerServiceFrom(InstrumentationTags.KAFKA_BOOTSTRAP_SERVERS) + if (isV0) { + // in v0 the service name is always set to DD_SERVICE while it should just be unset as v1 + // this is a buggy behaviour that could not be easily fixed. + serviceNameSource "java-kafka" + } defaultTags() } } @@ -1147,6 +1153,7 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } else { parent() } + final boolean isV0 = version() == 0 tags { "$Tags.COMPONENT" "java-kafka" "$Tags.SPAN_KIND" Tags.SPAN_KIND_CONSUMER @@ -1163,6 +1170,11 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { if ({ isDataStreamsEnabled() }) { "$DDTags.PATHWAY_HASH" { String } } + if (isV0) { + // in v0 the service name is always set to DD_SERVICE while it should just be unset as v1 + // this is a buggy behaviour that could not be easily fixed. + serviceNameSource "java-kafka" + } defaultTags(distributedRootSpan) } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaDecorator.java b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaDecorator.java index 0b2436d2d2e..4c3faf7e8e4 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaDecorator.java +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/KafkaDecorator.java @@ -145,7 +145,7 @@ public void onTimeInQueue(final AgentSpan span, final ConsumerRecord record) { String topic = record.topic() == null ? "kafka" : record.topic(); span.setResourceName(topic); if (Config.get().isMessageBrokerSplitByDestination()) { - span.setServiceName(topic); + span.setServiceName(topic, component()); } } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/test/groovy/KafkaClientTestBase.groovy b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/test/groovy/KafkaClientTestBase.groovy index e889cf2ac93..8e53df883bf 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/test/groovy/KafkaClientTestBase.groovy +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/test/groovy/KafkaClientTestBase.groovy @@ -907,6 +907,7 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } else { parent() } + final boolean isV0 = version() == 0 tags { "$Tags.COMPONENT" "java-kafka" "$Tags.SPAN_KIND" Tags.SPAN_KIND_PRODUCER @@ -929,6 +930,11 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } } peerServiceFrom(InstrumentationTags.KAFKA_BOOTSTRAP_SERVERS) + if (isV0) { + // in v0 the service name is always set to DD_SERVICE while it should just be unset as v1 + // this is a buggy behaviour that could not be easily fixed. + serviceNameSource "java-kafka" + } defaultTags() } } @@ -978,6 +984,7 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { } else { parent() } + final boolean isV0 = version() == 0 tags { "$Tags.COMPONENT" "java-kafka" "$Tags.SPAN_KIND" Tags.SPAN_KIND_CONSUMER @@ -994,6 +1001,9 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase { if ({ isDataStreamsEnabled() }) { "$DDTags.PATHWAY_HASH" { String } } + if (isV0) { + serviceNameSource "java-kafka" + } defaultTags(distributedRootSpan) } } diff --git a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsDecorator.java b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsDecorator.java index 91b018367b0..cdd5802b748 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsDecorator.java +++ b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/src/main/java/datadog/trace/instrumentation/kafka_streams/KafkaStreamsDecorator.java @@ -128,7 +128,7 @@ public void onTimeInQueue(final AgentSpan span, final String topic2) { String topic = topic2 == null ? "kafka" : topic2; span.setResourceName(topic); if (Config.get().isMessageBrokerSplitByDestination()) { - span.setServiceName(topic); + span.setServiceName(topic, component()); } } } diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ThreadContextClassloaderInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ThreadContextClassloaderInstrumentation.java index 9b71fda635c..2d3a7ccaa28 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ThreadContextClassloaderInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ThreadContextClassloaderInstrumentation.java @@ -13,8 +13,10 @@ public class ThreadContextClassloaderInstrumentation extends InstrumenterModule.Tracing implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + private static final String LIBERTY = "liberty"; + public ThreadContextClassloaderInstrumentation() { - super("liberty", "liberty-classloading"); + super(LIBERTY, "liberty-classloading"); } @Override @@ -40,7 +42,7 @@ public static class ThreadContextClassloaderAdvice { public static void afterConstruct(@Advice.This ThreadContextClassLoader self) { final String name = BundleNameHelper.extractDeploymentName(self); if (name != null && !name.isEmpty()) { - ClassloaderConfigurationOverrides.withPinnedServiceName(self, name); + ClassloaderConfigurationOverrides.withPinnedServiceName(self, name, LIBERTY); } } } diff --git a/dd-java-agent/instrumentation/mongo/mongo-common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommandListener.java b/dd-java-agent/instrumentation/mongo/mongo-common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommandListener.java index 00e7ee0786c..e5905ec5241 100644 --- a/dd-java-agent/instrumentation/mongo/mongo-common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommandListener.java +++ b/dd-java-agent/instrumentation/mongo/mongo-common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommandListener.java @@ -140,7 +140,7 @@ public void commandStarted(final CommandStartedEvent event) { if (applicationName != null) { span.setTag(Tags.DB_INSTANCE, applicationName); if (Config.get().isDbClientSplitByInstance()) { - span.setServiceName(applicationName); + span.setServiceName(applicationName, decorator.component()); } } if (event.getConnectionDescription() != null diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14ConventionsTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14ConventionsTest.groovy index 9bbfe3e2784..55e63f19111 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14ConventionsTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/OpenTelemetry14ConventionsTest.groovy @@ -129,6 +129,7 @@ class OpenTelemetry14ConventionsTest extends InstrumentationSpecification { serviceName "my-service" spanType "http" tags { + serviceNameSource null //service name was manually set defaultTags() "$SPAN_KIND" "$SPAN_KIND_INTERNAL" } 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 3383ce539ca..b355534ee5c 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 @@ -28,6 +28,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { parent() errored false tags { + serviceNameSource null // manual service name defaultTags() "$Tags.COMPONENT" "opentelemetry" "$Tags.SPAN_KIND" "internal" @@ -51,6 +52,7 @@ class WithSpanAnnotationTest extends InstrumentationSpecification { parent() errored false tags { + serviceNameSource null // manual service name defaultTags() "$Tags.COMPONENT" "opentelemetry" "$Tags.SPAN_KIND" "internal" diff --git a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitDecorator.java b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitDecorator.java index 65df57e807c..66a53121a35 100644 --- a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitDecorator.java +++ b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitDecorator.java @@ -159,7 +159,7 @@ public void onCommand(final AgentSpan span, final Command command) { public void onTimeInQueue(final AgentSpan span, final String queue, final byte[] body) { String normalizedQueueName = normalizeQueueName(queue); if (Config.get().isMessageBrokerSplitByDestination()) { - span.setServiceName(normalizedQueueName); + span.setServiceName(normalizedQueueName, component()); } span.setResourceName("amqp.deliver " + normalizedQueueName); if (null != body) { diff --git a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/test/groovy/RabbitMQTest.groovy b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/test/groovy/RabbitMQTest.groovy index 6f9c420ed9c..a861d03c744 100644 --- a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/test/groovy/RabbitMQTest.groovy +++ b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/test/groovy/RabbitMQTest.groovy @@ -772,6 +772,8 @@ abstract class RabbitMQTestBase extends VersionedNamingTestBase { errored exception != null measured true + final boolean isV0 = version() == 0 + tags { "$Tags.COMPONENT" "rabbitmq-amqp" "$Tags.PEER_HOSTNAME" { it == null || it instanceof String } @@ -827,6 +829,11 @@ abstract class RabbitMQTestBase extends VersionedNamingTestBase { if ({ isDataStreamsEnabled() }) { "$DDTags.PATHWAY_HASH" { String } } + if (isV0) { + // in v0 the service name is always set to DD_SERVICE while it should just be unset as v1 + // this is a buggy behaviour that could not be easily fixed. + serviceNameSource "rabbitmq-amqp" + } if ([Tags.SPAN_KIND_PRODUCER, Tags.SPAN_KIND_CLIENT].any({ it == tag(Tags.SPAN_KIND) })) { peerServiceFrom(Tags.PEER_HOSTNAME) defaultTags(distributedRootSpan) diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/test/groovy/test/boot/SpringBootBasedTest.groovy b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/test/groovy/test/boot/SpringBootBasedTest.groovy index 91e505884b2..d9506921b66 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/test/groovy/test/boot/SpringBootBasedTest.groovy +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/src/test/groovy/test/boot/SpringBootBasedTest.groovy @@ -536,6 +536,7 @@ class SpringBootBasedTest extends HttpServerTest "runtime-id" String "thread.id" Number "thread.name" String + serviceNameSource "inferred_proxy" } } // Server span should be a child of the inferred proxy span diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/CallbackHandlerInstrumentation.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/CallbackHandlerInstrumentation.java index f5e13347db4..63c0f62b6a1 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/CallbackHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/CallbackHandlerInstrumentation.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.tibcobw6; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.instrumentation.tibcobw6.TibcoDecorator.TIBCO_BW; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import com.google.auto.service.AutoService; @@ -44,9 +45,9 @@ public static void exit(@Advice.This JMSMessageCallBackHandler handler) { final AgentSpan span = activeSpan(); AgentSpan root = span.getLocalRootSpan(); if (root != null) { - root.setServiceName(pinnedName); + root.setServiceName(pinnedName, TIBCO_BW); } - span.setServiceName(pinnedName); + span.setServiceName(pinnedName, TIBCO_BW); } } } diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/ProcessInstrumentation.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/ProcessInstrumentation.java index 7c4c4e9b043..c7a82a984fa 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/ProcessInstrumentation.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/ProcessInstrumentation.java @@ -4,6 +4,7 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; +import static datadog.trace.instrumentation.tibcobw6.TibcoDecorator.TIBCO_BW; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import com.google.auto.service.AutoService; @@ -70,9 +71,9 @@ public static void onExit( if (appName != null) { AgentSpan root = span.getLocalRootSpan(); if (root != null) { - root.setServiceName(appName); + root.setServiceName(appName, TIBCO_BW); } - span.setServiceName(appName); + span.setServiceName(appName, TIBCO_BW); } TibcoDecorator.DECORATE.onProcessStart(span, process.getName(pmContext)); contextStore.put(process, span); diff --git a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java index 94c4226acbc..4f788ff8fba 100644 --- a/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java +++ b/dd-java-agent/instrumentation/tibco-businessworks/tibco-businessworks-6.5/src/main/java/datadog/trace/instrumentation/tibcobw6/TibcoDecorator.java @@ -15,7 +15,7 @@ public class TibcoDecorator extends BaseDecorator { private static final Logger LOGGER = LoggerFactory.getLogger(TibcoDecorator.class); - private static final CharSequence TIBCO_BW = UTF8BytesString.create("tibco_bw"); + static final CharSequence TIBCO_BW = UTF8BytesString.create("tibco_bw"); private static final CharSequence APPNODE_NAME = UTF8BytesString.create(SystemProperties.get("bw.appnode")); private static final CharSequence BW_VERSION = bwVersion(); diff --git a/dd-java-agent/instrumentation/tomcat/tomcat-9.0/src/main/java/datadog/trace/instrumentation/tomcat9/WebappClassLoaderInstrumentation.java b/dd-java-agent/instrumentation/tomcat/tomcat-9.0/src/main/java/datadog/trace/instrumentation/tomcat9/WebappClassLoaderInstrumentation.java index 83d86feb898..ce75326d074 100644 --- a/dd-java-agent/instrumentation/tomcat/tomcat-9.0/src/main/java/datadog/trace/instrumentation/tomcat9/WebappClassLoaderInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat/tomcat-9.0/src/main/java/datadog/trace/instrumentation/tomcat9/WebappClassLoaderInstrumentation.java @@ -20,8 +20,10 @@ @AutoService(InstrumenterModule.class) public class WebappClassLoaderInstrumentation extends InstrumenterModule.Tracing implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + private static final String TOMCAT = "tomcat"; + public WebappClassLoaderInstrumentation() { - super("tomcat", "tomcat-classloading"); + super(TOMCAT, "tomcat-classloading"); } @Override @@ -49,7 +51,9 @@ public static void onContextAvailable( final String contextName = context.getBaseName(); if (contextName != null && !contextName.isEmpty()) { - info = ClassloaderConfigurationOverrides.withPinnedServiceName(classLoader, contextName); + info = + ClassloaderConfigurationOverrides.withPinnedServiceName( + classLoader, contextName, TOMCAT); } if (context.getNamingResources() != null) { final ContextEnvironment[] envs = context.getNamingResources().findEnvironments(); diff --git a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/VertxSqlClientDecorator.java b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/VertxSqlClientDecorator.java index f583033e647..cb4b5ba0d70 100644 --- a/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/VertxSqlClientDecorator.java +++ b/dd-java-agent/instrumentation/vertx/vertx-sql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client_39/VertxSqlClientDecorator.java @@ -108,7 +108,7 @@ public AgentSpan startAndDecorateSpanForStatement( protected void postProcessServiceAndOperationName( AgentSpan span, DatabaseClientDecorator.NamingEntry namingEntry) { if (namingEntry.getService() != null) { - span.setServiceName(namingEntry.getService()); + span.setServiceName(namingEntry.getService(), component()); } span.setOperationName(namingEntry.getOperation()); } diff --git a/dd-java-agent/instrumentation/wildfly-9.0/src/test/groovy/WildFlyForkedTest.groovy b/dd-java-agent/instrumentation/wildfly-9.0/src/test/groovy/WildFlyForkedTest.groovy index f83ae987dbb..5e0b2701fe1 100644 --- a/dd-java-agent/instrumentation/wildfly-9.0/src/test/groovy/WildFlyForkedTest.groovy +++ b/dd-java-agent/instrumentation/wildfly-9.0/src/test/groovy/WildFlyForkedTest.groovy @@ -77,6 +77,8 @@ class WildFlyForkedTest extends WithHttpServer implements Testi "$InstrumentationTags.SERVLET_CONTEXT" "/test" "$InstrumentationTags.SERVLET_PATH" "/hello" "custom-metric" 1983 + // the service name is set as tag - no source expected right now + serviceNameSource null defaultTags(true) } } 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 ba3e5d6a397..236b571c095 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 @@ -11,17 +11,18 @@ import datadog.trace.common.writer.ddagent.TraceMapper import datadog.trace.core.DDSpan import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType - import java.util.regex.Pattern class TagsAssert { private final long spanParentId private final Map tags + private final String serviceName private final Set assertedTags = new TreeSet<>() private TagsAssert(DDSpan span) { this.spanParentId = span.parentId this.tags = span.tags + this.serviceName = span.getServiceName() } static void assertTags(DDSpan span, @@ -51,6 +52,11 @@ class TagsAssert { assert tags[DDTags.DD_INTEGRATION]?.toString() == integrationName } + def serviceNameSource(CharSequence source) { + assertedTags.add(DDTags.DD_SVC_SRC) + assert tags[DDTags.DD_SVC_SRC]?.toString() == source?.toString() + } + def defaultTagsNoPeerService(boolean distributedRootSpan = false) { defaultTags(distributedRootSpan, false) } @@ -137,6 +143,11 @@ class TagsAssert { assert tags[Tags.PEER_SERVICE] == null assert tags[DDTags.PEER_SERVICE_SOURCE] == null } + // Note: this is a simplification of the rule setting _dd.svc_src but it's good enough for instrumentation tests + if (assertedTags.add(DDTags.DD_SVC_SRC)) { + assert (tags[DDTags.DD_SVC_SRC] == null) == (Config.get().getServiceName() == serviceName), + "The tag $DDTags.DD_SVC_SRC must be set if the instrumentation sets a service name. Otherwise it must be missing" + } } static void codeOriginTags(ListWriter writer) { 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 33ee2edfb2b..c52034556c5 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 @@ -101,4 +101,5 @@ public class DDTags { 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"; + public static final String DD_SVC_SRC = "_dd.svc_src"; } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 0d366f2f4ad..1be5fa91744 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -1867,6 +1867,7 @@ protected static final DDSpanContext buildSpanContext( } String parentServiceName = null; + CharSequence parentserviceNameSource = null; // Propagate internal trace. // Note: if we are not in the context of distributed tracing, and we are starting the first // root span, parentContext will be null at this point. @@ -1884,6 +1885,7 @@ protected static final DDSpanContext buildSpanContext( rootSpanTags = null; rootSpanTagsNeedsIntercept = false; parentServiceName = ddsc.getServiceName(); + parentserviceNameSource = ddsc.getServiceNameSource(); if (serviceName == null) { serviceName = parentServiceName; } @@ -1981,6 +1983,9 @@ protected static final DDSpanContext buildSpanContext( } if (serviceName == null) { serviceName = traceConfig.getPreferredServiceName(); + if (serviceName != null) { + parentserviceNameSource = "preferred"; + } } Map contextualTags = null; if (parentServiceName == null) { @@ -1992,6 +1997,9 @@ protected static final DDSpanContext buildSpanContext( // We can try to see if we can find one from the thread context classloader if (serviceName == null) { serviceName = contextualInfo.getServiceName(); + if (serviceName != null) { + parentserviceNameSource = contextualInfo.getServiceNameSource(); + } } contextualTags = contextualInfo.getTags(); } @@ -2033,6 +2041,7 @@ protected static final DDSpanContext buildSpanContext( spanId, parentSpanId, parentServiceName, + parentserviceNameSource, serviceName, operationName, resourceName, diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java index e8a6ce87edb..745f1249fc5 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java @@ -585,6 +585,11 @@ public final DDSpan setServiceName(final String serviceName) { return this; } + @Override + public void setServiceName(@Nonnull String serviceName, @Nonnull CharSequence source) { + context.setServiceName(serviceName, source); + } + @Override public final DDSpan setResourceName(final CharSequence resourceName) { return setResourceName(resourceName, ResourceNamePriorities.DEFAULT); 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 4a0eb4378b5..2c5e3776aea 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 @@ -40,11 +40,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.function.Function; +import javax.annotation.Nonnull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,6 +97,7 @@ public class DDSpanContext private volatile short httpStatusCode; private CharSequence integrationName; + private CharSequence serviceNameSource; /** * Tags are associated to the current span, they will not propagate to the children span. @@ -156,7 +159,6 @@ public class DDSpanContext private final boolean injectBaggageAsTags; private volatile int encodedOperationName; private volatile int encodedResourceName; - private volatile CharSequence lastParentId; /** * Metastruct keys are associated to the current span, they will not propagate to the children @@ -190,6 +192,7 @@ public DDSpanContext( spanId, parentId, parentServiceName, + null, serviceName, operationName, resourceName, @@ -237,6 +240,7 @@ public DDSpanContext( spanId, parentId, parentServiceName, + null, serviceName, operationName, resourceName, @@ -263,53 +267,7 @@ public DDSpanContext( final long spanId, final long parentId, final CharSequence parentServiceName, - final String serviceName, - final CharSequence operationName, - final CharSequence resourceName, - final int samplingPriority, - final CharSequence origin, - final Map baggageItems, - final boolean errorFlag, - final CharSequence spanType, - final int tagsSize, - final TraceCollector traceCollector, - final Object requestContextDataAppSec, - final Object requestContextDataIast, - final PathwayContext pathwayContext, - final boolean disableSamplingMechanismValidation, - final PropagationTags propagationTags, - final ProfilingContextIntegration profilingContextIntegration) { - this( - traceId, - spanId, - parentId, - parentServiceName, - serviceName, - operationName, - resourceName, - samplingPriority, - origin, - baggageItems, - null, - errorFlag, - spanType, - tagsSize, - traceCollector, - requestContextDataAppSec, - requestContextDataIast, - null, - pathwayContext, - disableSamplingMechanismValidation, - propagationTags, - profilingContextIntegration, - true); - } - - public DDSpanContext( - final DDTraceId traceId, - final long spanId, - final long parentId, - final CharSequence parentServiceName, + final CharSequence serviceNameSource, final String serviceName, final CharSequence operationName, final CharSequence resourceName, @@ -367,6 +325,7 @@ public DDSpanContext( this.encodedOperationName = profilingContextIntegration.encodeOperationName(operationName); setServiceName(serviceName); + this.serviceNameSource = serviceNameSource; this.operationName = operationName; setResourceName(resourceName, ResourceNamePriorities.DEFAULT); this.errorFlag = errorFlag; @@ -426,11 +385,29 @@ public String getServiceName() { return serviceName; } - public void setServiceName(final String serviceName) { + private void internalSetServiceName(String serviceName) { this.serviceName = traceCollector.mapServiceName(serviceName); this.topLevel = isTopLevel(parentServiceName, this.serviceName); } + public void setServiceName(final String serviceName) { + internalSetServiceName(serviceName); + setServiceNameSource(null); + } + + public void setServiceName(String serviceName, @Nonnull CharSequence integrationName) { + internalSetServiceName(serviceName); + setServiceNameSource(Objects.requireNonNull(integrationName)); + } + + public CharSequence getServiceNameSource() { + return serviceNameSource; + } + + public void setServiceNameSource(final CharSequence serviceNameSource) { + this.serviceNameSource = serviceNameSource; + } + // TODO this logic is inconsistent with hasResourceName public CharSequence getResourceName() { return isResourceNameSet() ? resourceName : operationName; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java b/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java index f2c6640d721..3d82c288088 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/taginterceptor/TagInterceptor.java @@ -6,6 +6,7 @@ import static datadog.trace.api.DDTags.SPAN_TYPE; import static datadog.trace.api.sampling.PrioritySampling.USER_DROP; import static datadog.trace.api.sampling.PrioritySampling.USER_KEEP; +import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.SERVLET_CONTEXT; import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_METHOD; import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_STATUS; import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL; @@ -29,7 +30,6 @@ import datadog.trace.api.remoteconfig.ServiceNameCollector; import datadog.trace.api.sampling.SamplingMechanism; import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities; -import datadog.trace.bootstrap.instrumentation.api.InstrumentationTags; import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities; import datadog.trace.bootstrap.instrumentation.api.Tags; import datadog.trace.bootstrap.instrumentation.api.URIUtils; @@ -74,7 +74,7 @@ public TagInterceptor( this.inferredServiceName = inferredServiceName; this.splitServiceTags = splitServiceTags; this.ruleFlags = ruleFlags; - splitByServletContext = splitServiceTags.contains(InstrumentationTags.SERVLET_CONTEXT); + splitByServletContext = splitServiceTags.contains(SERVLET_CONTEXT); shouldSet404ResourceName = ruleFlags.isEnabled(URL_AS_RESOURCE_NAME) @@ -111,7 +111,7 @@ public boolean needsIntercept(String tag) { case Tags.SAMPLING_PRIORITY: case Tags.PROPAGATED_TRACE_SOURCE: case Tags.PROPAGATED_DEBUG: - case InstrumentationTags.SERVLET_CONTEXT: + case SERVLET_CONTEXT: case SPAN_TYPE: case ANALYTICS_SAMPLE_RATE: case Tags.ERROR: @@ -166,7 +166,7 @@ public boolean interceptTag(DDSpanContext span, String tag, Object value) { case Tags.PROPAGATED_DEBUG: span.updateDebugPropagation(String.valueOf(value)); return true; - case InstrumentationTags.SERVLET_CONTEXT: + case SERVLET_CONTEXT: return interceptServletContext(span, value); case SPAN_TYPE: return interceptSpanType(span, value); @@ -340,15 +340,15 @@ private boolean interceptServletContext(DDSpanContext span, Object value) { String serviceName = null; if (contextName.equals("/")) { serviceName = Config.get().getRootContextServiceName(); - span.setServiceName(serviceName); + span.setServiceName(serviceName, SERVLET_CONTEXT); } else if (contextName.charAt(0) == '/') { if (contextName.length() > 1) { serviceName = contextName.substring(1); - span.setServiceName(serviceName); + span.setServiceName(serviceName, SERVLET_CONTEXT); } } else { serviceName = contextName; - span.setServiceName(serviceName); + span.setServiceName(serviceName, SERVLET_CONTEXT); } ServiceNameCollector.get().addService(serviceName); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/ServiceNameSourceAdder.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/ServiceNameSourceAdder.java new file mode 100644 index 00000000000..0d1eb95a570 --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/ServiceNameSourceAdder.java @@ -0,0 +1,21 @@ +package datadog.trace.core.tagprocessor; + +import static datadog.trace.api.DDTags.DD_SVC_SRC; + +import datadog.trace.api.TagMap; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanLink; +import datadog.trace.core.DDSpanContext; +import java.util.List; + +public class ServiceNameSourceAdder extends TagsPostProcessor { + @Override + public void processTags( + TagMap unsafeTags, DDSpanContext spanContext, List spanLinks) { + final CharSequence serviceNameSource = spanContext.getServiceNameSource(); + if (serviceNameSource != null) { + unsafeTags.set(DD_SVC_SRC, serviceNameSource); + } else { + unsafeTags.remove(DD_SVC_SRC); + } + } +} 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 679fe25a932..a69c057646e 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 @@ -13,7 +13,7 @@ private static class Lazy { private static TagsPostProcessor lazyProcessor = createLazyChain(); private static TagsPostProcessor createEagerChain() { - final List processors = new ArrayList<>(3); + final List processors = new ArrayList<>(4); processors.add(new PeerServiceCalculator()); if (addBaseService) { processors.add(new BaseServiceAdder(Config.get().getServiceName())); @@ -23,6 +23,7 @@ private static TagsPostProcessor createEagerChain() { if (Config.get().isTraceResourceRenamingEnabled()) { processors.add(new HttpEndpointPostProcessor()); } + processors.add(new ServiceNameSourceAdder()); // eager since needed for stats return new PostProcessorChain(processors.toArray(new TagsPostProcessor[0])); } diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/test/DDCoreSpecification.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/test/DDCoreSpecification.groovy index db4c510db10..8cb80d323b3 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/test/DDCoreSpecification.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/test/DDCoreSpecification.groovy @@ -94,6 +94,7 @@ abstract class DDCoreSpecification extends DDSpecification { 1, DDSpanId.ZERO, null, + null, "fakeService", "fakeOperation", "fakeResource", 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 a102429011b..ecd2267d7d6 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy @@ -65,6 +65,7 @@ class OpenTracingAPITest extends DDSpecification { resourceName "someOperation" tags { "$DDTags.DD_INTEGRATION" "opentracing" + serviceNameSource null // service name was manually set defaultTags() } } @@ -105,6 +106,7 @@ class OpenTracingAPITest extends DDSpecification { "$DDTags.DD_INTEGRATION" "opentracing" "someBoolean" true "someNumber" 1 + serviceNameSource null // service name was manually set defaultTags() } } @@ -147,6 +149,7 @@ class OpenTracingAPITest extends DDSpecification { "$DDTags.DD_INTEGRATION" "opentracing" "someBoolean" true "someNumber" 1 + serviceNameSource null // service name was manually set defaultTags() } } @@ -209,6 +212,7 @@ class OpenTracingAPITest extends DDSpecification { resourceName "someOperation" tags { "$DDTags.DD_INTEGRATION" "opentracing" + serviceNameSource null // service name was manually set defaultTags() } } @@ -219,6 +223,7 @@ class OpenTracingAPITest extends DDSpecification { childOf(span(0)) tags { "$DDTags.DD_INTEGRATION" null + serviceNameSource null // service name was manually set defaultTags() } } @@ -264,6 +269,7 @@ class OpenTracingAPITest extends DDSpecification { resourceName "someOperation" tags { "$DDTags.DD_INTEGRATION" "opentracing" + serviceNameSource null // service name was manually set defaultTags() } } @@ -308,6 +314,7 @@ class OpenTracingAPITest extends DDSpecification { operationName "someOperation" resourceName "someOperation" tags { + serviceNameSource null // service name was manually set defaultTags() } } @@ -316,6 +323,7 @@ class OpenTracingAPITest extends DDSpecification { operationName "otherOperation" resourceName "otherOperation" tags { + serviceNameSource null // service name was manually set defaultTags() } } @@ -352,6 +360,7 @@ class OpenTracingAPITest extends DDSpecification { operationName "someOperation" resourceName "someOperation" tags { + serviceNameSource null // service name was manually set defaultTags() } } @@ -476,6 +485,7 @@ class OpenTracingAPITest extends DDSpecification { operationName "clientOperation" resourceName "clientOperation" tags { + serviceNameSource null // service name was manually set defaultTags() } } @@ -487,6 +497,7 @@ class OpenTracingAPITest extends DDSpecification { resourceName "serverOperation" childOf(trace(0).get(0)) tags { + serviceNameSource null // service name was manually set defaultTags(true) } } @@ -521,6 +532,7 @@ class OpenTracingAPITest extends DDSpecification { operationName "someOperation" resourceName "someOperation" tags { + serviceNameSource null // service name was manually set defaultTags() } } diff --git a/internal-api/src/main/java/datadog/trace/api/ClassloaderConfigurationOverrides.java b/internal-api/src/main/java/datadog/trace/api/ClassloaderConfigurationOverrides.java index cfcff9a10b0..18e36ca867b 100644 --- a/internal-api/src/main/java/datadog/trace/api/ClassloaderConfigurationOverrides.java +++ b/internal-api/src/main/java/datadog/trace/api/ClassloaderConfigurationOverrides.java @@ -28,16 +28,22 @@ static class Lazy { public static class ContextualInfo { private final String serviceName; + private final String serviceNameSource; private final Map tags = new HashMap<>(); - public ContextualInfo(String serviceName) { + public ContextualInfo(String serviceName, String source) { this.serviceName = serviceName; + this.serviceNameSource = source; } public String getServiceName() { return serviceName; } + public String getServiceNameSource() { + return serviceNameSource; + } + public void addTag(String name, Object value) { tags.put(name, value); } @@ -48,7 +54,7 @@ public Map getTags() { } private static final Function EMPTY_CONTEXTUAL_INFO_ADDER = - ignored -> new ContextualInfo(null); + ignored -> new ContextualInfo(null, null); private final WeakHashMap weakCache = new WeakHashMap<>(); private final String inferredServiceName = @@ -82,11 +88,12 @@ public static ContextualInfo maybeCreateContextualInfo(ClassLoader classLoader) } @Nullable - public static ContextualInfo withPinnedServiceName(ClassLoader classLoader, String serviceName) { + public static ContextualInfo withPinnedServiceName( + ClassLoader classLoader, String serviceName, String serviceNameSource) { if (!CAN_SPLIT_SERVICE_NAME_BY_DEPLOYMENT) { return null; } - final ContextualInfo contextualInfo = new ContextualInfo(serviceName); + final ContextualInfo contextualInfo = new ContextualInfo(serviceName, serviceNameSource); addContextualInfo(classLoader, contextualInfo); return contextualInfo; } @@ -135,7 +142,7 @@ public static void maybeEnrichSpan( final String currentServiceName = span.getServiceName(); if (currentServiceName == null || currentServiceName.equals(Lazy.INSTANCE.inferredServiceName)) { - span.setServiceName(serviceName); + span.setServiceName(serviceName, contextualInfo.getServiceNameSource()); ServiceNameCollector.get().addService(serviceName); } } diff --git a/internal-api/src/main/java/datadog/trace/api/gateway/InferredProxySpan.java b/internal-api/src/main/java/datadog/trace/api/gateway/InferredProxySpan.java index 32431a34b38..9acecd782bd 100644 --- a/internal-api/src/main/java/datadog/trace/api/gateway/InferredProxySpan.java +++ b/internal-api/src/main/java/datadog/trace/api/gateway/InferredProxySpan.java @@ -82,7 +82,7 @@ public AgentSpanContext start(AgentSpanContext extracted) { // Service: value of x-dd-proxy-domain-name or global config if not found String serviceName = domainName != null && !domainName.isEmpty() ? domainName : Config.get().getServiceName(); - span.setServiceName(serviceName); + span.setServiceName(serviceName, INSTRUMENTATION_NAME); // Component: aws-apigateway span.setTag(COMPONENT, proxySystem); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java index 18ba85b0454..8ed1414377b 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java @@ -246,4 +246,15 @@ default ContextScope attach() { default ContextScope attachWithCurrent() { return storeInto(Context.current()).attach(); } + + /** + * Set the service name specifying the source (origin) of this name + * + * @param serviceName the service name + * @param source the source. Can be typically the name of the integration that overrides the + * default name. + */ + default void setServiceName(@Nonnull String serviceName, @Nonnull CharSequence source) { + setServiceName(serviceName); + } } diff --git a/internal-api/src/test/groovy/datadog/trace/api/ClassloaderConfigurationOverridesTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/ClassloaderConfigurationOverridesTest.groovy index 6f57193e38b..728c8e336c8 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/ClassloaderConfigurationOverridesTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/ClassloaderConfigurationOverridesTest.groovy @@ -18,14 +18,14 @@ class ClassloaderConfigurationOverridesTest extends DDSpecification { when: ClassloaderConfigurationOverrides.CAN_SPLIT_SERVICE_NAME_BY_DEPLOYMENT = splitByDeploymentEnabled ClassloaderConfigurationOverrides.addContextualInfo(Thread.currentThread().getContextClassLoader(), - new ClassloaderConfigurationOverrides.ContextualInfo(contextualServiceName)) + new ClassloaderConfigurationOverrides.ContextualInfo(contextualServiceName, "test")) ClassloaderConfigurationOverrides.maybeEnrichSpan(span) then: if (splitByDeploymentEnabled && contextualServiceName != null && !contextualServiceName.isEmpty()) { (1.._) * span.getServiceName() >> spanServiceName } if (expected) { - 1 * span.setServiceName(contextualServiceName) + 1 * span.setServiceName(contextualServiceName, "test") } where: