"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
在同一个 instance
上 0
时,以上将触发所有 foo == 1
的警报。
其他方式
还有另一个 one-to-one 连接运算符,其工作方式相反。您可以使表达式的左侧和右侧匹配所有标签,ingoring()
仅匹配其中的一部分。
PromQL 文档中的更多信息:https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching
总结
我想在特定 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
在同一个 instance
上 0
时,以上将触发所有 foo == 1
的警报。
其他方式
还有另一个 one-to-one 连接运算符,其工作方式相反。您可以使表达式的左侧和右侧匹配所有标签,ingoring()
仅匹配其中的一部分。
PromQL 文档中的更多信息:https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching