全部产品

RestTemplate 埋点接入

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

本文将参考 示例工程 演示如何使用 SOFATracer 对 RestTemplate 进行埋点。

假设您已经基于 SOFABoot 构建了一个简单的 Spring Web 工程,那么可以通过如下步骤进行操作:

  1. 引入依赖
  2. 工程配置
  3. 添加 Controller
  4. 获取 RestTemplate
  5. 启动应用
  6. 查看日志

引入依赖

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

工程配置

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

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

添加一个提供 RESTful 服务的 Controller

在工程代码中,添加一个简单的 Controller,例如:

  1. @RestController
  2. public class SampleController {
  3. private final AtomicLong counter = new AtomicLong(0);
  4. @RequestMapping("/rest")
  5. public Map<String, Object> rest() {
  6. Map<String, Object> map = new HashMap<String, Object>();
  7. map.put("count", counter.incrementAndGet());
  8. return map;
  9. }
  10. @RequestMapping("/asyncrest")
  11. public Map<String, Object> asyncrest() throws InterruptedException {
  12. Map<String, Object> map = new HashMap<String, Object>();
  13. map.put("count", counter.incrementAndGet());
  14. Thread.sleep(5000);
  15. return map;
  16. }
  17. }

构造 RestTemplate

以 API 方式构造 RestTemplate 发起一次对上文的 RESTful 服务的调用:

  • 构造 RestTemplate 同步调用实例

    1. RestTemplate restTemplate = SofaTracerRestTemplateBuilder.buildRestTemplate();
    2. ResponseEntity<String> responseEntity = restTemplate.getForEntity(
    3. "http://sac.alipay.net:8080/rest", String.class);
  • 构造 RestTemplate 异步调用实例

    1. AsyncRestTemplate asyncRestTemplate = SofaTracerRestTemplateBuilder
    2. .buildAsyncRestTemplate();
    3. ListenableFuture<ResponseEntity<String>> forEntity = asyncRestTemplate.getForEntity(
    4. "http://sac.alipay.net:8080/asyncrest", String.class);

获取 RestTemplate

以自动注入的方式获取 RestTemplate:

  1. @Autowired
  2. RestTemplate restTemplate;

启动应用

启动 SOFABoot 应用,将会在控制台中看到启动打印的日志:

  1. 2018-10-24 10:45:28.683 INFO 5081 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
  2. 2018-10-24 10:45:28.733 INFO 5081 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
  3. 2018-10-24 10:45:28.736 INFO 5081 --- [ main] c.a.s.t.e.r.RestTemplateDemoApplication : Started RestTemplateDemoApplication in 2.163 seconds (JVM running for 3.603)

调用成功的日志如下:

  1. 2018-10-24 10:45:28.989 INFO 5081 --- [ main] c.a.s.t.e.r.RestTemplateDemoApplication : Response is {"count":1}
  2. 2018-10-24 10:45:34.014 INFO 5081 --- [ main] c.a.s.t.e.r.RestTemplateDemoApplication : Async Response is {"count":2}
  3. 2018-10-24 10:45:34.014 INFO 5081 --- [ main] c.a.s.t.e.r.RestTemplateDemoApplication : test finish .......

查看日志

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

  1. ./logs
  2. ├── spring.log
  3. └── tracelog
  4. ├── resttemplate-digest.log
  5. ├── resttemplate-stat.log
  6. ├── spring-mvc-digest.log
  7. ├── spring-mvc-stat.log
  8. ├── static-info.log
  9. └── tracer-self.log

示例中通过构造两个 RestTemplate(一个同步一个异步)发起对同一个 RESTful 服务的调用,调用完成后可以在 restTemplate-digest.log 中看到类似如下的日志:

  • 摘要日志

    1. {"time":"2019-09-03 10:33:10.336","local.app":"RestTemplateDemo","traceId":"0a0fe9271567477985327100211176","spanId":"0","span.kind":"client","result.code":"200","current.thread.name":"SimpleAsyncTaskExecutor-1","time.cost.milliseconds":"5009ms","request.url":"http://localhost:8801/asyncrest","method":"GET","req.size.bytes":0,"resp.size.bytes":0,"sys.baggage":"","biz.baggage":""}
  • 统计日志

    1. {"time":"2019-09-03 10:34:04.130","stat.key":{"method":"GET","local.app":"RestTemplateDemo","request.url":"http://localhost:8801/asyncrest"},"count":1,"total.cost.milliseconds":5009,"success":"true","load.test":"F"}