Skip to content

Commit 25acb15

Browse files
authored
Add process tags to dynamic instrumentation intake payload (#8779)
1 parent 0fad309 commit 25acb15

File tree

4 files changed

+69
-8
lines changed

4 files changed

+69
-8
lines changed

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/JsonSnapshotSerializer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.squareup.moshi.Json;
77
import com.squareup.moshi.JsonAdapter;
88
import datadog.trace.api.Config;
9+
import datadog.trace.api.ProcessTags;
910
import datadog.trace.bootstrap.debugger.CapturedContext;
1011
import datadog.trace.bootstrap.debugger.DebuggerContext;
1112

@@ -56,6 +57,9 @@ public static class IntakeRequest {
5657

5758
private final String ddtags;
5859

60+
@Json(name = "process_tags")
61+
private final String processTags;
62+
5963
@Json(name = "dd.trace_id")
6064
private String traceId;
6165

@@ -87,6 +91,8 @@ public IntakeRequest(String service, DebuggerIntakeRequestData debugger) {
8791
this.message = debugger.snapshot.getMessage();
8892
this.ddtags = debugger.snapshot.getProbe().getStrTags();
8993
this.timestamp = debugger.snapshot.getTimestamp();
94+
final CharSequence pt = ProcessTags.getTagsForSerialization();
95+
this.processTags = pt != null ? pt.toString() : null;
9096
}
9197

9298
public String getService() {
@@ -136,6 +142,10 @@ public long getLoggerThreadId() {
136142
public String getLoggerThreadName() {
137143
return loggerThreadName;
138144
}
145+
146+
public String getProcessTags() {
147+
return processTags;
148+
}
139149
}
140150

141151
public static class DebuggerIntakeRequestData {

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/DebuggerSinkTest.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.datadog.debugger.sink;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotNull;
5+
import static org.junit.jupiter.api.Assertions.assertNull;
46
import static org.junit.jupiter.api.Assertions.assertTrue;
57
import static org.mockito.ArgumentMatchers.anyString;
68
import static org.mockito.ArgumentMatchers.eq;
@@ -24,6 +26,7 @@
2426
import com.squareup.moshi.JsonAdapter;
2527
import com.squareup.moshi.Types;
2628
import datadog.trace.api.Config;
29+
import datadog.trace.api.ProcessTags;
2730
import datadog.trace.bootstrap.debugger.CapturedContext;
2831
import datadog.trace.bootstrap.debugger.CapturedContext.CapturedValue;
2932
import datadog.trace.bootstrap.debugger.CapturedStackFrame;
@@ -44,6 +47,8 @@
4447
import org.junit.jupiter.api.BeforeEach;
4548
import org.junit.jupiter.api.Test;
4649
import org.junit.jupiter.api.extension.ExtendWith;
50+
import org.junit.jupiter.params.ParameterizedTest;
51+
import org.junit.jupiter.params.provider.ValueSource;
4752
import org.mockito.ArgumentCaptor;
4853
import org.mockito.Captor;
4954
import org.mockito.Mock;
@@ -84,8 +89,11 @@ void setUp() {
8489
probeStatusSink = new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false);
8590
}
8691

87-
@Test
88-
public void addSnapshot() throws IOException {
92+
@ParameterizedTest(name = "Process tags enabled ''{0}''")
93+
@ValueSource(booleans = {true, false})
94+
public void addSnapshot(boolean processTagsEnabled) throws IOException {
95+
when(config.isExperimentalPropagateProcessTagsEnabled()).thenReturn(processTagsEnabled);
96+
ProcessTags.reset(config);
8997
DebuggerSink sink = createDefaultDebuggerSink();
9098
DebuggerAgentHelper.injectSerializer(new JsonSnapshotSerializer());
9199
Snapshot snapshot = createSnapshot();
@@ -107,6 +115,13 @@ public void addSnapshot() throws IOException {
107115
.getDebugger()
108116
.getRuntimeId()
109117
.matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
118+
if (processTagsEnabled) {
119+
assertNotNull(ProcessTags.getTagsForSerialization());
120+
assertEquals(
121+
ProcessTags.getTagsForSerialization().toString(), intakeRequest.getProcessTags());
122+
} else {
123+
assertNull(intakeRequest.getProcessTags());
124+
}
110125
}
111126

112127
@Test

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/sink/SnapshotSinkTest.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.datadog.debugger.sink;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotNull;
5+
import static org.junit.jupiter.api.Assertions.assertNull;
46
import static org.junit.jupiter.api.Assertions.assertTrue;
57
import static org.mockito.ArgumentMatchers.matches;
68
import static org.mockito.Mockito.verify;
@@ -14,6 +16,7 @@
1416
import com.squareup.moshi.JsonAdapter;
1517
import com.squareup.moshi.Types;
1618
import datadog.trace.api.Config;
19+
import datadog.trace.api.ProcessTags;
1720
import datadog.trace.bootstrap.debugger.DebuggerContext;
1821
import datadog.trace.bootstrap.debugger.Limits;
1922
import datadog.trace.bootstrap.debugger.ProbeId;
@@ -26,6 +29,8 @@
2629
import org.junit.jupiter.api.BeforeEach;
2730
import org.junit.jupiter.api.Test;
2831
import org.junit.jupiter.api.extension.ExtendWith;
32+
import org.junit.jupiter.params.ParameterizedTest;
33+
import org.junit.jupiter.params.provider.ValueSource;
2934
import org.mockito.ArgumentCaptor;
3035
import org.mockito.Captor;
3136
import org.mockito.Mock;
@@ -63,8 +68,11 @@ void setUp() {
6368
probeStatusSink = new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false);
6469
}
6570

66-
@Test
67-
public void addHighRateSnapshot() throws IOException {
71+
@ParameterizedTest(name = "Process tags enabled ''{0}''")
72+
@ValueSource(booleans = {true, false})
73+
public void addHighRateSnapshot(boolean processTagsEnabled) throws IOException {
74+
when(config.isExperimentalPropagateProcessTagsEnabled()).thenReturn(processTagsEnabled);
75+
ProcessTags.reset(config);
6876
SnapshotSink snapshotSink = createSnapshotSink();
6977
snapshotSink.start();
7078
Snapshot snapshot = createSnapshot();
@@ -86,6 +94,13 @@ public void addHighRateSnapshot() throws IOException {
8694
.getDebugger()
8795
.getRuntimeId()
8896
.matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
97+
if (processTagsEnabled) {
98+
assertNotNull(ProcessTags.getTagsForSerialization());
99+
assertEquals(
100+
ProcessTags.getTagsForSerialization().toString(), intakeRequest.getProcessTags());
101+
} else {
102+
assertNull(intakeRequest.getProcessTags());
103+
}
89104
}
90105

91106
@Test

dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/TracerDebuggerIntegrationTest.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import okhttp3.mockwebserver.RecordedRequest;
2828
import org.junit.jupiter.api.DisplayName;
2929
import org.junit.jupiter.api.Test;
30+
import org.junit.jupiter.params.ParameterizedTest;
31+
import org.junit.jupiter.params.provider.ValueSource;
3032

3133
public class TracerDebuggerIntegrationTest extends BaseIntegrationTest {
3234

@@ -44,9 +46,10 @@ protected String getAppId() {
4446
return TagsHelper.sanitize("SpringBootTestApplication");
4547
}
4648

47-
@Test
49+
@ParameterizedTest(name = "Process tags enabled ''{0}''")
50+
@ValueSource(booleans = {true, false})
4851
@DisplayName("testTracer")
49-
void testTracer() throws Exception {
52+
void testTracer(boolean processTagsEnabled) throws Exception {
5053
LogProbe logProbe =
5154
LogProbe.builder()
5255
.probeId(PROBE_ID)
@@ -56,13 +59,22 @@ void testTracer() throws Exception {
5659
"(HttpServletRequest, HttpServletResponse)")
5760
.captureSnapshot(true)
5861
.build();
59-
JsonSnapshotSerializer.IntakeRequest request = doTestTracer(logProbe);
62+
JsonSnapshotSerializer.IntakeRequest request = doTestTracer(logProbe, processTagsEnabled);
6063
Snapshot snapshot = request.getDebugger().getSnapshot();
6164
assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId());
6265
assertTrue(Pattern.matches("[0-9a-f]+", request.getTraceId()));
6366
assertTrue(Pattern.matches("\\d+", request.getSpanId()));
6467
assertFalse(
6568
logHasErrors(logFilePath, it -> it.contains("TypePool$Resolution$NoSuchTypeException")));
69+
if (processTagsEnabled) {
70+
assertNotNull(request.getProcessTags());
71+
assertTrue(
72+
request
73+
.getProcessTags()
74+
.contains("entrypoint.name:" + TagsHelper.sanitize(DEBUGGER_TEST_APP_CLASS)));
75+
} else {
76+
assertNull(request.getProcessTags());
77+
}
6678
}
6779

6880
@Test
@@ -146,9 +158,18 @@ void testTracerLineDynamicLogProbe() throws Exception {
146158
}
147159

148160
private JsonSnapshotSerializer.IntakeRequest doTestTracer(LogProbe logProbe) throws Exception {
161+
return doTestTracer(logProbe, false);
162+
}
163+
164+
private JsonSnapshotSerializer.IntakeRequest doTestTracer(
165+
LogProbe logProbe, boolean enableProcessTags) throws Exception {
149166
setCurrentConfiguration(createConfig(logProbe));
150167
String httpPort = String.valueOf(PortUtils.randomOpenPort());
151-
targetProcess = createProcessBuilder(logFilePath, "--server.port=" + httpPort).start();
168+
ProcessBuilder processBuilder = createProcessBuilder(logFilePath, "--server.port=" + httpPort);
169+
if (enableProcessTags) {
170+
processBuilder.environment().put("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "true");
171+
}
172+
targetProcess = processBuilder.start();
152173
// assert in logs app started
153174
waitForSpecificLogLine(
154175
logFilePath,

0 commit comments

Comments
 (0)