rate 与 irate 的区别
rate 用窗口内的全部样本做外推,得到平均变化速率,曲线平滑,适合告警与容量观察;irate 只取窗口内最后两个样本计算瞬时速率,反应快但抖动明显,适合在图表上观察突变。两者都要求输入是计数类序列,并自动处理进程重启带来的归零。
为什么要转成速率
计数类指标只在进程重启时归零,原始值本身是单调上升的累计量,直接画图只能看到一条斜线。转成速率后才能回答每秒发生多少次,才具备跨实例可比性,也才能与阈值比较。
基本信息
| 输入要求 | 计数类序列,窗口内至少两个样本 |
|---|---|
| rate 行为 | 窗口内所有样本参与、结果平滑 |
| irate 行为 | 只用末尾两个样本、结果灵敏 |
| 外推特性 | rate 会按窗口长度外推,短窗口数值可能略高于手工计算 |
| 窗口含义 | rate 是平均窗口,irate 的窗口只决定回看多远 |
典型使用场景
- 告警表达式:用 rate 得到平稳信号,避免尖刺造成误报
- 故障期观察:用 irate 快速看到流量与错误的瞬时变化
- 容量趋势:用 rate 的长期曲线判断是否需要扩容
- 发布对比:用同一窗口对比发布前后速率差异
- 重置确认:计数类归零后两条序列的曲线都会出现短暂下凹
两种速率对比
两种速率对比
# 平滑:5 分钟平均速率,适合告警
rate(http_requests_total[5m])
# 灵敏:末尾两个样本的瞬时速率,适合看板观察
irate(http_requests_total[5m])
# 按维度聚合后使用,避免同时画出过多曲线
sum by (service) (rate(http_requests_total{code=~"5.."}[5m]))两者对照
| 维度 | rate | irate |
|---|---|---|
| 参与样本 | 窗口内全部 | 窗口内最后两个 |
| 曲线形态 | 平滑 | 抖动明显 |
| 适用场景 | 告警、趋势、容量 | 突变观察、故障期手动排查 |
| 窗口长度作用 | 决定平均范围 | 只决定回看范围 |
窗口与采样点的关系
| 抓取间隔 | 推荐窗口 | 原因 |
|---|---|---|
| 15 秒 | 1 到 5 分钟 | 保证窗口内有足够采样点 |
| 1 分钟 | 5 到 15 分钟 | 窗口过短会让速率剧烈跳动 |
| 5 分钟 | 15 分钟以上 | 否则可能只覆盖两三个点 |
窗口至少要覆盖四个采样点才能得到稳定的速率:抓取间隔调整后,原来的窗口设置通常需要一并放宽。
irate 参数写成 5 分钟但实际只看末尾两个样本,容易被误解为窗口平均;对稳定性有要求的地方优先用 rate。
计数器重置怎么被处理
进程重启会让计数类序列归零,rate 与 irate 都按重置处理,把下降点视作新一轮累加,因此不会出现负值。自己用原始值做差值就没有这层保护,重启时刻会出现明显负尖峰,这也是推荐用函数而不是手工运算的原因。
选取速率窗口的经验
- 先看抓取间隔:窗口至少要覆盖四个采样点
- 告警用长窗口:稳定性优先,允许几十秒到几分钟的判定延迟
- 排查用短窗口:灵敏度优先,接受曲线抖动
- 看板统一宏:交给与步长联动的宏自动计算窗口,避免写死固定值
选错窗口的典型表现
| 写法 | 表现 | 修正方式 |
|---|---|---|
| 窗口小于采样间隔 | 结果为空或时有时无 | 窗口放大到覆盖多个采样点 |
| 窗口远大于抓取间隔 | 变化被抹平,突发看不到 | 缩短窗口或改用瞬时速率 |
| 两种速率混用在同一图 | 曲线尺度不一致,难以比较 | 同一面板统一使用一种 |
速率类查询要看趋势而不是精确值:短窗口下的外推会带来少量偏差,做容量估算时应使用更长的窗口与更完整的采样。