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 e8af5f2b5de..7336a059bdc 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 @@ -1,6 +1,7 @@ package datadog.trace.bootstrap.instrumentation.decorator; import static datadog.trace.api.gateway.Events.EVENTS; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.DB_CLIENT_SPLIT_BY_HOST; import static datadog.trace.bootstrap.instrumentation.api.Tags.DB_TYPE; import datadog.appsec.api.blocking.BlockingException; @@ -76,7 +77,7 @@ public AgentSpan onConnection(final AgentSpan span, final CONNECTION connection) span.setTag(Tags.PEER_HOSTNAME, hostName); if (Config.get().isDbClientSplitByHost()) { - span.setServiceName(hostName.toString(), component()); + span.setServiceName(hostName.toString(), DB_CLIENT_SPLIT_BY_HOST); } } } 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 3f929be0183..69d160de7c3 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 @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.aerospike4; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.DB_CLIENT_SPLIT_BY_INSTANCE; import com.aerospike.client.AerospikeClient; import com.aerospike.client.cluster.Cluster; @@ -81,7 +82,7 @@ public AgentSpan onConnection( } span.setTag(Tags.DB_INSTANCE, instanceName); if (Config.get().isDbClientSplitByInstance()) { - span.setServiceName(instanceName, component()); + span.setServiceName(instanceName, DB_CLIENT_SPLIT_BY_INSTANCE); } } diff --git a/dd-java-agent/instrumentation/axis2-1.3/src/main/java/datadog/trace/instrumentation/axis2/AxisMessageDecorator.java b/dd-java-agent/instrumentation/axis2-1.3/src/main/java/datadog/trace/instrumentation/axis2/AxisMessageDecorator.java index 09045760296..524e1df75ad 100644 --- a/dd-java-agent/instrumentation/axis2-1.3/src/main/java/datadog/trace/instrumentation/axis2/AxisMessageDecorator.java +++ b/dd-java-agent/instrumentation/axis2-1.3/src/main/java/datadog/trace/instrumentation/axis2/AxisMessageDecorator.java @@ -3,6 +3,7 @@ import static datadog.trace.api.Functions.UTF8_ENCODE; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes.SOAP; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.HTTP_CLIENT_SPLIT_BY_DOMAIN; import datadog.trace.api.Config; import datadog.trace.api.cache.DDCache; @@ -117,7 +118,7 @@ public void onTransport(AgentSpan span, MessageContext message) { if (null != host && !host.isEmpty()) { span.setTag(Tags.PEER_HOSTNAME, host); if (Config.get().isHttpClientSplitByDomain() && host.charAt(0) >= 'A') { - span.setServiceName(host, component()); + span.setServiceName(host, HTTP_CLIENT_SPLIT_BY_DOMAIN); } if (port > 0) { setPeerPort(span, port); 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 bc6957b5fbb..6b724a8c24e 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 @@ -166,8 +166,7 @@ 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, JBOSS_MODULES); + ClassloaderConfigurationOverrides.withPinnedServiceName(module.getClassLoader(), name); } } } 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 c26166c1689..18add9fdf3d 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 @@ -6,6 +6,7 @@ import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.OFFSET; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.PARTITION; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.RECORD_QUEUE_TIME_MS; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.MESSAGE_BROKER_SPLIT_BY_DESTINATION; import static java.util.concurrent.TimeUnit.NANOSECONDS; import datadog.trace.api.Config; @@ -145,7 +146,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, component()); + span.setServiceName(topic, MESSAGE_BROKER_SPLIT_BY_DESTINATION); } } } 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 4c3faf7e8e4..8a3cd612718 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 @@ -6,6 +6,7 @@ import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.OFFSET; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.PARTITION; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.RECORD_QUEUE_TIME_MS; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.MESSAGE_BROKER_SPLIT_BY_DESTINATION; import static java.util.concurrent.TimeUnit.NANOSECONDS; import datadog.trace.api.Config; @@ -145,7 +146,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, component()); + span.setServiceName(topic, MESSAGE_BROKER_SPLIT_BY_DESTINATION); } } } 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 cdd5802b748..97f52bae52c 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 @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.OFFSET; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.PARTITION; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.PROCESSOR_NAME; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.MESSAGE_BROKER_SPLIT_BY_DESTINATION; import datadog.trace.api.Config; import datadog.trace.api.Functions; @@ -128,7 +129,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, component()); + span.setServiceName(topic, MESSAGE_BROKER_SPLIT_BY_DESTINATION); } } } 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 2d3a7ccaa28..33f1641afb5 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 @@ -42,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, LIBERTY); + ClassloaderConfigurationOverrides.withPinnedServiceName(self, name); } } } 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 66a53121a35..c8aa381ed29 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 @@ -11,6 +11,7 @@ import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.AMQP_QUEUE; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.AMQP_ROUTING_KEY; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.RECORD_QUEUE_TIME_MS; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.MESSAGE_BROKER_SPLIT_BY_DESTINATION; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Command; @@ -159,7 +160,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, component()); + span.setServiceName(normalizedQueueName, MESSAGE_BROKER_SPLIT_BY_DESTINATION); } 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 a861d03c744..407195ed08c 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 @@ -1,3 +1,5 @@ +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.MESSAGE_BROKER_SPLIT_BY_DESTINATION + import com.rabbitmq.client.AMQP import com.rabbitmq.client.Channel import com.rabbitmq.client.ConnectionFactory @@ -773,6 +775,7 @@ abstract class RabbitMQTestBase extends VersionedNamingTestBase { measured true final boolean isV0 = version() == 0 + final boolean isSplitByDestination = splitByDestination() tags { "$Tags.COMPONENT" "rabbitmq-amqp" @@ -829,7 +832,9 @@ abstract class RabbitMQTestBase extends VersionedNamingTestBase { if ({ isDataStreamsEnabled() }) { "$DDTags.PATHWAY_HASH" { String } } - if (isV0) { + if (distributedRootSpan && isSplitByDestination) { + serviceNameSource MESSAGE_BROKER_SPLIT_BY_DESTINATION + } else 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" 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 ce75326d074..a24715c184f 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 @@ -51,9 +51,7 @@ public static void onContextAvailable( final String contextName = context.getBaseName(); if (contextName != null && !contextName.isEmpty()) { - info = - ClassloaderConfigurationOverrides.withPinnedServiceName( - classLoader, contextName, TOMCAT); + info = ClassloaderConfigurationOverrides.withPinnedServiceName(classLoader, contextName); } if (context.getNamingResources() != null) { final ContextEnvironment[] envs = context.getNamingResources().findEnvironments(); 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 3d82c288088..68dcee2ac48 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 @@ -7,6 +7,8 @@ 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.ServiceNameSources.SPLIT_BY_SERVLET_CONTEXT; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.SPLIT_BY_TAGS; 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; @@ -230,7 +232,7 @@ private static void setResourceFromUrl( private boolean intercept(DDSpanContext span, String tag, Object value) { if (splitServiceTags.contains(tag)) { - span.setServiceName(String.valueOf(value)); + span.setServiceName(String.valueOf(value), SPLIT_BY_TAGS); return true; } return false; @@ -340,15 +342,15 @@ private boolean interceptServletContext(DDSpanContext span, Object value) { String serviceName = null; if (contextName.equals("/")) { serviceName = Config.get().getRootContextServiceName(); - span.setServiceName(serviceName, SERVLET_CONTEXT); + span.setServiceName(serviceName, SPLIT_BY_SERVLET_CONTEXT); } else if (contextName.charAt(0) == '/') { if (contextName.length() > 1) { serviceName = contextName.substring(1); - span.setServiceName(serviceName, SERVLET_CONTEXT); + span.setServiceName(serviceName, SPLIT_BY_SERVLET_CONTEXT); } } else { serviceName = contextName; - span.setServiceName(serviceName, SERVLET_CONTEXT); + span.setServiceName(serviceName, SPLIT_BY_SERVLET_CONTEXT); } ServiceNameCollector.get().addService(serviceName); } 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 18e36ca867b..ae10a7fac5d 100644 --- a/internal-api/src/main/java/datadog/trace/api/ClassloaderConfigurationOverrides.java +++ b/internal-api/src/main/java/datadog/trace/api/ClassloaderConfigurationOverrides.java @@ -1,5 +1,7 @@ package datadog.trace.api; +import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.JEE_SPLIT_BY_DEPLOYMENT; + import datadog.trace.api.config.GeneralConfig; import datadog.trace.api.env.CapturedEnvironment; import datadog.trace.api.remoteconfig.ServiceNameCollector; @@ -28,10 +30,10 @@ static class Lazy { public static class ContextualInfo { private final String serviceName; - private final String serviceNameSource; + private final CharSequence serviceNameSource; private final Map tags = new HashMap<>(); - public ContextualInfo(String serviceName, String source) { + public ContextualInfo(String serviceName, CharSequence source) { this.serviceName = serviceName; this.serviceNameSource = source; } @@ -40,7 +42,7 @@ public String getServiceName() { return serviceName; } - public String getServiceNameSource() { + public CharSequence getServiceNameSource() { return serviceNameSource; } @@ -88,12 +90,11 @@ public static ContextualInfo maybeCreateContextualInfo(ClassLoader classLoader) } @Nullable - public static ContextualInfo withPinnedServiceName( - ClassLoader classLoader, String serviceName, String serviceNameSource) { + public static ContextualInfo withPinnedServiceName(ClassLoader classLoader, String serviceName) { if (!CAN_SPLIT_SERVICE_NAME_BY_DEPLOYMENT) { return null; } - final ContextualInfo contextualInfo = new ContextualInfo(serviceName, serviceNameSource); + final ContextualInfo contextualInfo = new ContextualInfo(serviceName, JEE_SPLIT_BY_DEPLOYMENT); addContextualInfo(classLoader, contextualInfo); return contextualInfo; } diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ServiceNameSources.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ServiceNameSources.java new file mode 100644 index 00000000000..2fd1397bb6e --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ServiceNameSources.java @@ -0,0 +1,21 @@ +package datadog.trace.bootstrap.instrumentation.api; + +public final class ServiceNameSources { + public static final CharSequence DB_CLIENT_SPLIT_BY_HOST = + UTF8BytesString.create("opt.db_client_split_by_host"); + public static final CharSequence DB_CLIENT_SPLIT_BY_INSTANCE = + UTF8BytesString.create("opt.db_client_split_by_instance"); + public static final CharSequence HTTP_CLIENT_SPLIT_BY_DOMAIN = + UTF8BytesString.create("opt.http_client_split_by_domain"); + public static final CharSequence JEE_SPLIT_BY_DEPLOYMENT = + UTF8BytesString.create("opt.jee_split_by_deployment"); + public static final CharSequence MESSAGE_BROKER_SPLIT_BY_DESTINATION = + UTF8BytesString.create("opt.message_broker_split_by_destination"); + public static final CharSequence SPLIT_BY_SERVLET_CONTEXT = + UTF8BytesString.create("opt.split_by_servlet_context"); + public static final CharSequence SPLIT_BY_TAGS = UTF8BytesString.create("opt.split_by_tags"); + + private ServiceNameSources() { + // utility class - no instantiation + } +}