Prometheus 的 rate() 与 increase() 函数有什么区别?
rate() 返回计数器每秒的平均增速,increase() 返回时间窗口内的总增量——两者都自动处理计数器重置,increase 的结果就等于 rate 乘以窗口秒数。本文用实例讲清两者区别与选用场景。
一句话区别:rate(http_requests_total[5m]) 回答"每秒多少个请求",increase(http_requests_total[5m]) 回答"这 5 分钟一共多少个请求"——后者数值上等于前者乘以 300 秒。
rate:每秒平均增速
rate(http_requests_total[5m])
取 5 分钟窗口内计数器的首尾差值,除以窗口秒数,得到"平均每秒增长多少"。画 QPS 曲线、配速率告警都用它。计数器重启归零会被自动识别并修正,不会算出负数。
increase:窗口内总增量
increase(http_requests_total[5m])
同一窗口内的绝对增量,适合"过去 1 小时总共多少错误"这类总量问题:
increase(errors_total[1h])
怎么选?
| 需求 | 函数 |
|---|---|
| 画趋势曲线、看每秒速率 | rate |
| 统计一段时间的总量(订单数、错误数) | increase |
| 计算百分比(错误率) | 两个 increase 相除 |
两个函数都有外推特性:窗口内首尾样本不一定恰好落在边界上,Prometheus 会按斜率外推到窗口边界,所以增量可能是小数——这是正常现象。
观测云对照
在观测云中无需手写 PromQL 函数:指标查看器里选择指标后,聚合方式(速率/增量/均值)是界面选项,DQL 也提供等价的速率计算函数,对计数器重置的处理同样内置。
常见问题(FAQ)
Q:窗口选多大合适? 至少是抓取间隔的 4 倍(如 15s 抓取用 1m 以上),太短会漏样本出现锯齿。
Q:increase 的结果为什么不是整数? 外推机制导致,属预期行为;要精确计数请用更长的窗口。
Q:Gauge 能用 rate 吗? 不能——rate/increase 只适用于只增的 Counter;Gauge 求变化用 deriv() 或 delta()。