"Smart" Grafana 警报 - 或 - Prometheus 中不相关目标的复合条件

"Smart" Grafana alerts - or - Compound Conditional of Unrelated Targets in Prometheus

总结

我想在特定 PromQL 结果大于 0 且另一个不相关的 PromQL 结果为 1 时使用 Grafana 8+ 发出警报。

背景

我们有每天打开和关闭的设备。我想知道他们在这次行动期间什么时候停机 window。我使用 probe_success 作为 PromQL 查询来了解设备何时关闭。我正在使用自定义 Prometheus 应用程序来了解设备何时打开和关闭 - 例如 PromQL powerStatus{job="powerMonitor", section="1", zone="2" } == bool 1

尝试次数

我直接 alertmanager/PromQL 进行了调查,但考虑到分区和区域的电源状态,还没有找到可以在我需要时使用的查询。我已经尝试了我可以从 Grafana 8 警报文档中提取的所有内容,包括使用经典条件表达式,但似乎我只能想出一个解决方案,该解决方案依赖于另一个不允许的经典条件中的经典条件评估.我认为这将是一个常见的用例,但我没有在网上看到关于它的博客文章。

预感

我觉得有一种我没有看到的惯用方法可以实现这一点,有点像从命令式编程到声明式编程并希望遍历数据集时:)。

你能帮忙吗?

您需要的是 on() 向量匹配运算符。在关系数据库的上下文中,它的工作方式很像 JOIN

以下示例基于以下指标:

foo{bar="one", baz="two", instance="localhost:9999", job="test"}      1
bar{spam="three", eggs="four", instance="localhost:9999", job="test"} 0

按名称匹配指标,忽略所有标签

bar 系列中的任何一个为 0 时,为您提供值为 1 的所有 foo 系列:

foo == 1 and on() bar == 0

结果将是:

foo{bar="one", baz="two", instance="localhost:9999", job="test"} 1
# I have only one foo series in this example, but if you had more of them
# with the value of 1, you would see all of them here.

您可能已经注意到,结果仅包含 foo 指标。如果您希望看到 bar,则需要先放置它:

# Show all bar series with the value of 0 when ANY foo is 1
bar == 0 and on() foo == 1

请注意,“忽略所有标签”是字面意思,包括“工作”和“实例”标签。 什么意思是,例如,如果您在一个实例上有 foo == 1 而在另一个实例上有 bar == 0,您仍然会触发警报。为了克服这个问题,您可能需要...

只忽略部分标签

您可以将 comma-separated 标签名称列表提供给 on() 运算符,以确保该系列至少有一些共同点:

foo == 1 and on(instance) bar == 0

当任何 bar 在同一个 instance0 时,以上将触发所有 foo == 1 的警报。

其他方式

还有另一个 one-to-one 连接运算符,其工作方式相反。您可以使表达式的左侧和右侧匹配所有标签,ingoring() 仅匹配其中的一部分。

PromQL 文档中的更多信息:https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching