You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grafana中如何基于$__timeFilter生成偏移时间范围的对比查询?

实现Grafana + TimescaleDB动态时间周期对比查询

核心思路

利用Grafana内置的$__from和$__to变量获取当前选择的时间范围起止时间,计算出时间范围的时长后,往前偏移该时长得到历史对比周期,通过UNION ALL合并当前周期与历史周期的查询结果,并添加标识字段区分两组数据。

基础平均值对比查询

适用于查看当前与历史周期的整体CPU平均值:

-- 当前周期CPU平均值
SELECT
  '当前周期' AS period,
  avg(cpu) AS avg_cpu
FROM cpu_utilization
WHERE $__timeFilter(timestamp)

UNION ALL

-- 历史周期CPU平均值(与当前周期时长一致的前一个周期)
SELECT
  '历史周期' AS period,
  avg(cpu) AS avg_cpu
FROM cpu_utilization
WHERE timestamp BETWEEN ($__from - ($__to - $__from)) AND $__from

逻辑验证

当选择最近24小时时:

  • 当前周期:timestamp BETWEEN '2022-09-07 05:32:10' AND '2022-09-08 05:32:10'
  • 计算时长:$__to - $__from = 24小时
  • 历史周期:timestamp BETWEEN '2022-09-07 05:32:10' - 24h AND '2022-09-07 05:32:10',即'2022-09-06 05:32:10'到'2022-09-07 05:32:10',完全符合需求。

按时间粒度聚合的对比查询

如果需要查看逐小时/逐分钟的对比数据,可添加时间分组,并将历史周期的时间轴对齐到当前周期,方便图表可视化对比:

-- 当前周期按小时聚合的CPU平均值
SELECT
  '当前周期' AS period,
  $__timeGroup(timestamp, '1h') AS time,
  avg(cpu) AS avg_cpu
FROM cpu_utilization
WHERE $__timeFilter(timestamp)
GROUP BY time

UNION ALL

-- 历史周期按小时聚合的CPU平均值(时间轴对齐到当前周期)
SELECT
  '历史周期' AS period,
  $__timeGroup(timestamp + ($__to - $__from), '1h') AS time,
  avg(cpu) AS avg_cpu
FROM cpu_utilization
WHERE timestamp BETWEEN ($__from - ($__to - $__from)) AND $__from
GROUP BY time

关键说明

  • $__timeGroup(timestamp, '1h'):Grafana内置函数,按指定粒度(此处为1小时)对时间字段分组,生成可用于图表的时间序列。
  • timestamp + ($__to - $__from):将历史周期的时间加上当前周期时长,使历史数据的时间点与当前周期对应,比如历史的2022-09-06 05:00会被转换为2022-09-07 05:00,在图表上可直接与当前同时间段的数据对比。

内容的提问来源于stack exchange,提问作者Kush Rohra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:30:54