如何使用普罗米修斯警报规则检测新的度量



假设我有一个针对用户的度量request_failures。对于每个用户,我都会在度量中添加一个唯一的标签值。因此,对于用户u1,当一个请求失败两次时,我得到以下指标:

request_failures{user_name="u1"} 2

我还有一条规则,当出现新的故障时就会触发。其表达式为:

increase(request_failures[1m]) > 0

这对于已经遇到故障的用户来说效果很好。例如,当u1遇到第三次失败时,该规则将触发。

当请求新用户u2失败时,我得到的指标为:

request_failures{user_name="u1"} 2
request_failures{user_name="u2"} 1

现在的问题是,警报规则不会为u2触发。规则似乎无法识别";新度量";,尽管所有三个度量都是相同的request_failures,只是带有不同的标签。

有人能指出我应该如何构建规则吗?

正如@MichaelDoubez已经指出的,increase()不认为新创建的度量是一种增值。不幸的是,changes()也是如此。这是有原因的,例如缺少刮伤,但仍然可以通过查询来解决。

increase(request_failures[10m]) > 0
or
( request_failures unless request_failures offset 10m )

当存在新度量时,第二部分(从or开始(将激发10分钟(由offset定义(。

规则未触发的原因是increase()函数在第一次刮取之前不认为新创建的计数器为0。我没有找到任何消息来源,但事实似乎确实如此。

因此,您需要检测两种情况:

  • 如果用户有问题,而他以前没有问题
  • 如果用户在最后N分钟内出现新问题

这可以用相反的逻辑重新表述:

应该为出现错误的用户触发警报,除非该用户在最后N分钟内错误没有增加

它很容易翻译成以下promql:

rule: request_failures > 0 UNLESS increase(request_failures[1m]) == 0

事后来看,关于increase()函数,它不能假设以前的值是0,因为它在一个范围内表示。上一个值可能超出范围并且不等于0。因此,至少有两点有一个值是有意义的。

这应该是答案:https://www.robustperception.io/dont-put-the-value-in-alert-labels.

关键是标签不应包含变量值,因为它是度量标识的一部分。解决方案是添加用户名作为注释,而不是度量的标签。

相关内容

  • 没有找到相关文章

最新更新