如何编写PromQL查询,检测gauge近1分钟首次上报Completed状态?
可行的PromQL实现方案
要实现“指定时间戳下,某namespace近1分钟内开始上报phase="Completed"的task_info指标则返回1,且保留namespace标签”的需求,可以通过判断当前窗口内存在上报、且1分钟前的窗口内无上报的逻辑来实现,具体有两种写法:
写法一:基于present_over_time与absent_over_time
present_over_time(task_info{phase="Completed"}[1m]) and absent_over_time(task_info{phase="Completed"}[1m] offset 1m)
逻辑说明:
present_over_time(task_info{phase="Completed"}[1m]):检查过去1分钟内(从指定时间戳往前推1分钟),该时间序列有上报样本则返回1,无则返回0。absent_over_time(task_info{phase="Completed"}[1m] offset 1m):通过offset 1m将检查窗口往前偏移1分钟,即检查[指定时间戳-2m, 指定时间戳-1m]窗口内无上报样本则返回1,有则返回0。- 两者通过
and逻辑组合,仅保留同时满足“近1分钟有上报”且“1分钟前的窗口无上报”的namespace,最终返回值为1,且保留原有的namespace标签。
写法二:基于count_over_time(直观计数判断)
count_over_time(task_info{phase="Completed"}[1m]) > 0 and count_over_time(task_info{phase="Completed"}[1m] offset 1m) == 0
逻辑说明:
count_over_time(...) > 0:统计过去1分钟内的上报次数,大于0说明近1分钟有上报。count_over_time(...) offset 1m == 0:统计1分钟前的1分钟窗口内的上报次数,等于0说明该窗口无上报。- 通过
and组合条件,筛选出符合要求的namespace,返回值为1,保留namespace标签。
多namespace聚合适配
如果需要按namespace维度聚合(比如同一个namespace下有多个任务,只要有一个任务在近1分钟内完成就返回该namespace的结果),可以加入by (namespace)聚合:
sum by (namespace) (present_over_time(task_info{phase="Completed"}[1m])) * sum by (namespace) (absent_over_time(task_info{phase="Completed"}[1m] offset 1m))
逻辑说明:
sum by (namespace)将同namespace下的所有任务结果聚合:只要有一个任务满足“近1分钟有上报”,第一个sum结果就大于0;只要namespace在1分钟前的窗口内无任何任务上报,第二个sum结果就为1。- 乘法运算会将两个条件同时满足的
namespace结果保留为1,不符合的则为0。
内容的提问来源于stack exchange,提问作者Kevin Qian
相关产品推荐
相关产品推荐

