Skip to content
Open
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 @@ -9,6 +9,7 @@
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge;
import io.opentelemetry.javaagent.bootstrap.servlet.ServletAsyncContext;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.annotation.Nullable;
import org.eclipse.jetty.server.HttpStream;
import org.eclipse.jetty.server.Request;
Expand All @@ -27,21 +28,33 @@ public boolean shouldStart(Context parentContext, Request request) {

public Context start(Context parentContext, Request request, Response response) {
Context context = instrumenter.start(parentContext, request);
request.addFailureListener(throwable -> end(context, request, response, throwable));
// Use AtomicBoolean to ensure the span ends exactly once
AtomicBoolean spanEnded = new AtomicBoolean(false);

request.addFailureListener(
throwable -> {
if (spanEnded.compareAndSet(false, true)) {
end(context, request, response, throwable);
}
});
// detect request completion
// https://github.com/jetty/jetty.project/blob/52d94174e2c7a6e794c6377dcf9cd3ed0b9e1806/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/EventsHandler.java#L75
request.addHttpStreamWrapper(
stream ->
new HttpStream.Wrapper(stream) {
@Override
public void succeeded() {
end(context, request, response, null);
if (spanEnded.compareAndSet(false, true)) {
end(context, request, response, null);
}
super.succeeded();
}

@Override
public void failed(Throwable throwable) {
end(context, request, response, throwable);
if (spanEnded.compareAndSet(false, true)) {
end(context, request, response, throwable);
}
super.failed(throwable);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ public static AdviceScope start(Object source, Request request, Response respons

public void end(Request request, Response response, @Nullable Throwable throwable) {
scope.close();
// Don't end the span here - it will be ended by the HttpStream callbacks
// registered in Jetty12Helper.start(). This ensures metrics are captured
// correctly regardless of whether virtual threads are enabled.
// Only end immediately if there's an exception, as the callbacks may not fire.
if (throwable != null) {
helper().end(context, request, response, throwable);
}
Expand Down
Loading