如何正确计算Prometheus计数器时段增量并检测其停止增长?
你遇到的sum(increase(application_thing_added[24h]))结果偏低,大概率是因为Prometheus不会将已销毁Pod对应的时间序列(标记为stale)纳入计算,但sum(application_thing_added) - sum(application_thing_added offset 24h)会包含这些已销毁Pod的最终计数差值,两者的维度计算逻辑不一致导致结果偏差。
1. 正确的计数器增量计算(支持重置)
如果需要按客户维度统计24小时内的总增量,同时自动处理计数器重置(比如Pod重启导致计数归零),应该按customer-name分组使用increase函数,这是Prometheus官方推荐的计数器增量计算方式:
sum by (customer-name) (increase(application_thing_added[24h]))
increase内部会自动识别计数器重置(当序列值出现下降时,视为重置,从0开始累加增量),无需额外处理。如果结果仍有偏差,可以尝试调整区间长度为[24h1m],确保覆盖完整的采样周期,避免因边界截断导致的计算误差。
2. 检测计数器是否停止增长
你的核心需求是判断计数器是否停止增长,无需统计24小时总增量,更高效的方式是检查最近一段时间内的增量是否为0。结合业务场景(客户24小时最少3次事件),可以选择6小时作为检测窗口(避免因正常间隔导致误判),查询语句如下:
sum by (customer-name) (increase(application_thing_added[6h])) == 0
该查询会返回所有最近6小时内没有任何计数递增的客户,即计数器停止增长的目标群体。increase函数同样会自动处理计数器重置,即使Pod重启后计数归零,只要重启后有新事件,增量就会大于0,不会误判。
3. 兼容已销毁Pod的增量统计(可选)
如果需要统计包括已销毁Pod在内的所有客户24小时总增量,可以使用以下组合查询,兼顾计数器重置和stale序列的计算:
sum by (customer-name) ( # 统计当前存在的序列24h增量 increase(application_thing_added[24h]) # 补充已销毁序列的增量(当前值为0,offset 24h的值为最终计数) or on(customer-name) group_left() sum by (customer-name) (application_thing_added offset 24h) )
内容的提问来源于stack exchange,提问作者Zyberzero

