From e685ef90d003e046b3c298d4d8068c79c28f3ad9 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Thu, 31 Aug 2017 14:58:39 +0800 Subject: [PATCH] support netflix fegin plugin --- apm-sniffer/apm-agent/pom.xml | 5 ++ .../http/v9/DefaultHttpClientInterceptor.java | 12 ++-- .../apm-sdk-plugin/spring-plugins/pom.xml | 1 + .../spring-cloud/netflix-plugins/pom.xml | 25 +++++++++ .../spring-cloud-feign-1.x-plugin/pom.xml | 34 ++++++++++++ .../define/NetflixFeignInstrumentation.java | 55 +++++++++++++++++++ .../src/main/resources/skywalking-plugin.def | 1 + .../spring-plugins/spring-cloud/pom.xml | 25 +++++++++ 8 files changed, 153 insertions(+), 5 deletions(-) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/cloud/netflix/feign/v11/define/NetflixFeignInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/src/main/resources/skywalking-plugin.def create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml diff --git a/apm-sniffer/apm-agent/pom.xml b/apm-sniffer/apm-agent/pom.xml index b9d1845b1..388873e7b 100644 --- a/apm-sniffer/apm-agent/pom.xml +++ b/apm-sniffer/apm-agent/pom.xml @@ -95,6 +95,11 @@ apm-springmvc-annotation-4.x-plugin ${project.version} + + org.skywalking + apm-spring-cloud-feign-1.x-plugin + ${project.version} + diff --git a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java index a9b0271e9..89219cbac 100644 --- a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java @@ -85,12 +85,14 @@ public class DefaultHttpClientInterceptor implements InstanceMethodsAroundInterc @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { Response response = (Response)ret; - int statusCode = response.status(); + if (response != null) { + int statusCode = response.status(); - AbstractSpan span = ContextManager.activeSpan(); - if (statusCode >= 400) { - span.errorOccurred(); - Tags.STATUS_CODE.set(span, statusCode + ""); + AbstractSpan span = ContextManager.activeSpan(); + if (statusCode >= 400) { + span.errorOccurred(); + Tags.STATUS_CODE.set(span, statusCode + ""); + } } ContextManager.stopSpan(); diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml index 0a91d8890..819b31547 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml @@ -14,6 +14,7 @@ concurrent-util-4.x-plugin resttemplate-4.x-plugin mvc-annotation-4.x-plugin + spring-cloud pom diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml new file mode 100644 index 000000000..dc3d3a38a --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + + org.skywalking + spring-cloud + 3.2-2017 + + + netflix-plugins + + spring-cloud-feign-1.x-plugin + + pom + + netflix-plugins + http://maven.apache.org + + + UTF-8 + + + diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml new file mode 100644 index 000000000..ceedb86a9 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + + org.skywalking + netflix-plugins + 3.2-2017 + + + apm-spring-cloud-feign-1.x-plugin + jar + + + spring-cloud-feign-1.x-plugin + http://maven.apache.org + + + + org.springframework.cloud + spring-cloud-starter-feign + 1.1.0.RELEASE + provided + + + org.skywalking + apm-feign-default-http-9.x-plugin + ${project.version} + provided + + + + diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/cloud/netflix/feign/v11/define/NetflixFeignInstrumentation.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/cloud/netflix/feign/v11/define/NetflixFeignInstrumentation.java new file mode 100644 index 000000000..50a84a0ce --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/src/main/java/org/skywalking/apm/plugin/spring/cloud/netflix/feign/v11/define/NetflixFeignInstrumentation.java @@ -0,0 +1,55 @@ +package org.skywalking.apm.plugin.spring.cloud.netflix.feign.v11.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.named; +import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName; + +/** + * {@link NetflixFeignInstrumentation} presents that skywalking intercepts {@link org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient#execute(feign.Request, + * feign.Request.Options)} by using {@link org.skywalking.apm.plugin.feign.http.v9.DefaultHttpClientInterceptor}. + * + * @author zhangxin + */ +public class NetflixFeignInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + /** + * Enhance class. + */ + private static final String ENHANCE_CLASS = "org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient"; + + /** + * Intercept class. + */ + private static final String INTERCEPT_CLASS = "org.skywalking.apm.plugin.feign.http.v9.DefaultHttpClientInterceptor"; + + @Override protected ClassMatch enhanceClass() { + return byName(ENHANCE_CLASS); + } + + @Override protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override public ElementMatcher getMethodsMatcher() { + return named("execute"); + } + + @Override public String getMethodsInterceptor() { + return INTERCEPT_CLASS; + } + + @Override public boolean isOverrideArgs() { + return false; + } + } + }; + } +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 000000000..80e07cebd --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1 @@ +spring-cloud-feign-1.x=org.skywalking.apm.plugin.spring.cloud.netflix.feign.v11.define.NetflixFeignInstrumentation diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml new file mode 100644 index 000000000..02a6d44c2 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + + org.skywalking + spring-plugins + 3.2-2017 + + + spring-cloud + + netflix-plugins + + pom + + spring-cloud + http://maven.apache.org + + + UTF-8 + + + -- GitLab