【发布时间】:2019-02-28 00:55:00
【问题描述】:
我有定义了一些警报规则的 Prometheus,我想统计 Prometheus 触发的警报数量。
我试图计算使用 grafana 触发警报的次数,但它不起作用:
SUM(ALERTS{alertname="XXX", alertstate="firing"})
有一种方法可以计算触发警报的次数吗?
【问题讨论】:
标签: prometheus
我有定义了一些警报规则的 Prometheus,我想统计 Prometheus 触发的警报数量。
我试图计算使用 grafana 触发警报的次数,但它不起作用:
SUM(ALERTS{alertname="XXX", alertstate="firing"})
有一种方法可以计算触发警报的次数吗?
【问题讨论】:
标签: prometheus
您的查询返回的是现在触发了多少警报,而不是每个警报被触发了多少次。
我发现此查询(大部分)适用于 Prometheus 2.4.0 及更高版本:
changes(ALERTS_FOR_STATE[24h])
它将返回过去 24 小时内每个警报从“待处理”变为“触发”的次数,这意味着它仅适用于首先具有待处理状态的警报(即带有 for: <some_duration> 的警报指定)。
ALERTS_FOR_STATE 是新添加的 Prometheus 内部指标,用于在 Prometheus 重启后恢复警报。这并不是所有的文档都很好(实际上根本没有),但它似乎有效。
哦,如果您想要按警报(或环境、工作或其他)分组的结果,您可以按该标签或标签集对结果进行汇总:
sum by(alertname) (changes(ALERTS_FOR_STATE[24h]))
将为您提供跨作业、环境等触发的每个警报的次数。
【讨论】:
受“Alin Sînpălean”的启发,我计算了 firing 状态的警报并忽略了 pending 状态。
计算当前警报:
count(ALERTS{alertstate="firing"}) by(alertname)
计算每个警报被触发的次数:
# Add a rule
groups:
- name: recording_rules
rules:
- record: ALERTS_FOR_STATE:firing
expr: ALERTS_FOR_STATE and ignoring(alertstate) ALERTS{alertstate="firing"}
sum(changes(ALERTS_FOR_STATE:firing[1w]) + 1) by(alertname)
【讨论】:
您的 PromQL 是正确的。请记住,标签(包括警报名称)区分大小写:也许这就是问题所在?
【讨论】: