《Prometheus 中 increase() 函数处理进程重启及最佳实践》

252 阅读4分钟

《Prometheus 中 increase() 函数处理进程重启及最佳实践》

*在 Prometheus 中,increase() 函数主要用于计算 Counter 类型指标 在时间窗口内的增量。当进程异常重启导致 Counter 重置时,increase() 会自动处理这种情况,确保计算结果的准确性。以下是详细解释和应对策略:

一、increase() 如何处理进程重启

1. 核心机制

1.              Counter 特性:Counter 指标只能单调递增,除非进程重启或重置。

2.              Prometheus 处理逻辑:当检测到 Counter 值下降(如从 1000 → 0),increase() 会认为发生了进程重启,并自动累加差值(即 (新值 - 0) + (前值的最大值 - 前值的最小值))。例如:

1.              重启前 Counter 从 0 增长到 1000(总增量 1000)。

2.              重启后 Counter 从 0 开始,在窗口内增长到 500(增量 500)。

3.              increase() 计算结果为 1000 + 500 = 1500,而非错误的 500 - 1000 = -500。

2. 数学公式

假设时间窗口内存在 n 次重启,Counter 值序列为 v₀, v₁, ..., vₘ,其中 vⱼ < vⱼ₋₁ 表示第 j 次重启:\text{increase}(v) = \sum_{i=1}^{n} (v_{\text{max_before_reset}i} - v{\text{min_before_reset}i}) + (v{\text{end}} - v_{\text{start_after_last_reset}})

二、验证与示例

1. 模拟进程重启场景

假设 http_requests_total 在 [5m] 窗口内的变化:

3.              0m:1000(重启前的最后值)

4.              1m:0(进程重启,Counter 重置)

5.              5m:300(当前值)

PromQL 查询:

 

increase(http_requests_total[5m])  # 结果为 1000 + 300 = 1300

 

如果使用误用 ****delta() ****处理 Counter 类型的数据就会存在上面:delta() 会直接计算差值,忽略重启逻辑,导致负值错误。,上面的值就变成了-1000+300= -700,在重启的时候就会变成负数。这样一定要特别的注意细节。delta() ****处理处理的数据必须是Gauge 类型,表示数据是有波动的,有增加或者减少的 在 Prometheus 监控体系中,Gauge(仪表盘)  是用于衡量当前状态值**的指标类型,反映系统在某个时刻的即时状态。它与 Counter(计数器)  的区别在于:Gauge 的值可以上升、下降甚至重置,而 Counter 的值只能单调递增(除非重置)。

image.png

image.png


2. 可视化验证

使用 Grafana 绘制 increase() 结果时,即使存在重启,曲线也会保持连续增长,不会出现负值或断层。

三、特殊情况与优化策略

1. 短时间内多次重启

若窗口内频繁重启,increase() 可能无法准确捕获所有重置点,导致计算偏差。解决方案

6.              缩短时间窗口(如从 [1h] 改为 [5m]),减少重启次数。

7.              使用 rate() 代替 increase(),计算平均速率(但需注意单位转换):

 

rate(http_requests_total[5m]) * 3600  # 转换为请求数/小时

2. 跨分片 / 实例的 Counter 合并

若需聚合多个实例的 Counter(如分布式系统),重启可能导致数据不连续。解决方案

8.              使用 sum(increase(...)) 而非 increase(sum(...)),确保每个实例的重启被单独处理:

 

sum(increase(http_requests_total[1h])) by (job)  # 按 job 聚合正确处理重启

3. 自定义标签标记重启事件

在应用代码中添加自定义指标(如 process_restart_total),当重启发生时递增该 Counter,便于监控和分析。示例

 

# 统计过去 24 小时内的重启次数increase(process_restart_total[24h])

四、最佳实践总结

1.              优先使用 increase() ****处理 Counter无需手动处理重启,Prometheus 会自动修正重置导致的负值。

2.              合理选择时间窗口

1.              过短的窗口可能因采样不足导致结果波动。

2.              过长的窗口可能包含多次重启,增加计算误差。

1.              结合其他函数增强准确性

1.              rate():计算平均速率,平滑短期波动。

2.              irate():计算瞬时速率,对突发变化更敏感。

1.              监控重启频率使用 process_start_time_seconds 或自定义指标监控进程稳定性:

 

changes(process_start_time_seconds[1d])  # 每天重启次数

五、常见误区

2.              误用 delta() ****处理 Counter:delta() 会直接计算差值,忽略重启逻辑,导致负值错误。

3.              手动补偿重启:无需在 PromQL 中手动添加补偿逻辑,increase() 已内置处理机制。

通过合理使用 increase() 和相关聚合函数,Prometheus 能够准确应对进程重启场景,确保监控数据的可靠性。

(注:文档部分内容可能由 AI 生成)