Skip to content

Commit c06a783

Browse files
gtukmachevclaude
andcommitted
Fix websocket upgrade span leak in handleHttpResponse, improve test docs
- WebSocket upgrades in handleHttpResponse now finish the span immediately instead of deferring to LastHttpContent (which never arrives for websockets) - Updated test Javadocs to accurately describe what each test validates - Improved connection-drop test synchronization (read first byte instead of sleep) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 757be22 commit c06a783

1 file changed

Lines changed: 11 additions & 3 deletions

File tree

dd-java-agent/instrumentation/netty/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerResponseTracingHandler.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,17 @@ private void handleHttpResponse(
148148
if (response.status() != HttpResponseStatus.CONTINUE
149149
&& (response.status() != HttpResponseStatus.SWITCHING_PROTOCOLS || isWebsocketUpgrade)) {
150150
DECORATE.onResponse(span, response);
151-
ctx.channel().attr(STREAMING_CONTEXT_KEY).set(storedContext);
152-
ctx.channel().attr(CONTEXT_ATTRIBUTE_KEY).remove();
153-
// Span finish is deferred to handleLastHttpContent.
151+
152+
if (isWebsocketUpgrade) {
153+
// WebSocket upgrades don't produce LastHttpContent — finish span immediately.
154+
DECORATE.beforeFinish(scope.context());
155+
span.finish();
156+
ctx.channel().attr(CONTEXT_ATTRIBUTE_KEY).remove();
157+
} else {
158+
ctx.channel().attr(STREAMING_CONTEXT_KEY).set(storedContext);
159+
ctx.channel().attr(CONTEXT_ATTRIBUTE_KEY).remove();
160+
// Span finish is deferred to handleLastHttpContent.
161+
}
154162
}
155163
}
156164
}

0 commit comments

Comments
 (0)