irate适用于绘制细粒度灵敏图,但警惕用于告警
1、irate解析
作用:
irate(v range-vector) 函数用于计算区间向量的增长率,但是其反应出的是瞬时增长率。
原理:
irate 函数是通过区间向量中最后两个两本数据来计算区间向量的增长速率,它会在单调性发生变化时(如由于采样目标重启引起的计数器复位)自动中断。
这种方式可以避免在时间窗口范围内的“长尾问题”,并且体现出更好的灵敏度,通过irate函数绘制的图标能够更好的反应样本数据的瞬时变化状态。
当将 irate() 函数与聚合运算符(例如 sum())或随时间聚合的函数(任何以 _over_time 结尾的函数)一起使用时,必须先执行 irate 函数,然后再进行聚合操作,
更多irate细节以及与rate的对比参考我之前的笔记:【博客486】prometheus-----rate,irate,increase的原理
2、虽然 irate() 函数对粒度图很有用,但它不适合警报
irate() 接受一个计数器并根据范围内的两个最新样本计算每秒的增长。相比之下,rate() 会查看范围内的所有样本。这样做的结果是,使用 irate() 您可以看到所有的凹陷和尖峰,其分辨率与刮擦的分辨率相同。这也是 irate() 因警报而失败的地方。
假设您有一个带有 irate(my_counter[1m]) > 10 表达式和 for: 5m 的警报,也就是说每秒速率超过 10 持续 5 分钟。如果速率增加到每秒 15 次,您预计它会在 5 分钟左右触发。然而
事情并没有那么简单。很少有指标完全稳定的情况,尤其是当事情处于异常状态时。当然,平均值可能是每秒 15 次,但也可能是前一瞬间 9.5 次和稍后 18.7 次。那个 9.5 将重置 for: 5m 警报,所以现在你必须重新开始计数。删除 for: 5m 无济于事,因为它会导致过度敏感的警报,从而产生大量误报。
如果一定要使用irate作为告警,请思考:
- 是否真的需要这么高的灵敏度,每次抖动都带来一次告警,真的要必要吗
- 是否这个触发尖峰是能稳定存在的,否则for设置后这条告警永不触发,没有意义
对于告警更推荐使用rate() 避免这种情况,因为它是许多样本的平均值,因此它对短暂的下降和尖峰具有弹性