Close scope for async servlet requests
This commit is contained in:
parent
b1004a7dc0
commit
6cd8be67d5
|
@ -128,6 +128,7 @@ public final class FilterChain3Instrumentation extends Instrumenter.Configurable
|
||||||
final AtomicBoolean activated = new AtomicBoolean(false);
|
final AtomicBoolean activated = new AtomicBoolean(false);
|
||||||
// what if async is already finished? This would not be called
|
// what if async is already finished? This would not be called
|
||||||
req.getAsyncContext().addListener(new TagSettingAsyncListener(activated, span));
|
req.getAsyncContext().addListener(new TagSettingAsyncListener(activated, span));
|
||||||
|
scope.close();
|
||||||
} else {
|
} else {
|
||||||
Tags.HTTP_STATUS.set(span, resp.getStatus());
|
Tags.HTTP_STATUS.set(span, resp.getStatus());
|
||||||
scope.close();
|
scope.close();
|
||||||
|
|
|
@ -120,6 +120,7 @@ public final class HttpServlet3Instrumentation extends Instrumenter.Configurable
|
||||||
final AtomicBoolean activated = new AtomicBoolean(false);
|
final AtomicBoolean activated = new AtomicBoolean(false);
|
||||||
// what if async is already finished? This would not be called
|
// what if async is already finished? This would not be called
|
||||||
req.getAsyncContext().addListener(new TagSettingAsyncListener(activated, span));
|
req.getAsyncContext().addListener(new TagSettingAsyncListener(activated, span));
|
||||||
|
scope.close();
|
||||||
} else {
|
} else {
|
||||||
Tags.HTTP_STATUS.set(span, resp.getStatus());
|
Tags.HTTP_STATUS.set(span, resp.getStatus());
|
||||||
scope.close();
|
scope.close();
|
||||||
|
|
|
@ -122,6 +122,31 @@ class JettyServlet3Test extends AgentTestRunner {
|
||||||
"sync" | "Hello Sync"
|
"sync" | "Hello Sync"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def "servlet instrumentation clears state after async request"() {
|
||||||
|
setup:
|
||||||
|
def request = new Request.Builder()
|
||||||
|
.url("http://localhost:$PORT/async")
|
||||||
|
.get()
|
||||||
|
.build()
|
||||||
|
def numTraces = 5
|
||||||
|
for (int i = 0; i < numTraces; ++i) {
|
||||||
|
client.newCall(request).execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
expect:
|
||||||
|
assertTraces(writer, numTraces) {
|
||||||
|
for (int i = 0; i < numTraces; ++i) {
|
||||||
|
trace(i, 1) {
|
||||||
|
span(0) {
|
||||||
|
serviceName "unnamed-java-app"
|
||||||
|
operationName "servlet.request"
|
||||||
|
resourceName "GET /async"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
def "test #path error servlet call"() {
|
def "test #path error servlet call"() {
|
||||||
setup:
|
setup:
|
||||||
def request = new Request.Builder()
|
def request = new Request.Builder()
|
||||||
|
|
|
@ -39,7 +39,8 @@ public class ListWriter extends CopyOnWriteArrayList<List<DDSpan>> implements Wr
|
||||||
latches.add(latch);
|
latches.add(latch);
|
||||||
}
|
}
|
||||||
if (!latch.await(20, TimeUnit.SECONDS)) {
|
if (!latch.await(20, TimeUnit.SECONDS)) {
|
||||||
throw new TimeoutException("Timeout waiting for " + number + " trace(s).");
|
throw new TimeoutException(
|
||||||
|
"Timeout waiting for " + number + " trace(s). ListWriter.size() == " + size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue