From 96b2baaddb59c4297756d84750cdf035e415e32f Mon Sep 17 00:00:00 2001 From: hi-sb <1922327128@qq.com> Date: Wed, 11 Sep 2019 13:44:36 +0800 Subject: [PATCH] spring-cloud-gateway traceid does not transmit #3411 (#3446) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * spring-cloud-gateway traceid does not transmit #3411 skywalking-version:6.5.0 spring-gateway-version:2.1.2 Error Description: Customize the filter, traceid does not transmit. "ServerWebExchangeDecorator" is a transport chain,His structure should be like this: serverWebExchangeDecorator -----(ServerWebExchangeDecorator)delegate ------(ServerWebExchangeDecorator)delegate ------..... -----(DefaultServerWebExchange)delegate In the current source code, there is no deep search, but only the next level. When there are multiple custom filters, you get an error. Repair method: Look for "delegate" of "ServerWebExchangeDecorator" recursively until "DefaultServerWebExchange" * spring-boot-webflux traceid does not transmit #3411 spring-boot-starter-webflux-version:2.1.6 Error Description: Customize the filter, traceid does not transmit. "ServerWebExchangeDecorator" is a transport chain,His structure should be like this: serverWebExchangeDecorator -----(ServerWebExchangeDecorator)delegate ------(ServerWebExchangeDecorator)delegate ------..... -----(DefaultServerWebExchange)delegate In the current source code, there is no deep search, but only the next level. When there are multiple custom filters, you get an error. Repair method: Look for "delegate" of "ServerWebExchangeDecorator" recursively until "DefaultServerWebExchange" * checkStyle --- ...patcherHandlerHandleMethodInterceptor.java | 20 +++++++++++++++---- .../v21x/NettyRoutingFilterInterceptor.java | 19 ++++++++++++++---- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerHandleMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerHandleMethodInterceptor.java index 5330e22a6..712ca6569 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerHandleMethodInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerHandleMethodInterceptor.java @@ -82,13 +82,25 @@ public class DispatcherHandlerHandleMethodInterceptor implements InstanceMethods public static EnhancedInstance getInstance(Object o) { EnhancedInstance instance = null; if (o instanceof ServerWebExchangeDecorator) { - ServerWebExchange delegate = ((ServerWebExchangeDecorator) o).getDelegate(); - if (delegate instanceof DefaultServerWebExchange) { - instance = (EnhancedInstance) delegate; - } + instance = getEnhancedInstance((ServerWebExchangeDecorator) o); } else if (o instanceof DefaultServerWebExchange) { instance = (EnhancedInstance) o; } return instance; } + + + private static EnhancedInstance getEnhancedInstance(ServerWebExchangeDecorator serverWebExchangeDecorator) { + Object o = serverWebExchangeDecorator.getDelegate(); + if (o instanceof ServerWebExchangeDecorator) { + return getEnhancedInstance((ServerWebExchangeDecorator) o); + } else if (o instanceof DefaultServerWebExchange) { + return (EnhancedInstance) o; + } else if (o == null) { + throw new NullPointerException("The expected class DefaultServerWebExchange is null"); + } else { + throw new RuntimeException("Unknown parameter types:" + o.getClass()); + } + } + } diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v21x/NettyRoutingFilterInterceptor.java b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v21x/NettyRoutingFilterInterceptor.java index c37aab8e4..251198568 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v21x/NettyRoutingFilterInterceptor.java +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v21x/NettyRoutingFilterInterceptor.java @@ -79,13 +79,24 @@ public class NettyRoutingFilterInterceptor implements InstanceMethodsAroundInter public static EnhancedInstance getInstance(Object o) { EnhancedInstance instance = null; if (o instanceof ServerWebExchangeDecorator) { - ServerWebExchange delegate = ((ServerWebExchangeDecorator) o).getDelegate(); - if (delegate instanceof DefaultServerWebExchange) { - instance = (EnhancedInstance) delegate; - } + instance = getEnhancedInstance((ServerWebExchangeDecorator) o); } else if (o instanceof DefaultServerWebExchange) { instance = (EnhancedInstance) o; } return instance; } + + + private static EnhancedInstance getEnhancedInstance(ServerWebExchangeDecorator serverWebExchangeDecorator) { + Object o = serverWebExchangeDecorator.getDelegate(); + if (o instanceof ServerWebExchangeDecorator) { + return getEnhancedInstance((ServerWebExchangeDecorator) o); + } else if (o instanceof DefaultServerWebExchange) { + return (EnhancedInstance) o; + } else if (o == null) { + throw new NullPointerException("The expected class DefaultServerWebExchange is null"); + } else { + throw new RuntimeException("Unknown parameter types:" + o.getClass()); + } + } }