无法查询所需的跟踪信息

问题描述

在服务网格中查询跟踪信息时,您可能会遇到无法获取目标跟踪的情况。

根本原因分析

1. 跟踪采样率配置过低

当跟踪的采样率参数设置过低时,系统将仅按比例收集跟踪数据。在请求量不足或低峰期,这可能导致采样的数据低于可见性阈值。

2. Elasticsearch 实时限制

Elasticsearch 索引的默认配置是"refresh_interval": "10s",这导致数据在从内存缓冲区刷新到可搜索状态之前存在 10 秒的延迟。当查询最近生成的跟踪信息时,结果可能会缺失,因为数据尚未持久化。

此索引配置可以有效减少 Elasticsearch 上的数据合并压力,提高索引速度和首次查询速度,但在一定程度上也降低了数据的实时性。

3. 查询条件设置不当

在进行跟踪查询时,如果对 Span kind 参数背后的技术原理理解不透彻,可能导致没有数据返回。因此,不建议随意使用该参数。特别是同时指定 ClientServer 时,可能会导致查询结果为空。

示例 1:Span kind 设置为Root Span,同时指定ClientServer

在这种情况下,查询将返回无数据。原因是当客户和服务器都由 OTel Agent 管理时,跟踪的根 span 通常位于客户端,服务器数据将无法检索。为了解决此问题,请删除 Server 条件或避免选择 Root Span

示例 2:Span kind 设置为Service Entry Span,同时指定ClientServer

同样,这个查询也将返回无数据。原因是当客户和服务器都有 Sidecar 注入时,Service Entry Span 指的是服务器接收到的第一个请求,但跟踪数据存储在客户端。为了解决此问题,请删除 Client 条件或避免选择 Service Entry Span

根本原因 1 的解决方案

  • 根据需求适当提高采样率。
  • 使用更丰富的采样方法,例如尾部采样。

根本原因 2 的解决方案

通过 jaeger-collector--es.asm.index-refresh-interval 启动参数调整刷新间隔,默认值为 10s

如果该参数的值为"null",则不会对索引的 refresh_interval 进行配置。

注意:设置为 "null" 将影响 Elasticsearch 的性能和查询速度。

根本原因 3 的解决方案

在使用 Span kind 参数进行跟踪查询时:

  • 避免同时使用 ClientServer 条件
  • 对于 Root Span 查询:
    • 如果客户端和服务器都存在,则移除 Server 条件
    • 或者如果需要服务器端数据,则避免选择 Root Span
  • 对于 Service Entry Span 查询:
    • 如果客户端和服务器都存在,则移除 Client 条件
    • 或者如果需要客户端数据,则避免选择 Service Entry Span