前言
在一个分布式系统中,服务之间相互依赖调用。一个请求有时需要经过几次转发之后才能到达最终的处理服务。这样,每个请求经过了哪些服务,每个服务消耗了多长时间,是后台开发人员迫切关系的问题。zipkin就是这样的一个分布式追踪系统。
术语
Span:基本工作单位。例如,发送RPC是一个新跨度,就像发送对RPC的响应一样。span由一个惟一的64位ID标识,并由另一个64位ID标识该span所在的跟踪。Span还有其他数据,比如描述、带时间戳的事件、键值注释(标记)、产生它们的跨越的ID和进程ID(通常是IP地址)。
Span可以启动和停止,它们跟踪它们的时间信息。一旦创建了一个span,就必须在将来的某个时候停止它。
启动跟踪的初始span称为根span。该span的ID值等于跟踪ID。
Trace:形成树形结构的一组跨度。例如,如果运行分布式大数据存储,则PUT请求可能会形成跟踪。
Annotation:用来在时间上记录一个事件的存在。使用Brave仪表化,我们不再需要为Zipkin设置特殊的事件来了解客户机和服务器是谁、请求从哪里开始和在哪里结束。然而,出于学习的目的,我们标记这些事件,以强调发生了什么样的行为。
- cs:客户端发送。客户已经提出了请求。这个注释表示跨度的开始。
- sr:服务器接收:服务器端收到请求并开始处理它。从这个时间戳中减去cs时间戳,就可以显示网络延迟。
- ss:服务器发送。在完成请求处理时(当响应被发送回客户端时)添加注释。从这个时间戳中减去sr时间戳,就可以看出服务器端处理请求所需的时间。
- cr:客户收到。表示跨度的结束。客户端已经成功接收到来自服务器端的响应。从这个时间戳中减去cs时间戳,就会显示出客户端从服务器接收响应所需的全部时间。
下面的图片展示了Span和Trace在系统中的外观,以及Zipkin注释:
注解的每一种颜色都表示一个跨度(从a到G有7个跨度)。
Trace Id = X
Span Id = D
Client Sent
此注释表明当前span的跟踪Id设置为X, span Id设置为D。此外,发生了Client Sent
的事件。
下面的图片展示了span的父子关系:
zipkin服务
使用docker swarm部署:
version: "3.7"
networks:
xxl:
external: true
services:
zipkin:
image: openzipkin/zipkin
networks:
- xxl
ports:
- "9411:9411"
基本接入
gradle依赖
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
yml配置
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1
查询
根据服务,时间,跟踪ID查找追踪记录。
依赖
根据条件查询服务之间的依赖关系。