未验证 提交 cbcb592c 编写于 作者: X Xin,Zhang 提交者: GitHub

Merge pull request #738 from YunaiV/master-5.0

Concurrency conflicts in Spring plugin #735
...@@ -18,25 +18,26 @@ ...@@ -18,25 +18,26 @@
package org.apache.skywalking.apm.plugin.spring.mvc.commons; package org.apache.skywalking.apm.plugin.spring.mvc.commons;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.NativeWebRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
public class EnhanceRequireObjectCache { public class EnhanceRequireObjectCache {
private PathMappingCache pathMappingCache; private PathMappingCache pathMappingCache;
private NativeWebRequest nativeWebRequest; private ThreadLocal<NativeWebRequest> nativeWebRequest = new ThreadLocal<NativeWebRequest>();
private HttpServletResponse httpResponse; private ThreadLocal<HttpServletResponse> httpResponse = new ThreadLocal<HttpServletResponse>();
public void setPathMappingCache(PathMappingCache pathMappingCache) { public void setPathMappingCache(PathMappingCache pathMappingCache) {
this.pathMappingCache = pathMappingCache; this.pathMappingCache = pathMappingCache;
} }
public HttpServletResponse getHttpServletResponse() { public HttpServletResponse getHttpServletResponse() {
return httpResponse == null ? (HttpServletResponse)nativeWebRequest.getNativeResponse() : httpResponse; return httpResponse.get() == null ? (HttpServletResponse) nativeWebRequest.get().getNativeResponse() : httpResponse.get();
} }
public void setNativeWebRequest(NativeWebRequest nativeWebRequest) { public void setNativeWebRequest(NativeWebRequest nativeWebRequest) {
this.nativeWebRequest = nativeWebRequest; this.nativeWebRequest.set(nativeWebRequest);
} }
public String findPathMapping(Method method) { public String findPathMapping(Method method) {
...@@ -52,10 +53,12 @@ public class EnhanceRequireObjectCache { ...@@ -52,10 +53,12 @@ public class EnhanceRequireObjectCache {
} }
public void setHttpResponse(HttpServletResponse httpResponse) { public void setHttpResponse(HttpServletResponse httpResponse) {
this.httpResponse = httpResponse; this.httpResponse.set(httpResponse);
} }
public HttpServletResponse getHttpResponse() { public void clearRequestAndResponse() {
return httpResponse; setNativeWebRequest(null);
setHttpResponse(null);
} }
} }
...@@ -19,27 +19,28 @@ ...@@ -19,27 +19,28 @@
package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor; package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor;
import java.lang.reflect.Method; import org.apache.skywalking.apm.agent.core.context.CarrierItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.skywalking.apm.agent.core.context.ContextCarrier; import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.tag.Tags;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
import org.apache.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache;
import org.apache.skywalking.apm.agent.core.context.CarrierItem;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
import org.apache.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/** /**
* the abstract method inteceptor * the abstract method inteceptor
*/ */
public abstract class AbstractMethodInteceptor implements InstanceMethodsAroundInterceptor { public abstract class AbstractMethodInterceptor implements InstanceMethodsAroundInterceptor {
public abstract String getRequestURL(Method method); public abstract String getRequestURL(Method method);
@Override @Override
...@@ -72,15 +73,19 @@ public abstract class AbstractMethodInteceptor implements InstanceMethodsAroundI ...@@ -72,15 +73,19 @@ public abstract class AbstractMethodInteceptor implements InstanceMethodsAroundI
@Override @Override
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
Object ret) throws Throwable { Object ret) throws Throwable {
HttpServletResponse response = ((EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField()).getHttpServletResponse(); try {
HttpServletResponse response = ((EnhanceRequireObjectCache) objInst.getSkyWalkingDynamicField()).getHttpServletResponse();
AbstractSpan span = ContextManager.activeSpan(); AbstractSpan span = ContextManager.activeSpan();
if (response.getStatus() >= 400) { if (response.getStatus() >= 400) {
span.errorOccurred(); span.errorOccurred();
Tags.STATUS_CODE.set(span, Integer.toString(response.getStatus())); Tags.STATUS_CODE.set(span, Integer.toString(response.getStatus()));
}
ContextManager.stopSpan();
return ret;
} finally {
((EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField()).clearRequestAndResponse();
} }
ContextManager.stopSpan();
return ret;
} }
@Override @Override
......
...@@ -18,13 +18,14 @@ ...@@ -18,13 +18,14 @@
package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor; package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletResponse;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.apache.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; import org.apache.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
public class InvokeHandlerMethodInterceptor implements InstanceMethodsAroundInterceptor { public class InvokeHandlerMethodInterceptor implements InstanceMethodsAroundInterceptor {
@Override @Override
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
...@@ -42,6 +43,5 @@ public class InvokeHandlerMethodInterceptor implements InstanceMethodsAroundInte ...@@ -42,6 +43,5 @@ public class InvokeHandlerMethodInterceptor implements InstanceMethodsAroundInte
@Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
Class<?>[] argumentsTypes, Throwable t) { Class<?>[] argumentsTypes, Throwable t) {
} }
} }
...@@ -19,16 +19,17 @@ ...@@ -19,16 +19,17 @@
package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor; package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor;
import java.lang.reflect.Method;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import java.lang.reflect.Method;
/** /**
* The <code>RequestMappingMethodInterceptor</code> only use the first mapping value. * The <code>RequestMappingMethodInterceptor</code> only use the first mapping value.
* it will inteceptor with <code>@RequestMapping</code> * it will inteceptor with <code>@RequestMapping</code>
* *
* @author clevertension * @author clevertension
*/ */
public class RequestMappingMethodInterceptor extends AbstractMethodInteceptor { public class RequestMappingMethodInterceptor extends AbstractMethodInterceptor {
@Override @Override
public String getRequestURL(Method method) { public String getRequestURL(Method method) {
String requestURL = ""; String requestURL = "";
......
...@@ -19,12 +19,9 @@ ...@@ -19,12 +19,9 @@
package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor; package org.apache.skywalking.apm.plugin.spring.mvc.commons.interceptor;
import org.springframework.web.bind.annotation.*;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
/** /**
* The <code>RestMappingMethodInterceptor</code> only use the first mapping value. * The <code>RestMappingMethodInterceptor</code> only use the first mapping value.
...@@ -34,7 +31,7 @@ import org.springframework.web.bind.annotation.PutMapping; ...@@ -34,7 +31,7 @@ import org.springframework.web.bind.annotation.PutMapping;
* *
* @author clevertension * @author clevertension
*/ */
public class RestMappingMethodInterceptor extends AbstractMethodInteceptor { public class RestMappingMethodInterceptor extends AbstractMethodInterceptor {
@Override @Override
public String getRequestURL(Method method) { public String getRequestURL(Method method) {
String requestURL = ""; String requestURL = "";
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册