Tempo 与 SQL 表达式:即时指标查询的兼容性问题

概述

在 Grafana 的可观测性平台中,用户经常需要结合不同数据源的数据进行深入分析。SQL 表达式功能允许用户使用熟悉的 SQL 语法对查询结果进行二次加工,极大地增强了数据探索的灵活性。然而,在结合分布式追踪系统 Tempo 生成的指标(例如从 traces 中提取的 RED 指标)时,SRE 工程师发现一个关键限制:SQL 表达式仅能处理区间(Range)查询结果,而无法处理即时(Instant)查询结果。这直接影响了对追踪派生指标进行实时、高效分析的能力,是构建统一分析管道时需要关注的一个重要技术细节。

核心概念

要理解此问题,需要明确以下几个关键概念:

  1. 帧(Frame)与帧类型(Frame Type):在 Grafana 的数据管道中,数据在数据源插件与前端可视化/转换层之间以“数据帧”的格式传输。每个数据帧都包含一个 meta 对象,其中 type 字段(即帧类型)是至关重要的元数据。它告诉 Grafana 的下游处理功能(如 SQL 表达式引擎)如何解释和处理这些数据,例如是时间序列(timeseries-multi)、表格(table)还是数值数组(numeric-multi)。

  2. SQL 表达式(SQL Expressions):这是 Grafana 中的一种数据转换功能。它允许用户编写一个 SQL 查询(通常是 SELECT 语句),对前面查询(如 Prometheus 或 Tempo 指标查询)返回的数据帧进行计算、聚合或重命名,生成新的可视化数据。它依赖于输入数据帧具有明确的 type 信息,以便正确构建 SQL 表达式执行时的上下文。

  3. 即时查询 vs 区间查询:

    • 即时查询(Instant Query):查询一个时间点(now)的值,返回一个单一的、即时的数据点。在监控中常用于获取当前状态。
    • 区间查询(Range Query):查询一个时间范围内的数据,返回一系列随时间变化的数据点。常用于绘制图表。

此问题的根源在于,当 Tempo 数据源返回即时查询的结果帧时,该帧的 meta.type 字段未被正确设置(或缺失)。SQL 表达式引擎因此无法识别输入数据的结构,导致转换失败。社区推测该即时查询结果帧的类型应为 numeric-multi。

实践

在实际的 Grafana 仪表板或告警规则中,此问题表现为一种特定的失败场景:

  • 场景:用户创建一个基于 Tempo 追踪数据的指标查询(例如,计算每秒错误请求数),并将其设置为“即时”模式(Instant)。
  • 尝试应用 SQL 表达式:用户随后尝试使用 SQL 表达式对该即时查询结果进行二次处理,例如重命名字段或与其他指标进行计算。
  • 结果:SQL 表达式查询失败,错误信息通常指向数据格式或类型不支持。正如 issue 中截图所示,调试信息会明确指出 frame.meta.type 是 undefined 或缺失。

可能的解决方向: 该问题的根本修复需要在 Tempo 数据源插件或 Grafana 核心框架层面进行。需要确保由 Tempo 生成的即时指标查询结果数据帧被正确标记其类型(如 numeric-multi)。作为临时解决方案,SRE 工程师可以:

  1. 避免对即时查询结果直接使用 SQL 表达式。
  2. 将查询改为区间查询模式,但这会失去“即时性”的优势。
  3. 在应用 SQL 表达式之前,先通过其他转换步骤(如“减少”转换)显式地为数据帧添加类型信息,但这可能增加查询链的复杂度。

SRE 要点

对于 SRE 团队而言,理解此限制对于设计可靠的监控和分析管道至关重要:

  • 对监控策略的影响:此问题阻碍了对关键性能指标(特别是基于追踪的)进行实时、复杂的跨数据源分析。例如,无法方便地将一个即时的错误率指标与一个静态配置阈值(可能通过 SQL 表达式从另一数据源获取)在同一个面板中进行即时对比。这可能导致告警或仪表板设计的妥协。

  • 可观测性关联:在构建从追踪到指标的统一流水线时,SQL 表达式是一个强大的粘合剂。此缺陷表明了在不同查询模式(即时 vs 区间)下,工具链的成熟度可能存在差异。SRE 需要在仪表板设计阶段就测试所有必要的查询模式与转换功能的兼容性。

  • 最佳实践与反模式:

    • 最佳实践:在涉及 SQL 表达式转换的关键仪表板或告警查询中,优先验证其查询模式(区间或即时)是否受支持。为关键指标同时创建区间和即时查询版本,以便在不同场景下使用。
    • 常见反模式:假设所有查询类型都能无缝地通过所有数据转换层。在复杂的 Grafana 查询链中,应明确测试数据帧的元数据是否完整。
  • 相关指标(SLI/SLO):虽然不直接定义 SLI/SLO,但此问题影响了实现和监控这些指标的手段。如果团队的 SLO 定义需要依赖基于追踪的即时指标进行实时错误预算计算,那么此兼容性问题会成为实现该 SLO 监控方案的阻塞项,需要在技术选型或方案设计时予以考虑。它凸显了对可观测性工具链自身可靠性进行验证的重要性。