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
相关产品推荐
相关产品推荐

