Prometheus 警报第一个计数器值

问题描述 投票:0回答:4

我正在尝试创建错误警报。有一个指标可以计算应用程序中发生的错误。但当我尝试捕捉它的增加时,它总是返回 0。

increase(app_error[1h])

即使我用偏移量来做到这一点

offset 5h
,直到第一次遇到它时,它就会消失。有没有办法找到第一个遇到的错误及其第一个值的增加(从0到1)?我只需要在该指标的第一次计数时触发警报。

prometheus prometheus-alertmanager
4个回答
3
投票

简短回答:否。

长答案:不,但是您可以通过在代码中声明相应指标时将指标初始化为 0 来绕过此限制。也许还有其他解决方案,我现在想不到。

原因是你的指标

app_error
只有在第一次增加后才开始在Prometheus中“存在”。因此
increase
会给你增加 0(从无到 1 是... 0)。


2
投票

已经解决了

app_error unless app_error offset 1h

返回表达式的左侧

unless
表达式的右侧没有匹配项。


2
投票

这是我迄今为止想出的最终解决方案:

sum(increase(app_error[1h]) or vector(0)) 
   + sum((app_error unless app_error offset 1h) or vector(0))

第一部分

sum(increase(app_error[1h]) or vector(0))
:

  • 如果我们一小时前的值为 7,现在的值为 9,那么它将返回 2
  • 它将对发布此指标的所有实例的增量进行求和
  • 如果一小时前没有值,那么将返回
    vector(0)

第二部分

sum((app_error unless app_error offset 1h) or vector(0))
:

  • 如果我们现在有值 1 而 1 小时前没有值 - 它将返回 1
  • 它将对发布此指标的所有实例的第一个计数器值进行求和
  • 如果我们 1 小时前有一个值,那么
    vector(0)
    将被返回

结论:当您将这 2 项相加时,您应该检测到增加或第一个计数器增量。


0
投票

如果您想按某些标签求和,我可以找到最好的:

sum by (label1, label2) (max_over_time(app_error[2m]) or vector(0)) 
- sum by (label1, label2) (max_over_time(app_error[1m] offset 1m) or vector(0))

我在这次讨论中发现它应用了我自己的标签并摆弄了范围以使其适合我的情况: https://github.com/prometheus/prometheus/issues/1673#issuecomment-508485652

© www.soinside.com 2019 - 2024. All rights reserved.