You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by zh...@apache.org on 2019/09/05 06:03:51 UTC

[skywalking] 01/01: gateway & webflux compatible with these scene

This is an automated email from the ASF dual-hosted git repository.

zhaoyuguang pushed a commit to branch origin/gateway_fix
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit 6201136334bdb793f7e10a322a78e64b4ca370c6
Author: 赵禹光 <76...@qq.com>
AuthorDate: Thu Sep 5 14:03:35 2019 +0800

    gateway & webflux compatible with these scene
---
 ...> AbstractServerResponseMethodInterceptor.java} | 32 ++++++++-------
 .../DispatcherHandlerHandleMethodInterceptor.java  | 47 +++++++++++++++-------
 ...atcherHandlerHandleResultMethodInterceptor.java | 12 +++---
 ...tcherHandlerInvokeHandlerMethodInterceptor.java | 38 ++++++++---------
 ...> ServerWebExchangeConstructorInterceptor.java} |  2 +-
 ... => AbstractServerResponseInstrumentation.java} |  7 ++--
 ....java => ServerWebExchangeInstrumentation.java} |  8 ++--
 .../src/main/resources/skywalking-plugin.def       |  4 +-
 .../v21x/NettyRoutingFilterInterceptor.java        | 38 ++++++++++++-----
 9 files changed, 115 insertions(+), 73 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/BodyInserterResponseMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/AbstractServerResponseMethodInterceptor.java
similarity index 70%
rename from apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/BodyInserterResponseMethodInterceptor.java
rename to apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/AbstractServerResponseMethodInterceptor.java
index 845166d..04f2184 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/BodyInserterResponseMethodInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/AbstractServerResponseMethodInterceptor.java
@@ -33,7 +33,7 @@ import org.springframework.web.server.ServerWebExchange;
 
 import java.lang.reflect.Method;
 
