常见问题
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 检索 Trace 的效率更高,但它不提供与 OpenSearch 相同强大的搜索功能。实际上,Jaeger 后端在客户端实现搜索功能,基于键值存储,这是有限的,并且可能产生不一致的结果(参阅issue-166 了解更多详情)。OpenSearch 不存在这些问题,因此可用性更好。OpenSearch 也可以直接查询,例如从 Kibana 面板,并提供有用的分析和聚合功能。
根据过去的性能实验,我们观察到 Cassandra 中的单次写入比 OpenSearch 快得多,这可能表明它能够承受更高的写入吞吐量。然而,由于 Jaeger 后端需要在键值存储之上实现搜索功能,将 Span 写入 Cassandra 实际上会导致较大的写入放大:除了写入 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。这些 ID 可以使用在线工具转换为 UI 能够识别的十六进制编码 ID,例如https://base64.guru/converter/encode/hex 。
我需要运行多个 Collector 吗?
拥有高可用的 jaeger-collector 是否能提升整体系统性能,例如减少丢弃的 Span 数量并减少追踪收集的中断?是否推荐这样做?如果推荐,原因是什么?
运行多个实例的原因包括:
- 您的客户端发送的数据量非常大,单个 jaeger-collector 无法足够快地接收它们。
- 您需要更高的可用性,例如,当您对 jaeger-collectors 进行滚动重启以进行升级时,仍有一些实例在运行并能够处理入站数据。
以下不是运行多个实例的原因:
- 为了避免数据丢失。当后端存储无法足够快地保存数据时,Jaeger 会丢弃数据。增加 jaeger-collector 实例数量,并为它们的内部队列分配更多内存,可以提供短暂的缓解,但并不能消除存储后端的瓶颈。
如何配置 Jaeger UI 的身份验证
Jaeger UI 不支持任何账户或角色概念,因此无需对用户进行身份验证。如果您需要身份验证来简单地限制谁可以访问 Jaeger UI,我们建议在其前面运行反向代理,例如 HAProxy、NGINX、Keycloak 等。使用标准反向代理的优点是它们支持与各种身份验证和单点登录服务进行广泛集成,这是我们在 Jaeger UI 中永远无法匹敌的。
例如,请参考这篇博客文章,了解如何使用 Keycloak 保护 Jaeger UI 。