此功能适用于 HttpClient 4.3.x - 4.5.x 版本。
HttpClient 是 Apache 项目的开源组件,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。
您可以在 SOFABoot 工程中引入并使用 HttpClient 打印 Tracer 日志。
本文将演示如何使用 SOFATracer 对 HttpClient 进行埋点。假设您已经基于 SOFABoot 构建了一个简单的 Spring Web 工程,那么可以通过如下步骤进行操作:
引入 Maven 依赖
为了使用 HttpClient 打印 Tracer 日志,您必须在项目的 pom.xml
文件中引入以下 Maven 依赖:
SOFATracer 依赖
<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>tracer-enterprise-sofa-boot-starter</artifactId> </dependency>
基于 SOFATracer 的 HttpClient 插件
为了使得 HttpClient 这个第三方开源组件能够支持 SOFATracer 的链路调用,SOFATracer 提供了 HttpClient 的插件扩展,即
tracer-enterprise-httpclient-plugin
:<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>tracer-enterprise-httpclient-plugin</artifactId> </dependency>
HttpClient 依赖
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <!-- 版本 4.3.x - 4.5.x --> <version>4.5.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpasyncclient</artifactId> <!-- 版本 4.1.x --> <version>4.1.3</version> </dependency>
添加一个提供 RESTful 服务的 Controller
示例代码:
@RestController
public class SampleRestController {
private final AtomicLong counter = new AtomicLong(0);
/**
* Request http://localhost:8080/httpclient?name=
*
* @param name name
* @return Map of Result
*/
@RequestMapping("/httpclient")
public Map<String, Object> greeting(@RequestParam(value = "name", defaultValue = "httpclient") String name) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("count", counter.incrementAndGet());
map.put("name", name);
return map;
}
}
构造 HttpClient 并发起对 RESTful 服务的调用
为了使得工程中使用 SOFATracer 的 HttpClient 能够正确埋点和打印日志,请根据 SOFA Boot 版本选择实现方法:
sofaboot-enterprise 3.1.0(即 tracer-parent 3.0.2 )及之前的版本,使用
com.alipay.sofa.tracer.enterprise.plugins.SofaTracerEnterpriseHttpClientBuilder
类去构造 HttpClient 的实例,并显式调用clientBuilder
方法。sofaboot-enterprise 3.1.1(即 tracer-parent 3.0.3 )及之后的版本,使用
com.alipay.sofa.tracer.plugins.httpclient.SofaTracerHttpClientBuilder
类去构造 HttpClient 的实例,并显式调用clientBuilder
方法。
SofaTracerEnterpriseHttpClientBuilder
类提供了 clientBuilder
(同步)和 asyncClientBuilder
(异步)方法,以构造出一个经过 SOFATracer 埋点的org.apache.http.impl.client.HttpClientBuilder
实例。方法签名如下:
// 同步调用构造方法
public static HttpClientBuilder clientBuilder(HttpClientBuilder clientBuilder);
// 同步调用构造方法,并在日志中显示当前应用和目标应用的字段
public static HttpClientBuilder clientBuilder(HttpClientBuilder clientBuilder,
String currentApp, String targetApp);
// 异步调用构造方法
public static HttpAsyncClientBuilder asyncClientBuilder(HttpAsyncClientBuilder httpAsyncClientBuilder);
// 异步调用构造方法,并在日志中显示当前应用和目标应用的字段
public static HttpAsyncClientBuilder asyncClientBuilder(HttpAsyncClientBuilder httpAsyncClientBuilder,
String currentApp, String targetApp);
代码示例
以下示例适用于 sofaboot-enterprise 3.1.0(即 tracer-parent 3.0.2 )及之前的版本。
sofaboot-enterprise 3.1.1(即 tracer-parent 3.0.3 )及之后的版本,请把
SofaTracerEnterpriseHttpClientBuilder
改为SofaTracerHttpClientBuilder
。
构造 HttpClient 同步调用示例:
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); //SOFATracer SofaTracerEnterpriseHttpClientBuilder.clientBuilder(httpClientBuilder,"testSyncClient","testSyncServer"); CloseableHttpClient httpClient=httpClientBuilder.setConnectionManager(connManager).disableAutomaticRetries() .build();
构造 HttpClient 异步调用示例:
RequestConfig requestConfig =RequestConfig.custom().setSocketTimeout(6000).setConnectTimeout(6000).setConnectionRequestTimeout(6000).build(); HttpAsyncClientBuilder httpAsyncClientBuilder =HttpAsyncClientBuilder.create(); //tracer SofaTracerEnterpriseHttpClientBuilder.asyncClientBuilder(httpAsyncClientBuilder,"testAsyncClient","testAsyncServer"); CloseableHttpAsyncClient asyncHttpclient = httpAsyncClientBuilder.setDefaultRequestConfig(requestConfig).build();
通过 SofaTracerEnterpriseHttpClientBuilder
构造的 HttpClient 实例在发起对上文的 RESTful 服务调用的时候,就会埋点 SOFATracer 的链路数据。
运行工程
将 SOFABoot 工程导入到 IDE 中。
编译并运行工程里面中的 main 方法启动应用。
通过
SofaTracerEnterpriseHttpClientBuilder
构造的 HttpClient 发起对 Controller 提供的http://localhost:8080/httpclient
RESTful 服务。
具体操作方法请参考 SOFABoot 快速入门。
查看日志
Tracer 日志的目录路径在 SOFABoot 的配置文件 application.properties
中定义。
在以下示例中,假设配置的日志打印目录是 ./logs
,即当前应用的根目录,同时假设通过 SofaTracerEnterpriseHttpClientBuilder
传入的当前应用名称为 testSyncClient
和目标应用名称 testSyncServer
,那么在当前工程的根目录下可以看到类似如下结构的日志文件:
-- tracelog
|-- httpclient-digest.log
|-- httpclient-stat.log
以 HttpClient 同步调用为例,摘要日志 httpclient-digest.log
如下:
2018-10-0920:57:29.923,testSyncClient,0a0fe9271539089849647100179895,0,http://localhost:49685/httpclient,GET,200,0B,-1B,275ms,main,testSyncServer,,
以 HttpClient 同步调用为例,统计日志 httpclient-stat.log
如下:
2018-10-0920:57:30.596,testSyncClient,http://localhost:49685/httpclient,GET,1,275,Y,F
有关 HttpClient 日志字段的具体含义,参见 日志格式 > HttpClient 日志。