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