一、什么是Jaeger
jaeger是一款开源的分布式追踪系统,为微服务场景而生,它主要用于分析多个服务的调用过程,图形化服务调用轨迹,是诊断性能问题、分析系统故障的利器。
二、Jaeger的0层架构分析
jaeger由以下组件构成:
- jaeger-Client(必选) :为不同语言实现了符合 OpenTracing 标准的 SDK。应用程序通过 API 写入数据,client library 把 trace 信息按照应用程序指定的采样策略传递给 jaeger-agent。
- jaeger-agent(可选): 它是一个监听在 UDP 端口上接收 span 数据的网络守护进程,它会将数据批量发送给 collector。它被设计成一个基础组件,部署到所有的宿主机上。Agent 将 client library 和 collector 解耦,为 client library 屏蔽了路由和发现 collector 的细节。
- jaeger-collector(必选) : 接收 jaeger-agent 或者jaeger-client发送来的数据,然后将数据写入后端存储。Collector 被设计成无状态的组件,因此您可以同时运行任意数量的 jaeger-collector。
- jaeger-db (必选): 后端存储被设计成一个可插拔的组件,支持将数据写入 cassandra、elastic search,最常用的就是elastic search数据库了。
- jaeger-query(可选) : 接收查询请求,然后从后端存储系统中检索 trace 并通过 UI 进行展示。Query 是无状态的,可以启动多个实例。
- jaeger-UI(可选):用于将jaeger存储在db中的数据可视化呈现出来,如果jaeger-db使用的是elasticsearch存储数据,那么可是直接使用elasticsearch更实用的kibana可视化UI来检索数据(需要你对jaeger收集的trace信息数据结构有一定的了解方可)。
三、Jaeger的具体工作流程
- Application(微服务等)-->jaeger-client:jaeger-client通过应用程序(微服务等)指定的采样策略获取到trace信息。
- jaeger-client-->jaeger-agent: client通过UDP协议将trace信息数据传输给jaeger-agent。
- jaeger-agent-->jaeger-collector: agent通过TChannel协议将trace信息数据传输给jager-collector。
- jaeger-collector-->DB: collector将trace信息数据写入到指定数据库中。
- jaeger-db-->jaeger-query: jaeger-query通过查询数据库获取指定的trace信息数据。
- jaeger-query-->jaeger-UI:jaeger-query将获取的trace信息数据呈现在UI上。
- jaeger-collector-->jaeger-agent-->jaeger-client: collector可以通过发起control flow控制流给jaeger-client,比如collector想要对trace数据进行sampling抽样,就发起samping flow,jaeger-client收到之后就进行响应。
四、Jaeger存储的数据结构体
Jaeger通过采集应用程序服务之间调用的轨迹数据,并保存在相应数据库中,那么其捕获的数据有一定的结构,方便UI呈现,只要有下面几个部分:
- Span:追踪中的逻辑单元,比如一次请求的过程/一个函数的执行,包含操作名称、开始时间、持续时间(其所有的Span统称Spans)。
- SpanContext:表示需要传播到下游的Spans数据和跨应用/进程的 Spans数据,可以简单理解为串在各个系统里的统一标识对象。
- Baggage:字符串组成的键值对,和 Span/SpanContext 互相关联,会在所有的下游 Spans 中进行传播。(可以做一些强大的功能,如在整个链路夹带数据,使用成本高,小心使用)
- Trace:项目中的追踪实例,追踪项目里数据变化/函数执行的过程,可以认为是一个定向非循环的 span 的集合图(Spans)。
trace和span的关系如下图:
在Jaeger-UI的视图对应关系如下图:
五、实际应用部署
如下图是一个简单的实例应用部署: