Skip to content

Commit b20c1e3

Browse files
authored
Prevent Vert.x 4 session reaper from retaining request contexts (#12667)
fix: prevent Vert.x 4 session reaper from retaining requests chore: allow Vert.x timer guard in agent jar budget fix: limit Vert.x 4 session timer guard to 4.x fix: keep Vert.x timer guard active without tracing chore: restore agent jar size budget refactor: share Vert.x session timer guard across 4 and 5 fix: scope Vert.x session timer guard to Vert.x Co-authored-by: brice.dutheil <brice.dutheil@datadoghq.com>
1 parent 54ac1bc commit b20c1e3

2 files changed

Lines changed: 64 additions & 3 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package server;
2+
3+
import static datadog.trace.agent.test.assertions.SpanMatcher.span;
4+
import static datadog.trace.agent.test.assertions.TraceMatcher.trace;
5+
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
6+
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
7+
import static java.util.concurrent.TimeUnit.SECONDS;
8+
import static org.junit.jupiter.api.Assertions.assertTrue;
9+
10+
import datadog.context.ContextScope;
11+
import datadog.trace.agent.test.AbstractInstrumentationTest;
12+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
13+
import io.vertx.core.Vertx;
14+
import io.vertx.ext.web.sstore.LocalSessionStore;
15+
import io.vertx.ext.web.sstore.impl.LocalSessionStoreImpl;
16+
import org.junit.jupiter.api.Test;
17+
18+
class LocalSessionStoreInstrumentationTest extends AbstractInstrumentationTest {
19+
@Test
20+
void initializingSessionStoreDoesNotRetainRequest() throws Exception {
21+
Vertx vertx = Vertx.vertx();
22+
try {
23+
AgentSpan parent = startSpan("test", "parent");
24+
LocalSessionStore store;
25+
try (ContextScope ignored = activateSpan(parent)) {
26+
store = LocalSessionStore.create(vertx, "initializing", 60_000);
27+
} finally {
28+
parent.finish();
29+
}
30+
try {
31+
assertTrue(
32+
writer.waitForTracesMax(1, 3), "Session-store timers retained the request trace");
33+
assertTraces(trace(span().root().operationName("parent")));
34+
} finally {
35+
store.close();
36+
}
37+
} finally {
38+
vertx.close().toCompletionStage().toCompletableFuture().get(10, SECONDS);
39+
}
40+
}
41+
42+
@Test
43+
void rearmingSessionReaperDoesNotRetainRequest() throws Exception {
44+
Vertx vertx = Vertx.vertx();
45+
LocalSessionStore store = LocalSessionStore.create(vertx, "rearming", 60_000);
46+
try {
47+
AgentSpan parent = startSpan("test", "parent");
48+
try (ContextScope ignored = activateSpan(parent)) {
49+
((LocalSessionStoreImpl) store).handle(0L);
50+
} finally {
51+
parent.finish();
52+
}
53+
assertTrue(writer.waitForTracesMax(1, 3), "Session reaper retained the request trace");
54+
assertTraces(trace(span().root().operationName("parent")));
55+
} finally {
56+
store.close();
57+
vertx.close().toCompletionStage().toCompletableFuture().get(10, SECONDS);
58+
}
59+
}
60+
}

dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-5.0/src/main/java/datadog/trace/instrumentation/vertx_5_0/server/LocalSessionStoreInstrumentation.java renamed to dd-java-agent/instrumentation/vertx/vertx-web/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/LocalSessionStoreInstrumentation.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package datadog.trace.instrumentation.vertx_5_0.server;
1+
package datadog.trace.instrumentation.vertx_4_0.server;
22

33
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
44
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.isAsyncPropagationEnabled;
@@ -21,7 +21,7 @@
2121
public final class LocalSessionStoreInstrumentation extends InstrumenterModule.ContextTracking
2222
implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
2323
public LocalSessionStoreInstrumentation() {
24-
super("vertx", "vertx-5.0");
24+
super("vertx");
2525
}
2626

2727
@Override
@@ -31,7 +31,8 @@ public String instrumentedType() {
3131

3232
@Override
3333
public Reference[] additionalMuzzleReferences() {
34-
return new Reference[] {VertxVersionMatcher.HTTP_HEADERS_INTERNAL};
34+
// Vert.x 3.9 has the same class and timer methods.
35+
return new Reference[] {VertxVersionMatcher.HTTP_1X_SERVER_RESPONSE};
3536
}
3637

3738
@Override

0 commit comments

Comments
 (0)