Jaeger 概述
Jaeger
是 Uber
开发并开源的一款分布式追踪系统,兼容 OpenTracing API
,适用于以下下场景:
- 分布式跟踪信息传递
- 分布式事务监控
- 问题分析
- 服务依赖性分析
- 性能优化
特性
高扩展性
Jaeger
后端的设计没有单点故障,可以根据业务需求进行扩展。
原生支持 OpenTracing
Jaeger
后端,Web UI
和工具库已完全设计为支持OpenTracing
标准。
- 通过跨度引用将迹线表示为有向无环图(不仅是树);
- 支持强类型的跨度标签和结构化日志
baggage
- 支持通用的分布式上下文传播机制
多存储后端
Jaeger
支持两个流行的开源NoSQL
数据库作为跟踪存储后端:Cassandra 3.4+
和Elasticsearch 5.x / 6.x / 7.x
。Jaeger
还附带了一个简单的内存存储区,用于测试设置。
现代化的UI
Jaeger Web UI
是使用流行的开源框架(如React
)以Javascript
实现的。v1.0
中发布了几项性能改进,以允许UI
有效处理大量数据,并显示具有成千上万个跨度的跟踪
云原生部署
Jaeger
后端作为Docker
映像的集合进行分发。- 这些二进制文件支持各种配置方法,包括命令行选项,环境变量和多种格式(
yaml,toml
等)的配置文件。 Kubernetes
模板和Helm
图表有助于将其部署到Kubernetes
集群。
可观察性
- 所有
Jaeger
后端组件都公开Prometheus
指标(也支持其他指标后端)。 - 使用结构化日志库
zap
将日志写到标准输出。
系统架构
-
Jaeger Client
- 为不同语言实现了符合OpenTracing
标准的SDK
。应用程序通过API
写入数据,client library
把trace
信息按照应用程序指定的采样策略传递给jaeger-agent
。 -
Agent
- 是一个监听在UDP
端口上接收span
数据的网络守护进程,它会将数据批量发送给collector
。它被设计成一个基础组件,推荐部署到所有的宿主机上。Agent
将client library
和collector
解耦,为client library
屏蔽了路由和发现collector
的细节。 -
Collector
- 接收jaeger-agent
发送来的数据,然后将数据写入后端存储。Collector
被设计成无状态的组件,因此您可以同时运行任意数量的jaeger-collector
。 -
Data Store
- 后端存储被设计成一个可插拔的组件,支持将数据写入cassandra
、elastic search
。 -
Query
- 接收查询请求,然后从后端存储系统中检索trace
并通过UI
进行展示。Query
是无状态的,您可以启动多个实例,把它们部署在nginx
这样的负载均衡器后面。
采样速率
如果所有的请求都开启 Trace
显然会带来比较大的压力,另外,大量的数据也会带来很大存储压力。为此,jaeger
支持设置采样速率,根据系统实际情况设置合适的采样频率。
Jaeger
官方提供了多种采集策略,可以根据时间情况按需使用
const
- 全量采集,采样率设置0
,1
分别对应打开和关闭probabilistic
- 概率采集,默认万份之一,0~1
之间取值,rateLimiting
- 限速采集,每秒只能采集一定量的数据remote
- 一种动态采集策略,根据当前系统的访问量调节采集策略