diff --git a/skywalking-sdk-plugin/httpclient-plugin/pom.xml b/skywalking-sdk-plugin/httpclient-plugin/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..60518bbf1a93527c0913a7b319d46e0fcf3fcd2b
--- /dev/null
+++ b/skywalking-sdk-plugin/httpclient-plugin/pom.xml
@@ -0,0 +1,33 @@
+
+
+ skywalking-sdk-plugin
+ com.ai.cloud
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ httpClient-plugin
+ jar
+
+ httpClient-plugin
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ com.ai.cloud
+ skywalking-api
+ ${project.version}
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.2.1
+ compile
+
+
+
diff --git a/skywalking-sdk-plugin/httpclient-plugin/src/main/java/com/ai/cloud/skywalking/plugin/httpclient/SWTracingHttpClient.java b/skywalking-sdk-plugin/httpclient-plugin/src/main/java/com/ai/cloud/skywalking/plugin/httpclient/SWTracingHttpClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..3105002f48309adb822a25878115c741e28e2427
--- /dev/null
+++ b/skywalking-sdk-plugin/httpclient-plugin/src/main/java/com/ai/cloud/skywalking/plugin/httpclient/SWTracingHttpClient.java
@@ -0,0 +1,132 @@
+package com.ai.cloud.skywalking.plugin.httpclient;
+
+import com.ai.cloud.skywalking.plugin.httpclient.trace.HttpClientTracing;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.HttpContext;
+
+import java.io.IOException;
+
+public class SWTracingHttpClient implements HttpClient {
+
+ private static final String DEFAULT_TRACE_NAME = "SkyWalking-TRACING-NAME";
+
+ private HttpClient client;
+ private String traceName;
+
+ public SWTracingHttpClient(HttpClient client, String traceName) {
+ this.client = client;
+ this.traceName = traceName;
+ }
+
+ public SWTracingHttpClient(String traceName) {
+ super();
+ this.traceName = traceName;
+ }
+
+ public SWTracingHttpClient() {
+ client = new DefaultHttpClient();
+ this.traceName = DEFAULT_TRACE_NAME;
+ }
+
+ @Override
+ public HttpParams getParams() {
+ return client.getParams();
+ }
+
+ @Override
+ public ClientConnectionManager getConnectionManager() {
+ return client.getConnectionManager();
+ }
+
+ @Override
+ public HttpResponse execute(final HttpUriRequest httpUriRequest) throws IOException, ClientProtocolException {
+ return HttpClientTracing.execute(httpUriRequest.getURI().toString(), traceName, httpUriRequest, new HttpClientTracing.Executor() {
+ @Override
+ public HttpResponse execute() throws IOException {
+ return client.execute(httpUriRequest);
+ }
+ });
+ }
+
+ @Override
+ public HttpResponse execute(final HttpUriRequest httpUriRequest, final HttpContext httpContext) throws IOException, ClientProtocolException {
+ return HttpClientTracing.execute(httpUriRequest.getURI().toString(), traceName, httpUriRequest, new HttpClientTracing.Executor() {
+ @Override
+ public HttpResponse execute() throws IOException {
+ return client.execute(httpUriRequest, httpContext);
+ }
+ });
+ }
+
+ @Override
+ public HttpResponse execute(final HttpHost httpHost, final HttpRequest httpRequest) throws IOException, ClientProtocolException {
+ return HttpClientTracing.execute(httpHost.toURI(), traceName, httpRequest, new HttpClientTracing.Executor() {
+ @Override
+ public HttpResponse execute() throws IOException {
+ return client.execute(httpHost, httpRequest);
+ }
+ });
+ }
+
+ @Override
+ public HttpResponse execute(final HttpHost httpHost, final HttpRequest httpRequest, final HttpContext httpContext) throws IOException, ClientProtocolException {
+ return HttpClientTracing.execute(httpHost.toURI(), traceName, httpRequest, new HttpClientTracing.Executor() {
+ @Override
+ public HttpResponse execute() throws IOException {
+ return client.execute(httpHost, httpRequest, httpContext);
+ }
+ });
+ }
+
+ @Override
+ public T execute(final HttpUriRequest httpUriRequest, final ResponseHandler extends T> responseHandler) throws IOException, ClientProtocolException {
+ return HttpClientTracing.execute(httpUriRequest.getURI().toString(), traceName, httpUriRequest, new HttpClientTracing.Executor() {
+ @Override
+ public T execute() throws IOException {
+ return client.execute(httpUriRequest, responseHandler);
+ }
+ });
+
+ }
+
+ @Override
+ public T execute(final HttpUriRequest httpUriRequest, final ResponseHandler extends T> responseHandler, final HttpContext httpContext) throws IOException, ClientProtocolException {
+ return HttpClientTracing.execute(httpUriRequest.getURI().toString(), traceName, httpUriRequest, new HttpClientTracing.Executor() {
+ @Override
+ public T execute() throws IOException {
+ return client.execute(httpUriRequest, responseHandler, httpContext);
+ }
+ });
+
+ }
+
+ @Override
+ public T execute(final HttpHost httpHost, final HttpRequest httpRequest, final ResponseHandler extends T> responseHandler) throws IOException, ClientProtocolException {
+ return HttpClientTracing.execute(httpHost.toURI(), traceName, httpRequest, new HttpClientTracing.Executor() {
+ @Override
+ public T execute() throws IOException {
+ return client.execute(httpHost, httpRequest, responseHandler);
+ }
+ });
+
+ }
+
+ @Override
+ public T execute(final HttpHost httpHost, final HttpRequest httpRequest, final ResponseHandler extends T> responseHandler, HttpContext httpContext) throws IOException, ClientProtocolException {
+ return HttpClientTracing.execute(httpHost.toURI(), traceName, httpRequest, new HttpClientTracing.Executor() {
+ @Override
+ public T execute() throws IOException {
+ return client.execute(httpHost, httpRequest, responseHandler);
+ }
+ });
+ }
+}
diff --git a/skywalking-sdk-plugin/httpclient-plugin/src/main/java/com/ai/cloud/skywalking/plugin/httpclient/trace/HttpClientTracing.java b/skywalking-sdk-plugin/httpclient-plugin/src/main/java/com/ai/cloud/skywalking/plugin/httpclient/trace/HttpClientTracing.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3e0619dcd0bf84aa8ef6436483720c8e05653cf
--- /dev/null
+++ b/skywalking-sdk-plugin/httpclient-plugin/src/main/java/com/ai/cloud/skywalking/plugin/httpclient/trace/HttpClientTracing.java
@@ -0,0 +1,35 @@
+package com.ai.cloud.skywalking.plugin.httpclient.trace;
+
+import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender;
+import com.ai.cloud.skywalking.model.Identification;
+import org.apache.http.HttpRequest;
+
+import java.io.IOException;
+
+public class HttpClientTracing {
+
+ private static RPCBuriedPointSender sender = new RPCBuriedPointSender();
+
+ public static R execute(String url, String traceHearName, HttpRequest httpRequest, Executor executor) throws IOException {
+ try {
+ httpRequest.setHeader(traceHearName,
+ sender.beforeSend(Identification.newBuilder()
+ .viewPoint(url)
+ .spanType('W')
+ .build())
+ .toString());
+ return executor.execute();
+ } catch (IOException e) {
+ sender.handleException(e);
+ throw e;
+ } finally {
+ sender.afterSend();
+ }
+ }
+
+ public interface Executor {
+ R execute() throws IOException;
+ }
+
+
+}
diff --git a/skywalking-sdk-plugin/pom.xml b/skywalking-sdk-plugin/pom.xml
index 39966128494573c7b73f75795632247ab34e805c..091051cd8b18b6df8433c87d075d6d7e2f5ae314 100644
--- a/skywalking-sdk-plugin/pom.xml
+++ b/skywalking-sdk-plugin/pom.xml
@@ -10,6 +10,7 @@
spring-plugin
jdbc-plugin
web-plugin
+ httpclient-plugin
pom