快速开始指南
SOFATracer 接入的组件列表参考:SOFATracer 介绍,在使用时请注意不同组件对应的SOFATracer 版本和 JDK 版本。
环境准备
要使用 SOFABoot,需要先准备好基础环境,SOFABoot 依赖以下环境: - JDK7 或 JDK8 - 需要采用 Apache Maven 3.2.5 或者以上的版本来编译
常见组件
Spring MVC 埋点接入
HttpClient 埋点接入
DataSource 埋点接入
RestTemplate 埋点接入
OkHttp 埋点接入
Dubbo 埋点接入
此处,以 spring mvc 作为例子。
Spring MVC 埋点接入
在本文档将演示如何使用 SOFATracer 对 SpringMVC 进行埋点,本示例工程地址。
假设你已经基于 SOFABoot 构建了一个简单的 Spring Web 工程,那么可以通过如下步骤进行操作:
依赖引入
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>tracer-sofa-boot-starter</artifactId>
</dependency>
工程配置
在工程的 application.properties 文件下添加 SOFATracer 要使用的参数,包括spring.application.name 用于标示当前应用的名称;logging.path 用于指定日志的输出目录。
# Application Name
spring.application.name=SOFATracerSpringMVC
# logging path
logging.path=./logs
添加一个提供 RESTful 服务的 Controller
在工程代码中,添加一个简单的 Controller,例如:
@RestController
public class SampleRestController {
private static final String TEMPLATE = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
/**
* http://localhost:8080/springmvc
* @param name name
* @return map
*/
@RequestMapping("/springmvc")
public Map<String, Object> springmvc(@RequestParam(value = "name", defaultValue = "SOFATracer SpringMVC DEMO") String name) {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("success", true);
resultMap.put("id", counter.incrementAndGet());
resultMap.put("content", String.format(TEMPLATE, name));
return resultMap;
}
}
运行
启动 SOFABoot 应用,将会在控制台中看到启动打印的日志:
2018-05-11 11:55:11.932 INFO 66490 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'SpringMvcOpenTracingFilter' to urls: [/*]
2018-05-11 11:55:13.961 INFO 66490 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-05-11 11:55:13.970 INFO 66490 --- [ main] c.a.s.t.e.springmvc.DemoApplication : Started DemoApplication in 8.361 seconds (JVM running for 9.34)
可以通过在浏览器中输入 http://localhost:8080/springmvc 来访问 REST 服务,结果类似如下:
{
content: "Hello, SOFATracer SpringMVC DEMO!",
id: 1,
success: true
}
查看日志
在上面的 application.properties 里面,我们配置的日志打印目录是 ./logs 即当前应用的根目录(我们可以根据自己的实践需要配置),在当前工程的根目录下可以看到类似如下结构的日志文件:
./logs
├── spring.log
└── tracelog
├── spring-mvc-digest.log
├── spring-mvc-stat.log
├── static-info.log
└── tracer-self.log
通过访问 http://localhost:8080/springmvc SOFATracer 会记录每一次访问的摘要日志,可以打开 spring-mvc-digest.log 看到具体的输出内容。
{"time":"2019-09-03 10:33:10.336","local.app":"RestTemplateDemo","traceId":"0a0fe9271567477985327100211176","spanId":"0.1","span.kind":"server","result.code":"200","current.thread.name":"http-nio-8801-exec-2","time.cost.milliseconds":"5006ms","request.url":"http://localhost:8801/asyncrest","method":"GET","req.size.bytes":-1,"resp.size.bytes":0,"sys.baggage":"","biz.baggage":""}
Spring MVC 日志
SOFATracer 集成 SpringMVC 后输出 MVC 请求的链路数据格式,默认为 JSON 数据格式。
Spring MVC 摘要日志(spring-mvc-digest.log)
以 JSON 格式输出的数据,相应 key 的含义解释如下:
key | 表达含义 |
---|---|
time | 日志打印时间 |
local.app | 当前应用名 |
traceId | TraceId |
spanId | SpanId |
span.kind | Span 类型 |
result.code | 状态码 |
current.thread.name | 当前线程名 |
time.cost.milliseconds | span 耗时 |
request.url | 请求地址 |
method | http method |
req.size.bytes | 请求大小 |
resp.size.bytes | 响应大小 |
sys.baggage | 系统透传的 baggage 数据 |
biz.baggage | 业务透传的 baggage 数据 |
样例:
{"time":"2019-09-03 10:33:10.336","local.app":"RestTemplateDemo","traceId":"0a0fe9271567477985327100211176","spanId":"0.1","span.kind":"server","result.code":"200","current.thread.name":"http-nio-8801-exec-2","time.cost.milliseconds":"5006ms","request.url":"http://localhost:8801/asyncrest","method":"GET","req.size.bytes":-1,"resp.size.bytes":0,"sys.baggage":"","biz.baggage":""}
Spring MVC 统计日志(spring-mvc-stat.log)
stat.key 即本段时间内的统计关键字集合,统一关键字集合唯一确定一组统计数据,包含local.app、request.url、和 method 字段.
key | 表达含义 |
---|---|
time | 日志打印时间 |
stat.key local.app | 当前应用名 |
stat.key request.url | 请求 URL |
stat.key method | 请求 HTTP 方法 |
count | 本段时间内请求次数 |
total.cost.milliseconds | 本段时间内的请求总耗时(ms) |
success | 请求结果:Y 表示成功(1 开头和 2 开头的结果码算是成功的,302表示的重定向算成功,其他算是失败的);N 表示失败 |
load.test | 压测标记:T 是压测;F 不是压测 |
样例:
{"time":"2019-09-03 10:34:04.129","stat.key":{"method":"GET","local.app":"RestTemplateDemo","request.url":"http://localhost:8801/asyncrest"},"count":1,"total.cost.milliseconds":5006,"success":"true","load.test":"F"}
小结
针对不同的组件,达到开箱即用的作用。
(1)这个和自己的 auto-log 有什么区别?
auto-log 是针对日志的一种丰富。
(2)有什么值得学习的地方?
针对不同组件的提供定制化的实现,这一点值得学习。
对于数据的统计,在传统的 auto-log 中是缺失的。
(3)用途
tracer 虽然看起来是本地 log,但是可以结合网络通讯,将日志上送到服务器。
便于统一的监控。
参考资料
https://www.sofastack.tech/projects/sofa-tracer/component-access/