全部产品

HttpClient 埋点接入

说明

此功能适用于 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 依赖

    <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 能够正确埋点和打印日志,您必须使用 com.alipay.sofa.tracer.enterprise.plugins.SofaTracerEnterpriseHttpClientBuilder 类去构造 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);

代码示例

  • 构造 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 的链路数据。

运行工程

  1. 将 SOFABoot 工程导入到 IDE 中。

  2. 编译并运行工程里面中的 main 方法启动应用。

  3. 通过 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 日志