Skip to content

Commit e5347b6

Browse files
authored
Fix race condition Exception Replay smoke tests (#10011)
need to wait for having added the fingerprint into the Concurrent Map otherwise it will try to reinstrument the exception on the second call Generalize the usage of NonRetryable annotation because all debugger smoke tests rely on the fact that they are run only once (log file naming)
1 parent c8bb444 commit e5347b6

14 files changed

+54
-9
lines changed

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/AbstractExceptionDebugger.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public void handleException(Throwable t, AgentSpan span) {
114114
private void applyExceptionConfiguration(String fingerprint) {
115115
configurationUpdater.accept(EXCEPTION, exceptionProbeManager.getProbes());
116116
exceptionProbeManager.addFingerprint(fingerprint);
117+
LOGGER.debug("Exception Fingerprint {} added", fingerprint);
117118
}
118119

119120
protected void addStackFrameTags(

dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/ServerDebuggerTestApplication.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ protected void waitForReTransformation(String className) {
9898
}
9999
}
100100

101+
protected void waitForExceptionFingerprint() {
102+
System.out.println("waitForExceptionFingerprint");
103+
try {
104+
TestApplicationHelper.waitForExceptionFingerprint(LOG_FILENAME);
105+
System.out.println("fingerprint added!");
106+
} catch (IOException ex) {
107+
ex.printStackTrace();
108+
}
109+
}
110+
101111
protected void waitForSpecificLine(String line) {
102112
System.out.println("waitForSpecificLine...");
103113
try {
@@ -281,6 +291,11 @@ public MockResponse dispatch(RecordedRequest request) throws InterruptedExceptio
281291
app.waitForReTransformation(className);
282292
break;
283293
}
294+
case "/app/waitForExceptionFingerprint":
295+
{
296+
app.waitForExceptionFingerprint();
297+
break;
298+
}
284299
case "/app/waitForSpecificLine":
285300
{
286301
String feature = request.getRequestUrl().queryParameter("line");

dd-smoke-tests/debugger-integration-tests/src/main/java/datadog/smoketest/debugger/TestApplicationHelper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class TestApplicationHelper {
2323
"[dd-remote-config] DEBUG com.datadog.debugger.agent.ConfigurationUpdater - Re-transforming class: %s";
2424
private static final String RETRANSFORMATION_DONE =
2525
"com.datadog.debugger.agent.ConfigurationUpdater - Re-transformation done";
26+
private static final String EXCEPTION_FINGERPRINT_ADDED =
27+
"DEBUG com.datadog.debugger.exception.AbstractExceptionDebugger - Exception Fingerprint ";
2628
private static final long SLEEP_MS = 100;
2729
private static final long TIMEOUT_S = 10;
2830

@@ -90,6 +92,10 @@ public static String waitForReTransformation(
9092
Duration.ofSeconds(TIMEOUT_S));
9193
}
9294

95+
public static String waitForExceptionFingerprint(String logFileName) throws IOException {
96+
return waitForSpecificLine(logFileName, EXCEPTION_FINGERPRINT_ADDED, null);
97+
}
98+
9399
public static String waitForSpecificLine(String logFileName, String specificLine, String fromLine)
94100
throws IOException {
95101
return waitForSpecificLogLine(

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static org.junit.jupiter.api.Assertions.assertTrue;
66

77
import com.datadog.debugger.probe.LogProbe;
8+
import datadog.trace.test.util.NonRetryable;
89
import java.util.Collections;
910
import java.util.List;
1011
import java.util.concurrent.TimeUnit;
@@ -14,6 +15,7 @@
1415
import org.junit.jupiter.api.DisplayName;
1516
import org.junit.jupiter.api.Test;
1617

18+
@NonRetryable
1719
public class AgentDebuggerIntegrationTest extends SimpleAppDebuggerIntegrationTest {
1820
@Test
1921
@DisplayName("testLatestJdk")

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88

99
import datadog.trace.api.DDTags;
1010
import datadog.trace.test.agent.decoder.DecodedSpan;
11+
import datadog.trace.test.util.NonRetryable;
1112
import java.nio.file.Path;
1213
import java.util.List;
1314
import java.util.concurrent.atomic.AtomicBoolean;
1415
import org.junit.jupiter.api.DisplayName;
1516
import org.junit.jupiter.api.Test;
1617

18+
@NonRetryable
1719
public class CodeOriginIntegrationTest extends ServerAppDebuggerIntegrationTest {
1820

1921
@Override
@@ -45,7 +47,7 @@ void testCodeOriginTraceAnnotation() throws Exception {
4547
assertEquals("runTracedMethod", span.getMeta().get(DD_CODE_ORIGIN_FRAME_METHOD));
4648
assertEquals(
4749
"(java.lang.String)", span.getMeta().get(DD_CODE_ORIGIN_FRAME_SIGNATURE));
48-
assertEquals("146", span.getMeta().get(DD_CODE_ORIGIN_FRAME_LINE));
50+
assertEquals("156", span.getMeta().get(DD_CODE_ORIGIN_FRAME_LINE));
4951
codeOrigin.set(true);
5052
}
5153
}

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import datadog.trace.bootstrap.debugger.CapturedContext;
1111
import datadog.trace.test.agent.decoder.DecodedSpan;
1212
import datadog.trace.test.agent.decoder.DecodedTrace;
13-
import datadog.trace.test.util.Flaky;
1413
import datadog.trace.test.util.NonRetryable;
1514
import java.nio.file.Path;
1615
import java.util.ArrayList;
@@ -23,7 +22,6 @@
2322
import org.junit.jupiter.api.condition.DisabledIf;
2423

2524
@NonRetryable
26-
@Flaky
2725
public class ExceptionDebuggerIntegrationTest extends ServerAppDebuggerIntegrationTest {
2826

2927
private List<String> snapshotIdTags = new ArrayList<>();
@@ -59,7 +57,7 @@ protected ProcessBuilder createProcessBuilder(Path logFilePath, String... params
5957
void testSimpleSingleFrameException() throws Exception {
6058
appUrl = startAppAndAndGetUrl();
6159
execute(appUrl, TRACED_METHOD_NAME, "oops"); // instrumenting first exception
62-
waitForInstrumentation(appUrl, SERVER_DEBUGGER_TEST_APP_CLASS, false);
60+
waitForExceptionFingerprint();
6361
execute(appUrl, TRACED_METHOD_NAME, "oops"); // collecting snapshots and sending them
6462
registerTraceListener(this::receiveExceptionReplayTrace);
6563
registerSnapshotListener(this::receiveSnapshot);
@@ -127,7 +125,7 @@ void testNoSubsequentCaptureAfterFirst() throws Exception {
127125
void test3CapturedFrames() throws Exception {
128126
appUrl = startAppAndAndGetUrl();
129127
execute(appUrl, TRACED_METHOD_NAME, "deepOops"); // instrumenting first exception
130-
waitForInstrumentation(appUrl, SERVER_DEBUGGER_TEST_APP_CLASS, false);
128+
waitForExceptionFingerprint();
131129
execute(appUrl, TRACED_METHOD_NAME, "deepOops"); // collecting snapshots and sending them
132130
registerTraceListener(this::receiveExceptionReplayTrace);
133131
registerSnapshotListener(this::receiveSnapshot);
@@ -185,7 +183,7 @@ void test5CapturedFrames() throws Exception {
185183
additionalJvmArgs.add("-Ddd.exception.replay.capture.max.frames=5");
186184
appUrl = startAppAndAndGetUrl();
187185
execute(appUrl, TRACED_METHOD_NAME, "deepOops"); // instrumenting first exception
188-
waitForInstrumentation(appUrl, SERVER_DEBUGGER_TEST_APP_CLASS, false);
186+
waitForExceptionFingerprint();
189187
execute(appUrl, TRACED_METHOD_NAME, "deepOops"); // collecting snapshots and sending them
190188
registerTraceListener(this::receiveExceptionReplayTrace);
191189
registerSnapshotListener(this::receiveSnapshot);
@@ -262,7 +260,7 @@ void test5CapturedFrames() throws Exception {
262260
void test3CapturedRecursiveFrames() throws Exception {
263261
appUrl = startAppAndAndGetUrl();
264262
execute(appUrl, TRACED_METHOD_NAME, "recursiveOops"); // instrumenting first exception
265-
waitForInstrumentation(appUrl, SERVER_DEBUGGER_TEST_APP_CLASS, false);
263+
waitForExceptionFingerprint();
266264
execute(appUrl, TRACED_METHOD_NAME, "recursiveOops"); // collecting snapshots and sending them
267265
registerTraceListener(this::receiveExceptionReplayTrace);
268266
registerSnapshotListener(this::receiveSnapshot);
@@ -310,7 +308,7 @@ void testLambdaHiddenFrames() throws Exception {
310308
additionalJvmArgs.add("-XX:+ShowHiddenFrames");
311309
appUrl = startAppAndAndGetUrl();
312310
execute(appUrl, TRACED_METHOD_NAME, "lambdaOops"); // instrumenting first exception
313-
waitForInstrumentation(appUrl, SERVER_DEBUGGER_TEST_APP_CLASS, false);
311+
waitForExceptionFingerprint();
314312
execute(appUrl, TRACED_METHOD_NAME, "lambdaOops"); // collecting snapshots and sending them
315313
registerTraceListener(this::receiveExceptionReplayTrace);
316314
registerSnapshotListener(this::receiveSnapshot);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package datadog.smoketest;
22

33
import com.datadog.debugger.probe.LogProbe;
4+
import datadog.trace.test.util.NonRetryable;
45
import java.io.IOException;
56
import java.nio.file.Path;
67
import java.util.ArrayList;
78
import java.util.List;
89
import org.junit.jupiter.api.DisplayName;
910
import org.junit.jupiter.api.Test;
1011

12+
@NonRetryable
1113
public class InProductEnablementIntegrationTest extends ServerAppDebuggerIntegrationTest {
1214
private List<String> additionalJvmArgs = new ArrayList<>();
1315

@@ -46,7 +48,7 @@ void testDynamicInstrumentationEnablementWithLineProbe() throws Exception {
4648
LogProbe probe =
4749
LogProbe.builder()
4850
.probeId(LINE_PROBE_ID1)
49-
.where("ServerDebuggerTestApplication.java", 312)
51+
.where("ServerDebuggerTestApplication.java", 327)
5052
.build();
5153
setCurrentConfiguration(createConfig(probe));
5254
waitForFeatureStarted(appUrl, "Dynamic Instrumentation");

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import datadog.trace.bootstrap.debugger.CapturedContext;
2525
import datadog.trace.bootstrap.debugger.MethodLocation;
2626
import datadog.trace.bootstrap.debugger.ProbeId;
27+
import datadog.trace.test.util.NonRetryable;
2728
import java.util.ArrayList;
2829
import java.util.Arrays;
2930
import java.util.HashMap;
@@ -37,6 +38,7 @@
3738
import org.junit.jupiter.api.Test;
3839
import org.junit.jupiter.api.condition.DisabledIf;
3940

41+
@NonRetryable
4042
public class LogProbesIntegrationTest extends SimpleAppDebuggerIntegrationTest {
4143
@Test
4244
@DisplayName("testInaccessibleObject")

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
import com.datadog.debugger.el.DSL;
88
import com.datadog.debugger.el.ValueScript;
99
import com.datadog.debugger.probe.MetricProbe;
10+
import datadog.trace.test.util.NonRetryable;
1011
import java.io.IOException;
1112
import java.util.concurrent.atomic.AtomicBoolean;
1213
import org.junit.jupiter.api.AfterEach;
1314
import org.junit.jupiter.api.DisplayName;
1415
import org.junit.jupiter.api.Test;
1516

17+
@NonRetryable
1618
public class MetricProbesIntegrationTest extends SimpleAppDebuggerIntegrationTest {
1719

1820
@AfterEach

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.datadog.debugger.agent.ProbeStatus;
88
import com.datadog.debugger.probe.LogProbe;
99
import com.datadog.debugger.sink.Snapshot;
10+
import datadog.trace.test.util.NonRetryable;
1011
import java.util.Collections;
1112
import java.util.concurrent.atomic.AtomicBoolean;
1213
import org.junit.jupiter.api.BeforeEach;
@@ -16,6 +17,7 @@
1617
import org.junit.jupiter.api.TestInfo;
1718
import org.junit.jupiter.api.condition.DisabledIf;
1819

20+
@NonRetryable
1921
public class ProbeStateIntegrationTest extends ServerAppDebuggerIntegrationTest {
2022

2123
@BeforeEach

0 commit comments

Comments
 (0)