架构
另请参阅
Jaeger v2 设计为一个多功能且灵活的追踪平台。它可以部署为一个单一二进制文件,配置为在 Jaeger 架构中执行不同的角色。
角色
- collector:接收来自应用程序的追踪数据并将其写入存储后端。
- query:提供用于查询和可视化追踪的 API 和用户界面。
- ingester:从 Kafka 接收 span 并将其写入存储后端;在分离的 collector-Kafka-ingester 配置中运行时非常有用。
- all-in-one:在单个进程中包含 collector 和 query 角色。
- agent:一个主机代理或 sidecar,与应用程序一起运行并将追踪数据转发给 collector。虽然 Jaeger 可以配置为这个角色,但我们建议改用标准的OpenTelemetry Collector ,因为您可能还需要它来处理其他类型的遥测数据(指标和日志)。
all-in-one 和 collector/query 配置之间的选择取决于偏好。当使用外部存储后端时,这两种配置都可以水平扩展,但 collector/query 配置允许分离读写流量并独立扩展它们,还可以应用不同的访问和安全策略。
使用内存存储的 all-in-one 配置最适合开发和测试,但不建议用于生产环境,因为重启会丢失数据。使用Badger 后端的 all-in-one 可以用于生产环境,但仅适用于适度的数据量,因为它仅限于单个实例且无法水平扩展。
架构选择
可扩展的 Jaeger 后端最常见的两种部署选项是直接写入存储和使用 Kafka 作为缓冲区。
直接写入存储
在此部署中,collectors 接收来自被追踪应用程序的数据并将其直接写入存储。存储必须能够处理平均和峰值流量。collectors 可以使用内存队列来平滑短时流量峰值,但如果存储无法跟上,持续的流量峰值可能导致数据丢失。
通过 Kafka
为了防止 collectors 和存储之间的数据丢失,可以使用 Kafka 作为中间的持久队列。collectors 配置了 Kafka 导出器。需要部署一个额外的组件 ingester,用于从 Kafka 读取数据并将其保存到存储中。可以部署多个 ingesters 来扩展数据摄取能力;它们会自动在它们之间分配负载。实际上,ingester 与 collector 非常相似,只是配置了一个 Kafka 接收器而不是基于 RPC 的接收器。
结合 OpenTelemetry Collector
您**不需要**使用 OpenTelemetry Collector 来运行 Jaeger,因为 Jaeger 是 OpenTelemetry Collector 的一个定制分发版本,具有不同的角色。但是,如果您已经使用 OpenTelemetry Collectors 来收集其他类型的遥测数据或用于预处理/丰富追踪数据,它可以放置在 Jaeger 前面的收集管道中。OpenTelemetry Collectors 可以作为应用程序 sidecar、主机代理/守护进程或远程服务集群运行。
OpenTelemetry Collector 支持 Jaeger 的远程采样协议,可以直接提供配置文件中的静态配置,或将请求代理到 Jaeger 后端(例如,在使用自适应采样时)。
将 OpenTelemetry Collector 作为 sidecar / 主机代理
优点
- SDK 配置得到简化,因为追踪导出端点和采样配置端点都可以指向本地主机,而无需担心发现这些服务在远程何处运行。
- Collector 可以通过添加环境信息(例如 k8s pod 名称)来丰富数据。
- 数据丰富所需的资源使用可以分布在所有应用程序主机上。
缺点
- 额外一层数据编组/解组。
将 OpenTelemetry Collector 作为远程集群
优点
- 分片能力,例如在使用尾部采样 时。
缺点
- 额外一层数据编组/解组。
Jaeger 二进制文件
Jaeger 二进制文件基于 OpenTelemetry Collector 框架构建,并包含
- 官方上游组件,例如 OTLP Receiver、Batch 和 Attribute Processor 等。
- 来自
opentelemetry-collector-contrib
的上游组件,例如 Kafka Exporter 和 Receiver、Tail Sampling Processor 等。 - Jaeger 自己的组件,例如 Jaeger Storage Exporter、Jaeger Query Extension 等。
Jaeger 组件
Jaeger Storage Extension(Jaeger 存储扩展) - Jaeger 支持的存储后端的可扩展中心。它为所有其他 Jaeger 组件提供了对 Jaeger 存储实现的访问权限。
Jaeger Storage Exporter(Jaeger 存储导出器) - 将 span 写入在 Jaeger Storage Extension 中配置的存储后端。
Jaeger Query Extension(Jaeger 查询扩展) - 运行查询 API 和 Jaeger UI。
Adaptive Sampling Processor(自适应采样处理器) - 对自适应采样执行概率计算。
Remote Sampling Extension(远程采样扩展) - 基于静态配置文件或自适应采样,提供远程采样的端点。
OpenTelemetry 组件
接收器
OTLP - 接受通过 OpenTelemetry Line Protocol (OTLP) 发送的 span。
Jaeger - 接受通过 gRPC 或 Thrift 协议传输的 Jaeger 格式追踪。
Kafka - 接受来自 Kafka 的各种格式(OTLP、Jaeger、Zipkin)的 span。
Zipkin - 接受使用 Zipkin v1 和 v2 协议的 span。
No-op - 用于不需要摄取管道的 Jaeger UI / 查询服务部署。
处理器
Batch Processor(批处理器) - 批量处理 span 以提高效率。
Tail Sampling(尾部采样) - 支持高级的收集后采样。
Memory Limiter(内存限制器) - 当 collector 过载时支持背压。
Attributes Processor(属性处理器) - 允许使用属性过滤、重写和丰富 span。可用于删除敏感数据、减少数据量或附加环境信息。
Filter Processor(过滤器处理器) - 允许从 collector 中丢弃 span 和 span 事件(⚠️ 可能导致追踪断裂)。
导出器
OTLP - 通过 gRPC 发送 OTLP 格式数据。
OTLP HTTP - 通过 HTTP 发送 OTLP 格式数据。
Kafka - 以各种格式(OTLP、Jaeger、Zipkin)将数据发送到 Kafka。
Prometheus - 将指标发送到 Prometheus。
Debug(调试) - 用于管道的调试工具。
No-op - 用于不需要摄取管道的 Jaeger UI / 查询服务部署。
连接器
Span Metrics(Span 指标) - 从 span 数据生成指标。
Forward(转发) - 在 collector 中的管道之间重定向遥测数据(例如:span 到指标 / span 到日志)
扩展
Health Check v2(健康检查 v2) - 支持健康检查。
zPages - 暴露 collector 的内部状态用于调试。
性能分析器 (pprof) - 启用 Go 的
net/http/pprof
端点,开发者通常使用它来收集性能剖析并调查收集器的问题。