微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。