Prometheus中对比指标自身状态,检测增长率变化的正确方法
检测指标增长率的正确PromQL写法
你的原始语句逻辑搞反了,要计算过去5分钟的增长率(当前相对5分钟前的增长幅度),得用当前速率除以历史速率再减1,或者直接判断当前速率是历史的1.02倍以上,以下是正确写法:
写法一:基于增长率公式
(sum(rate(my_http_counter[1m])) by (label) / sum(rate(my_http_counter[1m] offset 5m)) by (label)) - 1 > 0.02
这个表达式的逻辑是:
sum(rate(my_http_counter[1m])) by (label):获取当前各label维度的1分钟速率sum(rate(my_http_counter[1m] offset 5m)) by (label):获取5分钟前同一窗口的1分钟速率- 两者相除后减1,得到增长率,判断是否超过2%
写法二:等价的倍数判断
如果觉得除法容易出问题(比如除数为0),可以换成乘法逻辑:
sum(rate(my_http_counter[1m])) by (label) > 1.02 * sum(rate(my_http_counter[1m] offset 5m)) by (label)
额外注意事项
- 避免除数为0:如果5分钟前的速率为0,除法会报错,可加过滤条件:
((sum(rate(my_http_counter[1m])) by (label) / sum(rate(my_http_counter[1m] offset 5m)) by (label)) - 1 > 0.02) and sum(rate(my_http_counter[1m] offset 5m)) by (label) > 0 - 平滑波动:如果1分钟窗口的速率波动太大,可以换成更长的窗口(比如5分钟)来计算rate,比如
sum(rate(my_http_counter[5m])) by (label),这样结果更稳定
内容的提问来源于stack exchange,提问作者G_G
相关产品推荐
相关产品推荐

