为应该在特定时间间隔内发生的 activity 触发警报(使用 Prometheus Metrics 和 AlertManager)

Firing Alerts for an activity which is supposed to happen during a particular time interval(using Prometheus Metrics and AlertManager)

我对 Prometheus alertmanager 还很陌生,对仅在特定时期触发警报有疑问

我有一个微服务,它接收一个文件并对其进行一些处理,仅当它通过 Kafka 队列获取消息时才会调用该微服务。上述内容应该在每天早上 5 点到 6 点(UTC 时间)之间出现。微服务有一个指标,每次收到文件时该指标都会增加 1。如果它在间隔内没有收到文件,我想发出警报。我创建了一个这样的查询:

    expr : sum(increase(metric_name[1m]) and on() hour(vector(time()))==5) < 1
    for: 1h

我的问题:-
1) 是否正确或有更好的方法
2)如果没有更新,是return0还是"datapoints not found"
3)增加正确的功能,因为它往往会由于外推而给出小数的结果,但我知道如果增加为 0,它将显示 0

设置为 30 秒的 scrape_intervals 我实在玩不转。

我没有 运行 这个表达式,但我希望它会导致警报仅在 06:00 时触发,然后在 06:01 时关闭。这是该表达式唯一一次在一小时内成立。

回答您的问题

  1. 如果您想要的是一次警报(通过示例发送邮件)但之后不再触发,这是正确的。即便如此,日程安排还是有点紧,并且可能会受到 alertmanager 延迟的影响,导致警报丢失。
  2. 在没有增加的情况下,你会得到表达式的值为0。当有更新时它会是空的
  3. 增加是正确的功能。它甚至考虑了计数器的重置。

回答是否有更好的方法。

关于你的表达式,你可以得到相同的结果,没有 for 子句,有:

expr: increase(metric_name[1h])==0 and on() hour()==6 and on() minute()<1

它显示:如果在过去一小时内指标没有增加,则从早上 6 点开始持续 1 分钟。

提醒时间更长

如果您希望警报持续更长时间(比如一天,解决后将其静音),您可以使用子查询;

expr: increase((metric and on() hour()==5)[18h:])==0 and on() hour()>5

它的意思是:从早上 6 点开始 (hour()>5),计算接下来 18 小时早上 5-6 点的增加量。如果你喜欢有一个未决的,你可以删除尾随 on() hour()>5 并使用 for: 1h 子句。

如果您想在提交文件之前发出警报,从而检测到解决方案,只需转换表达式以评估到现在为止的增加:

expr: increase((metric and on() hour()>5)[18h:])==0 and on() hour()>5