diff --git a/examples/distro/instrumentation/servlet-3/src/main/java/com/example/javaagent/instrumentation/DemoServlet3HelperClass.java b/examples/distro/instrumentation/servlet-3/src/main/java/com/example/javaagent/instrumentation/DemoServlet3HelperClass.java index 32519022946d..e0caa28de143 100644 --- a/examples/distro/instrumentation/servlet-3/src/main/java/com/example/javaagent/instrumentation/DemoServlet3HelperClass.java +++ b/examples/distro/instrumentation/servlet-3/src/main/java/com/example/javaagent/instrumentation/DemoServlet3HelperClass.java @@ -6,9 +6,15 @@ package com.example.javaagent.instrumentation; import com.example.javaagent.bootstrap.AgentApi; +import io.opentelemetry.instrumentation.api.util.VirtualField; +import java.util.concurrent.atomic.AtomicInteger; +import javax.servlet.ServletResponse; public final class DemoServlet3HelperClass { + public static final VirtualField VIRTUAL_FIELD = + VirtualField.find(ServletResponse.class, AtomicInteger.class); + public static void doSomething(int number) { // call the api in bootstrap class loader AgentApi.doSomething(number); diff --git a/examples/distro/instrumentation/servlet-3/src/main/java/com/example/javaagent/instrumentation/DemoServlet3Instrumentation.java b/examples/distro/instrumentation/servlet-3/src/main/java/com/example/javaagent/instrumentation/DemoServlet3Instrumentation.java index fe0c29ba2e74..de34defca286 100644 --- a/examples/distro/instrumentation/servlet-3/src/main/java/com/example/javaagent/instrumentation/DemoServlet3Instrumentation.java +++ b/examples/distro/instrumentation/servlet-3/src/main/java/com/example/javaagent/instrumentation/DemoServlet3Instrumentation.java @@ -11,7 +11,6 @@ import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -45,12 +44,10 @@ public static class DemoServlet3Advice { public static void onEnter(@Advice.Argument(value = 1) ServletResponse response) { // VirtualField depends on muzzle-generation. Using it here to verify that muzzle-generation // was set up. - VirtualField virtualField = - VirtualField.find(ServletResponse.class, AtomicInteger.class); - AtomicInteger counter = virtualField.get(response); + AtomicInteger counter = DemoServlet3HelperClass.VIRTUAL_FIELD.get(response); if (counter == null) { counter = new AtomicInteger(); - virtualField.set(response, counter); + DemoServlet3HelperClass.VIRTUAL_FIELD.set(response, counter); } DemoServlet3HelperClass.doSomething(counter.incrementAndGet()); diff --git a/instrumentation/finagle-http-23.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/Helpers.java b/instrumentation/finagle-http-23.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/Helpers.java index 6f00d4cd69d9..05fb36aa2f7b 100644 --- a/instrumentation/finagle-http-23.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/Helpers.java +++ b/instrumentation/finagle-http-23.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finaglehttp/v23_11/Helpers.java @@ -26,6 +26,9 @@ public final class Helpers { + private static final VirtualField CHANNEL_HANDLER = + VirtualField.find(ChannelHandler.class, ChannelHandler.class); + private Helpers() {} public static final Local CONTEXT_LOCAL = new Local<>(); @@ -52,8 +55,7 @@ protected void initChannel(C channel) throws Exception { channel.pipeline().context(Http2StreamFrameToHttpObjectCodec.class); if (codecCtx != null) { if (channel.pipeline().get(HttpServerTracingHandler.class) == null) { - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); + ChannelHandler ourHandler = NettyServerSingletons.serverTelemetry() .createCombinedHandler(NettyHttpServerResponseBeforeCommitHandler.INSTANCE); @@ -62,7 +64,7 @@ protected void initChannel(C channel) throws Exception { .pipeline() .addAfter(codecCtx.name(), ourHandler.getClass().getName(), ourHandler); // attach this in this way to match up with how netty instrumentation expects things - virtualField.set(codecCtx.handler(), ourHandler); + CHANNEL_HANDLER.set(codecCtx.handler(), ourHandler); } } } @@ -93,15 +95,13 @@ protected void initChannel(C channel) throws Exception { channel.pipeline().context(Http2StreamFrameToHttpObjectCodec.class); if (codecCtx != null) { if (channel.pipeline().get(HttpClientTracingHandler.class) == null) { - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); ChannelHandler ourHandler = clientHandlerFactory().createCombinedHandler(); channel .pipeline() .addAfter(codecCtx.name(), ourHandler.getClass().getName(), ourHandler); // attach this in this way to match up with how netty instrumentation expects things - virtualField.set(codecCtx.handler(), ourHandler); + CHANNEL_HANDLER.set(codecCtx.handler(), ourHandler); } } } diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java index 48054b1b7503..3e5ef60bc2ea 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java @@ -7,19 +7,18 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.javaagent.instrumentation.netty.v3_8.VirtualFieldHelper.CONNECTION_CONTEXT; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFuture; public class ChannelFutureListenerInstrumentation implements TypeInstrumentation { @@ -58,10 +57,7 @@ public static Scope activateScope(@Advice.Argument(0) ChannelFuture future) { return null; } - VirtualField virtualField = - VirtualField.find(Channel.class, NettyConnectionContext.class); - - NettyConnectionContext connectionContext = virtualField.get(future.getChannel()); + NettyConnectionContext connectionContext = CONNECTION_CONTEXT.get(future.getChannel()); if (connectionContext == null) { return null; } diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelInstrumentation.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelInstrumentation.java index 6625cfbdb322..ed5db70be431 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelInstrumentation.java +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelInstrumentation.java @@ -7,6 +7,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.javaagent.instrumentation.netty.v3_8.VirtualFieldHelper.CONNECTION_CONTEXT; import static io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyClientSingletons.connectionInstrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -16,7 +17,6 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.netty.common.internal.NettyConnectionRequest; import io.opentelemetry.instrumentation.netty.common.internal.Timer; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; @@ -65,12 +65,10 @@ public static NettyScope onEnter( return null; } - VirtualField virtualField = - VirtualField.find(Channel.class, NettyConnectionContext.class); - if (virtualField.get(channel) != null) { + if (CONNECTION_CONTEXT.get(channel) != null) { return null; } - virtualField.set(channel, new NettyConnectionContext(parentContext)); + CONNECTION_CONTEXT.set(channel, new NettyConnectionContext(parentContext)); NettyConnectionRequest request = NettyConnectionRequest.connect(remoteAddress); Timer timer = Timer.start(); 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 a6cb34099421..e9682487f601 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 @@ -40,4 +40,9 @@ public List typeInstrumentations() { new NettyChannelPipelineInstrumentation(), new DefaultChannelPipelineInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/VirtualFieldHelper.java b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/VirtualFieldHelper.java new file mode 100644 index 000000000000..4587f6d0f662 --- /dev/null +++ b/instrumentation/netty/netty-3.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/VirtualFieldHelper.java @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.netty.v3_8; + +import io.opentelemetry.instrumentation.api.util.VirtualField; +import org.jboss.netty.channel.Channel; + +public class VirtualFieldHelper { + + public static final VirtualField CONNECTION_CONTEXT = + VirtualField.find(Channel.class, NettyConnectionContext.class); + + private VirtualFieldHelper() {} +} diff --git a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyChannelPipelineInstrumentation.java index 2d5fb38f91ad..8de6900451a6 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyChannelPipelineInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.v4_0; +import static io.opentelemetry.javaagent.instrumentation.netty.v4.common.VirtualFieldHelper.CHANNEL_HANDLER; import static io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.NettyClientSingletons.sslInstrumenter; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; @@ -19,7 +20,6 @@ import io.netty.handler.codec.http.HttpResponseDecoder; import io.netty.handler.codec.http.HttpResponseEncoder; import io.netty.handler.codec.http.HttpServerCodec; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettySslInstrumentationHandler; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -70,11 +70,8 @@ public static void addHandler( return; } - VirtualField instrumentationHandlerField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); - // don't add another instrumentation handler if there already is one attached - if (instrumentationHandlerField.get(handler) != null) { + if (CHANNEL_HANDLER.get(handler) != null) { return; } @@ -103,7 +100,7 @@ public static void addHandler( try { pipeline.addLast(ourHandler.getClass().getName(), ourHandler); // associate our handle with original handler so they could be removed together - instrumentationHandlerField.set(handler, ourHandler); + CHANNEL_HANDLER.set(handler, ourHandler); } catch (IllegalArgumentException e) { // Prevented adding duplicate handlers. } 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 a20246a5d1e3..644797fb54d1 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 @@ -46,4 +46,9 @@ public List typeInstrumentations() { new NettyChannelPipelineInstrumentation(), new AbstractChannelHandlerContextInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyChannelPipelineInstrumentation.java index ee54c30a108f..84aa8569f861 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyChannelPipelineInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.v4_1; +import static io.opentelemetry.javaagent.instrumentation.netty.v4.common.VirtualFieldHelper.CHANNEL_HANDLER; import static io.opentelemetry.javaagent.instrumentation.netty.v4_1.NettyClientSingletons.clientHandlerFactory; import static io.opentelemetry.javaagent.instrumentation.netty.v4_1.NettyClientSingletons.sslInstrumenter; import static io.opentelemetry.javaagent.instrumentation.netty.v4_1.NettyServerSingletons.serverTelemetry; @@ -22,7 +23,6 @@ import io.netty.handler.codec.http.HttpResponseDecoder; import io.netty.handler.codec.http.HttpResponseEncoder; import io.netty.handler.codec.http.HttpServerCodec; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.netty.common.v4_0.internal.client.NettySslInstrumentationHandler; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -78,11 +78,8 @@ public static void addHandler( return; } - VirtualField instrumentationHandlerField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); - // don't add another instrumentation handler if there already is one attached - if (instrumentationHandlerField.get(handler) != null) { + if (CHANNEL_HANDLER.get(handler) != null) { return; } @@ -126,7 +123,7 @@ public static void addHandler( try { pipeline.addAfter(name, ourHandler.getClass().getName(), ourHandler); // associate our handle with original handler so they could be removed together - instrumentationHandlerField.set(handler, ourHandler); + CHANNEL_HANDLER.set(handler, ourHandler); } catch (IllegalArgumentException e) { // Prevented adding duplicate handlers. } 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 9d9c71505726..e792306fe64b 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 @@ -44,4 +44,9 @@ public List typeInstrumentations() { new AbstractChannelHandlerContextInstrumentation(), new SingleThreadEventExecutorInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/netty/netty-common-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4/common/AbstractNettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-common-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4/common/AbstractNettyChannelPipelineInstrumentation.java index 155927b915fb..48c1a7841b17 100644 --- a/instrumentation/netty/netty-common-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4/common/AbstractNettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-common-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4/common/AbstractNettyChannelPipelineInstrumentation.java @@ -7,6 +7,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.javaagent.instrumentation.netty.v4.common.VirtualFieldHelper.CHANNEL_HANDLER; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; @@ -16,7 +17,6 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelPipeline; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.util.Iterator; @@ -74,14 +74,12 @@ public static class RemoveAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void removeHandler( @Advice.This ChannelPipeline pipeline, @Advice.Argument(0) ChannelHandler handler) { - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); - ChannelHandler ourHandler = virtualField.get(handler); + ChannelHandler ourHandler = CHANNEL_HANDLER.get(handler); if (ourHandler != null) { if (pipeline.context(ourHandler) != null) { pipeline.remove(ourHandler); } - virtualField.set(handler, null); + CHANNEL_HANDLER.set(handler, null); } } } @@ -97,14 +95,12 @@ public static void removeHandler( return; } - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); - ChannelHandler ourHandler = virtualField.get(handler); + ChannelHandler ourHandler = CHANNEL_HANDLER.get(handler); if (ourHandler != null) { if (pipeline.context(ourHandler) != null) { pipeline.remove(ourHandler); } - virtualField.set(handler, null); + CHANNEL_HANDLER.set(handler, null); } } } @@ -121,14 +117,12 @@ public static void removeHandler( return; } - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); - ChannelHandler ourHandler = virtualField.get(handler); + ChannelHandler ourHandler = CHANNEL_HANDLER.get(handler); if (ourHandler != null) { if (pipeline.context(ourHandler) != null) { pipeline.remove(ourHandler); } - virtualField.set(handler, null); + CHANNEL_HANDLER.set(handler, null); } } } @@ -139,14 +133,12 @@ public static class RemoveFirstAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void removeHandler( @Advice.This ChannelPipeline pipeline, @Advice.Return ChannelHandler handler) { - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); - ChannelHandler ourHandler = virtualField.get(handler); + ChannelHandler ourHandler = CHANNEL_HANDLER.get(handler); if (ourHandler != null) { if (pipeline.context(ourHandler) != null) { pipeline.remove(ourHandler); } - virtualField.set(handler, null); + CHANNEL_HANDLER.set(handler, null); } } } @@ -158,11 +150,9 @@ public static class RemoveLastAdvice { @Advice.AssignReturned.ToReturned public static ChannelHandler removeHandler( @Advice.This ChannelPipeline pipeline, @Advice.Return ChannelHandler returnHandler) { - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); // TODO remove this extra variable when migrating to "indy only" instrumentation. ChannelHandler handler = returnHandler; - ChannelHandler ourHandler = virtualField.get(handler); + ChannelHandler ourHandler = CHANNEL_HANDLER.get(handler); if (ourHandler != null) { // Context is null when our handler has already been removed. This happens when calling // removeLast first removed our handler and we called removeLast again to remove the http @@ -170,7 +160,7 @@ public static ChannelHandler removeHandler( if (pipeline.context(ourHandler) != null) { pipeline.remove(ourHandler); } - virtualField.set(handler, null); + CHANNEL_HANDLER.set(handler, null); } else { String handlerClassName = handler.getClass().getName(); if (handlerClassName.endsWith("TracingHandler") @@ -197,9 +187,7 @@ public static String addAfterHandler( String name = nameArg; ChannelHandler handler = pipeline.get(name); if (handler != null) { - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); - ChannelHandler ourHandler = virtualField.get(handler); + ChannelHandler ourHandler = CHANNEL_HANDLER.get(handler); if (ourHandler != null) { name = ourHandler.getClass().getName(); } @@ -213,8 +201,6 @@ public static class ToMapAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void wrapIterator(@Advice.Return Map map) { - VirtualField virtualField = - VirtualField.find(ChannelHandler.class, ChannelHandler.class); for (Iterator iterator = map.values().iterator(); iterator.hasNext(); ) { ChannelHandler handler = iterator.next(); String handlerClassName = handler.getClass().getName(); diff --git a/instrumentation/netty/netty-common-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4/common/VirtualFieldHelper.java b/instrumentation/netty/netty-common-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4/common/VirtualFieldHelper.java new file mode 100644 index 000000000000..6386d15cab29 --- /dev/null +++ b/instrumentation/netty/netty-common-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4/common/VirtualFieldHelper.java @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.netty.v4.common; + +import io.netty.channel.ChannelHandler; +import io.opentelemetry.instrumentation.api.util.VirtualField; + +public class VirtualFieldHelper { + + public static final VirtualField CHANNEL_HANDLER = + VirtualField.find(ChannelHandler.class, ChannelHandler.class); + + private VirtualFieldHelper() {} +}