如何修改Prometheus API请求以按kpi_metrics<1条件获取结果
解决Prometheus按条件计数自定义指标的问题
嘿,这个问题我之前也碰到过——你踩了PromQL语法的小坑啦!直接在count()里写kpi_metrics<1是不符合Prometheus查询规则的,所以才返回空结果。
为什么原查询失效?
PromQL的聚合函数(比如count())需要接收一个向量类型的参数,但count(kpi_metrics<1)的写法相当于把比较运算嵌套在了聚合函数内部,Prometheus无法正确解析这种逻辑。你得先筛选出符合条件的样本,再对这些样本做聚合操作。
正确的查询写法(适配query_range接口)
因为你用的是范围查询接口,推荐使用count_over_time()函数来统计每个时间步长内符合条件的样本数量,具体写法如下:
1. 核心查询语句
count_over_time((kpi_metrics < 1)[1m:])
kpi_metrics < 1:先筛选出所有值小于1的样本;[1m:]:定义一个1分钟的时间窗口(和你的step=60参数对应);count_over_time():统计每个时间窗口内符合条件的样本总数。
2. 完整的API请求URL
注意URL里的<需要编码成%3C(否则会被当作URL特殊字符解析出错),最终请求如下:
http://prometheus01/api/v1/query_range?query=count_over_time((kpi_metrics%3C1)[1m:])&start=1515747230&end=1515750830&step=60
其他可选写法
如果你的需求是统计整个时间范围内,存在至少一个值小于1的时间序列的数量(而非每个步长的样本数),可以用下面的查询:
count(kpi_metrics < 1)
对应的URL是:
http://prometheus01/api/v1/query_range?query=count(kpi_metrics%3C1)&start=1515747230&end=1515750830&step=60
这种写法会在每个步长返回当前时刻符合条件的时间序列总数。
内容的提问来源于stack exchange,提问作者Nikolay Baranenko
相关产品推荐
相关产品推荐