-public class BodyInserterResponseMethodInterceptor implements InstanceMethodsAroundInterceptor {
+public class AbstractServerResponseMethodInterceptor implements InstanceMethodsAroundInterceptor {
 
     /**
      * The error reason
@@ -43,22 +43,24 @@ public class BodyInserterResponseMethodInterceptor implements InstanceMethodsAro
 
     @Override
     public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable {
-        EnhancedInstance instance = (EnhancedInstance) allArguments[0];
-        AbstractSpan span = (AbstractSpan) instance.getSkyWalkingDynamicField();
-        if (span == null) {
-            return;
-        }
-        ServerWebExchange exchange = (ServerWebExchange) allArguments[0];
-        HttpStatus status = exchange.getResponse().getStatusCode();
-        if (status != null && status.value() >= 400) {
-            span.errorOccurred();
-            if (exchange.getAttribute(ERROR_ATTRIBUTE) != null) {
-                span.log((Throwable) exchange.getAttribute(ERROR_ATTRIBUTE));
+        EnhancedInstance instance = DispatcherHandlerHandleMethodInterceptor.getInstance(allArguments[0]);
+        if (instance != null) {
+            AbstractSpan span = (AbstractSpan) instance.getSkyWalkingDynamicField();
+            if (span == null) {
+                return;
+            }
+            ServerWebExchange exchange = (ServerWebExchange) allArguments[0];
+            HttpStatus status = exchange.getResponse().getStatusCode();
+            if (status != null && status.value() >= 400) {
+                span.errorOccurred();
+                if (exchange.getAttribute(ERROR_ATTRIBUTE) != null) {
+                    span.log((Throwable) exchange.getAttribute(ERROR_ATTRIBUTE));
+                }
+                Tags.STATUS_CODE.set(span, Integer.toString(status.value()));
             }
-            Tags.STATUS_CODE.set(span, Integer.toString(status.value()));
+            ContextManager.stopSpan(span);
+            ((EnhancedInstance) allArguments[0]).setSkyWalkingDynamicField(null);
         }
-        ContextManager.stopSpan(span);
-        ((EnhancedInstance) allArguments[0]).setSkyWalkingDynamicField(null);
     }
 
     @Override
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 a5b67b1..5330e22 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
@@ -34,6 +34,8 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInt
 import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
 import org.springframework.http.HttpHeaders;
 import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.ServerWebExchangeDecorator;
+import org.springframework.web.server.adapter.DefaultServerWebExchange;
 
 import java.lang.reflect.Method;
 import java.util.List;
@@ -45,23 +47,25 @@ public class DispatcherHandlerHandleMethodInterceptor implements InstanceMethods
     @Override
     public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
                              MethodInterceptResult result) throws Throwable {
-        ContextCarrier contextCarrier = new ContextCarrier();
-        CarrierItem next = contextCarrier.items();
-        ServerWebExchange exchange = (ServerWebExchange) allArguments[0];
-        EnhancedInstance instance = (EnhancedInstance) allArguments[0];
-        HttpHeaders headers = exchange.getRequest().getHeaders();
-        while (next.hasNext()) {
-            next = next.next();
-            List<String> header = headers.get(next.getHeadKey());
-            if (header != null && header.size() > 0) {
-                next.setHeadValue(header.get(0));
+        EnhancedInstance instance = DispatcherHandlerHandleMethodInterceptor.getInstance(allArguments[0]);
+        if (instance != null) {
+            ContextCarrier contextCarrier = new ContextCarrier();
+            CarrierItem next = contextCarrier.items();
+            ServerWebExchange exchange = (ServerWebExchange) allArguments[0];
+            HttpHeaders headers = exchange.getRequest().getHeaders();
+            while (next.hasNext()) {
+                next = next.next();
+                List<String> header = headers.get(next.getHeadKey());
+                if (header != null && header.size() > 0) {
+                    next.setHeadValue(header.get(0));
+                }
             }
+            AbstractSpan span = ContextManager.createEntrySpan(WIP_OPERATION_NAME, contextCarrier);
+            span.setComponent(ComponentsDefine.SPRING_WEBFLUX);
+            SpanLayer.asHttp(span);
+            Tags.URL.set(span, exchange.getRequest().getURI().toString());
+            instance.setSkyWalkingDynamicField(span);
         }
-        AbstractSpan span = ContextManager.createEntrySpan(WIP_OPERATION_NAME, contextCarrier);
-        span.setComponent(ComponentsDefine.SPRING_WEBFLUX);
-        SpanLayer.asHttp(span);
-        Tags.URL.set(span, exchange.getRequest().getURI().toString());
-        instance.setSkyWalkingDynamicField(span);
     }
 
     @Override
@@ -74,4 +78,17 @@ public class DispatcherHandlerHandleMethodInterceptor implements InstanceMethods
     public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
                                       Class<?>[] argumentsTypes, Throwable t) {
     }
+
+    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;
+            }
+        } else if (o instanceof DefaultServerWebExchange) {
+            instance = (EnhancedInstance) o;
+        }
+        return instance;
+    }
 }
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/DispatcherHandlerHandleResultMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerHandleResultMethodInterceptor.java
index 861069f..79a97e6 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerHandleResultMethodInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerHandleResultMethodInterceptor.java
@@ -40,11 +40,13 @@ public class DispatcherHandlerHandleResultMethodInterceptor implements InstanceM
     @Override
     public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
                               Object ret) throws Throwable {
-        EnhancedInstance instance = (EnhancedInstance) allArguments[0];
-        AbstractSpan span = (AbstractSpan) instance.getSkyWalkingDynamicField();
-        if (span != null) {
-            ContextManager.stopSpan(span);
-            instance.setSkyWalkingDynamicField(null);
+        EnhancedInstance instance = DispatcherHandlerHandleMethodInterceptor.getInstance(allArguments[0]);
+        if (instance != null) {
+            AbstractSpan span = (AbstractSpan) instance.getSkyWalkingDynamicField();
+            if (span != null) {
+                ContextManager.stopSpan(span);
+                instance.setSkyWalkingDynamicField(null);
+            }
         }
         return ret;
     }
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/DispatcherHandlerInvokeHandlerMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerInvokeHandlerMethodInterceptor.java
index b267696..542e82a 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerInvokeHandlerMethodInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DispatcherHandlerInvokeHandlerMethodInterceptor.java
@@ -41,25 +41,27 @@ public class DispatcherHandlerInvokeHandlerMethodInterceptor implements Instance
     @Override
     public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
                              MethodInterceptResult result) throws Throwable {
-        EnhancedInstance instance = (EnhancedInstance) allArguments[0];
-        AbstractSpan span = (AbstractSpan) instance.getSkyWalkingDynamicField();
-        if (span == null) {
-            return;
-        }
-        String handleClassName = allArguments[1].getClass().getSimpleName();
-        int index = handleClassName.indexOf(ROUTER_SEARCH);
-        if (index != -1) {
-            String operationName = handleClassName.substring(0, index);
-            try {
-                Field field = allArguments[1].getClass().getDeclaredField(ROUTER_FIELD);
-                field.setAccessible(true);
-                operationName = operationName + DOT + field.get(allArguments[1]).getClass().getName();
-            } catch (NoSuchFieldException ignore) {
+        EnhancedInstance instance = DispatcherHandlerHandleMethodInterceptor.getInstance(allArguments[0]);
+        if (instance != null) {
+            AbstractSpan span = (AbstractSpan) instance.getSkyWalkingDynamicField();
+            if (span == null) {
+                return;
+            }
+            String handleClassName = allArguments[1].getClass().getSimpleName();
+            int index = handleClassName.indexOf(ROUTER_SEARCH);
+            if (index != -1) {
+                String operationName = handleClassName.substring(0, index);
+                try {
+                    Field field = allArguments[1].getClass().getDeclaredField(ROUTER_FIELD);
+                    field.setAccessible(true);
+                    operationName = operationName + DOT + field.get(allArguments[1]).getClass().getName();
+                } catch (NoSuchFieldException ignore) {
+                }
+                span.setOperationName(operationName);
+            } else if (allArguments[1] instanceof HandlerMethod) {
+                HandlerMethod handler = (HandlerMethod) allArguments[1];
+                span.setOperationName(getHandlerMethodOperationName(handler));
             }
-            span.setOperationName(operationName);
-        } else if (allArguments[1] instanceof HandlerMethod) {
-            HandlerMethod handler = (HandlerMethod) allArguments[1];
-            span.setOperationName(getHandlerMethodOperationName(handler));
         }
     }
 
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/DefaultServerWebExchangeConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/ServerWebExchangeConstructorInterceptor.java
similarity index 91%
rename from apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DefaultServerWebExchangeConstructorInterceptor.java
rename to apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/ServerWebExchangeConstructorInterceptor.java
index 61cfe73..f6b805f 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/DefaultServerWebExchangeConstructorInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/ServerWebExchangeConstructorInterceptor.java
@@ -25,7 +25,7 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceC
  *
  * @author zhaoyuguang
  */
-public class DefaultServerWebExchangeConstructorInterceptor implements InstanceConstructorInterceptor {
+public class ServerWebExchangeConstructorInterceptor implements InstanceConstructorInterceptor {
     @Override
     public void onConstruct(EnhancedInstance objInst, Object[] allArguments) {
     }
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/define/BodyInserterResponseInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/AbstractServerResponseInstrumentation.java
similarity index 88%
rename from apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/BodyInserterResponseInstrumentation.java
rename to apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/AbstractServerResponseInstrumentation.java
index 5166e1f..686affb 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/BodyInserterResponseInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/AbstractServerResponseInstrumentation.java
@@ -32,12 +32,13 @@ import static org.apache.skywalking.apm.agent.core.plugin.match.MultiClassNameMa
  * @author zhaoyuguang
  */
 
-public class BodyInserterResponseInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
+public class AbstractServerResponseInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
 
     @Override
     protected ClassMatch enhanceClass() {
         return byMultiClassMatch("org.springframework.web.reactive.function.server.DefaultServerResponseBuilder$BodyInserterResponse",
-                "org.springframework.web.reactive.function.server.DefaultServerResponseBuilder$BodyInserterServerResponse");
+                "org.springframework.web.reactive.function.server.DefaultServerResponseBuilder$BodyInserterServerResponse",
+                "org.springframework.web.reactive.function.server.DefaultEntityResponseBuilder$DefaultEntityResponse");
     }
 
     @Override
@@ -54,7 +55,7 @@ public class BodyInserterResponseInstrumentation extends ClassInstanceMethodsEnh
                 }
 
                 @Override public String getMethodsInterceptor() {
-                    return "org.apache.skywalking.apm.plugin.spring.webflux.v5.BodyInserterResponseMethodInterceptor";
+                    return "org.apache.skywalking.apm.plugin.spring.webflux.v5.AbstractServerResponseMethodInterceptor";
                 }
 
                 @Override public boolean isOverrideArgs() {
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/define/DefaultServerWebExchangeInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/ServerWebExchangeInstrumentation.java
similarity index 86%
rename from apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/DefaultServerWebExchangeInstrumentation.java
rename to apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/ServerWebExchangeInstrumentation.java
index fb51452..0efe402 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/DefaultServerWebExchangeInstrumentation.java
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/webflux/v5/define/ServerWebExchangeInstrumentation.java
@@ -26,13 +26,13 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInst
 import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
 
 import static net.bytebuddy.matcher.ElementMatchers.any;
-import static org.apache.skywalking.apm.agent.core.plugin.match.MultiClassNameMatch.byMultiClassMatch;
+import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName;
 
 /**
  * @author zhaoyuguang
  */
 
-public class DefaultServerWebExchangeInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
+public class ServerWebExchangeInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
     @Override
     public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
         return new ConstructorInterceptPoint[]{
@@ -44,7 +44,7 @@ public class DefaultServerWebExchangeInstrumentation extends ClassInstanceMethod
 
                 @Override
                 public String getConstructorInterceptor() {
-                    return "org.apache.skywalking.apm.plugin.spring.webflux.v5.DefaultServerWebExchangeConstructorInterceptor";
+                    return "org.apache.skywalking.apm.plugin.spring.webflux.v5.ServerWebExchangeConstructorInterceptor";
                 }
             }
         };
@@ -57,6 +57,6 @@ public class DefaultServerWebExchangeInstrumentation extends ClassInstanceMethod
 
     @Override
     protected ClassMatch enhanceClass() {
-        return byMultiClassMatch("org.springframework.web.server.adapter.DefaultServerWebExchange", "org.springframework.web.server.ServerWebExchangeDecorator");
+        return byName("org.springframework.web.server.adapter.DefaultServerWebExchange");
     }
 }
diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/resources/skywalking-plugin.def
index b62fecf..f1752e3 100644
--- a/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/resources/skywalking-plugin.def
+++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/webflux-5.x-plugin/src/main/resources/skywalking-plugin.def
@@ -15,5 +15,5 @@
 # limitations under the License.
 
 spring-webflux-5.x=org.apache.skywalking.apm.plugin.spring.webflux.v5.define.DispatcherHandlerInstrumentation
-spring-webflux-5.x=org.apache.skywalking.apm.plugin.spring.webflux.v5.define.DefaultServerWebExchangeInstrumentation
-spring-webflux-5.x=org.apache.skywalking.apm.plugin.spring.webflux.v5.define.BodyInserterResponseInstrumentation
\ No newline at end of file
+spring-webflux-5.x=org.apache.skywalking.apm.plugin.spring.webflux.v5.define.ServerWebExchangeInstrumentation
+spring-webflux-5.x=org.apache.skywalking.apm.plugin.spring.webflux.v5.define.AbstractServerResponseInstrumentation
\ No newline at end of file
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 4443b19..c37aab8 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
@@ -27,6 +27,8 @@ import org.apache.skywalking.apm.plugin.spring.cloud.gateway.v21x.context.Consta
 import org.apache.skywalking.apm.plugin.spring.cloud.gateway.v21x.context.SWTransmitter;
 import org.springframework.cloud.gateway.route.Route;
 import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.ServerWebExchangeDecorator;
+import org.springframework.web.server.adapter.DefaultServerWebExchange;
 
 import java.lang.reflect.Method;
 
@@ -43,16 +45,19 @@ public class NettyRoutingFilterInterceptor implements InstanceMethodsAroundInter
     @Override
     public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
                              MethodInterceptResult result) throws Throwable {
-        ServerWebExchange exchange = (ServerWebExchange) allArguments[0];
-        AbstractSpan span = (AbstractSpan) ((EnhancedInstance) allArguments[0]).getSkyWalkingDynamicField();
-        String operationName = SPRING_CLOUD_GATEWAY_ROUTE_PREFIX;
-        if (span != null) {
-            Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
-            operationName = operationName + route.getId();
-            span.setOperationName(operationName);
-            SWTransmitter transmitter = new SWTransmitter(span.prepareForAsync(), ContextManager.capture(), operationName);
-            ContextManager.stopSpan(span);
-            ContextManager.getRuntimeContext().put(Constants.SPRING_CLOUD_GATEWAY_TRANSMITTER, transmitter);
+        EnhancedInstance instance = NettyRoutingFilterInterceptor.getInstance(allArguments[0]);
+        if (instance != null) {
+            ServerWebExchange exchange = (ServerWebExchange) allArguments[0];
+            AbstractSpan span = (AbstractSpan) instance.getSkyWalkingDynamicField();
+            String operationName = SPRING_CLOUD_GATEWAY_ROUTE_PREFIX;
+            if (span != null) {
+                Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
+                operationName = operationName + route.getId();
+                span.setOperationName(operationName);
+                SWTransmitter transmitter = new SWTransmitter(span.prepareForAsync(), ContextManager.capture(), operationName);
+                ContextManager.stopSpan(span);
+                ContextManager.getRuntimeContext().put(Constants.SPRING_CLOUD_GATEWAY_TRANSMITTER, transmitter);
+            }
         }
     }
 
@@ -70,4 +75,17 @@ public class NettyRoutingFilterInterceptor implements InstanceMethodsAroundInter
     public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
                                       Class<?>[] argumentsTypes, Throwable t) {
     }
+
+    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;
+            }
+        } else if (o instanceof DefaultServerWebExchange) {
+            instance = (EnhancedInstance) o;
+        }
+        return instance;
+    }
 }