From 64b6c9229204db7c021204cd6ee08b932d42843e Mon Sep 17 00:00:00 2001 From: wendal chen Date: Thu, 21 Sep 2017 11:40:35 +0800 Subject: [PATCH 1/7] add: support nutz mvc and nutz http --- .../trace/component/ComponentsDefine.java | 8 ++- apm-sniffer/apm-agent/pom.xml | 10 +++ .../nutz-plugins/http-1.x-plugin/pom.xml | 24 +++++++ .../nutz/http/sync/SenderSendInterceptor.java | 62 ++++++++++++++++ .../sync/define/NutzHttpInstrumentation.java | 60 ++++++++++++++++ .../src/main/resources/skywalking-plugin.def | 1 + .../mvc-annotation-1.x-plugin/pom.xml | 30 ++++++++ .../mvc/ControllerConstructorInterceptor.java | 32 +++++++++ .../ControllerServiceMethodInterceptor.java | 71 +++++++++++++++++++ .../apm/plugin/nutz/mvc/PathMappingCache.java | 28 ++++++++ .../AbstractControllerInstrumentation.java | 65 +++++++++++++++++ .../mvc/define/ControllerInstrumentation.java | 10 +++ .../src/main/resources/skywalking-plugin.def | 1 + .../apm-sdk-plugin/nutz-plugins/pom.xml | 27 +++++++ apm-sniffer/apm-sdk-plugin/pom.xml | 1 + 15 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/resources/skywalking-plugin.def create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerConstructorInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerServiceMethodInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/AbstractControllerInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ControllerInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/resources/skywalking-plugin.def create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml diff --git a/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java b/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java index 86a684b59..3689660ef 100644 --- a/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java +++ b/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java @@ -35,6 +35,10 @@ public class ComponentsDefine { public static final OfficialComponent SPRING_MVC_ANNOTATION = new OfficialComponent(14, "SpringMVCAnnotation"); + public static final OfficialComponent NUTZ_MVC_ANNOTATION = new OfficialComponent(15, "NutzMVCAnnotation"); + + public static final OfficialComponent NUTZ_HTTP = new OfficialComponent(16, "NutzHttp"); + private static ComponentsDefine instance = new ComponentsDefine(); private String[] components; @@ -44,7 +48,7 @@ public class ComponentsDefine { } public ComponentsDefine() { - components = new String[15]; + components = new String[17]; addComponent(TOMCAT); addComponent(HTTPCLIENT); addComponent(DUBBO); @@ -59,6 +63,8 @@ public class ComponentsDefine { addComponent(OKHTTP); addComponent(SPRING_REST_TEMPLATE); addComponent(SPRING_MVC_ANNOTATION); + addComponent(NUTZ_MVC_ANNOTATION); + addComponent(NUTZ_HTTP); } private void addComponent(OfficialComponent component) { diff --git a/apm-sniffer/apm-agent/pom.xml b/apm-sniffer/apm-agent/pom.xml index d53be9601..33ef29c4c 100644 --- a/apm-sniffer/apm-agent/pom.xml +++ b/apm-sniffer/apm-agent/pom.xml @@ -100,6 +100,16 @@ apm-spring-cloud-feign-1.x-plugin ${project.version} + + org.skywalking + apm-nutz-mvc-annotation-1.x-plugin + ${project.version} + + + org.skywalking + apm-nutz-http-1.x-plugin + ${project.version} + diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml new file mode 100644 index 000000000..205997690 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml @@ -0,0 +1,24 @@ + + + nutz-plugins + org.skywalking + 3.2-2017 + + 4.0.0 + + apm-nutz-http-1.x-plugin + jar + + http-1.x-plugin + http://maven.apache.org + + + + org.nutz + nutz + 1.r.62 + provided + + + diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java new file mode 100644 index 000000000..c56aa039d --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java @@ -0,0 +1,62 @@ +package org.skywalking.apm.plugin.nutz.http.sync; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URI; + +import org.nutz.http.Request; +import org.nutz.http.Request.METHOD; +import org.nutz.http.Response; +import org.nutz.http.Sender; +import org.skywalking.apm.agent.core.conf.Config; +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; + +public class SenderSendInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + MethodInterceptResult result) throws Throwable { + Field field = Sender.class.getDeclaredField("request"); + field.setAccessible(true); + Request req = (Request) field.get(objInst); + final URI requestURL = req.getUrl().toURI(); + final METHOD httpMethod = req.getMethod(); + final ContextCarrier contextCarrier = new ContextCarrier(); + String remotePeer = requestURL.getHost() + ":" + requestURL.getPort(); + AbstractSpan span = ContextManager.createExitSpan(requestURL.getPath(), contextCarrier, remotePeer); + + span.setComponent(ComponentsDefine.NUTZ_HTTP); + Tags.URL.set(span, requestURL.getScheme() + "://" + requestURL.getHost() + ":" + requestURL.getPort() + requestURL.getPath()); + Tags.HTTP.METHOD.set(span, httpMethod.toString()); + SpanLayer.asHttp(span); + + req.getHeader().set(Config.Plugin.Propagation.HEADER_NAME, contextCarrier.serialize()); + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + Object ret) throws Throwable { + Response response = (Response)ret; + int statusCode = response.getStatus(); + AbstractSpan span = ContextManager.activeSpan(); + if (statusCode >= 400) { + span.errorOccurred(); + Tags.STATUS_CODE.set(span, Integer.toString(statusCode)); + } + ContextManager.stopSpan(); + return ret; + } + + @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + ContextManager.activeSpan().errorOccurred().log(t); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java new file mode 100644 index 000000000..df87868db --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java @@ -0,0 +1,60 @@ +package org.skywalking.apm.plugin.nutz.http.sync.define; + +import static net.bytebuddy.matcher.ElementMatchers.named; + +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 org.skywalking.apm.agent.core.plugin.match.HierarchyMatch; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; + +/** + * {@link NutzHttpInstrumentation} enhance the doExecute method,handleResponse method and + * handleResponse method of org.springframework.web.client.RestTemplate by + * org.skywalking.apm.plugin.spring.resttemplate.sync.RestExecuteInterceptor, + * org.skywalking.apm.plugin.spring.resttemplate.sync.RestResponseInterceptor and + * org.skywalking.apm.plugin.spring.resttemplate.sync.RestRequestInterceptor. + * + * org.skywalking.apm.plugin.spring.resttemplate.sync.RestResponseInterceptor set context to header for + * propagate trace context after execute createRequest. + * + * @author wendal + */ +public class NutzHttpInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.nutz.http.Sender"; + private static final String DO_EXECUTE_METHOD_NAME = "send"; + private static final String DO_EXECUTE_INTERCEPTOR = "org.skywalking.apm.plugin.nutz.http.sync.SenderSendInterceptor"; + + @Override + protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override public ElementMatcher getMethodsMatcher() { + return named(DO_EXECUTE_METHOD_NAME); + } + + @Override public String getMethodsInterceptor() { + return DO_EXECUTE_INTERCEPTOR; + } + + @Override public boolean isOverrideArgs() { + return false; + } + } + }; + } + + @Override + protected ClassMatch enhanceClass() { + return HierarchyMatch.byHierarchyMatch(new String[]{ENHANCE_CLASS}); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 000000000..f37126670 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1 @@ +nutz-http-1.x=org.skywalking.apm.plugin.nutz.http.sync.define.NutzHttpInstrumentation diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml new file mode 100644 index 000000000..a725bd6c4 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml @@ -0,0 +1,30 @@ + + + nutz-plugins + org.skywalking + 3.2-2017 + + 4.0.0 + + apm-nutz-mvc-annotation-1.x-plugin + jar + + mvc-annotation-1.x-plugin + http://maven.apache.org + + + + org.nutz + nutz + 1.r.62 + provided + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerConstructorInterceptor.java new file mode 100644 index 000000000..04afa0f54 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerConstructorInterceptor.java @@ -0,0 +1,32 @@ +package org.skywalking.apm.plugin.nutz.mvc; + +import org.nutz.mvc.annotation.At; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; + +/** + * The ControllerConstructorInterceptor intercepts the Controller's constructor, in order to acquire the + * mapping annotation, if exist. + * + * But, you can see we only use the first mapping value, Why? + * + * Right now, we intercept the controller by annotation as you known, so we CAN'T know which uri patten is actually + * matched. Even we know, that costs a lot. + * + * If we want to resolve that, we must intercept the Nutz MVC core codes, that is not a good choice for now. + * + * Comment by @wu-sheng + */ +public class ControllerConstructorInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { + String basePath = ""; + At basePathRequestMapping = objInst.getClass().getAnnotation(At.class); + if (basePathRequestMapping != null) { + basePath = basePathRequestMapping.value()[0]; + } + PathMappingCache pathMappingCache = new PathMappingCache(basePath); + objInst.setSkyWalkingDynamicField(pathMappingCache); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerServiceMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerServiceMethodInterceptor.java new file mode 100644 index 000000000..44d0b7114 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerServiceMethodInterceptor.java @@ -0,0 +1,71 @@ +package org.skywalking.apm.plugin.nutz.mvc; + +import java.lang.reflect.Method; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.nutz.mvc.Mvcs; +import org.nutz.mvc.annotation.At; +import org.skywalking.apm.agent.core.conf.Config; +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; + +/** + * The ControllerServiceMethodInterceptor only use the first mapping value. + * + * @See {@link ControllerConstructorInterceptor} to explain why we are doing this. + */ +public class ControllerServiceMethodInterceptor implements InstanceMethodsAroundInterceptor { + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + MethodInterceptResult result) throws Throwable { + PathMappingCache pathMappingCache = (PathMappingCache)objInst.getSkyWalkingDynamicField(); + String requestURL = pathMappingCache.findPathMapping(method); + if (requestURL == null) { + At methodRequestMapping = method.getAnnotation(At.class); + if (methodRequestMapping.value().length > 0) { + requestURL = methodRequestMapping.value()[0]; + } else { + requestURL = ""; + } + pathMappingCache.addPathMapping(method, requestURL); + requestURL = pathMappingCache.findPathMapping(method); + } + + HttpServletRequest request = Mvcs.getReq(); + String tracingHeaderValue = request.getHeader(Config.Plugin.Propagation.HEADER_NAME); + ContextCarrier contextCarrier = new ContextCarrier().deserialize(tracingHeaderValue); + AbstractSpan span = ContextManager.createEntrySpan(requestURL, contextCarrier); + Tags.URL.set(span, request.getRequestURL().toString()); + Tags.HTTP.METHOD.set(span, request.getMethod()); + span.setComponent(ComponentsDefine.NUTZ_MVC_ANNOTATION); + SpanLayer.asHttp(span); + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + Object ret) throws Throwable { + HttpServletResponse response = Mvcs.getResp(); + + 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); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java new file mode 100644 index 000000000..f00584249 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java @@ -0,0 +1,28 @@ +package org.skywalking.apm.plugin.nutz.mvc; + +import java.lang.reflect.Method; +import java.util.concurrent.ConcurrentHashMap; + +/** + * The PathMappingCache represents a field + * + * + * @author wusheng + */ +public class PathMappingCache { + private String classPath = ""; + + 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); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/AbstractControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/AbstractControllerInstrumentation.java new file mode 100644 index 000000000..9e276953a --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/AbstractControllerInstrumentation.java @@ -0,0 +1,65 @@ +package org.skywalking.apm.plugin.nutz.mvc.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.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; + +/** + * + * @author wendal + */ +public abstract class AbstractControllerInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + @Override + protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[] { + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return any(); + } + + @Override + public String getConstructorInterceptor() { + return "org.skywalking.apm.plugin.nutz.mvc.ControllerConstructorInterceptor"; + } + } + }; + } + + @Override + protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return isAnnotatedWith(named("org.nutz.mvc.annotation.At")); + } + + @Override + public String getMethodsInterceptor() { + return "org.skywalking.apm.plugin.nutz.mvc.ControllerServiceMethodInterceptor"; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; + } + + @Override + protected ClassMatch enhanceClass() { + return byClassAnnotationMatch(getEnhanceAnnotations()); + } + + protected abstract String[] getEnhanceAnnotations(); +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ControllerInstrumentation.java new file mode 100644 index 000000000..8bb039dcb --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ControllerInstrumentation.java @@ -0,0 +1,10 @@ +package org.skywalking.apm.plugin.nutz.mvc.define; + +public class ControllerInstrumentation extends AbstractControllerInstrumentation { + + public static final String ENHANCE_ANNOTATION = "org.nutz.mvc.annotation.At"; + + @Override protected String[] getEnhanceAnnotations() { + return new String[] {ENHANCE_ANNOTATION}; + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 000000000..15ba62cdf --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1 @@ +nutz-mvc-annotation-1.x=org.skywalking.apm.plugin.nutz.mvc.define.ControllerInstrumentation \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml new file mode 100644 index 000000000..b9249fc68 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + + org.skywalking + apm-sdk-plugin + 3.2-2017 + + + nutz-plugins + + + http-1.x-plugin + mvc-annotation-1.x-plugin + + pom + + apm-sdk-plugin + http://maven.apache.org + + + UTF-8 + + + diff --git a/apm-sniffer/apm-sdk-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/pom.xml index 1b06f19d8..b3e6782e9 100644 --- a/apm-sniffer/apm-sdk-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pom.xml @@ -23,6 +23,7 @@ resin-3.x-plugin resin-4.x-plugin spring-plugins + nutz-plugins pom From 368535cea1ccdf7c70a319b57d45dcf5e096c00f Mon Sep 17 00:00:00 2001 From: wendal chen Date: Thu, 21 Sep 2017 16:08:26 +0800 Subject: [PATCH 2/7] change: nutz http 1.x without java.lang.reflect.* use ConstructorInterceptPoint to get "org.nutz.http.Request", and store in SkyWalkingDynamicField, then set header in SenderSendInterceptor --- .../sync/SenderConstructorInterceptor.java | 12 ++++ .../nutz/http/sync/SenderSendInterceptor.java | 17 +++--- .../sync/define/NutzHttpInstrumentation.java | 57 ++++++++++++------- 3 files changed, 57 insertions(+), 29 deletions(-) create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderConstructorInterceptor.java diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderConstructorInterceptor.java new file mode 100644 index 000000000..640b6e822 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderConstructorInterceptor.java @@ -0,0 +1,12 @@ +package org.skywalking.apm.plugin.nutz.http.sync; + +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; + +public class SenderConstructorInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(final EnhancedInstance objInst, final Object[] allArguments) { + objInst.setSkyWalkingDynamicField(allArguments[0]); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java index c56aa039d..864751348 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java @@ -1,13 +1,11 @@ package org.skywalking.apm.plugin.nutz.http.sync; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URI; import org.nutz.http.Request; import org.nutz.http.Request.METHOD; import org.nutz.http.Response; -import org.nutz.http.Sender; import org.skywalking.apm.agent.core.conf.Config; import org.skywalking.apm.agent.core.context.ContextCarrier; import org.skywalking.apm.agent.core.context.ContextManager; @@ -22,11 +20,9 @@ import org.skywalking.apm.network.trace.component.ComponentsDefine; public class SenderSendInterceptor implements InstanceMethodsAroundInterceptor { @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInterceptResult result) throws Throwable { - Field field = Sender.class.getDeclaredField("request"); - field.setAccessible(true); - Request req = (Request) field.get(objInst); + public void beforeMethod(final EnhancedInstance objInst, final Method method, final Object[] allArguments, final Class[] argumentsTypes, + final MethodInterceptResult result) throws Throwable { + Request req = (Request) objInst.getSkyWalkingDynamicField(); final URI requestURL = req.getUrl().toURI(); final METHOD httpMethod = req.getMethod(); final ContextCarrier contextCarrier = new ContextCarrier(); @@ -42,7 +38,7 @@ public class SenderSendInterceptor implements InstanceMethodsAroundInterceptor { } @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + public Object afterMethod(final EnhancedInstance objInst, final Method method, final Object[] allArguments, final Class[] argumentsTypes, Object ret) throws Throwable { Response response = (Response)ret; int statusCode = response.getStatus(); @@ -55,8 +51,9 @@ public class SenderSendInterceptor implements InstanceMethodsAroundInterceptor { return ret; } - @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, - Class[] argumentsTypes, Throwable t) { + @Override + public void handleMethodException(final EnhancedInstance objInst, final Method method, final Object[] allArguments, + final Class[] argumentsTypes, final Throwable t) { ContextManager.activeSpan().errorOccurred().log(t); } } diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java index df87868db..46f1abcd4 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java @@ -12,41 +12,60 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; /** - * {@link NutzHttpInstrumentation} enhance the doExecute method,handleResponse method and - * handleResponse method of org.springframework.web.client.RestTemplate by - * org.skywalking.apm.plugin.spring.resttemplate.sync.RestExecuteInterceptor, - * org.skywalking.apm.plugin.spring.resttemplate.sync.RestResponseInterceptor and - * org.skywalking.apm.plugin.spring.resttemplate.sync.RestRequestInterceptor. - * - * org.skywalking.apm.plugin.spring.resttemplate.sync.RestResponseInterceptor set context to header for - * propagate trace context after execute createRequest. + * {@link NutzHttpInstrumentation} enhance the send + * method,Constructor of org.nutz.http.Sender by + * org.skywalking.apm.plugin.nutz.http.sync.SenderConstructorInterceptor, and + * org.skywalking.apm.plugin.nutz.http.sync.SenderSendInterceptor + * set context to header for propagate trace context around execute + * send. * * @author wendal */ public class NutzHttpInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.nutz.http.Sender"; - private static final String DO_EXECUTE_METHOD_NAME = "send"; - private static final String DO_EXECUTE_INTERCEPTOR = "org.skywalking.apm.plugin.nutz.http.sync.SenderSendInterceptor"; + private static final String DO_SEND_METHOD_NAME = "send"; + private static final String DO_SEND_INTERCEPTOR = "org.skywalking.apm.plugin.nutz.http.sync.SenderSendInterceptor"; + private static final String DO_CONSTRUCTOR_INTERCEPTOR = "org.skywalking.apm.plugin.nutz.http.sync.SenderConstructorInterceptor"; @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return new ElementMatcher() { + @Override + public boolean matches(MethodDescription target) { + return target.isConstructor() && target.getParameters().size() > 0; + } + }; + } + + @Override + public String getConstructorInterceptor() { + return DO_CONSTRUCTOR_INTERCEPTOR; + } + } + }; } @Override protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[] { + return new InstanceMethodsInterceptPoint[]{ new InstanceMethodsInterceptPoint() { - @Override public ElementMatcher getMethodsMatcher() { - return named(DO_EXECUTE_METHOD_NAME); + @Override + public ElementMatcher getMethodsMatcher() { + return named(DO_SEND_METHOD_NAME); } - - @Override public String getMethodsInterceptor() { - return DO_EXECUTE_INTERCEPTOR; + + @Override + public String getMethodsInterceptor() { + return DO_SEND_INTERCEPTOR; } - - @Override public boolean isOverrideArgs() { + + @Override + public boolean isOverrideArgs() { return false; } } From 05bcf2b6ddf3109e8b25e00f68908a8bf3d6fce0 Mon Sep 17 00:00:00 2001 From: wendal chen Date: Thu, 21 Sep 2017 20:11:09 +0800 Subject: [PATCH 3/7] fix: let nutz-plugins compatible with 3.2.1-2017 change: using ContextCarrier.items() in 3.2.1-2017 remove: useless javadoc in nutz-plugins --- .../nutz-plugins/http-1.x-plugin/pom.xml | 2 +- .../nutz/http/sync/SenderSendInterceptor.java | 8 +++-- .../mvc-annotation-1.x-plugin/pom.xml | 2 +- ...java => ActionConstructorInterceptor.java} | 13 ++------ ...ptor.java => ActionMethodInterceptor.java} | 17 ++++++---- ...tation.java => ActionInstrumentation.java} | 32 ++++++++++--------- .../mvc/define/ControllerInstrumentation.java | 10 ------ .../src/main/resources/skywalking-plugin.def | 2 +- .../apm-sdk-plugin/nutz-plugins/pom.xml | 2 +- 9 files changed, 40 insertions(+), 48 deletions(-) rename apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/{ControllerConstructorInterceptor.java => ActionConstructorInterceptor.java} (54%) rename apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/{ControllerServiceMethodInterceptor.java => ActionMethodInterceptor.java} (82%) rename apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/{AbstractControllerInstrumentation.java => ActionInstrumentation.java} (81%) delete mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ControllerInstrumentation.java diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml index 205997690..defd73beb 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml @@ -3,7 +3,7 @@ nutz-plugins org.skywalking - 3.2-2017 + 3.2.1-2017 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java index 864751348..b7326ad31 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/SenderSendInterceptor.java @@ -6,7 +6,7 @@ import java.net.URI; import org.nutz.http.Request; import org.nutz.http.Request.METHOD; import org.nutz.http.Response; -import org.skywalking.apm.agent.core.conf.Config; +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; @@ -34,7 +34,11 @@ public class SenderSendInterceptor implements InstanceMethodsAroundInterceptor { Tags.HTTP.METHOD.set(span, httpMethod.toString()); SpanLayer.asHttp(span); - req.getHeader().set(Config.Plugin.Propagation.HEADER_NAME, contextCarrier.serialize()); + CarrierItem next = contextCarrier.items(); + while (next.hasNext()) { + next = next.next(); + req.getHeader().set(next.getHeadKey(), next.getHeadValue()); + } } @Override diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml index a725bd6c4..b71d4f8ac 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml @@ -3,7 +3,7 @@ nutz-plugins org.skywalking - 3.2-2017 + 3.2.1-2017 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ActionConstructorInterceptor.java similarity index 54% rename from apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerConstructorInterceptor.java rename to apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ActionConstructorInterceptor.java index 04afa0f54..930e041de 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerConstructorInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ActionConstructorInterceptor.java @@ -5,19 +5,10 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; /** - * The ControllerConstructorInterceptor intercepts the Controller's constructor, in order to acquire the - * mapping annotation, if exist. * - * But, you can see we only use the first mapping value, Why? - * - * Right now, we intercept the controller by annotation as you known, so we CAN'T know which uri patten is actually - * matched. Even we know, that costs a lot. - * - * If we want to resolve that, we must intercept the Nutz MVC core codes, that is not a good choice for now. - * - * Comment by @wu-sheng + * @author wendal */ -public class ControllerConstructorInterceptor implements InstanceConstructorInterceptor { +public class ActionConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerServiceMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ActionMethodInterceptor.java similarity index 82% rename from apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerServiceMethodInterceptor.java rename to apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ActionMethodInterceptor.java index 44d0b7114..ab96e057a 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ControllerServiceMethodInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/ActionMethodInterceptor.java @@ -7,7 +7,7 @@ import javax.servlet.http.HttpServletResponse; import org.nutz.mvc.Mvcs; import org.nutz.mvc.annotation.At; -import org.skywalking.apm.agent.core.conf.Config; +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; @@ -19,11 +19,12 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptR import org.skywalking.apm.network.trace.component.ComponentsDefine; /** - * The ControllerServiceMethodInterceptor only use the first mapping value. + * The ActionMethodInterceptor only use the first mapping value. * - * @See {@link ControllerConstructorInterceptor} to explain why we are doing this. + * @See {@link ActionConstructorInterceptor} to explain why we are doing this. + * @author wendal */ -public class ControllerServiceMethodInterceptor implements InstanceMethodsAroundInterceptor { +public class ActionMethodInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { @@ -41,8 +42,12 @@ public class ControllerServiceMethodInterceptor implements InstanceMethodsAround } HttpServletRequest request = Mvcs.getReq(); - String tracingHeaderValue = request.getHeader(Config.Plugin.Propagation.HEADER_NAME); - ContextCarrier contextCarrier = new ContextCarrier().deserialize(tracingHeaderValue); + 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()); diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/AbstractControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ActionInstrumentation.java similarity index 81% rename from apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/AbstractControllerInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ActionInstrumentation.java index 9e276953a..406789852 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/AbstractControllerInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ActionInstrumentation.java @@ -1,22 +1,22 @@ package org.skywalking.apm.plugin.nutz.mvc.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.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; -/** - * - * @author wendal - */ -public abstract class AbstractControllerInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +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 net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class ActionInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + public static final String ENHANCE_ANNOTATION = "org.nutz.mvc.annotation.At"; + @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[] { @@ -28,7 +28,7 @@ public abstract class AbstractControllerInstrumentation extends ClassInstanceMet @Override public String getConstructorInterceptor() { - return "org.skywalking.apm.plugin.nutz.mvc.ControllerConstructorInterceptor"; + return "org.skywalking.apm.plugin.nutz.mvc.ActionConstructorInterceptor"; } } }; @@ -45,7 +45,7 @@ public abstract class AbstractControllerInstrumentation extends ClassInstanceMet @Override public String getMethodsInterceptor() { - return "org.skywalking.apm.plugin.nutz.mvc.ControllerServiceMethodInterceptor"; + return "org.skywalking.apm.plugin.nutz.mvc.ActionMethodInterceptor"; } @Override @@ -61,5 +61,7 @@ public abstract class AbstractControllerInstrumentation extends ClassInstanceMet return byClassAnnotationMatch(getEnhanceAnnotations()); } - protected abstract String[] getEnhanceAnnotations(); + protected String[] getEnhanceAnnotations() { + return new String[] {ENHANCE_ANNOTATION}; + } } diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ControllerInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ControllerInstrumentation.java deleted file mode 100644 index 8bb039dcb..000000000 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/define/ControllerInstrumentation.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.skywalking.apm.plugin.nutz.mvc.define; - -public class ControllerInstrumentation extends AbstractControllerInstrumentation { - - public static final String ENHANCE_ANNOTATION = "org.nutz.mvc.annotation.At"; - - @Override protected String[] getEnhanceAnnotations() { - return new String[] {ENHANCE_ANNOTATION}; - } -} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/resources/skywalking-plugin.def index 15ba62cdf..c6566dcf3 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -1 +1 @@ -nutz-mvc-annotation-1.x=org.skywalking.apm.plugin.nutz.mvc.define.ControllerInstrumentation \ No newline at end of file +nutz-mvc-annotation-1.x=org.skywalking.apm.plugin.nutz.mvc.define.ActionInstrumentation \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml index b9249fc68..06b11ae04 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml @@ -6,7 +6,7 @@ org.skywalking apm-sdk-plugin - 3.2-2017 + 3.2.1-2017 nutz-plugins From 5934158902df87ec3d4a85f96e3c609bd9adf46b Mon Sep 17 00:00:00 2001 From: wendal chen Date: Fri, 22 Sep 2017 12:11:19 +0800 Subject: [PATCH 4/7] change: nutz http plugins split into three Instrumentation change: use ElementMatchers.takesArguments to match Sender(Request) --- ...a => AbstractNutzHttpInstrumentation.java} | 35 +++++-------------- ...NutzHttpFilePostSenderInstrumentation.java | 11 ++++++ .../NutzHttpGetSenderInstrumentation.java | 12 +++++++ .../NutzHttpPostSenderInstrumentation.java | 13 +++++++ .../src/main/resources/skywalking-plugin.def | 4 ++- .../apm/plugin/nutz/mvc/PathMappingCache.java | 2 +- 6 files changed, 48 insertions(+), 29 deletions(-) rename apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/{NutzHttpInstrumentation.java => AbstractNutzHttpInstrumentation.java} (63%) create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpFilePostSenderInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpGetSenderInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpPostSenderInstrumentation.java diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/AbstractNutzHttpInstrumentation.java similarity index 63% rename from apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/AbstractNutzHttpInstrumentation.java index 46f1abcd4..e4b372866 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/AbstractNutzHttpInstrumentation.java @@ -6,24 +6,13 @@ import org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoin 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 org.skywalking.apm.agent.core.plugin.match.HierarchyMatch; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; -/** - * {@link NutzHttpInstrumentation} enhance the send - * method,Constructor of org.nutz.http.Sender by - * org.skywalking.apm.plugin.nutz.http.sync.SenderConstructorInterceptor, and - * org.skywalking.apm.plugin.nutz.http.sync.SenderSendInterceptor - * set context to header for propagate trace context around execute - * send. - * - * @author wendal - */ -public class NutzHttpInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public abstract class AbstractNutzHttpInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - private static final String ENHANCE_CLASS = "org.nutz.http.Sender"; private static final String DO_SEND_METHOD_NAME = "send"; private static final String DO_SEND_INTERCEPTOR = "org.skywalking.apm.plugin.nutz.http.sync.SenderSendInterceptor"; private static final String DO_CONSTRUCTOR_INTERCEPTOR = "org.skywalking.apm.plugin.nutz.http.sync.SenderConstructorInterceptor"; @@ -34,14 +23,9 @@ public class NutzHttpInstrumentation extends ClassInstanceMethodsEnhancePluginDe new ConstructorInterceptPoint() { @Override public ElementMatcher getConstructorMatcher() { - return new ElementMatcher() { - @Override - public boolean matches(MethodDescription target) { - return target.isConstructor() && target.getParameters().size() > 0; - } - }; + return ElementMatchers.takesArguments(1); } - + @Override public String getConstructorInterceptor() { return DO_CONSTRUCTOR_INTERCEPTOR; @@ -58,12 +42,12 @@ public class NutzHttpInstrumentation extends ClassInstanceMethodsEnhancePluginDe public ElementMatcher getMethodsMatcher() { return named(DO_SEND_METHOD_NAME); } - + @Override public String getMethodsInterceptor() { return DO_SEND_INTERCEPTOR; } - + @Override public boolean isOverrideArgs() { return false; @@ -72,8 +56,5 @@ public class NutzHttpInstrumentation extends ClassInstanceMethodsEnhancePluginDe }; } - @Override - protected ClassMatch enhanceClass() { - return HierarchyMatch.byHierarchyMatch(new String[]{ENHANCE_CLASS}); - } -} + protected abstract ClassMatch enhanceClass(); +} \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpFilePostSenderInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpFilePostSenderInstrumentation.java new file mode 100644 index 000000000..9082a9e57 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpFilePostSenderInstrumentation.java @@ -0,0 +1,11 @@ +package org.skywalking.apm.plugin.nutz.http.sync.define; + +import org.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.skywalking.apm.agent.core.plugin.match.NameMatch; + +public class NutzHttpFilePostSenderInstrumentation extends AbstractNutzHttpInstrumentation { + + protected ClassMatch enhanceClass() { + return NameMatch.byName("org.nutz.http.sender.FilePostSender"); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpGetSenderInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpGetSenderInstrumentation.java new file mode 100644 index 000000000..28bf2a1a6 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpGetSenderInstrumentation.java @@ -0,0 +1,12 @@ +package org.skywalking.apm.plugin.nutz.http.sync.define; + +import org.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.skywalking.apm.agent.core.plugin.match.NameMatch; + +public class NutzHttpGetSenderInstrumentation extends AbstractNutzHttpInstrumentation { + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName("org.nutz.http.sender.GetSender"); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpPostSenderInstrumentation.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpPostSenderInstrumentation.java new file mode 100644 index 000000000..f1ed889f0 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/http/sync/define/NutzHttpPostSenderInstrumentation.java @@ -0,0 +1,13 @@ +package org.skywalking.apm.plugin.nutz.http.sync.define; + +import org.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.skywalking.apm.agent.core.plugin.match.NameMatch; + + +public class NutzHttpPostSenderInstrumentation extends AbstractNutzHttpInstrumentation { + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName("org.nutz.http.sender.PostSender"); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/resources/skywalking-plugin.def index f37126670..203a31f4d 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -1 +1,3 @@ -nutz-http-1.x=org.skywalking.apm.plugin.nutz.http.sync.define.NutzHttpInstrumentation +nutz-http-1.x=org.skywalking.apm.plugin.nutz.http.sync.define.NutzHttpGetSenderInstrumentation +nutz-http-1.x=org.skywalking.apm.plugin.nutz.http.sync.define.NutzHttpPostSenderInstrumentation +nutz-http-1.x=org.skywalking.apm.plugin.nutz.http.sync.define.NutzHttpFilePostSenderInstrumentation diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java index f00584249..b7bec5db8 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java @@ -7,7 +7,7 @@ import java.util.concurrent.ConcurrentHashMap; * The PathMappingCache represents a field * * - * @author wusheng + * @author wendal */ public class PathMappingCache { private String classPath = ""; From 1194f0a8fdee1ed4c2135956864a9dbd4df0c912 Mon Sep 17 00:00:00 2001 From: wendal chen Date: Fri, 22 Sep 2017 20:57:18 +0800 Subject: [PATCH 5/7] add: testcase for nutz http 1.x plugin --- .../nutz/http/sync/SenderInterceptorTest.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/test/java/org/skywalking/apm/plugin/nutz/http/sync/SenderInterceptorTest.java diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/test/java/org/skywalking/apm/plugin/nutz/http/sync/SenderInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/test/java/org/skywalking/apm/plugin/nutz/http/sync/SenderInterceptorTest.java new file mode 100644 index 000000000..61bc40f1d --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/src/test/java/org/skywalking/apm/plugin/nutz/http/sync/SenderInterceptorTest.java @@ -0,0 +1,114 @@ +package org.skywalking.apm.plugin.nutz.http.sync; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Method; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.nutz.http.Request; +import org.nutz.http.Request.METHOD; +import org.nutz.http.Response; +import org.nutz.http.Sender; +import org.nutz.http.sender.FilePostSender; +import org.nutz.http.sender.GetSender; +import org.nutz.http.sender.PostSender; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.skywalking.apm.agent.core.boot.ServiceManager; +import org.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; +import org.skywalking.apm.agent.core.context.trace.TraceSegment; +import org.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.skywalking.apm.agent.test.helper.SegmentHelper; +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; + +@RunWith(org.powermock.modules.junit4.PowerMockRunner.class) +@PowerMockRunnerDelegate(TracingSegmentRunner.class) +public class SenderInterceptorTest { + + @SegmentStoragePoint + public SegmentStorage segmentStorage; + + @Rule + public AgentServiceRule serviceRule = new AgentServiceRule(); + + @Mock + private EnhancedInstance enhancedInstance; + + @Mock + Response resp; + + SenderConstructorInterceptor constructorInterceptPoint; + + SenderSendInterceptor senderSendInterceptor; + + Method sendMethod; + Object[] allArguments; + Class[] argumentsTypes; + + @Before + public void setUp() throws Exception { + ServiceManager.INSTANCE.boot(); + constructorInterceptPoint = new SenderConstructorInterceptor(); + senderSendInterceptor = new SenderSendInterceptor(); + } + + public void setupSender(Class klass) throws NoSuchMethodException, SecurityException { + sendMethod = klass.getMethod("send"); + allArguments = new Object[0]; + argumentsTypes = new Class[0]; + } + + @Test + public void test_constructor() { + Request request = Request.create("https://nutz.cn/yvr/list", METHOD.GET); + constructorInterceptPoint.onConstruct(enhancedInstance, new Object[]{request}); + verify(enhancedInstance, times(1)).setSkyWalkingDynamicField(request); + } + + @Test + public void test_getsender_send() throws NoSuchMethodException, SecurityException, Throwable { + setupSender(GetSender.class); + _sender_sender_test(); + } + + @Test + public void test_postsender_send() throws NoSuchMethodException, SecurityException, Throwable { + setupSender(PostSender.class); + _sender_sender_test(); + } + + @Test + public void test_filepostsender_send() throws NoSuchMethodException, SecurityException, Throwable { + setupSender(FilePostSender.class); + _sender_sender_test(); + } + + protected void _sender_sender_test() throws Throwable { + Request request = Request.create("https://nutz.cn/yvr/list", METHOD.GET); + constructorInterceptPoint.onConstruct(enhancedInstance, new Object[]{request}); + verify(enhancedInstance, times(1)).setSkyWalkingDynamicField(request); + + when(enhancedInstance.getSkyWalkingDynamicField()).thenReturn(request); + when(resp.getStatus()).thenReturn(200); + + senderSendInterceptor.beforeMethod(enhancedInstance, sendMethod, allArguments, argumentsTypes, null); + senderSendInterceptor.afterMethod(enhancedInstance, sendMethod, allArguments, argumentsTypes, resp); + + TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); + List spans = SegmentHelper.getSpans(traceSegment); + assertThat(spans.size(), is(1)); + assertThat(spans.get(0).getOperationName(), is("/yvr/list")); + } +} From d38221350c1305f0e572a7fa389499da1060f2a4 Mon Sep 17 00:00:00 2001 From: wendal chen Date: Fri, 22 Sep 2017 22:41:00 +0800 Subject: [PATCH 6/7] change: Component name for NUTZ_MVC_ANNOTATION, from NutzMVCAnnotation to NutzMVC --- .../apm/network/trace/component/ComponentsDefine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java b/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java index c679af69d..5c9b7c0ef 100644 --- a/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java +++ b/apm-network/src/main/java/org/skywalking/apm/network/trace/component/ComponentsDefine.java @@ -37,7 +37,7 @@ public class ComponentsDefine { public static final OfficialComponent STRUTS2 = new OfficialComponent(15, "Struts2"); - public static final OfficialComponent NUTZ_MVC_ANNOTATION = new OfficialComponent(16, "NutzMVCAnnotation"); + public static final OfficialComponent NUTZ_MVC_ANNOTATION = new OfficialComponent(16, "NutzMVC"); public static final OfficialComponent NUTZ_HTTP = new OfficialComponent(17, "NutzHttp"); From 13b408e3e8b440b58bbe1608f3c44cc387a4e164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=99=9F=20Wu=20Sheng?= Date: Sat, 23 Sep 2017 08:37:00 +0800 Subject: [PATCH 7/7] Update PathMappingCache.java Update a comment --- .../org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java index b7bec5db8..7df1b31ba 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/src/main/java/org/skywalking/apm/plugin/nutz/mvc/PathMappingCache.java @@ -4,8 +4,9 @@ import java.lang.reflect.Method; import java.util.concurrent.ConcurrentHashMap; /** - * The PathMappingCache represents a field - * + * The PathMappingCache represents a mapping cache. + * key: {@link Method} + * value: the url pattern * * @author wendal */