PromQL统计指定时间段node/IP组合的指标宣告次数实现方法
PromQL实现node/ip维度指定时间段内IP宣告累计次数统计
核心实现逻辑
由于场景中node/ip组合对应的时序不会全程存在,会随宣告/撤销动作动态出现、消失,直接使用内置的delta/count_over_time/changes等范围函数无法得到正确结果,需要通过子查询识别每次「时序从无到有」的宣告事件,再按维度聚合累计值。
假设指标采集间隔为15s,统计30分钟窗口内累计宣告次数的PromQL如下:
sum_over_time( ( some_metric > 0 unless some_metric > 0 offset 15s )[30m:15s] ) by (node, ip)
语句说明
some_metric > 0:筛选出当前采样点存在有效宣告的node/ip组合,存在则返回对应时序,不存在则无返回unless some_metric > 0 offset 15s:和15s前(上一个采集周期)的状态对比,排除掉上一周期已经存在的时序,只保留当前周期新出现的宣告时序,命中则记为1次宣告事件[30m:15s]:子查询配置,代表在30分钟的统计窗口内,按15s步长(和采集间隔对齐)逐点执行上述判断sum_over_time(...) by (node,ip):将窗口内所有识别到的宣告事件按node、ip维度累加,得到每个组合的累计宣告次数
参数调整说明
- 偏移量和子查询步长:需要和实际的Prometheus采集间隔保持一致,如果采集间隔为30s,将语句中所有
15s替换为30s即可,避免漏算、多算事件 - 统计窗口:按需修改
30m为目标时间范围即可,比如统计1小时数据则改为1h
常规范围函数不适用的原因
count_over_time(some_metric[30m]):仅统计时序存在期间的样本点总数,全程存在的时序会返回和采集次数一致的数值(比如15s间隔下30分钟会返回120),无法统计宣告次数delta(some_metric[30m]):仅计算窗口首尾两个样本点的差值,无法识别窗口内发生的多次宣告、撤销动作,时序中途消失时计算结果会出现偏差changes(some_metric[30m]):仅统计已有样本的值变化,时序消失(无样本)后重新出现的场景不会被识别为变化,无法统计跨中断的宣告事件
以上写法完全匹配示例场景的预期输出:
{node=server1,ip=10.0.0.1} = 2 {node=server2,ip=10.0.0.2} = 1 {node=server2,ip=10.0.0.1} = 1
内容的提问来源于stack exchange,提问作者carrotcakeslayer
相关产品推荐
相关产品推荐

