From 8dfe6f4c2127313fc8f63b811d1696ff5bc4ea85 Mon Sep 17 00:00:00 2001 From: jean-philippe bempel Date: Thu, 23 Jul 2026 10:58:32 +0200 Subject: [PATCH] Fix initialization of samplers for probe file When loading probes from file, initSamplers method is not called for deserialized probes. we centralize probe deserialization in ProbeDefinitionDeserializer class and add smoke test for this. --- .../agent/ConfigurationFileLoader.java | 65 +++---------- .../probe/ProbeDefinitionDeserializer.java | 29 ++++++ .../agent/ConfigurationFileLoaderTest.java | 12 ++- .../src/test/resources/test_probe_file.json | 14 +++ .../smoketest/BaseIntegrationTest.java | 23 +++-- .../smoketest/LogProbesIntegrationTest.java | 14 +-- .../MetricProbesIntegrationTest.java | 4 +- .../smoketest/ProbeFileIntegrationTest.java | 83 +++++++++++++++++ .../smoketest/SpanProbesIntegrationTest.java | 4 +- .../src/test/resources/test_probe_file.json | 92 +++++++++++++++++++ 10 files changed, 261 insertions(+), 79 deletions(-) create mode 100644 dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeFileIntegrationTest.java create mode 100644 dd-smoke-tests/debugger-integration-tests/src/test/resources/test_probe_file.json diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java index c33243e21c5..9cc7f5f5421 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java @@ -1,30 +1,24 @@ package com.datadog.debugger.agent; -import com.datadog.debugger.probe.LogProbe; -import com.datadog.debugger.probe.MetricProbe; +import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeLogProbe; +import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeMetricProbe; +import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeSpanDecorationProbe; +import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeSpanProbe; +import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeTriggerProbe; + import com.datadog.debugger.probe.ProbeDefinition; -import com.datadog.debugger.probe.SpanDecorationProbe; -import com.datadog.debugger.probe.SpanProbe; -import com.datadog.debugger.probe.TriggerProbe; -import com.datadog.debugger.util.MoshiHelper; import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.JsonReader; import com.squareup.moshi.JsonWriter; -import com.squareup.moshi.Moshi; -import com.squareup.moshi.Types; import datadog.trace.util.SizeCheckedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.lang.annotation.Annotation; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.Set; import okio.Okio; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,9 +40,7 @@ public static Configuration from(Path probeFilePath, long maxPayloadSize) { } } while (bytesRead > -1); byte[] configContent = outputStream.toByteArray(); - Moshi moshi = MoshiHelper.createMoshiConfigBuilder().add(new ProbeFileFactory()).build(); - ParameterizedType type = Types.newParameterizedType(List.class, ProbeDefinition.class); - JsonAdapter> adapter = moshi.adapter(type); + JsonAdapter> adapter = new ProbeFileAdapter(); List probeDefinitions = adapter.fromJson( JsonReader.of(Okio.buffer(Okio.source(new ByteArrayInputStream(configContent))))); @@ -59,40 +51,7 @@ public static Configuration from(Path probeFilePath, long maxPayloadSize) { } } - private static class ProbeFileFactory implements JsonAdapter.Factory { - @Override - public JsonAdapter create(Type type, Set annotations, Moshi moshi) { - if (Types.equals(type, Types.newParameterizedType(List.class, ProbeDefinition.class))) { - return new ProbeFileAdapter( - moshi.adapter(LogProbe.class), - moshi.adapter(MetricProbe.class), - moshi.adapter(SpanProbe.class), - moshi.adapter(SpanDecorationProbe.class), - moshi.adapter(TriggerProbe.class)); - } - return null; - } - } - private static class ProbeFileAdapter extends JsonAdapter> { - private final JsonAdapter logProbeAdapter; - private final JsonAdapter metricProbeAdapter; - private final JsonAdapter spanProbeAdapter; - private final JsonAdapter spanDecorationProbeAdapter; - private final JsonAdapter triggerProbeAdapter; - - public ProbeFileAdapter( - JsonAdapter logProbeAdapter, - JsonAdapter metricProbeAdapter, - JsonAdapter spanProbeAdapter, - JsonAdapter spanDecorationProbeAdapter, - JsonAdapter triggerProbeAdapter) { - this.logProbeAdapter = logProbeAdapter; - this.metricProbeAdapter = metricProbeAdapter; - this.spanProbeAdapter = spanProbeAdapter; - this.spanDecorationProbeAdapter = spanDecorationProbeAdapter; - this.triggerProbeAdapter = triggerProbeAdapter; - } @Override public List fromJson(JsonReader reader) throws IOException { @@ -110,19 +69,19 @@ public List fromJson(JsonReader reader) throws IOException { String type = jsonPeekReader.nextString(); switch (type) { case "LOG_PROBE": - probeDefinitions.add(logProbeAdapter.fromJson(reader)); + probeDefinitions.add(deserializeLogProbe(reader)); break; case "METRIC_PROBE": - probeDefinitions.add(metricProbeAdapter.fromJson(reader)); + probeDefinitions.add(deserializeMetricProbe(reader)); break; case "SPAN_PROBE": - probeDefinitions.add(spanProbeAdapter.fromJson(reader)); + probeDefinitions.add(deserializeSpanProbe(reader)); break; case "SPAN_DECORATION_PROBE": - probeDefinitions.add(spanDecorationProbeAdapter.fromJson(reader)); + probeDefinitions.add(deserializeSpanDecorationProbe(reader)); break; case "TRIGGER_PROBE": - probeDefinitions.add(triggerProbeAdapter.fromJson(reader)); + probeDefinitions.add(deserializeTriggerProbe(reader)); break; default: throw new RuntimeException("Unknown type: " + type); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinitionDeserializer.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinitionDeserializer.java index 9501b1ad07b..891200f0c3d 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinitionDeserializer.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinitionDeserializer.java @@ -3,6 +3,7 @@ import com.datadog.debugger.agent.Configuration; import com.datadog.debugger.util.MoshiHelper; import com.squareup.moshi.JsonAdapter; +import com.squareup.moshi.JsonReader; import java.io.ByteArrayInputStream; import java.io.IOException; import okio.Okio; @@ -29,22 +30,42 @@ public static MetricProbe deserializeMetricProbe(byte[] content) throws IOExcept return deserialize(METRIC_PROBE_JSON_ADAPTER, content); } + public static MetricProbe deserializeMetricProbe(JsonReader reader) throws IOException { + return METRIC_PROBE_JSON_ADAPTER.fromJson(reader); + } + public static LogProbe deserializeLogProbe(byte[] content) throws IOException { LogProbe logProbe = deserialize(LOG_PROBE_JSON_ADAPTER, content); logProbe.initSamplers(); return logProbe; } + public static LogProbe deserializeLogProbe(JsonReader reader) throws IOException { + LogProbe logProbe = LOG_PROBE_JSON_ADAPTER.fromJson(reader); + logProbe.initSamplers(); + return logProbe; + } + public static SpanProbe deserializeSpanProbe(byte[] content) throws IOException { return deserialize(SPAN_PROBE_JSON_ADAPTER, content); } + public static SpanProbe deserializeSpanProbe(JsonReader reader) throws IOException { + return SPAN_PROBE_JSON_ADAPTER.fromJson(reader); + } + public static TriggerProbe deserializeTriggerProbe(byte[] content) throws IOException { TriggerProbe triggerProbe = deserialize(TRIGGER_PROBE_JSON_ADAPTER, content); triggerProbe.initSamplers(); return triggerProbe; } + public static TriggerProbe deserializeTriggerProbe(JsonReader jsonReader) throws IOException { + TriggerProbe triggerProbe = TRIGGER_PROBE_JSON_ADAPTER.fromJson(jsonReader); + triggerProbe.initSamplers(); + return triggerProbe; + } + public static SpanDecorationProbe deserializeSpanDecorationProbe(byte[] content) throws IOException { SpanDecorationProbe spanDecorationProbe = @@ -53,6 +74,14 @@ public static SpanDecorationProbe deserializeSpanDecorationProbe(byte[] content) return spanDecorationProbe; } + public static SpanDecorationProbe deserializeSpanDecorationProbe(JsonReader jsonReader) + throws IOException { + SpanDecorationProbe spanDecorationProbe = + SPAN_DECORATION_PROBE_JSON_ADAPTER.fromJson(jsonReader); + spanDecorationProbe.initSamplers(); + return spanDecorationProbe; + } + private static T deserialize(JsonAdapter adapter, byte[] content) throws IOException { return adapter.fromJson(Okio.buffer(Okio.source(new ByteArrayInputStream(content)))); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java index 3dd1f04cc94..c96382cab9a 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java @@ -7,6 +7,7 @@ import com.datadog.debugger.probe.ProbeDefinition; import com.datadog.debugger.probe.SpanDecorationProbe; import com.datadog.debugger.probe.SpanProbe; +import com.datadog.debugger.probe.TriggerProbe; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; @@ -21,11 +22,12 @@ public void load() throws Exception { Configuration configuration = ConfigurationFileLoader.from(probeFilePath, 1024 * 1024); assertNotNull(configuration); List definitions = configuration.getDefinitions(); - assertEquals(5, definitions.size()); - assertInstanceOf(MetricProbe.class, definitions.get(0)); - assertInstanceOf(LogProbe.class, definitions.get(1)); + assertEquals(6, definitions.size()); + assertInstanceOf(TriggerProbe.class, definitions.get(0)); + assertInstanceOf(MetricProbe.class, definitions.get(1)); assertInstanceOf(LogProbe.class, definitions.get(2)); - assertInstanceOf(SpanProbe.class, definitions.get(3)); - assertInstanceOf(SpanDecorationProbe.class, definitions.get(4)); + assertInstanceOf(LogProbe.class, definitions.get(3)); + assertInstanceOf(SpanProbe.class, definitions.get(4)); + assertInstanceOf(SpanDecorationProbe.class, definitions.get(5)); } } diff --git a/dd-java-agent/agent-debugger/src/test/resources/test_probe_file.json b/dd-java-agent/agent-debugger/src/test/resources/test_probe_file.json index 9acd77856c9..a7b430f9939 100644 --- a/dd-java-agent/agent-debugger/src/test/resources/test_probe_file.json +++ b/dd-java-agent/agent-debugger/src/test/resources/test_probe_file.json @@ -87,5 +87,19 @@ }, "tags": [], "evaluateAt": "EXIT" + }, + { + "id": "70b55d06-f9fa-403b-a329-4f2f960aed02", + "version": 0, + "type": "TRIGGER_PROBE", + "language": "java", + "where": { + "typeName": "MetadataClientUtils", + "methodName": "listTableWithContinuation" + }, + "tags": [], + "evaluateAt": "EXIT", + "sessionId": "session", + "sampling": { "snapshotsPerSecond": 100 } } ] diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/BaseIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/BaseIntegrationTest.java index f44bfd5facc..34560553807 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/BaseIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/BaseIntegrationTest.java @@ -21,6 +21,7 @@ import com.squareup.moshi.Moshi; import com.squareup.moshi.Types; import datadog.trace.bootstrap.debugger.CapturedContext; +import datadog.trace.bootstrap.debugger.ProbeId; import datadog.trace.bootstrap.debugger.ProbeRateLimiter; import datadog.trace.test.agent.decoder.DecodedMessage; import datadog.trace.test.agent.decoder.DecodedTrace; @@ -332,23 +333,25 @@ protected void registerProbeStatusListener(Consumer listener) { probeStatusListeners.add(listener); } - protected AtomicBoolean registerCheckReceivedInstalledEmitting() { + protected AtomicBoolean registerCheckReceivedInstalledEmitting(ProbeId probeId) { AtomicBoolean received = new AtomicBoolean(); AtomicBoolean installed = new AtomicBoolean(); AtomicBoolean emitting = new AtomicBoolean(); AtomicBoolean result = new AtomicBoolean(); registerProbeStatusListener( probeStatus -> { - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { - received.set(true); - } - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.INSTALLED) { - installed.set(true); - } - if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.EMITTING) { - emitting.set(true); + if (probeStatus.getDiagnostics().getProbeId().equals(probeId)) { + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.RECEIVED) { + received.set(true); + } + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.INSTALLED) { + installed.set(true); + } + if (probeStatus.getDiagnostics().getStatus() == ProbeStatus.Status.EMITTING) { + emitting.set(true); + } + result.set(received.get() && installed.get() && emitting.get()); } - result.set(received.get() && installed.get() && emitting.get()); }); return result; } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/LogProbesIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/LogProbesIntegrationTest.java index 338aa762a6c..4ff2d8bbfb3 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/LogProbesIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/LogProbesIntegrationTest.java @@ -100,7 +100,7 @@ void testFullMethod() throws Exception { assertNull(snapshot.getCaptures().getReturn().getCapturedThrowable()); snapshotReceived.set(true); }); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), () -> @@ -132,7 +132,7 @@ void testFullMethodWithCondition() throws Exception { assertFullMethodCaptureArgs(snapshot.getCaptures().getEntry()); snapshotReceived.set(true); }); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), () -> @@ -166,7 +166,7 @@ void testFullMethodWithConditionAtExit() throws Exception { assertFullMethodCaptureArgs(snapshot.getCaptures().getReturn()); snapshotReceived.set(true); }); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), () -> @@ -199,7 +199,7 @@ void testFullMethodWithConditionFailed() throws Exception { "Cannot find symbol: noarg", snapshot.getEvaluationErrors().get(0).getMessage()); snapshotReceived.set(true); }); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), () -> @@ -236,7 +236,7 @@ void testFullMethodWithLogTemplate() throws Exception { assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); snapshotReceived.set(true); }); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && correctLogMessage.get() && statusResult.get(), () -> @@ -288,7 +288,7 @@ void testFullMethodWithCaptureExpressions() throws Exception { assertNull(key2Value.getNotCapturedReason()); snapshotReceived.set(true); }); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( () -> snapshotReceived.get() && statusResult.get(), () -> @@ -371,7 +371,7 @@ void testLineProbe() throws Exception { assertNull(capturedContext.getCapturedThrowable()); snapshotReceived.set(true); }); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(LINE_PROBE_ID1); processRequests( () -> snapshotReceived.get() && statusResult.get(), () -> diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/MetricProbesIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/MetricProbesIntegrationTest.java index 5c700b07acf..dfd5150fcd4 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/MetricProbesIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/MetricProbesIntegrationTest.java @@ -112,7 +112,7 @@ private void doMethodMetric( targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); String msgExpected = String.format(expectedMsgFormat, metricName, PROBE_ID.getId()); assertNotNull(retrieveStatsdMessage(msgExpected)); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( statusResult::get, () -> String.format("timeout statusResult=%s", statusResult.get())); } @@ -219,7 +219,7 @@ private void doLineMetric( targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); String msgExpected = String.format(expectedMsgFormat, metricName, PROBE_ID.getId()); assertNotNull(retrieveStatsdMessage(msgExpected)); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); processRequests( statusResult::get, () -> String.format("timeout statusResult=%s", statusResult.get())); } diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeFileIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeFileIntegrationTest.java new file mode 100644 index 00000000000..3fb17608915 --- /dev/null +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/ProbeFileIntegrationTest.java @@ -0,0 +1,83 @@ +package datadog.smoketest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import datadog.trace.bootstrap.debugger.ProbeId; +import datadog.trace.test.agent.decoder.DecodedSpan; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.condition.DisabledIf; + +public class ProbeFileIntegrationTest extends ServerAppDebuggerIntegrationTest { + private static final ProbeId PROBE_ID2 = new ProbeId("ad4cba6f-d476-4554-b5ed-80dd941a40d8", 0); + private static final ProbeId PROBE_ID3 = new ProbeId("70b55d06-f9fa-403b-a329-4f2f960aed01", 0); + private static final ProbeId PROBE_ID4 = new ProbeId("123356537", 0); + + Path probeFilePath; + + @BeforeEach + @Override + public void setup(TestInfo testInfo) throws Exception { + super.setup(testInfo); + probeFilePath = + Paths.get(ProbeFileIntegrationTest.class.getResource("/test_probe_file.json").toURI()); + appUrl = startAppAndAndGetUrl(); + } + + @Override + protected ProcessBuilder createProcessBuilder(Path logFilePath, String... params) { + List commandParams = getDebuggerCommandParams(); + commandParams.add("-Ddd.trace.enabled=true"); // explicitly enable tracer + commandParams.add("-Ddd.dynamic.instrumentation.probe.file=" + probeFilePath.toString()); + // increase eval timeout for decoration evaluations + commandParams.add("-Ddd.dynamic.instrumentation.evaluation.timeout.ms=100"); + return ProcessBuilderHelper.createProcessBuilder( + commandParams, logFilePath, getAppClass(), params); + } + + @Test + @DisplayName("testProbeFile") + @DisabledIf( + value = "datadog.environment.JavaVirtualMachine#isJ9", + disabledReason = "Flaky on J9 JVMs") + void testProbeFile() throws Exception { + waitForInstrumentation(appUrl); + execute(appUrl, TRACED_METHOD_NAME); + AtomicBoolean snapshotReceived = new AtomicBoolean(); + AtomicBoolean traceReceived = new AtomicBoolean(); + registerSnapshotListener( + snapshot -> { + assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertEquals(5, snapshot.getCaptures().getReturn().getArguments().size()); + snapshotReceived.set(true); + }); + registerTraceListener( + decodedTrace -> { + for (DecodedSpan span : decodedTrace.getSpans()) { + if (isDynamicSpan(span)) { + assertEquals("foobar", span.getMeta().get("client")); + assertEquals(PROBE_ID2.getId(), span.getMeta().get("_dd.di.client.probe_id")); + traceReceived.set(true); + } + } + }); + processRequests( + () -> snapshotReceived.get() && traceReceived.get(), + () -> + String.format( + "Timeout! traceReceived=%s snapshotReceived=%s", traceReceived, snapshotReceived)); + assertFalse(logHasErrors(logFilePath, it -> it.contains(" Error "))); + } + + protected boolean isDynamicSpan(DecodedSpan span) { + return span.getName().equals("dd.dynamic.span") + && span.getResource().equals("ServerDebuggerTestApplication.tracedMethod"); + } +} diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanProbesIntegrationTest.java b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanProbesIntegrationTest.java index 6cf6f17f883..63dc4a9dc98 100644 --- a/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanProbesIntegrationTest.java +++ b/dd-smoke-tests/debugger-integration-tests/src/test/java/datadog/smoketest/SpanProbesIntegrationTest.java @@ -34,7 +34,7 @@ void testMethodSpan() throws Exception { setCurrentConfiguration(createSpanConfig(spanProbe)); targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); AtomicBoolean traceReceived = new AtomicBoolean(); registerTraceListener( decodedTrace -> { @@ -64,7 +64,7 @@ void testLineRangeSpan() throws Exception { .build(); setCurrentConfiguration(createSpanConfig(spanProbe)); targetProcess = createProcessBuilder(logFilePath, METHOD_NAME, EXPECTED_UPLOADS).start(); - AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(); + AtomicBoolean statusResult = registerCheckReceivedInstalledEmitting(PROBE_ID); AtomicBoolean traceReceived = new AtomicBoolean(); registerTraceListener( decodedTrace -> { diff --git a/dd-smoke-tests/debugger-integration-tests/src/test/resources/test_probe_file.json b/dd-smoke-tests/debugger-integration-tests/src/test/resources/test_probe_file.json new file mode 100644 index 00000000000..5459e57cfd8 --- /dev/null +++ b/dd-smoke-tests/debugger-integration-tests/src/test/resources/test_probe_file.json @@ -0,0 +1,92 @@ +[ + { + "id": "123356536", + "version": 0, + "language": "java", + "type": "LOG_PROBE", + "where": { + "typeName": "ServerDebuggerTestApplication", + "methodName": "tracedMethod", + "signature": "" + }, + "captureSnapshot": true + }, + { + "id": "100c9a5c-45ad-49dc-818b-c570d31e11d1", + "version": 0, + "type": "LOG_PROBE", + "where": { + "sourceFile": "index.js", + "lines": ["25"] + }, + "template": "Hello World", + "segments": [{ + "str": "Hello World" + }], + "captureSnapshot": true, + "capture": { "maxReferenceDepth": 3 }, + "sampling": { "snapshotsPerSecond": 100 } + }, + { + "id": "123356537", + "language": "java", + "type": "METRIC_PROBE", + "where": { + "typeName": "ServerDebuggerTestApplication", + "methodName": "tracedMethod" + }, + "tags": ["version:v123", "env:staging"], + "kind": "COUNT", + "metricName": "datadog.debugger.fullMethod.calls", + "value": { + "dsl": "42", + "json": 42 + } + }, + { + "id": "ad4cba6f-d476-4554-b5ed-80dd941a40d8", + "version": 0, + "type": "SPAN_DECORATION_PROBE", + "language": "java", + "where": { + "typeName": "ServerDebuggerTestApplication", + "methodName": "tracedMethod", + "signature": "" + }, + "tags": [], + "evaluateAt": "EXIT", + "targetSpan": "ACTIVE", + "decorations": [ + { + "tags": [ + { + "name": "client", + "value": { + "segments": [ + { + "dsl": "argStr", + "json": { + "ref": "argStr" + } + } + ], + "template": "{argStr}" + } + } + ] + } + ] + }, + { + "id": "70b55d06-f9fa-403b-a329-4f2f960aed01", + "version": 0, + "type": "SPAN_PROBE", + "language": "java", + "where": { + "typeName": "ServerDebuggerTestApplication", + "methodName": "tracedMethod" + }, + "tags": [], + "evaluateAt": "EXIT" + } +]