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