Spring Cloud Sleuth为Spring Cloud实现了分布式链路跟踪解决方案。也引入了Google论文 Dapper 中的术语。
Span:基本工作单元,例如,发送RPC是一个新的span,就像向RPC发送响应一样,Span由span的唯一64位ID标识,另一个64位ID标识其所属的Trace。Span还有其他数据,例如描述、带时间戳的事件、键值annotations(标签),导致它们的span的ID以及进程ID(通常是IP地址)。
span可以启动和停止,它们可以跟踪自己的时间信息,创建span后,必须在将来的某个时刻停止它。
启动Trace的初始span称为 root span
,该span的ID值等于trace ID。
Trace:一组span形成的树状结构,例如,如果运行分布式大数据存储,则可能由 PUT
请求形成trace。
Annotation:用于及时记录事件的存在,使用 Brave 工具,不再需要为 Zipkin 设置特殊的事件来了解客户端和 服务器 是谁、请求在哪里开始以及在哪里结束,然而,出于学习目的,标记这些事件以突出发生了什么类型的操作。
- cs :Client Sent,客户端发起了一个请求,这个annotation表示span的开始。
- sr :Server Received,服务器端获得了请求并开始处理它,从此时间戳中减去
cs
时间戳会显示网络延迟。 - ss :Server Sent,在请求处理完成时注释(当响应被发送回客户端时),从此时间戳中减去
sr
时间戳会显示服务器端处理请求所需的时间。 - cr :Client Received,表示span的结束,客户端已成功从服务器端收到响应,从此时间戳中减去
cs
时间戳会显示客户端从服务器接收响应所需的全部时间。
下图显示了系统中的 Span 和 Trace ,以及Zipkin annotations:
标记的每种颜色表示一个span(有七个span — 从 A 到 G ),请考虑以下标记:
Trace Id = X Span Id = D Client Sent
此标记表示当前span的 Trace Id 设置为 X , Span Id 设置为 D ,此外,还发生了 Client Sent
事件。
下图显示了span的父—子关系:
https://github.com/spring-cloud/spring-cloud-sleuth
实际项目中若已引入Spring Could sleuth包,则默认会在打印日志时输出traceId、spanId等内容,若它调用一个也是用Spring Could sleuth的服务,则会自动传递traceId
类似这种traceId的传递操作,在服务内多采用ThreadLocal或MDC的方式,在分布式微服务时一般在request header或url参数中传递。