Jaeger是一个链路追踪系统,适合用于分布式的调用链路分析,服务依赖分析,性能和延迟优化。使用OpenTracing标准的语意和与其兼容的类库,使用灵活的抽样策略,支持多种后端存储(Cassandra, Elasticsearch, memory)
OpenTracing介绍
jaeger使用了OpenTracing的语意和类库,OpenTracing的目的是创建一个平台无关,厂商无关的trace系统标准。在介绍jaeger前先说一下OpenTracing抽象出来的几个概念。
英文说明 不长,对理解有帮助
trace由span组成
span可以理解为一个“过程”,在图片中用一个有跨度的线(长方形)表示,长度即消耗的时间。
trace则由多个span组成。将多个独立的span联系起来的的是requestID,也就是span的上下文信息。span和span之间有两种关系:childOf
和FollowsFrom
。上图的左边将函数调用链描述成一个树,childOf
就是树中的父子关系,followsFrom
就是兄弟关系。
span包含的信息:
- An operation name
- A start timestamp
- A finish timestamp
- A set of zero or more key:value Span Tags. The keys must be strings. The values may be strings, bools, or numeric types.
- A set of zero or more Span Logs, each of which is itself a key:value map paired with a timestamp. The keys must be strings, though the values may be of any type. Not all OpenTracing implementations must support every value type.
- A SpanContext (see below)
- References(childOf/followsFrom) to zero or more causally-related Spans (via the SpanContext of those related Spans)
SpanContext包含两部分信息:
- 能定位到一个特定span的状态信息(traceId和spanId)
- 在进程之间传递的Baggage Items(分布式trace需要上下文信息)
Tracer
创建Span,在进程间在载体(例如Http Header)上Inject和Extract SpanContxt。
Jaeger架构
组件:client、agent、collector、DB、web展示
一种部署架构
包含kafka的部署架构
client说明
client部分负责将span中的信息通过agent传递给后端,从而写入存储;同时,向下游发送请求时,会将SpanContext附加在请求中,从而将trace的信息向下传播。
client为了减小负载,会进行采样,仅仅采样约0.1%的数据(可配置)
使用以及代码侵入型分析
示例代码 这份代码展示了如何在单进程中使用Jaeger Client。可以看到创建了一个单例的Tracer对象,定义好该Trace如何进行采样,以及如何向agent上报数据(Http、rpc、udp)
在微服务环境下,涉及trace的跨进程传播,首先可以在Controller上增加切面,抽取SpanContext信息,其次可以对向外发送请求的对象进行adapt,例如对HttpClient进行代理,增加相关Header以Inject SpanContext信息。另外,因为Tracer对象是单例的,所以Tracer可以作为Spring的一个Bean进行初始化和使用。