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;
+ }
}