架构
另请参阅
术语
Jaeger 使用的数据模型受到了 OpenTracing 规范 的启发,用于表示追踪数据。该数据模型在逻辑上与 OpenTelemetry 追踪 非常相似,但存在一些命名差异
Jaeger | OpenTelemetry | 说明 |
---|---|---|
标签 | 属性 | 两者都支持类型化值,但 Jaeger 不支持嵌套标签。 |
Span 日志 | Span 事件 | 以结构化形式记录的 span 上的时间点事件。 |
Span 引用 | Span 链接 | Jaeger 的 Span 引用具有必需的类型(child-of 或 follows-from )并总是引用前驱 span;OpenTelemetry 的 Span 链接没有类型,但允许属性。 |
进程 | 资源 | 描述产生遥测数据的实体的结构体。 |
Span
Span 表示一个具有操作名称、操作开始时间和持续时间的逻辑工作单元。Span 可以嵌套和排序以建模因果关系。
Trace
Trace 表示数据或执行通过系统的路径。它可以被认为是 span 的有向无环图。
Baggage
Baggage 是任意用户定义的元数据(键值对),可以附加到分布式上下文并通过追踪 SDK 进行传播。参见 W3C Baggage 了解更多信息。
架构
Jaeger 可以部署为一体化二进制文件(所有 Jaeger 后端组件运行在单个进程中),也可以部署为可扩展的分布式系统。下面讨论了两种主要的部署选项。
直接写入存储
在此部署中,收集器接收来自被追踪应用的数据并将其直接写入存储。存储必须能够处理平均流量和峰值流量。收集器使用内存队列来平滑短期流量峰值,但如果存储无法跟上,持续的流量峰值可能会导致数据丢失。
收集器能够集中向 SDK 提供采样配置,这被称为 远程采样模式。它们还可以启用自动采样配置计算,这被称为 自适应采样。
通过 Kafka
为了防止收集器和存储之间的数据丢失,可以使用 Kafka 作为中间的持久队列。需要部署一个额外的组件 jaeger-ingester 来从 Kafka 读取数据并保存到数据库。可以部署多个 jaeger-ingester 来扩展数据摄取;它们将自动在它们之间分配负载。
使用 OpenTelemetry Collector
您无需使用 OpenTelemetry Collector,因为 jaeger-collector 可以直接从 OpenTelemetry SDK(使用 OTLP 导出器)接收 OpenTelemetry 数据。但是,如果您已经使用 OpenTelemetry Collector,例如为了收集其他类型的遥测数据或为了预处理/丰富追踪数据,它可以放置在 SDK 和 jaeger-collector 之间。OpenTelemetry Collector 可以作为应用程序 sidecar、主机代理/守护程序或中心集群运行。
OpenTelemetry Collector 支持 Jaeger 的远程采样协议,可以直接从配置文件提供静态配置,或将请求代理到 Jaeger 后端(例如,使用自适应采样时)。
将 OpenTelemetry Collector 作为 sidecar / 主机代理
优点
- SDK 配置得到简化,因为 trace 导出端点和采样配置端点都可以指向本地主机,无需担心发现这些服务在远程何处运行。
- Collector 可以通过添加环境信息(例如 k8s pod 名称)来丰富数据。
- 数据丰富所需的资源使用可以分布在所有应用主机上。
缺点
- 多一层数据的封送/解封送。
将 OpenTelemetry Collector 作为远程集群
优点
- 分片能力,例如,使用 基于尾部的采样 时。
缺点
- 多一层数据的封送/解封送。
组件
本节详细介绍了 Jaeger 的组成部分以及它们之间的关系。它们按您的应用程序中的 span 与其交互的顺序进行排列。
追踪 SDK
为了生成追踪数据,应用程序必须使用追踪 SDK 进行插桩,例如 OpenTelemetry SDK 。被插桩的应用程序在接收新请求时创建 span,并将上下文信息(trace ID、span ID 和 baggage)附加到传出请求。只有 ID 和 baggage 会随请求传播;所有其他剖析数据,如操作名称、时间、标签和日志,都不会传播。相反,它会在后台异步地导出到 Jaeger 后端。
有许多方法可以对应用程序进行插桩
- 手动地,直接使用追踪 API,
- 依赖于已为各种现有开源框架创建的插桩,
- 自动地,通过字节码操作、monkey-patching、eBPF 和类似技术。
插桩通常不应依赖于特定的追踪 SDK,而只应依赖于抽象的追踪 API,例如 OpenTelemetry API。追踪 SDK 实现追踪 API 并负责数据导出。
插桩旨在在生产环境中始终开启。为了最小化开销,SDK 采用各种采样策略。当 trace 被采样时,剖析 span 数据会被捕获并传输到 Jaeger 后端。当 trace 未被采样时,不会收集任何剖析数据,并且对追踪 API 的调用会被短路,以产生最小量的开销。欲了解更多信息,请参阅 采样 页面。
收集器
jaeger-collector 接收 trace,通过处理管道进行验证和清理/丰富,并将它们存储在存储后端。Jaeger 内置支持多种存储后端(参见 部署),以及用于实现自定义存储插件的可扩展插件框架。
查询
jaeger-query 是一个服务,它暴露 API 以从存储中检索 trace,并托管一个 Web UI 用于搜索和分析 trace。
摄取器
jaeger-ingester 是一个服务,它从 Kafka 读取 trace 并将其写入存储后端。实际上,它是 Jaeger 收集器的一个简化版本,只支持 Kafka 作为输入协议。