Skip to content

Commit 2e97a4d

Browse files
author
Mateusz Rzeszutek
authored
Netty: preserve caught exception in the context instead of calling end() (#4413)
1 parent 13f28dc commit 2e97a4d

File tree

17 files changed

+87
-57
lines changed

17 files changed

+87
-57
lines changed

instrumentation/netty/netty-3.8/javaagent/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ dependencies {
2121
compileOnly("com.google.auto.value:auto-value-annotations")
2222
annotationProcessor("com.google.auto.value:auto-value")
2323

24+
implementation(project(":instrumentation:netty:netty-common:javaagent"))
25+
2426
compileOnly("io.netty:netty:3.8.0.Final")
2527

2628
testLibrary("io.netty:netty:3.8.0.Final")

instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/DefaultChannelPipelineInstrumentation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1313
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1414
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
15-
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.NettyServerErrorHandler;
15+
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyErrorHolder;
1616
import net.bytebuddy.asm.Advice;
1717
import net.bytebuddy.description.type.TypeDescription;
1818
import net.bytebuddy.matcher.ElementMatcher;
@@ -39,7 +39,7 @@ public static class NotifyHandlerExceptionAdvice {
3939
@Advice.OnMethodEnter
4040
public static void onEnter(@Advice.Argument(1) Throwable throwable) {
4141
if (throwable != null) {
42-
NettyServerErrorHandler.onError(Java8BytecodeBridge.currentContext(), throwable);
42+
NettyErrorHolder.set(Java8BytecodeBridge.currentContext(), throwable);
4343
}
4444
}
4545
}

instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/HttpClientResponseTracingHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import io.opentelemetry.context.Scope;
1111
import io.opentelemetry.instrumentation.api.field.VirtualField;
12+
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyErrorHolder;
1213
import org.jboss.netty.channel.Channel;
1314
import org.jboss.netty.channel.ChannelHandlerContext;
1415
import org.jboss.netty.channel.MessageEvent;
@@ -35,7 +36,7 @@ public void messageReceived(ChannelHandlerContext ctx, MessageEvent msg) {
3536
requestAndContexts.context(),
3637
requestAndContexts.request(),
3738
(HttpResponse) msg.getMessage(),
38-
null);
39+
NettyErrorHolder.getOrDefault(requestAndContexts.context(), null));
3940
requestContextsField.set(ctx.getChannel(), null);
4041
}
4142

instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/client/NettyClientSingletons.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
1212
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
1313
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
14+
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyErrorHolder;
1415
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.HttpRequestAndChannel;
1516
import org.jboss.netty.handler.codec.http.HttpResponse;
1617

@@ -35,6 +36,8 @@ final class NettyClientSingletons {
3536
.addAttributesExtractor(
3637
PeerServiceAttributesExtractor.create(netClientAttributesExtractor))
3738
.addRequestMetrics(HttpClientMetrics.get())
39+
.addContextCustomizer(
40+
(context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context))
3841
.newClientInstrumenter(new HttpRequestHeadersSetter());
3942
}
4043

instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/HttpServerResponseTracingHandler.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.opentelemetry.context.Context;
1111
import io.opentelemetry.context.Scope;
1212
import io.opentelemetry.instrumentation.api.field.VirtualField;
13+
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyErrorHolder;
1314
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.HttpRequestAndChannel;
1415
import org.jboss.netty.channel.Channel;
1516
import org.jboss.netty.channel.ChannelHandlerContext;
@@ -35,12 +36,15 @@ public void writeRequested(ChannelHandlerContext ctx, MessageEvent msg) {
3536
HttpRequestAndChannel request = requestAndContext.request();
3637
HttpResponse response = (HttpResponse) msg.getMessage();
3738

39+
Throwable error = null;
3840
try (Scope ignored = context.makeCurrent()) {
3941
ctx.sendDownstream(msg);
40-
instrumenter().end(context, request, response, null);
41-
} catch (Throwable throwable) {
42-
instrumenter().end(context, request, response, throwable);
43-
throw throwable;
42+
} catch (Throwable t) {
43+
error = t;
44+
throw t;
45+
} finally {
46+
error = NettyErrorHolder.getOrDefault(context, error);
47+
instrumenter().end(context, request, response, error);
4448
}
4549
}
4650
}

instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/NettyServerErrorHandler.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/server/NettyServerSingletons.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
1111
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
1212
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
13+
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyErrorHolder;
1314
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.HttpRequestAndChannel;
1415
import org.jboss.netty.handler.codec.http.HttpResponse;
1516

@@ -30,6 +31,8 @@ final class NettyServerSingletons {
3031
.addAttributesExtractor(httpServerAttributesExtractor)
3132
.addAttributesExtractor(new NettyNetServerAttributesExtractor())
3233
.addRequestMetrics(HttpServerMetrics.get())
34+
.addContextCustomizer(
35+
(context, requestAndChannel, startAttributes) -> NettyErrorHolder.init(context))
3336
.newServerInstrumenter(new NettyHeadersGetter());
3437
}
3538

instrumentation/netty/netty-4-common/javaagent/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@ dependencies {
66
compileOnly("com.google.auto.value:auto-value-annotations")
77
annotationProcessor("com.google.auto.value:auto-value")
88

9+
api(project(":instrumentation:netty:netty-common:javaagent"))
10+
911
compileOnly("io.netty:netty-codec-http:4.0.0.Final")
1012
}

instrumentation/netty/netty-4-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/common/NettyErrorHandler.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

instrumentation/netty/netty-4-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/common/server/NettyServerInstrumenterFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.opentelemetry.instrumentation.api.servlet.ServerSpanNaming;
1515
import io.opentelemetry.javaagent.instrumentation.netty.common.HttpRequestAndChannel;
1616
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyCommonNetAttributesExtractor;
17+
import io.opentelemetry.javaagent.instrumentation.netty.common.NettyErrorHolder;
1718

1819
public final class NettyServerInstrumenterFactory {
1920

@@ -33,6 +34,7 @@ public static Instrumenter<HttpRequestAndChannel, HttpResponse> create(
3334
.addRequestMetrics(HttpServerMetrics.get())
3435
.addContextCustomizer(
3536
(context, request, attributes) -> {
37+
context = NettyErrorHolder.init(context);
3638
// netty is not exactly a "container", but it's the best match out of these
3739
return ServerSpanNaming.init(context, ServerSpanNaming.Source.CONTAINER);
3840
})

0 commit comments

Comments
 (0)