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

Posted

技术标签:

【中文标题】如何使用 Prometheus 警报规则检测新指标【英文标题】:How to detect a new metrics with Prometheus alerting rule 【发布时间】:2021-01-01 13:55:34 【问题描述】:

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

    request_failuresuser_name="u1" 2

我还有一个规则,当有新的失败时触发。其表达式为:

    increase(request_failures[1m]) > 0

这适用于已经遇到故障的用户。例如,当 u1 遇到第三次失败时,触发规则。

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

    request_failuresuser_name="u1" 2
    request_failuresuser_name="u2" 1

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

谁能指出我应该如何构建规则?

【问题讨论】:

你的意思是只有当用户至少有一次失败时才存在度量标准,并且你的表达式只有在失败增加时才会发出警报,这样你就不会检测到新的失败? 当发生新故障(对于新用户)时,会创建一个新指标。所以是的,只有当用户至少有一次失败时,指标(带有用户的特定标签)才存在。是的,我的表达式只有在失败从 1 增加时才会发出警报。问题是当失败发生时(指标从 0 变为 1),没有警报。 抱歉,但准确地说-从普罗米修斯的观点来看,您是创建一个新的指标还是一个新的标签值?您的问题可能适用于任何一个,答案大相径庭。 我的意图是创建相同的指标(具有相同的名称“request_failures”)但使用新标签。从普罗米修斯的角度来看,似乎有一个“新指标”。我昨天给出了答案(见下文),但我更喜欢使用标签而不是注释。因此,如果您能建议一种方法,我可以继续为不同的用户使用标签,但检测到指标的增加,我将不胜感激。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

规则没有触发的原因是increase() 函数在第一次抓取之前没有将新创建的计数器视为 0。我没有找到任何消息来源,但似乎是这样。

因此你要检测两种情况:

如果用户之前没有遇到过问题 如果用户在过去 N 分钟内有新问题

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

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

这很容易转化为以下 promql:

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

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

【讨论】:

这似乎是一个很有前途的解决方案。我会尝试并回复你。非常感谢! 嗨,迈克尔,感谢您的建议。不幸的是,它也不起作用。我想知道您是否在实时系统中尝试过这个?对于“新”指标,表达式 increase(request-failures[1m]) == 0 仍然无法正常工作。在我的测试中,规则不会在第一个错误发生时触发,而仅在第二个错误发生时触发。进一步的 cmets 表示赞赏。 嗨迈克尔,还有什么建议/cmets? 您好,是的,我测试过了。你是什​​么意思它不起作用?如果您的数据点彼此相距太远,则增加表达式只会存在很短的时间,这可能不足以触发警报。尝试增加 1m 或为其添加偏移量。根据您的投票率和警报中的任何for 子句,您可能需要对其进行一些修改。 嗨迈克尔,不工作是指当错误第一次发生时我仍然没有被触发(即指标是从 0 到 1)。在这种情况下,原则上,无论我等待多长时间,都应该始终触发警报。让我仔细检查一下将其更改为 5m 或 10m 是否会产生任何影响。谢谢。【参考方案3】:

正如@MichaelDoubez 所说,increase() 不会将新创建的指标视为价值增加。不幸的是,changes() 也是如此。这是有原因的,例如缺少刮擦,但仍然可以通过查询来解决。

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

当有新指标时,第二部分(以 or 开头)将触发 10 分钟(由 offset 定义)。

【讨论】:

以上是关于如何使用 Prometheus 警报规则检测新指标的主要内容,如果未能解决你的问题,请参考以下文章

prometheus rules

如何配置 Grafana 以捕捉 Prometheus 指标的急剧下降?

为啥 Prometheus 不会在不可见的指标上引发错误?

prometheus通过企业微信机器人报警

Prometheus Alert 不适用于基于事件的指标

使用 Prometheus 监控 eKuiper 规则运行状态