说我有一个针对用户的指标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 ,只是标签不同。
任何人都可以指出我应该如何构造规则?
答案 0 :(得分:0)
关键是标签不应该包含变量值,因为它是度量标识的一部分。解决方案是添加用户名作为注释而不是指标的标签。
答案 1 :(得分:0)
该规则不触发的原因是2 5
24
函数在第一次刮擦之前没有将新创建的计数器视为0。我没有找到任何消息来源,但事实确实如此。
因此,您要检测两种情况:
这可以用相反的逻辑来表述:
应该向有错误的用户触发警报,除非该用户最近N分钟内错误没有增加
很容易翻译成以下promql:
increase()
事后看来,关于rule: request_failures > 0 UNLESS increase(request_failures[1m]) == 0
函数,它不能假定先前的值为0,因为它在范围内表示。前一个值可能超出范围且不等于0。因此,至少要包含一个点才有意义。