如何使用Prometheus警报规则检测新指标

问题描述

我有一个针对用户的指标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 ,只是标签不同。

任何人都可以指出我应该如何构造规则?

解决方法

这应该是答案:https://docs.influxdata.com/influxdb/v1.8/administration/authentication_and_authorization/#set-up-authentication

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

,

该规则不触发的原因是2 5 24 函数在第一次刮擦之前没有将新创建的计数器视为0。我没有找到任何消息来源,但事实确实如此。

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

  • 如果用户遇到问题而之前没有问题
  • 如果用户在最近N分钟内有新问题

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

应该向有错误的用户触发警报,除非该用户最近N分钟内错误没有增加

很容易翻译成以下promql:

increase()

事后看来,关于rule: request_failures > 0 UNLESS increase(request_failures[1m]) == 0 函数,它不能假定先前的值为0,因为它在范围内表示。前一个值可能超出范围且不等于0。因此,至少要包含一个点才有意义。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...