diff --git a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java b/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java index 80ed525130d..e0e59969a97 100644 --- a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java +++ b/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java @@ -3,10 +3,12 @@ import static datadog.trace.bootstrap.instrumentation.api.WriterConstants.LOGGING_WRITER_TYPE; import datadog.trace.api.Config; +import datadog.trace.api.ProcessTags; import datadog.trace.api.StatsDClient; import datadog.trace.api.StatsDClientManager; import datadog.trace.api.cache.DDCache; import datadog.trace.api.cache.DDCaches; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; @@ -52,8 +54,30 @@ public StatsDClient statsDClient( nameMapping = new NameResolver(namespace); } - if (null != constantTags && constantTags.length > 0) { - tagMapping = new TagCombiner(constantTags); + final List processTags = ProcessTags.getTagsAsStringList(); + final int processTagSize = processTags != null ? processTags.size() : 0; + String[] finalConstantTags = constantTags; + if (processTagSize > 0) { + final int constantTagSize = constantTags != null ? constantTags.length : 0; + if (constantTagSize == 0) { + finalConstantTags = processTags.toArray(new String[0]); + } else { + final int tagSizeSum = processTagSize + constantTagSize; + finalConstantTags = new String[tagSizeSum]; + int pos = 0; + // copy constant tags + for (; pos < constantTagSize; pos++) { + finalConstantTags[pos] = constantTags[pos]; + } + // copy process tags + for (int i = 0; i < processTagSize; i++) { + finalConstantTags[pos + i] = processTags.get(i); + } + } + } + + if (null != finalConstantTags && finalConstantTags.length > 0) { + tagMapping = new TagCombiner(finalConstantTags); } if (USE_LOGGING_CLIENT) { diff --git a/communication/src/test/groovy/datadog/communication/monitor/DDAgentStatsDClientTest.groovy b/communication/src/test/groovy/datadog/communication/monitor/DDAgentStatsDClientTest.groovy index d079fbc836f..66a49ee0c36 100644 --- a/communication/src/test/groovy/datadog/communication/monitor/DDAgentStatsDClientTest.groovy +++ b/communication/src/test/groovy/datadog/communication/monitor/DDAgentStatsDClientTest.groovy @@ -1,6 +1,8 @@ package datadog.communication.monitor +import static datadog.trace.api.config.GeneralConfig.EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED +import datadog.trace.api.ProcessTags import datadog.trace.test.util.DDSpecification import static datadog.trace.api.config.GeneralConfig.DOGSTATSD_START_DELAY @@ -109,13 +111,44 @@ class DDAgentStatsDClientTest extends DDSpecification { where: // spotless:off namespace | constantTags | expectedMetricName | expectedCheckName | expectedTags - null | null | "test.metric" | "test.check" | "jmx_domain:java.nio,type:BufferPool" - null | ["lang:java", "lang_version:1.8.0"] | "test.metric" | "test.check" | "jmx_domain:java.nio,type:BufferPool,lang:java,lang_version:1.8.0" - "example" | null | "example.test.metric" | "example.test.check" | "jmx_domain:java.nio,type:BufferPool" - "example" | ["lang:java", "lang_version:1.8.0"] | "example.test.metric" | "example.test.check" | "jmx_domain:java.nio,type:BufferPool,lang:java,lang_version:1.8.0" + null | null | "test.metric" | "test.check" | "jmx_domain:java.nio,type:BufferPool,${ProcessTags.getTagsForSerialization().toString()}" + null | ["lang:java", "lang_version:1.8.0"] | "test.metric" | "test.check" | "jmx_domain:java.nio,type:BufferPool,lang:java,lang_version:1.8.0,${ProcessTags.getTagsForSerialization().toString()}" + "example" | null | "example.test.metric" | "example.test.check" | "jmx_domain:java.nio,type:BufferPool,${ProcessTags.getTagsForSerialization().toString()}" + "example" | ["lang:java", "lang_version:1.8.0"] | "example.test.metric" | "example.test.check" | "jmx_domain:java.nio,type:BufferPool,lang:java,lang_version:1.8.0,${ProcessTags.getTagsForSerialization().toString()}" // spotless:on } + def "single statsd client without process tags"() { + setup: + injectSysConfig(DOGSTATSD_START_DELAY, '0') + injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "false") + def server = new StatsDServer() + server.start() + ProcessTags.reset() + + def client = statsDClientManager().statsDClient('127.0.0.1', server.socket.localPort, null, namespace, constantTags as String[], false) + + String metricName = "test.metric" + String[] tags = ["test:true"] + + when: + client.incrementCounter(metricName, tags) + + then: + server.waitForMessage().startsWith("$expectedMetricName:1|c|#$expectedTags") + + cleanup: + injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "true") + ProcessTags.reset() + client.close() + server.close() + + where: + namespace | constantTags | expectedMetricName | expectedTags + null | null | "test.metric" | "test:true" + null | ["lang:java", "lang_version:1.8.0"] | "test.metric" | "test:true,lang:java,lang_version:1.8.0" + } + def "single statsd client with event"() { setup: injectSysConfig(DOGSTATSD_START_DELAY, '0')