分布式跟踪系统Jaeger(二):Jaeger的基本概念
2017-11-19
1.Opentracing #
Opentracing是一个分布式追踪标准,与平台和语言无关,统一接口,方便接入不同的分布式追踪系统。 Jaeger也是支持Opentracing标准的项目之一。学习jaeger有必要了解Opentracing规范。 以下是jaeger的文档资料:
Opentracing的基本概念:
- Trace:表示对一次请求完整调用链的跟踪,可以认为是多个span的有向无环图(DAG)
- Span:一个span代表系统中具有开始时间和执行时长的逻辑运行单元。span之间通过嵌套或顺序排列简历逻辑因果关系
- Operation Name:每个span都有一个操作名称,这个名称要求具有可读性(例如: 一个RPC方法的名称,一个函数的名称,或一个大型计算过程中的子任务或阶段)。operation name应该是抽象的、通用的标识和明确的、具有统计意义的名称。更具体的子类型的描述请使用tag
- Inter-Span References:一个span可以和一个或多个span间存在因果关系。OpenTracing定义了两种关系
ChildOf
和FollowsFrom
。这两种引用类型代表了子节点和父节点间的直接因果关系。 - Log:每个span可以进行多次Log操作,每次Log操作都需要一个带时间戳的时间名称,以及可选的任意大小的存储结构
- Tag:每个span可以有多个简直对形式的Tag,Tag没有时间戳。Tag主要用来对span进行简单的注解和补充
- SpanContext:每个span必须提供方法访问SpanContext。SpanContext代表跨越进程边界,传递到下级span的状态。例如包含元组
<trace_id, span_id, sampled>
- Baggage:是存储在SpanContext中的一个键值对(SpanContext)集合,它会在一条追踪链路上的所有span内全局传输,包含这些span对应的SpanContext。Baggage功能强大,消耗也很大。因为Baggage全局传输,如果包含的数据量太大或元素太多,将会降低系统的吞吐量或增加RPC的延迟
2.Jaeger的组件 #
下图是Jaeger官方绘制的Jaeger架构图:
Jaeger包含以下主要组件:
- 客户端库
jaeger-client-*
:支持多种语言的客户端库,如Go, Java, Python等语言 - 客户端代理
jaeger-agent
:客户端代理负责将追踪数据转发到服务端,这样能方便应用的快速处理,同时减轻服务端的直接压力;另外可以在客户端代理动态调整采样的频率,进行追踪数据采样的控制 - 数据收集器
jaeger-collector
:主要进行数据收集和处理,从客户端代理收集数据进行处理后持久化到数据存储中 - 数据存储:目前Jaeger支持将收集到的数据持久化到
Cassandra
或Elasticsearch
里面 - 数据查询
jaeger-query
:主要根据不同的条件到数据存储中进行搜索,支撑前端页面的展示 jaeger-ui
:是一个基于React的前端应用,作为jaeger的webuijaeger spark
: 是一个基于spark的后处理和聚合数据管道,可以完成jaeger的服务依赖分析