From b02a8734664199de3bf2235fb30a55514717c67d Mon Sep 17 00:00:00 2001 From: ascrutae Date: Wed, 6 Dec 2017 11:55:12 +0800 Subject: [PATCH] support spring mvc spring 4.0 framework --- .../mvc-annotation-3.x-plugin/pom.xml | 6 + .../v3/ControllerConstructorInterceptor.java | 2 + .../mvc/v3/ControllerMethodInterceptor.java | 100 ---------- .../v3/HandlerMethodInvokerInterceptor.java | 1 + .../v3/define/ControllerInstrumentation.java | 2 +- .../define/HandlerMethodInstrumentation.java | 4 +- .../InvocableHandlerInstrumentation.java | 4 +- .../ControllerConstructorInterceptorTest.java | 2 + .../v3/ControllerMethodInterceptorTest.java | 178 ------------------ .../spring/mvc/v3/GetBeanInterceptorTest.java | 2 + .../v3/InvokeForRequestInterceptorTest.java | 1 + .../mvc-annotation-4.x-plugin/pom.xml | 6 + .../v4/ControllerConstructorInterceptor.java | 7 +- .../AbstractControllerInstrumentation.java | 17 +- .../AbstractSpring4Instrumentation.java} | 29 +-- .../define/HandlerMethodInstrumentation.java | 73 +++++++ .../InvocableHandlerInstrumentation.java | 73 +++++++ .../src/main/resources/skywalking-plugin.def | 2 + .../ControllerConstructorInterceptorTest.java | 7 +- .../spring/mvc/v4/PathMappingCacheTest.java | 1 + .../RequestMappingMethodInterceptorTest.java | 14 +- .../v4/RestMappingMethodInterceptorTest.java | 13 +- .../define/ControllerInstrumentationTest.java | 4 +- .../RestControllerInstrumentationTest.java | 4 +- .../mvc-annotation-commons/pom.xml | 54 ++++++ .../plugin/spring/mvc/commons/Constants.java | 34 ++++ .../commons}/EnhanceRequireObjectCache.java | 2 +- .../spring/mvc/commons}/PathMappingCache.java | 2 +- .../AbstractMethodInteceptor.java | 7 +- .../interceptor}/GetBeanInterceptor.java | 3 +- .../InvokeForRequestInterceptor.java | 5 +- .../RequestMappingMethodInterceptor.java | 2 +- .../RestMappingMethodInterceptor.java | 2 +- .../apm-sdk-plugin/spring-plugins/pom.xml | 1 + 34 files changed, 324 insertions(+), 340 deletions(-) delete mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerMethodInterceptor.java delete mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerMethodInterceptorTest.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/{PathMappingCache.java => define/AbstractSpring4Instrumentation.java} (50%) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/HandlerMethodInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/InvocableHandlerInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/Constants.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/{mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3 => mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons}/EnhanceRequireObjectCache.java (96%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/{mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3 => mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons}/PathMappingCache.java (96%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/{mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4 => mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor}/AbstractMethodInteceptor.java (90%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/{mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3 => mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor}/GetBeanInterceptor.java (93%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/{mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3 => mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor}/InvokeForRequestInterceptor.java (96%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/{mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4 => mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor}/RequestMappingMethodInterceptor.java (95%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/{mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4 => mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor}/RestMappingMethodInterceptor.java (98%) diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml index 7c9cb95b4..63fee0ac1 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml @@ -50,5 +50,11 @@ 3.0.1 provided + + org.skywalking + apm-springmvc-annotation-commons + ${project.version} + provided + diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerConstructorInterceptor.java index df1d1e9c6..634d0a506 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerConstructorInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerConstructorInterceptor.java @@ -20,6 +20,8 @@ package org.skywalking.apm.plugin.spring.mvc.v3; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; +import org.skywalking.apm.plugin.spring.mvc.commons.PathMappingCache; import org.springframework.web.bind.annotation.RequestMapping; /** diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerMethodInterceptor.java deleted file mode 100644 index 43f51dbd7..000000000 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerMethodInterceptor.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2017, OpenSkywalking Organization All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Project repository: https://github.com/OpenSkywalking/skywalking - */ - -package org.skywalking.apm.plugin.spring.mvc.v3; - -import java.lang.reflect.Method; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.skywalking.apm.agent.core.context.CarrierItem; -import org.skywalking.apm.agent.core.context.ContextCarrier; -import org.skywalking.apm.agent.core.context.ContextManager; -import org.skywalking.apm.agent.core.context.tag.Tags; -import org.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.skywalking.apm.agent.core.context.trace.SpanLayer; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.skywalking.apm.network.trace.component.ComponentsDefine; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -/** - * {@link ControllerMethodInterceptor} create entry span when the client call the method annotation with {@link - * RequestMapping} in the class annotation with {@link org.springframework.stereotype.Controller}. - * - * @author zhangxin - */ -public class ControllerMethodInterceptor implements InstanceMethodsAroundInterceptor { - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInterceptResult result) throws Throwable { - EnhanceRequireObjectCache pathMappingCache = (EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField(); - String requestURL = pathMappingCache.findPathMapping(method); - if (requestURL == null) { - requestURL = getRequestURL(method); - pathMappingCache.addPathMapping(method, requestURL); - requestURL = pathMappingCache.findPathMapping(method); - } - - HttpServletRequest request = - ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); - - ContextCarrier contextCarrier = new ContextCarrier(); - CarrierItem next = contextCarrier.items(); - while (next.hasNext()) { - next = next.next(); - next.setHeadValue(request.getHeader(next.getHeadKey())); - } - - AbstractSpan span = ContextManager.createEntrySpan(requestURL, contextCarrier); - Tags.URL.set(span, request.getRequestURL().toString()); - Tags.HTTP.METHOD.set(span, request.getMethod()); - span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION); - SpanLayer.asHttp(span); - } - - @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret) throws Throwable { - HttpServletResponse response = ((EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField()).getHttpServletResponse(); - AbstractSpan span = ContextManager.activeSpan(); - if (response.getStatus() >= 400) { - span.errorOccurred(); - Tags.STATUS_CODE.set(span, Integer.toString(response.getStatus())); - } - ContextManager.stopSpan(); - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, - Class[] argumentsTypes, Throwable t) { - ContextManager.activeSpan().errorOccurred().log(t); - } - - public String getRequestURL(Method method) { - String requestURL = ""; - RequestMapping methodRequestMapping = method.getAnnotation(RequestMapping.class); - if (methodRequestMapping.value().length > 0) { - requestURL = methodRequestMapping.value()[0]; - } - return requestURL; - } -} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/HandlerMethodInvokerInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/HandlerMethodInvokerInterceptor.java index 52dd64a32..a4a3edfe3 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/HandlerMethodInvokerInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/HandlerMethodInvokerInterceptor.java @@ -22,6 +22,7 @@ import java.lang.reflect.Method; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; import org.springframework.web.context.request.NativeWebRequest; /** diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/ControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/ControllerInstrumentation.java index 4b22c7550..438980c62 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/ControllerInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/ControllerInstrumentation.java @@ -28,6 +28,7 @@ import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static org.skywalking.apm.agent.core.plugin.match.ClassAnnotationMatch.byClassAnnotationMatch; +import static org.skywalking.apm.plugin.spring.mvc.commons.Constants.REQUEST_MAPPING_METHOD_INTERCEPTOR; /** * {@link ControllerInstrumentation} intercept the constructor and the methods annotated with {@link @@ -40,7 +41,6 @@ public class ControllerInstrumentation extends AbstractSpring3Instrumentation { public static final String CONTROLLER_ENHANCE_ANNOTATION = "org.springframework.stereotype.Controller"; public static final String CONSTRUCTOR_INTERCEPTOR = "org.skywalking.apm.plugin.spring.mvc.v3.ControllerConstructorInterceptor"; public static final String REQUEST_MAPPING_ENHANCE_ANNOTATION = "org.springframework.web.bind.annotation.RequestMapping"; - public static final String REQUEST_MAPPING_METHOD_INTERCEPTOR = "org.skywalking.apm.plugin.spring.mvc.v3.ControllerMethodInterceptor"; @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/HandlerMethodInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/HandlerMethodInstrumentation.java index 06819c1a9..6e481cd7d 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/HandlerMethodInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/HandlerMethodInstrumentation.java @@ -26,6 +26,7 @@ import org.skywalking.apm.agent.core.plugin.match.ClassMatch; import static net.bytebuddy.matcher.ElementMatchers.named; import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; +import static org.skywalking.apm.plugin.spring.mvc.commons.Constants.GET_BEAN_INTERCEPTOR; /** * {@link HandlerMethodInstrumentation} intercept the getBean method in the @@ -36,7 +37,6 @@ import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; public class HandlerMethodInstrumentation extends AbstractSpring3Instrumentation { public static final String ENHANCE_METHOD = "getBean"; - public static final String INTERCEPTOR_CLASS = "org.skywalking.apm.plugin.spring.mvc.v3.GetBeanInterceptor"; public static final String ENHANCE_CLASS = "org.springframework.web.method.HandlerMethod"; @Override @@ -55,7 +55,7 @@ public class HandlerMethodInstrumentation extends AbstractSpring3Instrumentation @Override public String getMethodsInterceptor() { - return INTERCEPTOR_CLASS; + return GET_BEAN_INTERCEPTOR; } @Override diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/InvocableHandlerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/InvocableHandlerInstrumentation.java index 0b87e8767..89b953972 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/InvocableHandlerInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/define/InvocableHandlerInstrumentation.java @@ -26,6 +26,7 @@ import org.skywalking.apm.agent.core.plugin.match.ClassMatch; import static net.bytebuddy.matcher.ElementMatchers.named; import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; +import static org.skywalking.apm.plugin.spring.mvc.commons.Constants.INVOKE_FOR_REQUEST_INTERCEPTOR; /** * {@link InvocableHandlerInstrumentation} intercept the invokeForRequest method in the @@ -36,7 +37,6 @@ import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; public class InvocableHandlerInstrumentation extends AbstractSpring3Instrumentation { public static final String ENHANCE_METHOD = "invokeForRequest"; - public static final String INTERCEPTOR_CLASS = "org.skywalking.apm.plugin.spring.mvc.v3.InvokeForRequestInterceptor"; public static final String ENHANCE_CLASS = "org.springframework.web.method.support.InvocableHandlerMethod"; @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { @@ -53,7 +53,7 @@ public class InvocableHandlerInstrumentation extends AbstractSpring3Instrumentat @Override public String getMethodsInterceptor() { - return INTERCEPTOR_CLASS; + return INVOKE_FOR_REQUEST_INTERCEPTOR; } @Override diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerConstructorInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerConstructorInterceptorTest.java index 678a6bdea..a36a71edd 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerConstructorInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerConstructorInterceptorTest.java @@ -24,6 +24,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.modules.junit4.PowerMockRunner; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; +import org.skywalking.apm.plugin.spring.mvc.commons.PathMappingCache; import org.springframework.web.bind.annotation.RequestMapping; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerMethodInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerMethodInterceptorTest.java deleted file mode 100644 index e971815b4..000000000 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/ControllerMethodInterceptorTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2017, OpenSkywalking Organization All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Project repository: https://github.com/OpenSkywalking/skywalking - */ - -package org.skywalking.apm.plugin.spring.mvc.v3; - -import java.lang.reflect.Method; -import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.modules.junit4.PowerMockRunnerDelegate; -import org.skywalking.apm.agent.core.context.SW3CarrierItem; -import org.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; -import org.skywalking.apm.agent.core.context.trace.LogDataEntity; -import org.skywalking.apm.agent.core.context.trace.SpanLayer; -import org.skywalking.apm.agent.core.context.trace.TraceSegment; -import org.skywalking.apm.agent.core.context.trace.TraceSegmentRef; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.skywalking.apm.agent.test.helper.SegmentHelper; -import org.skywalking.apm.agent.test.helper.SegmentRefHelper; -import org.skywalking.apm.agent.test.helper.SpanHelper; -import org.skywalking.apm.agent.test.tools.AgentServiceRule; -import org.skywalking.apm.agent.test.tools.SegmentStorage; -import org.skywalking.apm.agent.test.tools.SegmentStoragePoint; -import org.skywalking.apm.agent.test.tools.TracingSegmentRunner; -import org.skywalking.apm.network.trace.component.ComponentsDefine; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.powermock.api.mockito.PowerMockito.mockStatic; -import static org.powermock.api.mockito.PowerMockito.when; -import static org.skywalking.apm.agent.test.tools.SpanAssert.assertComponent; -import static org.skywalking.apm.agent.test.tools.SpanAssert.assertException; -import static org.skywalking.apm.agent.test.tools.SpanAssert.assertLayer; -import static org.skywalking.apm.agent.test.tools.SpanAssert.assertTag; - -@RunWith(PowerMockRunner.class) -@PowerMockRunnerDelegate(TracingSegmentRunner.class) -@PrepareForTest({RequestContextHolder.class, ServletRequestAttributes.class}) -public class ControllerMethodInterceptorTest { - - @SegmentStoragePoint - private SegmentStorage segmentStorage; - - @Rule - public AgentServiceRule serviceRule = new AgentServiceRule(); - - @Mock - private EnhancedInstance enhancedInstance; - @Mock - private NativeWebRequest nativeWebRequest; - @Mock - private HttpServletResponse httpServletResponse; - @Mock - private ServletRequestAttributes servletRequestAttributes; - @Mock - private HttpServletRequest httpServletRequest; - - private Method method; - - private EnhanceRequireObjectCache enhanceRequireObjectCache; - private ControllerMethodInterceptor controllerMethodInterceptor; - - @Before - public void setUp() throws NoSuchMethodException { - controllerMethodInterceptor = new ControllerMethodInterceptor(); - enhanceRequireObjectCache = new EnhanceRequireObjectCache(); - enhanceRequireObjectCache.setPathMappingCache(new PathMappingCache("/test")); - method = ControllerMethodInterceptorTest.class.getDeclaredMethod("mockControllerService"); - enhanceRequireObjectCache.addPathMapping(method, "/test"); - - enhanceRequireObjectCache.setNativeWebRequest(nativeWebRequest); - enhanceRequireObjectCache.setPathMappingCache(new PathMappingCache("/test")); - - mockStatic(RequestContextHolder.class); - when(servletRequestAttributes.getRequest()).thenReturn(httpServletRequest); - when(nativeWebRequest.getNativeResponse()).thenReturn(httpServletResponse); - when(enhancedInstance.getSkyWalkingDynamicField()).thenReturn(enhanceRequireObjectCache); - when(RequestContextHolder.getRequestAttributes()).thenReturn(servletRequestAttributes); - when(httpServletRequest.getMethod()).thenReturn("GET"); - when(httpServletRequest.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/skywalking-test/test")); - } - - @Test - public void testWithoutSerializedContextData() throws Throwable { - controllerMethodInterceptor.beforeMethod(enhancedInstance, method, null, null, null); - controllerMethodInterceptor.afterMethod(enhancedInstance, method, null, null, null); - - assertThat(segmentStorage.getTraceSegments().size(), is(1)); - TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); - - List spans = SegmentHelper.getSpans(traceSegment); - assertThat(spans.size(), is(1)); - assertRequestSpan(spans.get(0)); - } - - @Test - public void testWithSerializedContextData() throws Throwable { - Mockito.when(httpServletRequest.getHeader(SW3CarrierItem.HEADER_NAME)).thenReturn("1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); - - controllerMethodInterceptor.beforeMethod(enhancedInstance, method, null, null, null); - controllerMethodInterceptor.afterMethod(enhancedInstance, method, null, null, null); - - assertThat(segmentStorage.getTraceSegments().size(), is(1)); - TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); - - List spans = SegmentHelper.getSpans(traceSegment); - assertThat(spans.size(), is(1)); - assertRequestSpan(spans.get(0)); - - List traceSegmentRefs = traceSegment.getRefs(); - assertThat(traceSegmentRefs.size(), is(1)); - assertTraceSegmentRef(traceSegmentRefs.get(0)); - } - - @Test - public void testOccurException() throws Throwable { - controllerMethodInterceptor.beforeMethod(enhancedInstance, method, null, null, null); - controllerMethodInterceptor.handleMethodException(enhancedInstance, method, null, null, new RuntimeException()); - controllerMethodInterceptor.afterMethod(enhancedInstance, method, null, null, null); - - assertThat(segmentStorage.getTraceSegments().size(), is(1)); - TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); - - List spans = SegmentHelper.getSpans(traceSegment); - assertThat(spans.size(), is(1)); - assertRequestSpan(spans.get(0)); - - List logDataEntities = SpanHelper.getLogs(spans.get(0)); - assertThat(logDataEntities.size(), is(1)); - assertException(logDataEntities.get(0), RuntimeException.class); - } - - private void assertTraceSegmentRef(TraceSegmentRef ref) { - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(1)); - assertThat(SegmentRefHelper.getSpanId(ref), is(3)); - assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111")); - } - - private void assertRequestSpan(AbstractTracingSpan span) { - assertThat(span.getOperationName(), is("/test/test")); - assertComponent(span, ComponentsDefine.SPRING_MVC_ANNOTATION); - assertTag(span, 0, "http://localhost:8080/skywalking-test/test"); - assertThat(span.isEntry(), is(true)); - assertLayer(span, SpanLayer.HTTP); - } - - @RequestMapping("/test") - public void mockControllerService() { - - } -} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/GetBeanInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/GetBeanInterceptorTest.java index d5b73d0b1..6dc0fd067 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/GetBeanInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/GetBeanInterceptorTest.java @@ -25,6 +25,8 @@ import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; +import org.skywalking.apm.plugin.spring.mvc.commons.interceptor.GetBeanInterceptor; import org.springframework.web.context.request.NativeWebRequest; import static org.mockito.Mockito.times; diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/InvokeForRequestInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/InvokeForRequestInterceptorTest.java index 5cd45920a..b9bc6055a 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/InvokeForRequestInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v3/InvokeForRequestInterceptorTest.java @@ -25,6 +25,7 @@ import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.skywalking.apm.plugin.spring.mvc.commons.interceptor.InvokeForRequestInterceptor; import org.springframework.web.context.request.NativeWebRequest; import static org.mockito.Mockito.times; diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml index d59f27b4d..9a58c353a 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml @@ -50,5 +50,11 @@ 3.0.1 provided + + org.skywalking + apm-springmvc-annotation-commons + ${project.version} + provided + diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptor.java index 83f72c466..1a79730f3 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptor.java @@ -20,6 +20,8 @@ package org.skywalking.apm.plugin.spring.mvc.v4; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; +import org.skywalking.apm.plugin.spring.mvc.commons.PathMappingCache; import org.springframework.web.bind.annotation.RequestMapping; /** @@ -48,7 +50,8 @@ public class ControllerConstructorInterceptor implements InstanceConstructorInte basePath = basePathRequestMapping.path()[0]; } } - PathMappingCache pathMappingCache = new PathMappingCache(basePath); - objInst.setSkyWalkingDynamicField(pathMappingCache); + EnhanceRequireObjectCache enhanceRequireObjectCache = new EnhanceRequireObjectCache(); + enhanceRequireObjectCache.setPathMappingCache(new PathMappingCache(basePath)); + objInst.setSkyWalkingDynamicField(enhanceRequireObjectCache); } } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/AbstractControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/AbstractControllerInstrumentation.java index e8259aec3..c0f224588 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/AbstractControllerInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/AbstractControllerInstrumentation.java @@ -22,13 +22,14 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.skywalking.apm.agent.core.plugin.match.ClassMatch; import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static org.skywalking.apm.agent.core.plugin.match.ClassAnnotationMatch.byClassAnnotationMatch; +import static org.skywalking.apm.plugin.spring.mvc.commons.Constants.REQUEST_MAPPING_METHOD_INTERCEPTOR; +import static org.skywalking.apm.plugin.spring.mvc.commons.Constants.REST_MAPPING_METHOD_INTERCEPTOR; /** * {@link ControllerInstrumentation} enhance all constructor and method annotated with @@ -45,7 +46,7 @@ import static org.skywalking.apm.agent.core.plugin.match.ClassAnnotationMatch.by * * @author zhangxin */ -public abstract class AbstractControllerInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public abstract class AbstractControllerInstrumentation extends AbstractSpring4Instrumentation { @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[] { @@ -74,7 +75,7 @@ public abstract class AbstractControllerInstrumentation extends ClassInstanceMet @Override public String getMethodsInterceptor() { - return "org.skywalking.apm.plugin.spring.mvc.v4.RequestMappingMethodInterceptor"; + return REQUEST_MAPPING_METHOD_INTERCEPTOR; } @Override @@ -94,7 +95,7 @@ public abstract class AbstractControllerInstrumentation extends ClassInstanceMet @Override public String getMethodsInterceptor() { - return "org.skywalking.apm.plugin.spring.mvc.v4.RestMappingMethodInterceptor"; + return REST_MAPPING_METHOD_INTERCEPTOR; } @Override @@ -112,12 +113,4 @@ public abstract class AbstractControllerInstrumentation extends ClassInstanceMet protected abstract String[] getEnhanceAnnotations(); - @Override protected String[] witnessClasses() { - /** - * @see {@link org.springframework.web.servlet.tags.ArgumentTag} - */ - return new String[]{ - "org.springframework.web.servlet.tags.ArgumentTag" - }; - } } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/PathMappingCache.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java similarity index 50% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/PathMappingCache.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java index ea49c81d3..50ee39a55 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/PathMappingCache.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/AbstractSpring4Instrumentation.java @@ -16,30 +16,15 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.plugin.spring.mvc.v4; +package org.skywalking.apm.plugin.spring.mvc.v4.define; -import java.lang.reflect.Method; -import java.util.concurrent.ConcurrentHashMap; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -/** - * The PathMappingCache represents a field - * - * @author wusheng - */ -public class PathMappingCache { - private String classPath = ""; +public abstract class AbstractSpring4Instrumentation extends ClassInstanceMethodsEnhancePluginDefine { + public static final String WITHNESS_CLASSES = "org.springframework.web.servlet.tags.ArgumentTag"; - private ConcurrentHashMap methodPathMapping = new ConcurrentHashMap(); - - public PathMappingCache(String classPath) { - this.classPath = classPath; - } - - public String findPathMapping(Method method) { - return methodPathMapping.get(method); - } - - public void addPathMapping(Method method, String methodPath) { - methodPathMapping.put(method, classPath + methodPath); + @Override + protected final String[] witnessClasses() { + return new String[] {WITHNESS_CLASSES}; } } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/HandlerMethodInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/HandlerMethodInstrumentation.java new file mode 100644 index 000000000..51198dfc8 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/HandlerMethodInstrumentation.java @@ -0,0 +1,73 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.plugin.spring.mvc.v4.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.skywalking.apm.agent.core.plugin.match.ClassMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; +import static org.skywalking.apm.plugin.spring.mvc.commons.Constants.GET_BEAN_INTERCEPTOR; + +/** + * {@link HandlerMethodInstrumentation} intercept the getBean method in the + * org.springframework.web.method.HandlerMethod class. + * + * @author zhangxin + */ +public class HandlerMethodInstrumentation extends AbstractSpring4Instrumentation { + + public static final String ENHANCE_METHOD = "getBean"; + public static final String ENHANCE_CLASS = "org.springframework.web.method.HandlerMethod"; + + @Override + protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named(ENHANCE_METHOD); + } + + @Override + public String getMethodsInterceptor() { + return GET_BEAN_INTERCEPTOR; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; + } + + @Override + protected ClassMatch enhanceClass() { + return byName(ENHANCE_CLASS); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/InvocableHandlerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/InvocableHandlerInstrumentation.java new file mode 100644 index 000000000..50704c80a --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/define/InvocableHandlerInstrumentation.java @@ -0,0 +1,73 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.plugin.spring.mvc.v4.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.skywalking.apm.agent.core.plugin.match.ClassMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; +import static org.skywalking.apm.plugin.spring.mvc.commons.Constants.INVOKE_FOR_REQUEST_INTERCEPTOR; + +/** + * {@link InvocableHandlerInstrumentation} intercept the invokeForRequest method in the + * org.springframework.web.method.support.InvocableHandlerMethod class. + * + * @author zhangxin + */ +public class InvocableHandlerInstrumentation extends AbstractSpring4Instrumentation { + + public static final String ENHANCE_METHOD = "invokeForRequest"; + public static final String ENHANCE_CLASS = "org.springframework.web.method.support.InvocableHandlerMethod"; + + @Override + protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named(ENHANCE_METHOD); + } + + @Override + public String getMethodsInterceptor() { + return INVOKE_FOR_REQUEST_INTERCEPTOR; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; + } + + @Override + protected ClassMatch enhanceClass() { + return byName(ENHANCE_CLASS); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/resources/skywalking-plugin.def index 9196c36f3..0cfc41c66 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/resources/skywalking-plugin.def @@ -1,2 +1,4 @@ spring-mvc-annotation-4.x=org.skywalking.apm.plugin.spring.mvc.v4.define.ControllerInstrumentation spring-mvc-annotation-4.x=org.skywalking.apm.plugin.spring.mvc.v4.define.RestControllerInstrumentation +spring-mvc-annotation-4.x=org.skywalking.apm.plugin.spring.mvc.v4.define.HandlerMethodInstrumentation +spring-mvc-annotation-4.x=org.skywalking.apm.plugin.spring.mvc.v4.define.InvocableHandlerInstrumentation diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptorTest.java index 0e96121a0..d5bb84419 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptorTest.java @@ -27,6 +27,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.test.tools.TracingSegmentRunner; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; import org.springframework.web.bind.annotation.RequestMapping; @RunWith(PowerMockRunner.class) @@ -45,7 +46,7 @@ public class ControllerConstructorInterceptorTest { @Test public void testOnConstruct_Accuracy1() throws Throwable { controllerConstructorInterceptor.onConstruct(inst1, null); - PathMappingCache cache = (PathMappingCache)inst1.getSkyWalkingDynamicField(); + EnhanceRequireObjectCache cache = (EnhanceRequireObjectCache)inst1.getSkyWalkingDynamicField(); Assert.assertNotNull(cache); Object obj = new Object(); @@ -58,7 +59,7 @@ public class ControllerConstructorInterceptorTest { @Test public void testOnConstruct_Accuracy2() throws Throwable { controllerConstructorInterceptor.onConstruct(inst2, null); - PathMappingCache cache = (PathMappingCache)inst2.getSkyWalkingDynamicField(); + EnhanceRequireObjectCache cache = (EnhanceRequireObjectCache)inst2.getSkyWalkingDynamicField(); Assert.assertNotNull(cache); Object obj = new Object(); @@ -71,7 +72,7 @@ public class ControllerConstructorInterceptorTest { @Test public void testOnConstruct_Accuracy3() throws Throwable { controllerConstructorInterceptor.onConstruct(inst3, null); - PathMappingCache cache = (PathMappingCache)inst3.getSkyWalkingDynamicField(); + EnhanceRequireObjectCache cache = (EnhanceRequireObjectCache)inst3.getSkyWalkingDynamicField(); Assert.assertNotNull(cache); Object obj = new Object(); diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/PathMappingCacheTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/PathMappingCacheTest.java index a0761b507..1f1f34dc6 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/PathMappingCacheTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/PathMappingCacheTest.java @@ -26,6 +26,7 @@ import org.junit.runner.RunWith; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; import org.skywalking.apm.agent.test.tools.TracingSegmentRunner; +import org.skywalking.apm.plugin.spring.mvc.commons.PathMappingCache; @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(TracingSegmentRunner.class) diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java index 2ed195557..c534b93f9 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java @@ -44,7 +44,11 @@ import org.skywalking.apm.agent.test.tools.SegmentStorage; import org.skywalking.apm.agent.test.tools.SegmentStoragePoint; import org.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.skywalking.apm.network.trace.component.ComponentsDefine; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; +import org.skywalking.apm.plugin.spring.mvc.commons.PathMappingCache; +import org.skywalking.apm.plugin.spring.mvc.commons.interceptor.RequestMappingMethodInterceptor; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -84,6 +88,9 @@ public class RequestMappingMethodInterceptorTest { private ControllerConstructorInterceptor controllerConstructorInterceptor; + @Mock + private NativeWebRequest nativeWebRequest; + @Before public void setUp() throws Exception { interceptor = new RequestMappingMethodInterceptor(); @@ -97,6 +104,7 @@ public class RequestMappingMethodInterceptorTest { when(request.getRequestURI()).thenReturn("/test/testRequestURL"); when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/testRequestURL")); when(response.getStatus()).thenReturn(200); + when(nativeWebRequest.getNativeResponse()).thenReturn(response); arguments = new Object[] {request, response}; argumentType = new Class[] {request.getClass(), response.getClass()}; @@ -157,16 +165,18 @@ public class RequestMappingMethodInterceptorTest { @RequestMapping(value = "/test") private class MockEnhancedInstance1 implements EnhancedInstance { - private Object value; + private EnhanceRequireObjectCache value = new EnhanceRequireObjectCache(); @Override public Object getSkyWalkingDynamicField() { + value.setPathMappingCache(new PathMappingCache("/test")); + value.setNativeWebRequest(nativeWebRequest); return value; } @Override public void setSkyWalkingDynamicField(Object value) { - this.value = value; + } } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java index 75db61abf..98b9603f1 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java @@ -44,12 +44,16 @@ import org.skywalking.apm.agent.test.tools.SegmentStorage; import org.skywalking.apm.agent.test.tools.SegmentStoragePoint; import org.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.skywalking.apm.network.trace.component.ComponentsDefine; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; +import org.skywalking.apm.plugin.spring.mvc.commons.PathMappingCache; +import org.skywalking.apm.plugin.spring.mvc.commons.interceptor.RestMappingMethodInterceptor; 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; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -80,6 +84,9 @@ public class RestMappingMethodInterceptorTest { @Mock private MethodInterceptResult methodInterceptResult; + @Mock + private NativeWebRequest nativeWebRequest; + private Object[] arguments; private Class[] argumentType; @@ -97,6 +104,7 @@ public class RestMappingMethodInterceptorTest { when(request.getServerName()).thenReturn("localhost"); when(request.getServerPort()).thenReturn(8080); when(response.getStatus()).thenReturn(200); + when(nativeWebRequest.getNativeResponse()).thenReturn(response); arguments = new Object[] {request, response}; argumentType = new Class[] {request.getClass(), response.getClass()}; @@ -263,16 +271,17 @@ public class RestMappingMethodInterceptorTest { @RequestMapping(value = "/test") private class MockEnhancedInstance1 implements EnhancedInstance { - private Object value; + private EnhanceRequireObjectCache value = new EnhanceRequireObjectCache(); @Override public Object getSkyWalkingDynamicField() { + value.setPathMappingCache(new PathMappingCache("/test")); + value.setNativeWebRequest(nativeWebRequest); return value; } @Override public void setSkyWalkingDynamicField(Object value) { - this.value = value; } } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/define/ControllerInstrumentationTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/define/ControllerInstrumentationTest.java index 1d245bb9c..8d99e4b33 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/define/ControllerInstrumentationTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/define/ControllerInstrumentationTest.java @@ -52,8 +52,8 @@ public class ControllerInstrumentationTest { public void testGetInstanceMethodsInterceptPoints() throws Throwable { InstanceMethodsInterceptPoint[] methodPoints = controllerInstrumentation.getInstanceMethodsInterceptPoints(); assertThat(methodPoints.length, is(2)); - assertThat(methodPoints[0].getMethodsInterceptor(), is("org.skywalking.apm.plugin.spring.mvc.v4.RequestMappingMethodInterceptor")); - assertThat(methodPoints[1].getMethodsInterceptor(), is("org.skywalking.apm.plugin.spring.mvc.v4.RestMappingMethodInterceptor")); + assertThat(methodPoints[0].getMethodsInterceptor(), is("org.skywalking.apm.plugin.spring.mvc.commons.interceptor.RequestMappingMethodInterceptor")); + assertThat(methodPoints[1].getMethodsInterceptor(), is("org.skywalking.apm.plugin.spring.mvc.commons.interceptor.RestMappingMethodInterceptor")); Assert.assertFalse(methodPoints[0].isOverrideArgs()); Assert.assertFalse(methodPoints[1].isOverrideArgs()); diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentationTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentationTest.java index c67fa6978..7939dd626 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentationTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/skywalking/apm/plugin/spring/mvc/v4/define/RestControllerInstrumentationTest.java @@ -50,8 +50,8 @@ public class RestControllerInstrumentationTest { public void testGetInstanceMethodsInterceptPoints() throws Throwable { InstanceMethodsInterceptPoint[] methodPoints = restControllerInstrumentation.getInstanceMethodsInterceptPoints(); assertThat(methodPoints.length, is(2)); - assertThat(methodPoints[0].getMethodsInterceptor(), is("org.skywalking.apm.plugin.spring.mvc.v4.RequestMappingMethodInterceptor")); - assertThat(methodPoints[1].getMethodsInterceptor(), is("org.skywalking.apm.plugin.spring.mvc.v4.RestMappingMethodInterceptor")); + assertThat(methodPoints[0].getMethodsInterceptor(), is("org.skywalking.apm.plugin.spring.mvc.commons.interceptor.RequestMappingMethodInterceptor")); + assertThat(methodPoints[1].getMethodsInterceptor(), is("org.skywalking.apm.plugin.spring.mvc.commons.interceptor.RestMappingMethodInterceptor")); Assert.assertFalse(methodPoints[0].isOverrideArgs()); Assert.assertFalse(methodPoints[1].isOverrideArgs()); diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml new file mode 100644 index 000000000..d5c93691f --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml @@ -0,0 +1,54 @@ + + + + + spring-plugins + org.skywalking + 3.2.6-2017 + + 4.0.0 + + apm-springmvc-annotation-commons + jar + + mvc-annotation-commons + http://maven.apache.org + + + + org.springframework + spring-core + 4.3.10.RELEASE + provided + + + org.springframework + spring-webmvc + 4.3.8.RELEASE + provided + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/Constants.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/Constants.java new file mode 100644 index 000000000..3f89eef1e --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/Constants.java @@ -0,0 +1,34 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.plugin.spring.mvc.commons; + +/** + * Interceptor class name constant variables + * + * @author zhangxin + */ +public class Constants { + public static final String GET_BEAN_INTERCEPTOR = "org.skywalking.apm.plugin.spring.mvc.commons.interceptor.GetBeanInterceptor"; + + public static final String INVOKE_FOR_REQUEST_INTERCEPTOR = "org.skywalking.apm.plugin.spring.mvc.commons.interceptor.InvokeForRequestInterceptor"; + + public static final String REQUEST_MAPPING_METHOD_INTERCEPTOR = "org.skywalking.apm.plugin.spring.mvc.commons.interceptor.RequestMappingMethodInterceptor"; + + public static final String REST_MAPPING_METHOD_INTERCEPTOR = "org.skywalking.apm.plugin.spring.mvc.commons.interceptor.RestMappingMethodInterceptor"; +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/EnhanceRequireObjectCache.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/EnhanceRequireObjectCache.java similarity index 96% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/EnhanceRequireObjectCache.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/EnhanceRequireObjectCache.java index eb92f4848..2547b49bd 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/EnhanceRequireObjectCache.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/EnhanceRequireObjectCache.java @@ -16,7 +16,7 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.plugin.spring.mvc.v3; +package org.skywalking.apm.plugin.spring.mvc.commons; import java.lang.reflect.Method; import javax.servlet.http.HttpServletResponse; diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/PathMappingCache.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/PathMappingCache.java similarity index 96% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/PathMappingCache.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/PathMappingCache.java index 5c732ce2c..698ff6864 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/PathMappingCache.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/PathMappingCache.java @@ -16,7 +16,7 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.plugin.spring.mvc.v3; +package org.skywalking.apm.plugin.spring.mvc.commons; import java.lang.reflect.Method; import java.util.concurrent.ConcurrentHashMap; diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/AbstractMethodInteceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInteceptor.java similarity index 90% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/AbstractMethodInteceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInteceptor.java index 62f02b6cf..0c8ecfa92 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/AbstractMethodInteceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/AbstractMethodInteceptor.java @@ -16,7 +16,7 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.plugin.spring.mvc.v4; +package org.skywalking.apm.plugin.spring.mvc.commons.interceptor; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; @@ -31,6 +31,7 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.skywalking.apm.network.trace.component.ComponentsDefine; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -43,7 +44,7 @@ public abstract class AbstractMethodInteceptor implements InstanceMethodsAroundI @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - PathMappingCache pathMappingCache = (PathMappingCache)objInst.getSkyWalkingDynamicField(); + EnhanceRequireObjectCache pathMappingCache = (EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField(); String requestURL = pathMappingCache.findPathMapping(method); if (requestURL == null) { requestURL = getRequestURL(method); @@ -70,7 +71,7 @@ public abstract class AbstractMethodInteceptor implements InstanceMethodsAroundI @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); + HttpServletResponse response = ((EnhanceRequireObjectCache)objInst.getSkyWalkingDynamicField()).getHttpServletResponse(); AbstractSpan span = ContextManager.activeSpan(); if (response.getStatus() >= 400) { diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/GetBeanInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/GetBeanInterceptor.java similarity index 93% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/GetBeanInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/GetBeanInterceptor.java index 7a771458a..7bfac0f2d 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/GetBeanInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/GetBeanInterceptor.java @@ -16,12 +16,13 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.plugin.spring.mvc.v3; +package org.skywalking.apm.plugin.spring.mvc.commons.interceptor; import java.lang.reflect.Method; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.skywalking.apm.plugin.spring.mvc.commons.EnhanceRequireObjectCache; import org.springframework.web.context.request.NativeWebRequest; /** diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/InvokeForRequestInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/InvokeForRequestInterceptor.java similarity index 96% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/InvokeForRequestInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/InvokeForRequestInterceptor.java index cc7cde4c7..846c0ac04 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v3/InvokeForRequestInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/InvokeForRequestInterceptor.java @@ -16,14 +16,15 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.plugin.spring.mvc.v3; +package org.skywalking.apm.plugin.spring.mvc.commons.interceptor; -import java.lang.reflect.Method; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.springframework.web.context.request.NativeWebRequest; +import java.lang.reflect.Method; + /** * {@link InvokeForRequestInterceptor} pass the {@link NativeWebRequest} object into the {@link * org.springframework.stereotype.Controller} object. diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/RequestMappingMethodInterceptor.java similarity index 95% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/RequestMappingMethodInterceptor.java index 4b1bdd4e5..1ecc8e2ae 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/RequestMappingMethodInterceptor.java @@ -16,7 +16,7 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.plugin.spring.mvc.v4; +package org.skywalking.apm.plugin.spring.mvc.commons.interceptor; import java.lang.reflect.Method; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/RestMappingMethodInterceptor.java similarity index 98% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/RestMappingMethodInterceptor.java index 571098b9e..9242d5bbb 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/skywalking/apm/plugin/spring/mvc/commons/interceptor/RestMappingMethodInterceptor.java @@ -16,7 +16,7 @@ * Project repository: https://github.com/OpenSkywalking/skywalking */ -package org.skywalking.apm.plugin.spring.mvc.v4; +package org.skywalking.apm.plugin.spring.mvc.commons.interceptor; import java.lang.reflect.Method; import org.springframework.web.bind.annotation.DeleteMapping; diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml index 87bdc4034..a655a84cd 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml @@ -35,6 +35,7 @@ spring-cloud mvc-annotation-3.x-plugin core-patch + mvc-annotation-commons pom