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
+
+
+