From 4d76f3e2fb9bfa2745a53439901c296304c5625e Mon Sep 17 00:00:00 2001 From: wuwen Date: Mon, 25 Apr 2022 09:28:27 +0800 Subject: [PATCH] Fix NPE in gateway plugin when the timer triggers webflux webclient call. (#164) --- CHANGES.md | 1 + .../gateway/v20x/HttpClientRequestInterceptor.java | 12 +++++++++++- .../v21x/HttpClientFinalizerSendInterceptor.java | 12 +++++++++++- .../v3x/HttpClientFinalizerSendInterceptor.java | 12 +++++++++++- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index bbb594179..bf08b72c4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ Release Notes. * Add layer field to event when reporting. * Remove redundant `shade.package` property. * Add servicecomb-2.x plugin and Testcase. +* Fix NPE in gateway plugin when the timer triggers webflux webclient call. #### Documentation diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v20x/HttpClientRequestInterceptor.java b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v20x/HttpClientRequestInterceptor.java index a0630305e..00613b602 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v20x/HttpClientRequestInterceptor.java +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v20x/HttpClientRequestInterceptor.java @@ -45,6 +45,16 @@ public class HttpClientRequestInterceptor implements InstanceMethodsAroundInterc final Object[] allArguments, final Class[] argumentsTypes, final MethodInterceptResult result) throws Throwable { + + /* + In this plug-in, the HttpClientFinalizerSendInterceptor depends on the NettyRoutingFilterInterceptor + When the NettyRoutingFilterInterceptor is not executed, the HttpClientFinalizerSendInterceptor has no meaning to be executed independently + and using ContextManager.activeSpan() method would cause NPE as active span does not exist. + */ + if (!ContextManager.isActive()) { + return; + } + AbstractSpan span = ContextManager.activeSpan(); URL url = new URL((String) allArguments[1]); @@ -78,7 +88,7 @@ public class HttpClientRequestInterceptor implements InstanceMethodsAroundInterc final Method method, final Object[] allArguments, final Class[] argumentsTypes, - final Object ret) throws Throwable { + final Object ret) { EnhanceCacheObject enhanceCacheObject = (EnhanceCacheObject) objInst.getSkyWalkingDynamicField(); Mono responseMono = (Mono) ret; return responseMono.doAfterSuccessOrError(new BiConsumer() { 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/HttpClientFinalizerSendInterceptor.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/HttpClientFinalizerSendInterceptor.java index c8fe43ce3..add09f4c7 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/HttpClientFinalizerSendInterceptor.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/HttpClientFinalizerSendInterceptor.java @@ -42,6 +42,16 @@ public class HttpClientFinalizerSendInterceptor implements InstanceMethodsAround public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { EnhanceObjectCache enhanceObjectCache = (EnhanceObjectCache) objInst.getSkyWalkingDynamicField(); + + /* + In this plug-in, the HttpClientFinalizerSendInterceptor depends on the NettyRoutingFilterInterceptor + When the NettyRoutingFilterInterceptor is not executed, the HttpClientFinalizerSendInterceptor has no meaning to be executed independently + and using ContextManager.activeSpan() method would cause NPE as active span does not exist. + */ + if (!ContextManager.isActive()) { + return; + } + AbstractSpan span = ContextManager.activeSpan(); span.prepareForAsync(); @@ -85,7 +95,7 @@ public class HttpClientFinalizerSendInterceptor implements InstanceMethodsAround @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret) throws Throwable { + Object ret) { ((EnhancedInstance) ret).setSkyWalkingDynamicField(objInst.getSkyWalkingDynamicField()); return ret; } diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v3x/HttpClientFinalizerSendInterceptor.java b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v3x/HttpClientFinalizerSendInterceptor.java index e1c5e35bf..3e2963d9b 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v3x/HttpClientFinalizerSendInterceptor.java +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/cloud/gateway/v3x/HttpClientFinalizerSendInterceptor.java @@ -53,6 +53,16 @@ public class HttpClientFinalizerSendInterceptor implements InstanceMethodsAround if (enhanceObjectCache == null) { return; } + + /* + In this plug-in, the HttpClientFinalizerSendInterceptor depends on the NettyRoutingFilterInterceptor + When the NettyRoutingFilterInterceptor is not executed, the HttpClientFinalizerSendInterceptor has no meaning to be executed independently + and using ContextManager.activeSpan() method would cause NPE as active span does not exist. + */ + if (!ContextManager.isActive()) { + return; + } + AbstractSpan span = ContextManager.activeSpan(); span.prepareForAsync(); @@ -92,7 +102,7 @@ public class HttpClientFinalizerSendInterceptor implements InstanceMethodsAround @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret) throws Throwable { + Object ret) { ((EnhancedInstance) ret).setSkyWalkingDynamicField(objInst.getSkyWalkingDynamicField()); return ret; }