如何使用Prometheus计算指定时间窗口内的HTTP请求完成率
Prometheus 计算时间窗口内HTTP请求完成率方案
核心逻辑
你需要的完成率公式为:时间窗口内已完成请求数 / 时间窗口内总收到请求数,PromQL本身没有专门计算完成率的内置函数,但可以通过两个对应Counter指标的增量计算得到结果。
具体实现方案
方案1:复用现有HTTP埋点指标
主流服务框架的官方Prometheus埋点(比如Spring Boot Actuator、Go生态Gin/Echo中间件、Node.js Express插件等)默认暴露的http_server_requests_seconds_count指标,本身统计的就是已处理完成的请求数,只有当请求处理结束(无论正常返回还是报错)才会计数+1。
如果你的服务埋点符合这个特性,直接用该指标的增量除以你已有的总请求数增量即可,5分钟完成率的示例PromQL如下:
increase(http_server_requests_seconds_count{service="myservice"}[5m]) / increase(你的自定义总接收请求Counter{service="myservice"}[5m])
如果你的http_server_requests_seconds_count是请求进入控制器就计数的,可给指标新增process_status标签区分processing(处理中)和finished(已完成),过滤process_status="finished"的指标增量即可得到已完成请求数。
方案2:自定义两个Counter埋点
如果现有指标不符合要求,可以自行新增两个Counter类型的指标:
http_requests_received_total:控制器收到请求时计数+1,对应总接收请求数http_requests_completed_total:请求处理完成(无论成功失败)时计数+1,对应已完成请求数
然后使用如下PromQL计算5分钟完成率:
increase(http_requests_completed_total{service="myservice"}[5m]) / increase(http_requests_received_total{service="myservice"}[5m])
如需避免分母为0返回空值,可以追加默认值逻辑:
increase(http_requests_completed_total{service="myservice"}[5m]) / increase(http_requests_received_total{service="myservice"}[5m]) > 0 or on() vector(0)
注意事项
- 不要用
rate()代替increase(),rate()返回的是每秒平均速率,increase()返回的是指定时间窗口内的总增量,更匹配你的需求 - 参与除法运算的两个指标的标签维度必须完全匹配,否则会因为标签对齐失败返回空值
- 如果需要统计成功请求的完成率,只需给已完成请求的Counter指标增加响应码标签,过滤2xx状态的增量即可
内容的提问来源于stack exchange,提问作者Jonathan Hagen
相关产品推荐
相关产品推荐

