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

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-java.git


The following commit(s) were added to refs/heads/main by this push:
     new 4d76f3e2f Fix NPE in gateway plugin when the timer triggers webflux 
webclient call. (#164)
4d76f3e2f is described below

commit 4d76f3e2fb9bfa2745a53439901c296304c5625e
Author: wuwen <[email protected]>
AuthorDate: Mon Apr 25 09:28:27 2022 +0800

    Fix NPE in gateway plugin when the timer triggers webflux webclient call. 
(#164)
---
 CHANGES.md                                                   |  1 +
 .../cloud/gateway/v20x/HttpClientRequestInterceptor.java     | 12 +++++++++++-
 .../gateway/v21x/HttpClientFinalizerSendInterceptor.java     | 12 +++++++++++-
 .../gateway/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<HttpClientResponse> responseMono = (Mono<HttpClientResponse>) ret;
         return responseMono.doAfterSuccessOrError(new 
BiConsumer<HttpClientResponse, Throwable>() {
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;
     }

Reply via email to