乌克兰国旗 我们与在乌克兰的朋友和同事站在一起。为了在他们需要的时候支持乌克兰 请访问此页面

架构

版本  1.69 最新 转到最新的 2.x 版本

另请参阅


术语

Jaeger 使用的数据模型受到了 OpenTracing 规范外部链接 - Jaeger 分布式追踪平台 的启发,用于表示追踪数据。该数据模型在逻辑上与 OpenTelemetry 追踪外部链接 - Jaeger 分布式追踪平台 非常相似,但存在一些命名差异

JaegerOpenTelemetry说明
标签属性两者都支持类型化值,但 Jaeger 不支持嵌套标签。
Span 日志Span 事件以结构化形式记录的 span 上的时间点事件。
Span 引用Span 链接Jaeger 的 Span 引用具有必需的类型(child-offollows-from)并总是引用前驱 span;OpenTelemetry 的 Span 链接没有类型,但允许属性。
进程资源描述产生遥测数据的实体的结构体。

Span

Span 表示一个具有操作名称、操作开始时间和持续时间的逻辑工作单元。Span 可以嵌套和排序以建模因果关系。

Traces And Spans

Trace

Trace 表示数据或执行通过系统的路径。它可以被认为是 span 的有向无环图。

Baggage

Baggage 是任意用户定义的元数据(键值对),可以附加到分布式上下文并通过追踪 SDK 进行传播。参见 W3C Baggage外部链接 - Jaeger 分布式追踪平台 了解更多信息。

架构

Jaeger 可以部署为一体化二进制文件(所有 Jaeger 后端组件运行在单个进程中),也可以部署为可扩展的分布式系统。下面讨论了两种主要的部署选项。

直接写入存储

在此部署中,收集器接收来自被追踪应用的数据并将其直接写入存储。存储必须能够处理平均流量和峰值流量。收集器使用内存队列来平滑短期流量峰值,但如果存储无法跟上,持续的流量峰值可能会导致数据丢失。

收集器能够集中向 SDK 提供采样配置,这被称为 远程采样模式。它们还可以启用自动采样配置计算,这被称为 自适应采样

Architecture

通过 Kafka

为了防止收集器和存储之间的数据丢失,可以使用 Kafka 作为中间的持久队列。需要部署一个额外的组件 jaeger-ingester 来从 Kafka 读取数据并保存到数据库。可以部署多个 jaeger-ingester 来扩展数据摄取;它们将自动在它们之间分配负载。

Architecture

使用 OpenTelemetry Collector

无需使用 OpenTelemetry Collector,因为 jaeger-collector 可以直接从 OpenTelemetry SDK(使用 OTLP 导出器)接收 OpenTelemetry 数据。但是,如果您已经使用 OpenTelemetry Collector,例如为了收集其他类型的遥测数据或为了预处理/丰富追踪数据,它可以放置在 SDK 和 jaeger-collector 之间。OpenTelemetry Collector 可以作为应用程序 sidecar、主机代理/守护程序或中心集群运行。

OpenTelemetry Collector 支持 Jaeger 的远程采样协议,可以直接从配置文件提供静态配置,或将请求代理到 Jaeger 后端(例如,使用自适应采样时)。

Architecture

将 OpenTelemetry Collector 作为 sidecar / 主机代理

优点

  • SDK 配置得到简化,因为 trace 导出端点和采样配置端点都可以指向本地主机,无需担心发现这些服务在远程何处运行。
  • Collector 可以通过添加环境信息(例如 k8s pod 名称)来丰富数据。
  • 数据丰富所需的资源使用可以分布在所有应用主机上。

缺点

  • 多一层数据的封送/解封送。

将 OpenTelemetry Collector 作为远程集群

优点

缺点

  • 多一层数据的封送/解封送。

组件

本节详细介绍了 Jaeger 的组成部分以及它们之间的关系。它们按您的应用程序中的 span 与其交互的顺序进行排列。

追踪 SDK

为了生成追踪数据,应用程序必须使用追踪 SDK 进行插桩,例如 OpenTelemetry SDK外部链接 - Jaeger 分布式追踪平台。被插桩的应用程序在接收新请求时创建 span,并将上下文信息(trace ID、span ID 和 baggage)附加到传出请求。只有 ID 和 baggage 会随请求传播;所有其他剖析数据,如操作名称、时间、标签和日志,都不会传播。相反,它会在后台异步地导出到 Jaeger 后端。

Context propagation explained

有许多方法可以对应用程序进行插桩

  • 手动地,直接使用追踪 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 作为输入协议。