全部产品
云市场

HttpClient 埋点接入

更新时间:2020-02-18 09:27:16

说明:此功能适用于 HttpClient 4.3.x - 4.5.x 版本。

HttpClient 是 Apache 项目的开源组件,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。

您可以在 SOFABoot 工程中引入并使用 HttpClient 打印 Tracer 日志。

本文将演示如何使用 SOFATracer 对 HttpClient 进行埋点。假设您已经基于 SOFABoot 构建了一个简单的 Spring Web 工程,那么可以通过如下步骤进行操作:

  1. 引入 Maven 依赖
  2. 添加提供 RESTful 服务的 Controller
  3. 构造并发起对 HttpClient 的调用
  4. 运行工程
  5. 查看日志

引入 Maven 依赖

为了使用 HttpClient 打印 Tracer 日志,您必须在项目的 pom.xml 文件中引入以下 Maven 依赖:

  • SOFATracer 依赖
    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>tracer-enterprise-sofa-boot-starter</artifactId>
    4. </dependency>
  • 基于 SOFATracer 的 HttpClient 插件

    为了使得 HttpClient 这个第三方开源组件能够支持 SOFATracer 的链路调用,SOFATracer 提供了 HttpClient 的插件扩展,即 tracer-enterprise-httpclient-plugin

    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>tracer-enterprise-httpclient-plugin</artifactId>
    4. </dependency>
  • HttpClient 依赖
    1. <dependency>
    2. <groupId>org.apache.httpcomponents</groupId>
    3. <artifactId>httpclient</artifactId>
    4. <!-- 版本 4.3.x - 4.5.x -->
    5. <version>4.5.3</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.apache.httpcomponents</groupId>
    9. <artifactId>httpasyncclient</artifactId>
    10. <!-- 版本 4.1.x -->
    11. <version>4.1.3</version>
    12. </dependency>

添加一个提供 RESTful 服务的 Controller

示例代码:

  1. @RestController
  2. public class SampleRestController {
  3. private final AtomicLong counter = new AtomicLong(0);
  4. /**
  5. * Request http://localhost:8080/httpclient?name=
  6. * @param name name
  7. * @return Map of Result
  8. */
  9. @RequestMapping("/httpclient")
  10. public Map<String, Object> greeting(@RequestParam(value = "name", defaultValue = "httpclient") String name) {
  11. Map<String, Object> map = new HashMap<String, Object>();
  12. map.put("count", counter.incrementAndGet());
  13. map.put("name", name);
  14. return map;
  15. }
  16. }

构造 HttpClient 并发起对 RESTful 服务的调用

为了使得工程中使用 SOFATracer 的 HttpClient 能够正确埋点和打印日志,您必须使用 com.alipay.sofa.tracer.enterprise.plugins.SofaTracerEnterpriseHttpClientBuilder 类去构造 HttpClient 的实例,并显式调用 clientBuilder 方法。

SofaTracerEnterpriseHttpClientBuilder 类提供了 clientBuilder(同步)和 asyncClientBuilder(异步)方法,以构造出一个经过 SOFATracer 埋点的org.apache.http.impl.client.HttpClientBuilder 实例。方法签名如下:

  1. // 同步调用构造方法
  2. public static HttpClientBuilder clientBuilder(HttpClientBuilder clientBuilder);
  3. // 同步调用构造方法,并在日志中显示当前应用和目标应用的字段
  4. public static HttpClientBuilder clientBuilder(HttpClientBuilder clientBuilder,
  5. String currentApp, String targetApp);
  6. // 异步调用构造方法
  7. public static HttpAsyncClientBuilder asyncClientBuilder(HttpAsyncClientBuilder httpAsyncClientBuilder);
  8. // 异步调用构造方法,并在日志中显示当前应用和目标应用的字段
  9. public static HttpAsyncClientBuilder asyncClientBuilder(HttpAsyncClientBuilder httpAsyncClientBuilder,
  10. String currentApp, String targetApp) ;

代码示例

  • 构造 HttpClient 同步调用示例:
  1. HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
  2. //SOFATracer
  3. SofaTracerEnterpriseHttpClientBuilder.clientBuilder(httpClientBuilder,"testSyncClient","testSyncServer");
  4. CloseableHttpClient httpClient = httpClientBuilder.setConnectionManager(connManager).disableAutomaticRetries()
  5. .build();
  • 构造 HttpClient 异步调用示例:
  1. RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(6000).setConnectTimeout(6000).setConnectionRequestTimeout(6000).build();
  2. HttpAsyncClientBuilder httpAsyncClientBuilder = HttpAsyncClientBuilder.create();
  3. //tracer
  4. SofaTracerEnterpriseHttpClientBuilder.asyncClientBuilder(httpAsyncClientBuilder,"testAsyncClient","testAsyncServer");
  5. CloseableHttpAsyncClient asyncHttpclient = httpAsyncClientBuilder.setDefaultRequestConfig(requestConfig).build();

通过 SofaTracerEnterpriseHttpClientBuilder 构造的 HttpClient 实例在发起对上文的 RESTful 服务调用的时候,就会埋点 SOFATracer 的链路数据。

运行工程

  1. 将 SOFABoot 工程导入到 IDE 中。
  2. 编译并运行工程里面中的 main 方法启动应用。
  3. 通过 SofaTracerEnterpriseHttpClientBuilder 构造的 HttpClient 发起对 Controller 提供的 http://localhost:8080/httpclient RESTful 服务。

具体操作方法请参考 SOFABoot 快速入门

查看日志

Tracer 日志的目录路径在 SOFABoot 的配置文件 application.properties 中定义。

在以下示例中,假设配置的日志打印目录是 ./logs ,即当前应用的根目录,同时假设通过 SofaTracerEnterpriseHttpClientBuilder 传入的当前应用名称为 testSyncClient 和目标应用名称 testSyncServer,那么在当前工程的根目录下可以看到类似如下结构的日志文件:

  1. -- tracelog
  2. |-- httpclient-digest.log
  3. |-- httpclient-stat.log

以 HttpClient 同步调用为例,摘要日志 httpclient-digest.log 如下:

  1. 2018-10-09 20:57:29.923,testSyncClient,0a0fe9271539089849647100179895,0,http://localhost:49685/httpclient,GET,200,0B,-1B,275ms,main,testSyncServer,,

以 HttpClient 同步调用为例,统计日志 httpclient-stat.log 如下:

  1. 2018-10-09 20:57:30.596,testSyncClient,http://localhost:49685/httpclient,GET,1,275,Y,F

有关 HttpClient 日志字段的具体含义,参见 日志格式 > HttpClient 日志