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