Skip to content

Commit 19f8596

Browse files
authored
Collect process tags for tracing (#8698)
* Collect process tags for tracing * fix tests and experimental features * Only add to first span in chunk * fix tests * use the good tag name * target all spring boot advices * fix coverage * Add process tags to client stats payload (#8704) * Use the correct setting name * update system test commit * refactor * add more tests
1 parent 0698839 commit 19f8596

25 files changed

Lines changed: 531 additions & 48 deletions

File tree

.circleci/config.continue.yml.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ instrumentation_modules: &instrumentation_modules "dd-java-agent/instrumentation
3636
debugger_modules: &debugger_modules "dd-java-agent/agent-debugger|dd-java-agent/agent-bootstrap|dd-java-agent/agent-builder|internal-api|communication|dd-trace-core"
3737
profiling_modules: &profiling_modules "dd-java-agent/agent-profiling"
3838

39-
default_system_tests_commit: &default_system_tests_commit 761b9e7a82ffb136c4653a4d1623d120d67b005b
39+
default_system_tests_commit: &default_system_tests_commit 08276e905c5c81055412ea4c318856d879cf15e5
4040

4141
parameters:
4242
nightly:

dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[
7676
+ "datadog.trace.api.Platform:rerun,"
7777
+ "datadog.trace.api.Platform$Captured:build_time,"
7878
+ "datadog.trace.api.env.CapturedEnvironment:build_time,"
79+
+ "datadog.trace.api.env.CapturedEnvironment$ProcessInfo:build_time,"
7980
+ "datadog.trace.api.ConfigCollector:rerun,"
8081
+ "datadog.trace.api.ConfigDefaults:build_time,"
8182
+ "datadog.trace.api.ConfigOrigin:build_time,"

dd-java-agent/instrumentation/spring-boot/src/main/java/datadog/trace/instrumentation/springboot/SpringApplicationInstrumentation.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import datadog.trace.agent.tooling.Instrumenter;
88
import datadog.trace.agent.tooling.InstrumenterModule;
99
import datadog.trace.api.Config;
10+
import datadog.trace.api.ProcessTags;
1011
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
1112
import net.bytebuddy.asm.Advice;
1213
import org.springframework.core.env.ConfigurableEnvironment;
@@ -60,6 +61,18 @@ public static void afterEnvironmentPostProcessed(
6061
final String applicationName = environment.getProperty("spring.application.name");
6162
if (applicationName != null && !applicationName.isEmpty()) {
6263
AgentTracer.get().updatePreferredServiceName(applicationName);
64+
ProcessTags.addTag("springboot.application", applicationName);
65+
}
66+
if (Config.get().isExperimentalPropagateProcessTagsEnabled()) {
67+
final String[] profiles = environment.getActiveProfiles();
68+
if (profiles != null && profiles.length > 0) {
69+
ProcessTags.addTag("springboot.profile", profiles[0]);
70+
} else {
71+
final String[] defaultProfiles = environment.getDefaultProfiles();
72+
if (defaultProfiles != null && defaultProfiles.length > 0) {
73+
ProcessTags.addTag("springboot.profile", defaultProfiles[0]);
74+
}
75+
}
6376
}
6477
}
6578
}
@@ -77,6 +90,18 @@ public static void afterEnvironmentPostProcessed(
7790
final String applicationName = environment.getProperty("spring.application.name");
7891
if (applicationName != null && !applicationName.isEmpty()) {
7992
AgentTracer.get().updatePreferredServiceName(applicationName);
93+
ProcessTags.addTag("springboot.application", applicationName);
94+
}
95+
if (Config.get().isExperimentalPropagateProcessTagsEnabled()) {
96+
final String[] profiles = environment.getActiveProfiles();
97+
if (profiles != null && profiles.length > 0) {
98+
ProcessTags.addTag("springboot.profile", profiles[0]);
99+
} else {
100+
final String[] defaultProfiles = environment.getDefaultProfiles();
101+
if (defaultProfiles != null && defaultProfiles.length > 0) {
102+
ProcessTags.addTag("springboot.profile", defaultProfiles[0]);
103+
}
104+
}
80105
}
81106
}
82107
}

dd-java-agent/instrumentation/spring-boot/src/test/groovy/SpringBootApplicationTest.groovy

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1+
import datadog.trace.api.ProcessTags
2+
13
import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
24

35
import datadog.trace.agent.test.AgentTestRunner
4-
import datadog.trace.api.Config
56
import org.springframework.beans.factory.InitializingBean
67
import org.springframework.boot.SpringApplication
78

9+
import static datadog.trace.api.config.GeneralConfig.EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED
10+
811
class SpringBootApplicationTest extends AgentTestRunner {
912
@Override
1013
protected void configurePreAgent() {
1114
super.configurePreAgent()
15+
injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "true")
1216
}
17+
1318
static class BeanWhoTraces implements InitializingBean {
1419

1520
@Override
@@ -32,15 +37,19 @@ class SpringBootApplicationTest extends AgentTestRunner {
3237
}
3338
}
3439
})
40+
and:
41+
def processTags = ProcessTags.getTagsForSerialization()
42+
assert processTags.toString() =~ ".+,springboot.application:$expectedService,springboot.profile:$expectedProfile"
3543
context != null
3644
cleanup:
3745
context?.stop()
3846
where:
39-
expectedService | args
40-
"application-name-from-args" | new String[]{
41-
"--spring.application.name=application-name-from-args"
47+
expectedService | expectedProfile | args
48+
"application-name-from-args" | "prod" | new String[]{
49+
"--spring.application.name=application-name-from-args",
50+
"--spring.profiles.active=prod,common",
4251
}
43-
"application-name-from-properties" | new String[0] // will load from properties
52+
"application-name-from-properties" | "default" | new String[0] // will load from properties
4453
}
4554
}
4655

dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import datadog.trace.agent.tooling.bytebuddy.matcher.GlobalIgnores
2727
import datadog.trace.api.Config
2828
import datadog.trace.api.DDSpanId
2929
import datadog.trace.api.IdGenerationStrategy
30+
import datadog.trace.api.ProcessTags
3031
import datadog.trace.api.StatsDClient
3132
import datadog.trace.api.TraceConfig
3233
import datadog.trace.api.WellKnownTags
@@ -509,6 +510,7 @@ abstract class AgentTestRunner extends DDSpecification implements AgentBuilder.L
509510
ActiveSubsystems.APPSEC_ACTIVE = true
510511
}
511512
InstrumentationErrors.resetErrorCount()
513+
ProcessTags.reset()
512514
}
513515

514516
@Override

dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ public final class ConfigDefaults {
241241
static final int DEFAULT_TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE = 100000;
242242

243243
static final Set<String> DEFAULT_TRACE_EXPERIMENTAL_FEATURES_ENABLED =
244-
new HashSet<>(asList("DD_TAGS", "DD_LOGS_INJECTION"));
244+
new HashSet<>(
245+
asList("DD_TAGS", "DD_LOGS_INJECTION", "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED"));
245246

246247
static final boolean DEFAULT_TRACE_128_BIT_TRACEID_GENERATION_ENABLED = true;
247248
static final boolean DEFAULT_TRACE_128_BIT_TRACEID_LOGGING_ENABLED = true;

dd-trace-api/src/main/java/datadog/trace/api/DDTags.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,5 @@ public class DDTags {
9898
public static final String DECISION_MAKER_INHERITED = "_dd.dm.inherited";
9999
public static final String DECISION_MAKER_SERVICE = "_dd.dm.service";
100100
public static final String DECISION_MAKER_RESOURCE = "_dd.dm.resource";
101+
public static final String PROCESS_TAGS = "_dd.tags.process";
101102
}

dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public final class GeneralConfig {
2929
@Deprecated // Use dd.tags instead
3030
public static final String GLOBAL_TAGS = "trace.global.tags";
3131

32+
public static final String EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED =
33+
"experimental.propagate.process.tags.enabled";
34+
3235
public static final String LOG_LEVEL = "log.level";
3336
public static final String TRACE_DEBUG = "trace.debug";
3437
public static final String TRACE_TRIAGE = "trace.triage";

dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import datadog.communication.serialization.GrowableBuffer;
66
import datadog.communication.serialization.WritableFormatter;
77
import datadog.communication.serialization.msgpack.MsgPackWriter;
8+
import datadog.trace.api.ProcessTags;
89
import datadog.trace.api.WellKnownTags;
10+
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
911

1012
public final class SerializingMetricWriter implements MetricWriter {
1113

@@ -28,6 +30,7 @@ public final class SerializingMetricWriter implements MetricWriter {
2830
private static final byte[] STATS = "Stats".getBytes(ISO_8859_1);
2931
private static final byte[] OK_SUMMARY = "OkSummary".getBytes(ISO_8859_1);
3032
private static final byte[] ERROR_SUMMARY = "ErrorSummary".getBytes(ISO_8859_1);
33+
private static final byte[] PROCESS_TAGS = "ProcessTags".getBytes(ISO_8859_1);
3134

3235
private final WellKnownTags wellKnownTags;
3336
private final WritableFormatter writer;
@@ -48,7 +51,9 @@ public SerializingMetricWriter(WellKnownTags wellKnownTags, Sink sink, int initi
4851

4952
@Override
5053
public void startBucket(int metricCount, long start, long duration) {
51-
writer.startMap(6);
54+
final UTF8BytesString processTags = ProcessTags.getTagsForSerialization();
55+
final boolean writeProcessTags = processTags != null;
56+
writer.startMap(6 + (writeProcessTags ? 1 : 0));
5257

5358
writer.writeUTF8(RUNTIME_ID);
5459
writer.writeUTF8(wellKnownTags.getRuntimeId());
@@ -65,7 +70,13 @@ public void startBucket(int metricCount, long start, long duration) {
6570
writer.writeUTF8(VERSION);
6671
writer.writeUTF8(wellKnownTags.getVersion());
6772

73+
if (writeProcessTags) {
74+
writer.writeUTF8(PROCESS_TAGS);
75+
writer.writeUTF8(processTags);
76+
}
77+
6878
writer.writeUTF8(STATS);
79+
6980
writer.startArray(1);
7081

7182
writer.startMap(3);

dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ public interface TraceMapper extends RemoteMapper {
1212
UTF8BytesString SAMPLING_PRIORITY_KEY =
1313
UTF8BytesString.create(DDSpanContext.PRIORITY_SAMPLING_KEY);
1414
UTF8BytesString ORIGIN_KEY = UTF8BytesString.create(DDTags.ORIGIN_KEY);
15+
UTF8BytesString PROCESS_TAGS_KEY = UTF8BytesString.create(DDTags.PROCESS_TAGS);
1516
}

0 commit comments

Comments
 (0)