CnOps 智能运维与可观测社区
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题
导航菜单
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题

CnOps 智能运维与可观测社区

愿景

CnOps 智能运维与可观测社区是一个以"智能运维与可观测"为核心的开放、包容、分享的技术社区,旨在聚集运维专家、开发者和爱好者,共同探讨、学习和分享可观测最佳实践与最新技术,与众多技术社区合作互动,共同探讨交叉领域的技术挑战,推动可观测领域的创新与进步。

内容社区

  • 实践文章
  • 视频课程
  • 开源项目
  • 常见问答
  • 开发者工具

友情链接

  • Prometheus
  • Grafana Lab
  • OpenTelemetry
  • LoongCollector

关注我们

阿里云云原生公众号阿里云云原生
阿里云可观测公众号阿里云可观测

Copyright © 2026 CnOps 社区. All rights reserved.

首页/开源项目/Jaeger/常见问题
文档目录
快速开始功能特性常见问题

Jaeger

常见问题

依赖关系页面显示 Jaeger 追踪的服务之间的关系图及其连接。当您使用内存存储时,该图会根据内存中存储的所有追踪数据按需计算。然而,如果您使用 Cassandra、Elasticsearch 或 OpenSearch 等真正的分布式存储,扫描数据库中的所有数据来构建服务关系图的成本太高。因此,Jaeger 项目提供了"大数据"作业,可用于从追踪数据中提取服务关系图数据: ...

为什么依赖关系页面是空的?

依赖关系页面显示 Jaeger 追踪的服务之间的关系图及其连接。当您使用内存存储时,该图会根据内存中存储的所有追踪数据按需计算。然而,如果您使用 Cassandra、Elasticsearch 或 OpenSearch 等真正的分布式存储,扫描数据库中的所有数据来构建服务关系图的成本太高。因此,Jaeger 项目提供了"大数据"作业,可用于从追踪数据中提取服务关系图数据:

  • https://github.com/jaegertracing/spark-dependencies - 较早的 Spark 作业,可以定期运行
  • https://github.com/jaegertracing/jaeger-analytics - 新的(实验性)流式 Flink 作业,持续运行并以更小的时间间隔构建服务关系图

为什么我在 Jaeger 中看不到任何 span?

请参阅故障排除指南。

推荐使用哪种存储后端?

Jaeger 团队推荐使用 Elasticsearch 或 OpenSearch 作为存储后端,而非 Cassandra,原因如下:

  • Cassandra 是键值数据库,因此通过 trace ID 检索追踪数据更高效,但它不提供与 OpenSearch 同等强大的搜索能力。实际上,Jaeger 后端在键值存储之上的客户端侧实现搜索功能,这存在限制并可能产生不一致的结果(详见 issue-166)。OpenSearch 不存在这些问题,具有更好的可用性。OpenSearch 还可以直接查询,例如从 Kibana 仪表板查询,提供有用的分析和聚合功能。

  • 根据过去的性能实验,我们观察到 Cassandra 的单次写入比 OpenSearch 快得多,这可能暗示它能承受更高的写入吞吐量。然而,由于 Jaeger 后端需要在键值存储之上实现搜索功能,向 Cassandra 写入 span 实际上会产生很大的写入放大:除了为 span 本身写入一条记录外,Jaeger 还会为服务名称和操作名称索引执行额外写入,以及为每个标签执行额外的索引写入。相比之下,将 span 保存到 OpenSearch 是一次写入,所有索引都在 OpenSearch 节点内部完成。因此,Cassandra 的整体吞吐量与 OpenSearch 相当。

Cassandra 后端的一个优势是由于其原生支持数据 TTL,维护更加简便。在 OpenSearch 中,数据过期通过索引轮转管理,这需要额外的设置(请参阅 Elasticsearch 索引轮转)。

为什么 Jaeger trace ID 在 Kafka 和 UI 中显示不同?

在底层数据模型级别,Jaeger trace ID 是一个 16 字节的序列。然而,这 16 个字节可以有多种不同的表示方式:

  • 在 UI 中,我们历来将其表示为十六进制编码字符串,例如 7e90c0eca22784ec7e90c0eca22784ec。当使用 128 位 ID(在 OpenTelemetry 中更常见)时,这些字符串长度为 32 个字符;如果 ID 以传统的 64 位模式生成,则为 16 个字符。
  • 在 Jaeger 后端代码的领域模型中,我们使用大端编码将 trace ID 表示为一对无符号 64 位整数。这样做是为了提高效率,因为 Go 中的字节切片需要额外的内存分配。
  • 在原始的 Thrift 模型中,我们也将其表示为一对无符号 64 位整数。
  • 在 Protobuf 模型中,ID 表示为字节序列。当 Protobuf 以二进制负载序列化时,这些字节按原样传输。然而,Protobuf 也支持 JSON 编码,其中字节序列使用 base64 编码序列化。因此,如果您将 collector-Kafka-ingester 管道配置为使用 JSON 编码,您将看到类似 fpDA7KInhOx+kMDsoieE7A== 的 trace ID。可以使用在线工具(如 https://base64.guru/converter/encode/hex)将其转换为 UI 可识别的十六进制编码 ID。

我需要运行多个 collector 吗?

运行多个 jaeger-collector 实现高可用是否能提高系统整体性能,例如减少丢弃的 span 数量,减少追踪采集的中断时间?是否推荐这样做?如果是,原因是什么?

以下是运行多个实例的理由:

  • 您的客户端发送的数据量太大,单个 jaeger-collector 无法快速接收。
  • 您需要更高的可用性,例如在滚动重启 jaeger-collector 进行升级时,保持部分实例仍在运行并能够处理入站数据。

以下不是运行多个实例的理由:

  • 为了避免数据丢失。当后端存储无法足够快地保存数据时,Jaeger 会丢弃数据。增加 jaeger-collector 实例的数量,并为其内部队列分配更多内存,可以提供少量的临时缓解,但并不能消除存储后端的瓶颈。

如何为 Jaeger UI 配置身份认证

Jaeger UI 不支持任何账户或角色的概念,因此无需对用户进行身份认证。如果您需要通过身份认证来限制谁可以访问 Jaeger UI,我们建议在其前面运行反向代理,例如 HAProxy、NGINX、Keycloak 等。使用标准反向代理的优势在于它们支持与各种身份认证和单点登录服务的广泛集成,这是我们在 Jaeger UI 中永远无法匹敌的。

例如,请参阅这篇博客文章了解使用 Keycloak 保护 Jaeger UI 的示例。

如果我已经在 Elasticsearch/ClickHouse 中存储数据,可以只运行 Jaeger UI 吗?

问:我已经使用 sidecar 容器和 OpenTelemetry Collector(索引模式为:traces-${date})将追踪和指标数据发送到我的 Elasticsearch 云环境。我想通过 Jaeger UI 可视化这些数据。我可以只运行查询服务和 UI,而不运行 Jaeger collector 吗?

答:不可以,我们不支持该设置。每个 exporter 可以选择不同的方式将追踪数据存储到 Elasticsearch 或 ClickHouse 等数据库中。Jaeger 有自己的存储实现,被 collector 和查询服务共同使用,它采用 Jaeger 特有的数据库模式,可能与其他 exporter 使用的模式不兼容。

文章大纲