请求失败率超25%持续5分钟的Prometheus告警规则验证
Prometheus告警规则PromQL语句问题解答
需求回顾
- 触发告警:请求失败率持续5分钟高于25%
- 抑制条件:5分钟内总请求数少于10时不触发
- 指标:
result,带status="SUCCESS|FAIL"标签,还有customer_id等其他标签,需计算整体失败率
你写的PromQL存在的问题
- 总请求数计算错误:你用
sum(rate(result[5m]))判断总请求数,但rate返回的是每秒请求速率,不是5分钟内的总请求数,应该用sum(increase(result[5m]))获取5分钟内的总请求增量(即总请求数)。 - 条件逻辑错误:
unless sum(rate(...)) <10的逻辑是“当总请求速率小于10时不返回失败率”,既不符合“总请求数>=10”的要求,也用错了逻辑运算符,应该用and关联“总请求数>=10”的条件。 - 持续判断逻辑不完整:你用
avg_over_time包裹布尔结果,但未明确判断是否所有时刻都满足条件,返回的0-1之间的平均值无法直接作为告警触发的布尔条件。
正确的PromQL语句
avg_over_time( ( (sum(rate(result{status="FAIL"}[5m])) by () / sum(rate(result[5m])) by ()) and sum(increase(result[5m])) by () >= 10 ) > bool 0.25 [5m:] ) == 1
语句拆解说明
sum(rate(result{status="FAIL"}[5m])) by ():聚合所有标签(包括customer_id),计算整体的每秒失败请求速率sum(rate(result[5m])) by ():聚合所有标签,计算整体的每秒总请求速率- 两者相除得到实时失败率
sum(increase(result[5m])) by () >= 10:计算5分钟内的总请求数(increase获取计数器增量),确保总请求数不少于10> bool 0.25:将“失败率>25%且总请求数>=10”的结果转换为布尔值(1=满足,0=不满足)avg_over_time(...[5m:]) == 1:检查过去5分钟内的所有时刻是否都满足条件(平均值为1说明所有样本都是1,即持续5分钟符合要求)
内容的提问来源于stack exchange,提问作者KOB
相关产品推荐
相关产品推荐

