服务链路追踪(sleuth)
- 本文springboot版本:
2.0.2.RELEASE
,springcloud版本:Finchley.RC1
- 本文使用我公开的注册中心: http://www.wekri.com/eureka; ui: http://www.wekri.com/eureka_ui
Spring Cloud Sleuth 是一个分布式链路追踪工具 for Spring Cloud。 她借助了 Dapper, Zipkin, 和 HTrace.
术语
Spring Cloud Sleuth借用了Dapper的术语。
- Span: 基本的工作单位。 当调用一个服务时,会持续一段时间,这个跨度称为Span。Spans由span唯一的64位标识和span所包含的跟踪的另一个64位标识标识。 Spans还具有其他数据,如描述、时间戳事件、键值注释(标记)。
- Trace: 一组span形成树状结构。在一个调用链中,多个Span对应同一个Trace。
- Annotation: 用来及时记录事件发生。借助Brave工具,我们不再需要为Zipkin设置特殊事件,以了解客户端和服务器是谁,请求的起始位置以及结束位置。
- cs: Client Sent。客户端发出请求时,记录span(包括时间戳等信息)。
- sr: Server Received。服务器端收到请求并开始处理时记录一下。 用当前间戳减去
cs
时间戳可以得到网络延迟。 - ss: Server Sent。在请求处理完成时(当响应被发送回客户端时)记录一下。 用当前戳减去
sr
时间戳可以得到服务器端处理请求所需的时间。 - cr: Client Received。表示span结束。客户端已经成功接收到服务器端的响应。 用当前时间戳减去
cs
时间戳可以得到客户端从服务器接收响应所需的全部时间。
下图展示了Span
和Trace
是如何工作的。
每种颜色代表一个span
(总共有7个span
,A-G)
1 |
|
意思是:当前span
的Trace Id
设置为X
, Span Id
设置为D
,同时记录Client Sent
事件。
7个span
的Trace Id
同为X
,表示为同一个调用链。串联起来:
使用
添加依赖
1 |
|
日志输出
1 |
|
[appname,traceId,spanId,exportable]
- 第一个值:
service1
,应用程序名称,也就是application.properties中spring.application.name参数配置的属性。 - 第二个值:
2485ec27856c56f4
,traceId,Spring Cloud Sleuth生成的一个ID,它用来标识一条请求链路。一条请求链路中包含一个Trace ID,多个Span ID。 - 第三个值:
2485ec27856c56f4
,spanId,Spring Cloud Sleuth生成的另外一个ID,称为Span ID,它表示一个基本的工作单元,比如:发送一个HTTP请求。 - 第四个值:
true
,该日志是否需要输出到Zipkin等服务中来收集和展示。
上面四个值中的Trace ID和Span ID是Spring Cloud Sleuth实现分布式服务跟踪的核心。在一次服务请求链路的调用过程中,会保持并传递同一个Trace ID,从而将整个分布于不同微服务进程中的请求跟踪信息串联起来,以上面输出内容为例,trace-1和trace-2同属于一个前端服务请求来源,所以他们的Trace ID是相同的,处于同一条请求链路中。
应用
后续可以使用ELK、zipkin等分析调用链。
资料:
https://github.com/spring-cloud/spring-cloud-sleuth#sleuth-adding-project
https://github.com/openzipkin/zipkin
https://zipkin.io/
服务链路追踪(sleuth)
https://www.wekri.com/springcloud/springCloudSleuth/