如何用PromQL筛选耗时超50ms的PUT请求?Grafana查询异常求助
问题分析与解决
原查询的问题
你写的PromQL逻辑完全偏离需求:(sum(rate(http_server_requests_seconds_bucket{exception="None", app="Myapp", method="PUT"}[5m])) by (le) > 0.05) 是在判断每个直方图桶的请求速率是否大于0.05,和“筛选耗时超过50ms的请求”没有关系,所以才会只返回le=0.05556的桶(这个桶的请求速率刚好满足>0.05的条件)。
正确查询方式
1. 获取耗时超过50ms(0.05秒)的请求速率
用直方图总请求数减去耗时≤0.05秒的请求数,得到耗时>0.05秒的请求速率:
sum(rate(http_server_requests_seconds_bucket{exception="None", app="Myapp", method="PUT", le="+Inf"}[5m])) - sum(rate(http_server_requests_seconds_bucket{exception="None", app="Myapp", method="PUT", le="0.05"}[5m]))
2. 获取耗时超过50ms的请求占比
如果需要看超耗时请求在总请求中的占比,用以下查询:
( sum(rate(http_server_requests_seconds_bucket{exception="None", app="Myapp", method="PUT", le="+Inf"}[5m])) - sum(rate(http_server_requests_seconds_bucket{exception="None", app="Myapp", method="PUT", le="0.05"}[5m])) ) / sum(rate(http_server_requests_seconds_bucket{exception="None", app="Myapp", method="PUT", le="+Inf"}[5m]))
关键说明
http_server_requests_seconds_bucket是Prometheus的直方图指标,le表示该桶包含所有耗时≤le值的请求。要统计耗时超过某个阈值的请求,必须用le="+Inf"(总请求数)减去le=阈值的桶数据,这是直方图的标准用法。
内容的提问来源于stack exchange,提问作者luckyman80
相关产品推荐
相关产品推荐

