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:50 UTC
[skywalking] branch origin/gateway_fix created (now 6201136)
This is an automated email from the ASF dual-hosted git repository.
zhaoyuguang pushed a change to branch origin/gateway_fix
in repository https://gitbox.apache.org/repos/asf/skywalking.git.
at 6201136 gateway & webflux compatible with these scene
This branch includes the following new commits:
new 6201136 gateway & webflux compatible with these scene
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[skywalking] 01/01: gateway & webflux compatible with these scene
Posted by zh...@apache.org.
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;
+ }
}