Grafana 图形面板根据 prometheus promQL 查询过滤过去的特定时间

问题描述

我有以下 grafana (v7.5) 图形面板

enter image description here

绿线代表我的普罗米修斯指标 foo,它看起来像:

sum(foo)

黄色/橙色线代表我的动态阈值,我正在尝试验证其正确性:

avg_over_time((sum(foo and on() hour() == 22 or on() vector(0)) > 0)[2w:10m])

我们的想法是取回两周的数据,只考虑感兴趣的一小时并计算平均值 - 这是阈值,当我考虑 22:00 到 23 时间的图形面板时,它看起来是正确的: 00. 顺便提一句。需要 or on() vector(0) 将不感兴趣的小时的所有数据标记为 0 数据,然后使用 > 0 我忽略它进行平均计算。不过,如果我保持这样,每当时间范围更改为早上的某个时间时,硬编码 22 将根据过去几天错误的晚上时间计算阈值。

所以在 grafana 中,我创建了一个变量 $hourquery_result(hour()),它在时间范围变化时进行评估,因此我的面板查询变为:

avg_over_time((sum(foo and on() hour() == $hour or on() vector(0)) > 0)[2w:10m])

现在每次更改grafana中的监控时间范围时,我的计算时间都会适应时间范围的最后一个小时,但这只是我想要的部分,因为我的阈值线对于面板的最后一个小时是正确的,但在整个面板时间范围内仍然非常直接。例如,当我考虑让我们说早上 08:00 时,我想从两周前的数据中获得阈值计算,仅适用于早上 8 点到 9 点。 换句话说,我希望每小时动态计算单个监控范围的阈值线:

avg_over_time((sum(foo and on() hour() == 0 or on() vector(0)) > 0)[2w:10m])

上面应该绘制0到1之间的图形线

avg_over_time((sum(foo and on() hour() == 1 or on() vector(0)) > 0)[2w:10m])

上面应该绘制1到2之间的图形线

avg_over_time((sum(foo and on() hour() == 2 or on() vector(0)) > 0)[2w:10m])

上面应该绘制2到3之间的图形线,依此类推。

现在显然使用我的 $hour 变量我无法实现这一点,因为该变量仅在每个时间范围重新选择时都是动态的,而不是在单个图形内。我尝试了一些异国情调的东西:

avg_over_time((sum(foo and on() hour() == hour(timestamp(sum(foo))) 
or on() vector(0)) > 0)[2w:10m])

我得到了不同的结果,但仍然是直线,不确定这个异国情调的东西是否成功。请指教

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)