Skip to content

Add process tags to dynamic instrumentation intake payload #8779

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.squareup.moshi.Json;
import com.squareup.moshi.JsonAdapter;
import datadog.trace.api.Config;
import datadog.trace.api.ProcessTags;
import datadog.trace.bootstrap.debugger.CapturedContext;
import datadog.trace.bootstrap.debugger.DebuggerContext;

Expand Down Expand Up @@ -56,6 +57,9 @@ public static class IntakeRequest {

private final String ddtags;

@Json(name = "process_tags")
private final String processTags;

@Json(name = "dd.trace_id")
private String traceId;

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

public String getService() {
Expand Down Expand Up @@ -136,6 +142,10 @@ public long getLoggerThreadId() {
public String getLoggerThreadName() {
return loggerThreadName;
}

public String getProcessTags() {
return processTags;
}
}

public static class DebuggerIntakeRequestData {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.datadog.debugger.sink;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
Expand All @@ -24,6 +26,7 @@
import com.squareup.moshi.JsonAdapter;
import com.squareup.moshi.Types;
import datadog.trace.api.Config;
import datadog.trace.api.ProcessTags;
import datadog.trace.bootstrap.debugger.CapturedContext;
import datadog.trace.bootstrap.debugger.CapturedContext.CapturedValue;
import datadog.trace.bootstrap.debugger.CapturedStackFrame;
Expand All @@ -44,6 +47,8 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
Expand Down Expand Up @@ -84,8 +89,11 @@ void setUp() {
probeStatusSink = new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false);
}

@Test
public void addSnapshot() throws IOException {
@ParameterizedTest(name = "Process tags enabled ''{0}''")
@ValueSource(booleans = {true, false})
public void addSnapshot(boolean processTagsEnabled) throws IOException {
when(config.isExperimentalPropagateProcessTagsEnabled()).thenReturn(processTagsEnabled);
ProcessTags.reset(config);
DebuggerSink sink = createDefaultDebuggerSink();
DebuggerAgentHelper.injectSerializer(new JsonSnapshotSerializer());
Snapshot snapshot = createSnapshot();
Expand All @@ -107,6 +115,13 @@ public void addSnapshot() throws IOException {
.getDebugger()
.getRuntimeId()
.matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
if (processTagsEnabled) {
assertNotNull(ProcessTags.getTagsForSerialization());
assertEquals(
ProcessTags.getTagsForSerialization().toString(), intakeRequest.getProcessTags());
} else {
assertNull(intakeRequest.getProcessTags());
}
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.datadog.debugger.sink;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.matches;
import static org.mockito.Mockito.verify;
Expand All @@ -14,6 +16,7 @@
import com.squareup.moshi.JsonAdapter;
import com.squareup.moshi.Types;
import datadog.trace.api.Config;
import datadog.trace.api.ProcessTags;
import datadog.trace.bootstrap.debugger.DebuggerContext;
import datadog.trace.bootstrap.debugger.Limits;
import datadog.trace.bootstrap.debugger.ProbeId;
Expand All @@ -26,6 +29,8 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
Expand Down Expand Up @@ -63,8 +68,11 @@ void setUp() {
probeStatusSink = new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false);
}

@Test
public void addHighRateSnapshot() throws IOException {
@ParameterizedTest(name = "Process tags enabled ''{0}''")
@ValueSource(booleans = {true, false})
public void addHighRateSnapshot(boolean processTagsEnabled) throws IOException {
when(config.isExperimentalPropagateProcessTagsEnabled()).thenReturn(processTagsEnabled);
ProcessTags.reset(config);
SnapshotSink snapshotSink = createSnapshotSink();
snapshotSink.start();
Snapshot snapshot = createSnapshot();
Expand All @@ -86,6 +94,13 @@ public void addHighRateSnapshot() throws IOException {
.getDebugger()
.getRuntimeId()
.matches("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
if (processTagsEnabled) {
assertNotNull(ProcessTags.getTagsForSerialization());
assertEquals(
ProcessTags.getTagsForSerialization().toString(), intakeRequest.getProcessTags());
} else {
assertNull(intakeRequest.getProcessTags());
}
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import okhttp3.mockwebserver.RecordedRequest;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class TracerDebuggerIntegrationTest extends BaseIntegrationTest {

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

@Test
@ParameterizedTest(name = "Process tags enabled ''{0}''")
@ValueSource(booleans = {true, false})
@DisplayName("testTracer")
void testTracer() throws Exception {
void testTracer(boolean processTagsEnabled) throws Exception {
LogProbe logProbe =
LogProbe.builder()
.probeId(PROBE_ID)
Expand All @@ -56,13 +59,22 @@ void testTracer() throws Exception {
"(HttpServletRequest, HttpServletResponse)")
.captureSnapshot(true)
.build();
JsonSnapshotSerializer.IntakeRequest request = doTestTracer(logProbe);
JsonSnapshotSerializer.IntakeRequest request = doTestTracer(logProbe, processTagsEnabled);
Snapshot snapshot = request.getDebugger().getSnapshot();
assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId());
assertTrue(Pattern.matches("[0-9a-f]+", request.getTraceId()));
assertTrue(Pattern.matches("\\d+", request.getSpanId()));
assertFalse(
logHasErrors(logFilePath, it -> it.contains("TypePool$Resolution$NoSuchTypeException")));
if (processTagsEnabled) {
assertNotNull(request.getProcessTags());
assertTrue(
request
.getProcessTags()
.contains("entrypoint.name:" + TagsHelper.sanitize(DEBUGGER_TEST_APP_CLASS)));
} else {
assertNull(request.getProcessTags());
}
}

@Test
Expand Down Expand Up @@ -146,9 +158,18 @@ void testTracerLineDynamicLogProbe() throws Exception {
}

private JsonSnapshotSerializer.IntakeRequest doTestTracer(LogProbe logProbe) throws Exception {
return doTestTracer(logProbe, false);
}

private JsonSnapshotSerializer.IntakeRequest doTestTracer(
LogProbe logProbe, boolean enableProcessTags) throws Exception {
setCurrentConfiguration(createConfig(logProbe));
String httpPort = String.valueOf(PortUtils.randomOpenPort());
targetProcess = createProcessBuilder(logFilePath, "--server.port=" + httpPort).start();
ProcessBuilder processBuilder = createProcessBuilder(logFilePath, "--server.port=" + httpPort);
if (enableProcessTags) {
processBuilder.environment().put("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "true");
}
targetProcess = processBuilder.start();
// assert in logs app started
waitForSpecificLogLine(
logFilePath,
Expand Down
Loading