服务链路追踪(sleuth)

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时间戳可以得到客户端从服务器接收响应所需的全部时间。

下图展示了SpanTrace是如何工作的。

每种颜色代表一个span(总共有7个span,A-G)

1
2
3
Trace Id = X
Span Id = D
Client Sent

意思是:当前spanTrace Id设置为X, Span Id设置为D,同时记录Client Sent事件。
7个spanTrace Id同为X,表示为同一个调用链。串联起来:

使用

添加依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

日志输出

1
2
3
4
5
6
7
service1.log:2016-02-26 11:15:47.561  INFO [service1,2485ec27856c56f4,2485ec27856c56f4,true] 68058 --- [nio-8081-exec-1] i.s.c.sleuth.docs.service1.Application   : Hello from service1. Calling service2
service2.log:2016-02-26 11:15:47.710 INFO [service2,2485ec27856c56f4,9aa10ee6fbde75fa,true] 68059 --- [nio-8082-exec-1] i.s.c.sleuth.docs.service2.Application : Hello from service2. Calling service3 and then service4
service3.log:2016-02-26 11:15:47.895 INFO [service3,2485ec27856c56f4,1210be13194bfe5,true] 68060 --- [nio-8083-exec-1] i.s.c.sleuth.docs.service3.Application : Hello from service3
service2.log:2016-02-26 11:15:47.924 INFO [service2,2485ec27856c56f4,9aa10ee6fbde75fa,true] 68059 --- [nio-8082-exec-1] i.s.c.sleuth.docs.service2.Application : Got response from service3 [Hello from service3]
service4.log:2016-02-26 11:15:48.134 INFO [service4,2485ec27856c56f4,1b1845262ffba49d,true] 68061 --- [nio-8084-exec-1] i.s.c.sleuth.docs.service4.Application : Hello from service4
service2.log:2016-02-26 11:15:48.156 INFO [service2,2485ec27856c56f4,9aa10ee6fbde75fa,true] 68059 --- [nio-8082-exec-1] i.s.c.sleuth.docs.service2.Application : Got response from service4 [Hello from service4]
service1.log:2016-02-26 11:15:48.182 INFO [service1,2485ec27856c56f4,2485ec27856c56f4,true] 68058 --- [nio-8081-exec-1] i.s.c.sleuth.docs.service1.Application : Got response from service2 [Hello from service2, response from service3 [Hello from service3] and from service4 [Hello from service4]]

[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/
Author
Echo
Posted on
June 11, 2018
Licensed under