1

概括

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

背景

我们有每天打开和关闭的设备。我想知道他们在这个操作窗口中何时关闭。我使用 probe_success 作为 PromQL 查询来了解设备何时关闭。我正在使用自定义 Prometheus 应用程序来了解设备何时打开和关闭 - 例如 PromQLpowerStatus{job="powerMonitor", section="1", zone="2" } == bool 1

尝试

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

直觉

我有一种我没有看到的惯用方法来完成这个,有点像从命令式编程到声明式编程并想要循环遍历数据集:)。

你能帮我吗?

4

1 回答 1

1

您需要的是on()矢量匹配运算符。这件事很像JOIN在关系数据库的上下文中工作。

以下示例基于以下指标:

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

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

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

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另一个实例上都有,您仍然会触发警报。为了克服这个问题,您可能想要...

只忽略一些标签

您可以为操作员提供一个以逗号分隔的标签名称列表,on()以确保该系列至少有一些共同点:

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

foo == 1当 ANYbar0同时,以上将触发 ALL 警报instance

其他方法

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

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

于 2022-02-17T06:24:20.937 回答