使用 SOFATracer 记录 HttpClient 链路调用数据

    要使用 SOFABoot,需要先准备好基础环境,SOFABoot 依赖以下环境:

    • JDK7 或 JDK8
    • 需要采用 Apache Maven 3.2.5 或者以上的版本来编译

    引入 SOFATracer

    在创建好一个 Spring Boot 的工程之后,接下来就需要引入 SOFABoot 的依赖,首先,需要将上文中生成的 Spring Boot 工程的 包解压后,修改 Maven 项目的配置文件 pom.xml,将

    替换为:

    1. <parent>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>sofaboot-dependencies</artifactId>
    4. <version>${sofa.boot.version}</version>
    5. </parent>

    然后,在工程中添加 SOFATracer 依赖:

    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>tracer-sofa-boot-starter</artifactId>
    4. <version>2.2.0</version>
    5. </dependency>

    最后,在工程的 application.properties 文件下添加一个 SOFATracer 要使用的参数,包括spring.application.name 用于标示当前应用的名称;logging.path 用于指定日志的输出目录。

    1. # Application Name
    2. spring.application.name=HttpClientDemo
    3. logging.path=./logs

    添加一个提供 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 的过程不详细展开,具体可以参见本示例中 HttpClientInstance(同步) 和 HttpAsyncClientInstance(异步)构造方法,仅供参考,其中需要重点强调的是,
    为了能够使得 HttpClient 这个第三方开源组件能够支持 SOFATracer 的链路调用,SOFATracer 提供了 HttpClient 的插件扩展即 sofa-tracer-httpclient-plugin ,为了使得用 SOFATracer 的 HttpCliet 正确的埋点,我们需要使用 HttpClientBuilder 去构造 HttpClient 的实例,
    并需要显示的调用 SofaTracerHttpClientBuilder.clientBuilder(httpClientBuilder) 来构造出一个经过 SOFATracer 埋点的 HttpClientBuilder ,关键代码示例如下

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

    运行

    可以将工程导入到 IDE 中运行工程里面中的 main 方法(本实例 main 方法在 HttpClientDemoApplication 中)启动应用,在控制台中看到启动打印的日志如下:

    当有类似如下的日志时,说明 HttpClient 的调用成功:

    1. 2018-09-27 20:31:22.336 INFO 33277 --- [ main] c.a.s.t.e.h.HttpClientDemoApplication : Response is {"count":1,"name":"httpclient"}
    2. 2018-09-27 20:31:22.453 INFO 33277 --- [ main] c.a.s.t.e.h.HttpClientDemoApplication : Async Response is {"count":2,"name":"httpclient"}

    在上面的 application.properties 里面,我们配置的日志打印目录是 ./logs 即当前应用的根目录(我们可以根据自己的实践需要进行配置),在当前工程的根目录下可以看到类似如下结构的日志文件:

    1. ./logs
    2. ├── spring.log
    3. └── tracelog
    4. ├── httpclient-digest.log
    5. ├── httpclient-stat.log
    6. ├── spring-mvc-digest.log
    7. ├── spring-mvc-stat.log
    8. ├── static-info.log
    9. └── tracer-self.log
    1. {"time":"2018-09-27 20:31:22.328","local.app":"HttpClientDemo","traceId":"0a0fe8801538051482054100133277","spanId":"0","request.url":"http://localhost:8080/httpclient","method":"GET","result.code":"200","req.size.bytes":0,"resp.size.bytes":-1,"time.cost.milliseconds":274,"current.thread.name":"main","remote.app":"","baggage":""}

    附此示例工程的。