假设我有一个针对用户的度量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.
关键是标签不应包含变量值,因为它是度量标识的一部分。解决方案是添加用户名作为注释,而不是度量的标签。