常见问题
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 是一种键值数据库,因此按跟踪 ID 检索跟踪数据更高效,但它不提供与 OpenSearch 相同的强大搜索功能。实际上,Jaeger 后端在客户端、在键值存储之上实现了搜索功能,这功能有限且可能产生不一致的结果(更多详情请参阅 issue-166 )。OpenSearch 没有这些问题,从而提供了更好的可用性。OpenSearch 也可以直接查询,例如从 Kibana 仪表板中查询,并提供有用的分析和聚合功能。
根据过去的性能实验,我们观察到 Cassandra 的单次写入速度比 OpenSearch 快得多,这可能表明它能支持更高的写入吞吐量。然而,由于 Jaeger 后端需要在键值存储之上实现搜索功能,因此将 span 写入 Cassandra 实际上会面临大量的写入放大:除了写入 span 本身的记录外,Jaeger 还会为服务名称和操作名称索引执行额外的写入,以及为每个标签执行额外的索引写入。相比之下,将 span 保存到 OpenSearch 是一次写入,并且所有索引操作都在 OpenSearch 节点内部进行。因此,对 Cassandra 的整体吞吐量与 OpenSearch 相当。
Cassandra 后端的一个优点是其原生支持数据 TTL,从而简化了维护。在 OpenSearch 中,数据过期通过索引轮转管理,这需要额外的设置(请参阅Elasticsearch 滚动)。
为什么 Jaeger 跟踪 ID 在 Kafka 和 UI 中的显示不同?
在底层,数据模型层面,Jaeger 跟踪 ID 是一个 16 字节的序列。然而,这 16 字节可以用许多不同的方式表示:
- 在 UI 中,我们历来将它们表示为十六进制编码字符串,例如
7e90c0eca22784ec7e90c0eca22784ec
。当使用 128 位 ID(在 OpenTelemetry 中更常见)时,这些字符串可以是 32 个字符长,如果 ID 是在传统 64 位模式下生成的,则可以是 16 个字符。 - 在 Jaeger 后端代码的领域模型 中,我们使用大端编码将跟踪 ID 表示为一对无符号 64 位整数。这样做是为了效率,因为 Go 中的字节切片需要额外的内存分配。
- 在原始的 Thrift 模型 中,我们也将其表示为一对无符号 64 位整数。
- 在 Protobuf 模型 中,ID 表示为字节序列。当 Protobuf 序列化为二进制负载时,这些字节按原样传输。然而,Protobuf 也支持 JSON 编码,其中字节序列使用 base64 编码进行序列化。因此,如果您将 collector-Kafka-ingester 管道配置为使用 JSON 编码,您将看到类似
fpDA7KInhOx+kMDsoieE7A==
的跟踪 ID。这些 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 特定的数据库 schema,可能与其他 exporter 使用的 schema 不兼容。