diff --git a/instrumentation/netty/netty-3.8/javaagent/src/latestDepTest/groovy/Netty38ServerTest.groovy b/instrumentation/netty/netty-3.8/javaagent/src/latestDepTest/groovy/Netty38ServerTest.groovy index 06367800e6..e840594142 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/latestDepTest/groovy/Netty38ServerTest.groovy +++ b/instrumentation/netty/netty-3.8/javaagent/src/latestDepTest/groovy/Netty38ServerTest.groovy @@ -144,10 +144,4 @@ class Netty38ServerTest extends HttpServerTest { String expectedServerSpanName(ServerEndpoint endpoint) { return "netty.request" } - - @Override - boolean testException() { - // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/807 - return false - } } diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/DefaultChannelPipelineInstrumentation.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/DefaultChannelPipelineInstrumentation.java new file mode 100644 index 0000000000..5fffce2dca --- /dev/null +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/DefaultChannelPipelineInstrumentation.java @@ -0,0 +1,48 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.netty.v3_8; + +import static io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.NettyHttpServerTracer.tracer; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.Map; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class DefaultChannelPipelineInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("org.jboss.netty.channel.DefaultChannelPipeline"); + } + + @Override + public Map, String> transformers() { + return singletonMap( + isMethod() + .and(named("notifyHandlerException")) + .and(takesArgument(1, named(Throwable.class.getName()))), + DefaultChannelPipelineInstrumentation.class.getName() + "$NotifyHandlerExceptionAdvice"); + } + + public static class NotifyHandlerExceptionAdvice { + @Advice.OnMethodEnter + public static void onEnter(@Advice.Argument(1) Throwable throwable) { + Span span = Java8BytecodeBridge.currentSpan(); + if (span.getSpanContext().isValid() && throwable != null) { + tracer().addThrowable(span, throwable); + } + } + } +} diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyInstrumentationModule.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyInstrumentationModule.java index 9fae920d9b..2f1153e700 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyInstrumentationModule.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyInstrumentationModule.java @@ -25,7 +25,8 @@ public class NettyInstrumentationModule extends InstrumentationModule { return asList( new ChannelFutureListenerInstrumentation(), new NettyChannelInstrumentation(), - new NettyChannelPipelineInstrumentation()); + new NettyChannelPipelineInstrumentation(), + new DefaultChannelPipelineInstrumentation()); } @Override diff --git a/instrumentation/netty/netty-3.8/javaagent/src/test/groovy/Netty38ServerTest.groovy b/instrumentation/netty/netty-3.8/javaagent/src/test/groovy/Netty38ServerTest.groovy index bb77939728..670deffebe 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/test/groovy/Netty38ServerTest.groovy +++ b/instrumentation/netty/netty-3.8/javaagent/src/test/groovy/Netty38ServerTest.groovy @@ -144,10 +144,4 @@ class Netty38ServerTest extends HttpServerTest { String expectedServerSpanName(ServerEndpoint endpoint) { return "netty.request" } - - @Override - boolean testException() { - // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/807 - return false - } } diff --git a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/AbstractChannelHandlerContextInstrumentation.java b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/AbstractChannelHandlerContextInstrumentation.java new file mode 100644 index 0000000000..02f3a343f2 --- /dev/null +++ b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/AbstractChannelHandlerContextInstrumentation.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.netty.v4_0; + +import static io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.NettyHttpServerTracer.tracer; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.Map; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class AbstractChannelHandlerContextInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("io.netty.channel.AbstractChannelHandlerContext"); + } + + @Override + public Map, String> transformers() { + return singletonMap( + isMethod() + .and(named("notifyHandlerException")) + .and(takesArgument(0, named(Throwable.class.getName()))), + AbstractChannelHandlerContextInstrumentation.class.getName() + + "$NotifyHandlerExceptionAdvice"); + } + + public static class NotifyHandlerExceptionAdvice { + @Advice.OnMethodEnter + public static void onEnter(@Advice.Argument(0) Throwable throwable) { + Span span = Java8BytecodeBridge.currentSpan(); + if (span.getSpanContext().isValid() && throwable != null) { + tracer().addThrowable(span, throwable); + } + } + } +} diff --git a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyInstrumentationModule.java b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyInstrumentationModule.java index d5229e2964..9d083ed51e 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyInstrumentationModule.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyInstrumentationModule.java @@ -21,6 +21,8 @@ public class NettyInstrumentationModule extends InstrumentationModule { @Override public List typeInstrumentations() { return asList( - new ChannelFutureListenerInstrumentation(), new NettyChannelPipelineInstrumentation()); + new ChannelFutureListenerInstrumentation(), + new NettyChannelPipelineInstrumentation(), + new AbstractChannelHandlerContextInstrumentation()); } } diff --git a/instrumentation/netty/netty-4.0/javaagent/src/test/groovy/Netty40ServerTest.groovy b/instrumentation/netty/netty-4.0/javaagent/src/test/groovy/Netty40ServerTest.groovy index 488b4d12fe..248274945a 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/test/groovy/Netty40ServerTest.groovy +++ b/instrumentation/netty/netty-4.0/javaagent/src/test/groovy/Netty40ServerTest.groovy @@ -116,10 +116,4 @@ class Netty40ServerTest extends HttpServerTest { String expectedServerSpanName(ServerEndpoint endpoint) { return "netty.request" } - - @Override - boolean testException() { - // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/807 - return false - } } diff --git a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/AbstractChannelHandlerContextInstrumentation.java b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/AbstractChannelHandlerContextInstrumentation.java new file mode 100644 index 0000000000..7e1251126a --- /dev/null +++ b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/AbstractChannelHandlerContextInstrumentation.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.netty.v4_1; + +import static io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.NettyHttpServerTracer.tracer; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.Map; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class AbstractChannelHandlerContextInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("io.netty.channel.AbstractChannelHandlerContext"); + } + + @Override + public Map, String> transformers() { + return singletonMap( + isMethod() + .and(named("notifyHandlerException")) + .and(takesArgument(0, named(Throwable.class.getName()))), + AbstractChannelHandlerContextInstrumentation.class.getName() + + "$NotifyHandlerExceptionAdvice"); + } + + public static class NotifyHandlerExceptionAdvice { + @Advice.OnMethodEnter + public static void onEnter(@Advice.Argument(0) Throwable throwable) { + Span span = Java8BytecodeBridge.currentSpan(); + if (span.getSpanContext().isValid() && throwable != null) { + tracer().addThrowable(span, throwable); + } + } + } +} diff --git a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyInstrumentationModule.java b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyInstrumentationModule.java index 7d361449d5..d5aa8e0742 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyInstrumentationModule.java +++ b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyInstrumentationModule.java @@ -21,6 +21,8 @@ public class NettyInstrumentationModule extends InstrumentationModule { @Override public List typeInstrumentations() { return asList( - new ChannelFutureListenerInstrumentation(), new NettyChannelPipelineInstrumentation()); + new ChannelFutureListenerInstrumentation(), + new NettyChannelPipelineInstrumentation(), + new AbstractChannelHandlerContextInstrumentation()); } } diff --git a/instrumentation/netty/netty-4.1/javaagent/src/test/groovy/Netty41ServerTest.groovy b/instrumentation/netty/netty-4.1/javaagent/src/test/groovy/Netty41ServerTest.groovy index 78f7b984ab..3ca957e980 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/test/groovy/Netty41ServerTest.groovy +++ b/instrumentation/netty/netty-4.1/javaagent/src/test/groovy/Netty41ServerTest.groovy @@ -115,10 +115,4 @@ class Netty41ServerTest extends HttpServerTest { String expectedServerSpanName(ServerEndpoint endpoint) { return "netty.request" } - - @Override - boolean testException() { - // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/807 - return false - } }