Calculate depth per handler class in netty channel pipeline instrumentation
This commit is contained in:
parent
f01d473d10
commit
27e0e4492e
|
|
@ -97,8 +97,17 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
|||
*/
|
||||
public static class ChannelPipelineAddAdvice {
|
||||
@Advice.OnMethodEnter
|
||||
public static int checkDepth() {
|
||||
return CallDepthThreadLocalMap.incrementCallDepth(ChannelPipeline.class);
|
||||
public static int checkDepth(@Advice.Argument(2) final ChannelHandler handler) {
|
||||
// Previously we used one unique call depth tracker for all handlers, using
|
||||
// ChannelPipeline.class as a key.
|
||||
// The problem with this approach is that is does not work with netty's
|
||||
// io.netty.channel.ChannelInitializer which provides an `initChannel` that can be used to
|
||||
// `addLast` other handlers. In that case
|
||||
// the depth would exceed over 0 and handlers added from initializers would not be considered.
|
||||
// Using the specific handler key instead of the generic ChannelPipeline.class will help us
|
||||
// both to handle such cases and avoid adding our additional handlers in case of internal
|
||||
// calls of `addLast` to other method overloads with a compatible signature.
|
||||
return CallDepthThreadLocalMap.incrementCallDepth(handler.getClass());
|
||||
}
|
||||
|
||||
@Advice.OnMethodExit(suppress = Throwable.class)
|
||||
|
|
@ -140,7 +149,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
|||
} catch (final IllegalArgumentException e) {
|
||||
// Prevented adding duplicate handlers.
|
||||
} finally {
|
||||
CallDepthThreadLocalMap.reset(ChannelPipeline.class);
|
||||
CallDepthThreadLocalMap.reset(handler.getClass());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue