全链路监控Jaeger
目录
Jaeger为何物?
Jaeger 是Uber推出的一款开源分布式追踪系统,兼容OpenTracing API,它用于监视和诊断基于微服务的分布式系统.分布式追踪系统用于记录请求范围内的信息,eg.一次远程方法调用的执行过程和耗时。是我们排查系统问题和系统性能的利器。
分布式追踪系统核心步骤
分布式追踪系统种类繁多,但是核心步骤有三个
- 代码埋点
- 数据存储
- 查询展示
Jaeger系统
- 分布式上下文传播
- 分布式交易监控
- 根本原因分析
- 服务依赖性分析性能/延迟优化
Jagger优点
- 兼容OpenTracing API,写起来简单方便
- UI相较于Zipkin的更加直观和丰富
- sdk比较丰富,go语言编写,支持 Go, Java, Node, Python, C++ and C#
- 上传采用的是udp传输,效率高速度快
- 后台存储支持Cassandra 3.4+,Elasticsearch 5.x, 6.x, 7.x,Kafka
Jaeger架构
Jaeger组件介绍
jaeger-client | jaeger 的客户端,实现了opentracing协议 开销很小 |
jaeger-agent | jaeger client的一个代理程序,client将收集到的调用链数据发给agent,然后由agent发给collector |
jaeger-collector | 负责接收jaeger client或者jaeger agent上报上来的调用链数据,然后做一些校验,比如时间范围是否合法等,最终会经过内部的处理存储到后端存储 |
jaeger-query | 专门负责调用链查询的一个服务,有自己独立的UI |
jaeger-ingester | 中文名称“摄食者”,可用从kafka读取数据然后写到jaeger的后端存储,比如Cassandra和Elasticsearch |
spark-job | 基于spark的运算任务,可以计算服务的依赖关系,调用次数等 |
其中jaeger-collector和jaeger-query是必须的,其余的都是可选的,我们没有采用agent上报的方式,而是让客户端直接通过endpoint上报到collector。
Span
Span表示Jaeger中的逻辑工作单元,具有操作名称,操作的开始时间和持续时间。跨度可以嵌套并排序以建立因果关系模型。
每个 Span 包含以下对象:
- Operation name:操作名称 (也可以称作 Span name)。
- Start timestamp:起始时间。
- Finish timestamp:结束时间。
- Span tag:一组键值对构成的 Span 标签集合。键值对中,键必须为 String,值可以是字符串、布尔或者数字类型。
- Span log:一组 Span 的日志集合。每次 Log 操作包含一个键值对和一个时间戳。键值对中,键必须为 String,值可以是任意类型。
- SpanContext: pan 上下文对象。每个 SpanContext 包含以下状态:
- 要实现任何一个 OpenTracing,都需要依赖一个独特的 Span 去跨进程边界传输当前调用链的状态(例如:Trace 和 Span 的 ID)。
- Baggage Items 是 Trace 的随行数据,是一个键值对集合,存在于 Trace 中,也需要跨进程边界传输。
- References(Span 间关系):相关的零个或者多个 Span(Span 间通过 SpanContext 建立这种关系)
Jaeger特性
1.高扩展性
Jaeger后端的设计没有单点故障,可以根据业务需求进行扩展。例如,Uber上任何给定的Jaeger安装通常每天要处理数十亿个跨度。
2.原生支持OpenTracing
Jaeger后端,Web UI和工具库已完全设计为支持OpenTracing标准。
通过跨度引用将迹线表示为有向无环图(不仅是树)
支持强类型的跨度标签和结构化日志通过行李
支持通用的分布式上下文传播机制
3 多存储后端
Jaeger支持两个流行的开源NoSQL数据库作为跟踪存储后端:Cassandra 3.4+和Elasticsearch 5.x / 6.x / 7.x。正在进行使用其他数据库的社区实验,例如ScyllaDB,InfluxDB,Amazon DynamoDB。Jaeger还附带了一个简单的内存存储区,用于测试设置。
4 现代化的UI
Jaeger Web UI是使用流行的开源框架(如React)以Javascript实现的。v1.0中发布了几项性能改进,以允许UI有效处理大量数据,并显示具有成千上万个跨度的跟踪。
5 云原生部署
Jaeger后端作为Docker映像的集合进行分发。这些二进制文件支持各种配置方法,包括命令行选项,环境变量和多种格式(yaml,toml等)的配置文件。Kubernetes模板和Helm图表有助于将其部署到Kubernetes集群。
6 可观察性
默认情况下,所有Jaeger后端组件都公开Prometheus指标(也支持其他指标后端)。使用结构化日志库zap将日志写到标准输出。
7 安全
Jaeger的第三方安全审核可在https://github.com/jaegertracing/security-audits中获得。
8 与Zipkin的向后兼容性
尽管我们建议使用OpenTracing API来对应用程序进行检测并绑定到Jaeger客户端库,以从其他地方无法获得的高级功能中受益,但是如果您的组织已经使用Zipkin库对检测进行了投资,则不必重写所有代码。Jaeger通过在HTTP上接受Zipkin格式(Thrift或JSON v1 / v2)的跨度来提供与Zipkin的向后兼容性。从Zipkin后端切换只是将流量从Zipkin库路由到Jaeger后端的问题。
Jaeger实践
Trace View
Trace Detail View
All in one部署
为了方便大家快速使用,Jaeger直接提供一个All in one的docker镜像,通过All in one的image,我们可以通过以下命令直接启动一套完整的Jaeger tracing系统:
$ docker run -d -e \
COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
jaegertracing/all-in-one:latest
一旦启动成功后,就可以去 http://localhost:16686 看到Jaeger UI了
部署示例APP
docker run --rm -it \
--link jaeger \
-p 8080-8083:8080-8083 \
-e JAEGER_AGENT_HOST="jaeger" \
jaegertracing/example-hotrod:1.14 \
all
部署后通过 http://localhost:8080/ 访问,并点击订购车辆
端口说明
端口 协议 所属模块 功能
5775 UDP agent 通过兼容性Thrift协议,接收Zipkin thrift类型数据
6831 UDP agent 通过兼容性Thrift协议,接收Jaeger thrift类型数据
6832 UDP agent 通过二进制Thrift协议,接收Jaeger thrift类型数据
5778 HTTP agent 配置控制服务接口
16686 HTTP query 客户端前端界面展示端口
14268 HTTP collector 接收客户端Zipkin thrift类型数据
14267 HTTP collector 接收客户端Jaeger thrift类型数据
9411 HTTP collector Zipkin兼容endpoint