diff --git a/apm-sniffer/apm-agent/pom.xml b/apm-sniffer/apm-agent/pom.xml index b9d1845b1e7244dc42cbee82c381211c0d4e4939..388873e7b70ceb49a1ed66ce5734126e0222742f 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 a9b0271e9a090afcab455547f008d1953756c09d..89219cbacf44f6d41287f7db5cc11cb523fab016 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 0a91d88902ec1b3bbb0887ce8071bcd9b842c414..819b31547017a3eef8b9146351ee24b81ce55da4 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 0000000000000000000000000000000000000000..dc3d3a38a947e44327635939e9d384bd5108a3c0 --- /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 0000000000000000000000000000000000000000..ceedb86a96490000ac86609c3be2e6de1561e498 --- /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 0000000000000000000000000000000000000000..50a84a0ce9783d9d57cbe4df3097f2fbdd54a403 --- /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 0000000000000000000000000000000000000000..80e07cebdc2631d33659c99b39b329a38a29e7dc --- /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 0000000000000000000000000000000000000000..02a6d44c2066e124c4aaabe5842124cbe9d1e95b --- /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 + + +