架构

Alauda Distributed Tracing 基于 Jaeger v2 和 Alauda Build of OpenTelemetry v2。Jaeger 实例通过 OpenTelemetry Operator 部署,后端存储使用 Elasticsearch 或 OpenSearch。在此架构中,Jaeger v2 为数据摄取、查询和可视化提供核心 tracing 后端能力。

Jaeger v2 的设计目标是成为一个多用途且灵活的 tracing 平台。它可以作为单个二进制文件部署,并通过配置在 Jaeger 架构中承担不同的 roles

Roles

  • collector: 接收来自应用程序的传入 trace 数据,并将其写入存储后端。
  • query: 提供用于查询和可视化 trace 的 API 和用户界面。
  • es-rollover: 管理 Jaeger 在 Elasticsearch 和 OpenSearch 上基于 rollover 的索引操作。它用于为 rollover 部署准备别名、索引和模板,并可定期将写入别名切换到新索引,同时更新读取别名。
  • es-index-cleaner: 删除早于配置保留期限的基于时间的索引。它匹配带日期后缀的索引(<prefix>-jaeger-(span|service|dependencies|sampling)-YYYY-MM-DD),并移除已超过保留阈值的索引。它适用于将 trace 存储在带日期后缀索引中的部署;对于在 Elasticsearch 上使用带 Index Lifecycle Management (ILM) 的 rollover 别名,或在 OpenSearch 上使用 Index State Management (ISM) 的安装,则由生命周期策略接管保留管理。

存储架构

直接写入存储

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

架构

使用 OpenTelemetry Collector

不需要使用 OpenTelemetry Collector 来运行 Jaeger,因为 Jaeger 是基于 OpenTelemetry Collector 并针对不同 roles 进行定制的发行版。不过,如果你已经在使用 OpenTelemetry Collector 来收集其他类型的 telemetry,或对 tracing 数据进行预处理/增强,它可以放在 Jaeger 前面,作为收集流水线的一部分。OpenTelemetry Collector 可以作为 application sidecar 运行,也可以作为远程服务集群运行。

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

架构

作为 sidecar / host agent 的 OpenTelemetry Collector

优点

  • SDK 配置更简单,因为 trace 导出端点和采样配置端点都可以指向本地 host,而无需关心这些服务在远程运行的位置。
  • Collector 可以通过添加环境信息(例如 k8s pod 名称)来增强数据。
  • 数据增强所需的资源消耗可以分布到所有 application host 上。

缺点

  • 需要额外一层数据 marshaling/unmarshaling。

作为远程集群的 OpenTelemetry Collector

优点

缺点

  • 需要额外一层数据 marshaling/unmarshaling。

Jaeger Binary

Jaeger binary 构建于 OpenTelemetry Collector framework 之上,并包含:

  • 官方上游组件,例如 OTLP Receiver、Batch 和 Attribute Processor 等。
  • 来自 opentelemetry-collector-contrib 的上游组件,例如 Kafka Exporter 和 Receiver、Tail Sampling Processor 等。
  • Jaeger 自有组件,例如 Jaeger Storage Exporter、Jaeger Query Extension 等。

架构

Jaeger Components

OpenTelemetry Components

Receivers

  • OTLP - 接收通过 OpenTelemetry Protocol (OTLP) 发送的 spans。
  • Jaeger - 接收通过 gRPC 或 Thrift 协议传输的 Jaeger 格式 traces。
  • Kafka - 接收来自 Kafka 的多种格式 spans(OTLP、Jaeger、Zipkin)。
  • Zipkin - 接收使用 Zipkin v1 和 v2 协议的 spans。
  • No-op - 用于不需要 ingestion pipeline 的 Jaeger UI / query service 部署。

Processors

  • Batch Processor - 对 spans 进行批处理以提高效率。
  • Tail Sampling - 支持高级的采集后采样。
  • Memory Limiter - 当 collector 过载时支持 back-pressure。
  • Attributes Processor - 允许使用 attributes 对 spans 进行过滤、重写和增强。可用于脱敏敏感数据、减少数据量或附加环境信息。
  • Filter Processor - 允许从 collector 中丢弃 spans 和 span events(⚠️ 可能导致 trace 断裂)。

Exporters

  • OTLP - 通过 gRPC 以 OTLP 格式发送数据。
  • OTLP HTTP - 通过 HTTP 以 OTLP 格式发送数据。
  • Kafka - 以多种格式(OTLP、Jaeger、Zipkin)将数据发送到 Kafka。
  • Prometheus - 将 metrics 发送到 Prometheus。
  • Debug - 用于 pipeline 的调试工具。
  • No-op - 用于不需要 ingestion pipeline 的 Jaeger UI / query service 部署。

Connectors

  • Span Metrics - 根据 span 数据生成 metrics。
  • Forward - 在 collector 中转发不同 pipeline 之间的 telemetry(例如:span 到 metric / span 到 log)

Extensions