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 02999c4e7ca..3cdfac3271e 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 @@ -83,6 +83,8 @@ class TagsAssert { // If runtime id is actually different here, it might indicate that // the Config class was loaded on multiple different class loaders. assert tags[DDTags.RUNTIME_ID_TAG] == Config.get().runtimeId + assertedTags.add(DDTags.TRACER_HOST) + assert tags[DDTags.TRACER_HOST] == Config.get().getHostName() } else { assert tags[DDTags.RUNTIME_ID_TAG] == null } 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 fff1793fdcf..c9902a2bee2 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 @@ -50,6 +50,7 @@ public class DDTags { /* Tags below are for internal use only. */ static final String INTERNAL_HOST_NAME = "_dd.hostname"; + public static final String TRACER_HOST = "_dd.tracer_host"; public static final String RUNTIME_ID_TAG = "runtime-id"; public static final String RUNTIME_VERSION_TAG = "runtime_version"; static final String SERVICE = "service"; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/RemoteHostnameAdder.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/RemoteHostnameAdder.java new file mode 100644 index 00000000000..36343146a02 --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/RemoteHostnameAdder.java @@ -0,0 +1,23 @@ +package datadog.trace.core.tagprocessor; + +import datadog.trace.api.Config; +import datadog.trace.api.DDTags; +import datadog.trace.core.DDSpanContext; +import java.util.Map; + +public class RemoteHostnameAdder implements TagsPostProcessor { + private final Config config; + + public RemoteHostnameAdder(Config config) { + this.config = config; + } + + @Override + public Map processTags( + Map unsafeTags, DDSpanContext spanContext) { + if (spanContext.getSpanId() == spanContext.getRootSpanId()) { + unsafeTags.put(DDTags.TRACER_HOST, config.getHostName()); + } + 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 74aa7215629..dceec011b4f 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 @@ -6,15 +6,19 @@ public final class TagsPostProcessorFactory { private static boolean addBaseService = true; + private static boolean addRemoteHostname = true; private static class Lazy { private static TagsPostProcessor create() { - final List processors = new ArrayList<>(addBaseService ? 3 : 2); + final List processors = new ArrayList<>(4); processors.add(new PeerServiceCalculator()); if (addBaseService) { processors.add(new BaseServiceAdder(Config.get().getServiceName())); } processors.add(new QueryObfuscator(Config.get().getObfuscationQueryRegexp())); + if (addRemoteHostname) { + processors.add(new RemoteHostnameAdder(Config.get())); + } return new PostProcessorChain( processors.toArray(processors.toArray(new TagsPostProcessor[0]))); } @@ -35,10 +39,19 @@ public static void withAddBaseService(boolean enabled) { addBaseService = enabled; Lazy.instance = Lazy.create(); } + /** + * Mostly used for test purposes. + * + * @param enabled if false, {@link RemoteHostnameAdder} is not put in the chain. + */ + public static void withAddRemoteHostname(boolean enabled) { + addRemoteHostname = enabled; + Lazy.instance = Lazy.create(); + } /** Used for testing purposes. It reset the singleton and restore default options */ public static void reset() { withAddBaseService(true); - Lazy.instance = Lazy.create(); + withAddRemoteHostname(true); } } 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 e42fa7e95ac..f2226f6c88f 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 @@ -28,6 +28,7 @@ abstract class DDCoreSpecification extends DDSpecification { @Override void setupSpec() { TagsPostProcessorFactory.withAddBaseService(false) + TagsPostProcessorFactory.withAddRemoteHostname(false) } @Override