如何用PromQL编写告警:特定URL超5秒请求占比达20%
实现特定URL请求耗时超5秒占比20%的PromQL告警方案
核心结论
完全可以实现你的需求,即使bucket边界是非整数,依然可以通过histogram指标近似计算超时请求占比,以下是具体推进步骤:
一、指标转换:从TPS到总请求数
你的seconds_counted是TPS平均值,要获取一段时间内的总请求数,需用sum_over_time对其在告警评估窗口内求和,示例:
sum_over_time(seconds_counted{url="你的目标URL"}[5m])
这里的[5m]是告警统计窗口,可根据业务需求调整(如1m、10m),代表统计最近5分钟的总请求量。
二、用bucket计算超时请求数
虽然bucket的le边界是非整数,但只要找到最大的le值小于等于5的那个bucket,就能近似算出耗时超5秒的请求数:
- 总请求数等于
seconds_bucket中le="+Inf"的累积值(所有请求都会落在这个bucket内),统计窗口内总量:sum_over_time(seconds_bucket{url="你的目标URL", le="+Inf"}[5m]) - 耗时≤5秒的请求数,取
le值最接近5且不超过5的bucket累积值,比如假设存在le="4.89"的bucket,就用:sum_over_time(seconds_bucket{url="你的目标URL", le="4.89"}[5m]) - 耗时超5秒的请求数 = 总请求数 - 耗时≤5秒的请求数
三、告警规则的PromQL表达式
组合上述指标,计算超时请求占比是否超过20%:
( sum_over_time(seconds_bucket{url="你的目标URL", le="+Inf"}[5m]) - sum_over_time(seconds_bucket{url="你的目标URL", le="<最接近5且≤5的le值>"}[5m]) ) / sum_over_time(seconds_counted{url="你的目标URL"}[5m]) > 0.2
四、非整数bucket边界的处理说明
histogram的bucket通常是指数分布(比如基于2的幂次),接近5的非整数边界和5的差距极小,对占比计算的误差可以忽略。如果实在介意,也可以在指标采集阶段自定义histogram的bucket边界,添加5的整数阈值;若无法修改采集配置,用现有非整数bucket完全能满足需求。
完整告警规则示例
groups: - name: url_request_timeout_ratio rules: - alert: URLRequestTimeoutRatioExceed20Percent expr: | ( sum_over_time(seconds_bucket{url="/api/your-target-url", le="+Inf"}[5m]) - sum_over_time(seconds_bucket{url="/api/your-target-url", le="4.89"}[5m]) ) / sum_over_time(seconds_counted{url="/api/your-target-url"}[5m]) > 0.2 for: 1m labels: severity: warning annotations: summary: "特定URL请求超时占比超20%" description: "最近5分钟内,URL {{ $labels.url }} 的请求中,耗时超5秒的占比达 {{ $value | printf \"%.2f%%\" }},超过阈值20%"
内容的提问来源于stack exchange,提问作者Ali Yüce
相关产品推荐
相关产品推荐

