You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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秒的请求数:

  1. 总请求数等于seconds_bucket中le="+Inf"的累积值(所有请求都会落在这个bucket内),统计窗口内总量:
    sum_over_time(seconds_bucket{url="你的目标URL", le="+Inf"}[5m])
    
  2. 耗时≤5秒的请求数,取le值最接近5且不超过5的bucket累积值,比如假设存在le="4.89"的bucket,就用:
    sum_over_time(seconds_bucket{url="你的目标URL", le="4.89"}[5m])
    
  3. 耗时超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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:17:15