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定义了两种关系ChildOfFollowsFrom。这两种引用类型代表了子节点和父节点间的直接因果关系。
  • 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-architecture.png

Jaeger包含以下主要组件:

  • 客户端库jaeger-client-*:支持多种语言的客户端库,如Go, Java, Python等语言
  • 客户端代理jaeger-agent:客户端代理负责将追踪数据转发到服务端,这样能方便应用的快速处理,同时减轻服务端的直接压力;另外可以在客户端代理动态调整采样的频率,进行追踪数据采样的控制
  • 数据收集器jaeger-collector:主要进行数据收集和处理,从客户端代理收集数据进行处理后持久化到数据存储中
  • 数据存储:目前Jaeger支持将收集到的数据持久化到CassandraElasticsearch里面
  • 数据查询jaeger-query:主要根据不同的条件到数据存储中进行搜索,支撑前端页面的展示
  • jaeger-ui:是一个基于React的前端应用,作为jaeger的webui
  • jaeger spark: 是一个基于spark的后处理和聚合数据管道,可以完成jaeger的服务依赖分析

参考