predict_linear做磁盘预警需五层设计:选2小时滚动窗口、按响应能力设预测时长(如4小时)、单位转GB并向上取整、完整Alertmanager规则封装、配套抑制与反向验证机制。

直接用 predict_linear 做磁盘预警,核心不是“能不能算”,而是“算得准不准、告得及时不及时、误报多不多”。它本质是线性外推,只适合短期、趋势稳定、无突变的场景。企业级落地必须结合数据周期、预测窗口、单位换算、标签过滤和告警抑制这五层设计。
选对历史窗口:2小时比1小时更稳,但别超过4小时
磁盘增长不是匀速的,尤其日志轮转、备份任务、临时文件写入会造成脉冲式增长。太短(如30分钟)易受噪声干扰;太长(如24小时)可能包含非典型周期(比如周末低峰+周一高峰混在一起),导致斜率失真。
生产验证推荐:2小时滚动窗口,既避开单次大写入干扰,又能捕捉真实业务节奏。例如:
-
node_filesystem_free_bytes{mountpoint="/", device!~"tmpfs|devtmpfs"}—— 过滤掉虚拟文件系统,只盯物理挂载点 -
[2h]—— 采样最近2小时数据,每30秒拉一次,约240个点,足够拟合一条合理直线
设准预测时长:按运维响应能力定,不是越短越好
告警不是为了“吓人”,而是留出人工介入时间。如果SRE平均响应+扩容耗时是2小时,那预测窗口设成4小时就毫无意义——等你收到告警,磁盘早满了。
常见分级策略:
-
紧急干预级(2–4小时):触发自动清理脚本或通知值班工程师立即处理
predict_linear(...[2h], 4*3600) < 5 * 1024^3→ 预测4小时后剩余不足5GB -
计划扩容级(24–48小时):加入周报、排期,不发强提醒
predict_linear(...[2h], 24*3600) < 20 * 1024^3→ 预测24小时后剩余不足20GB
单位与精度必须显式转换,别信默认值
Prometheus底层存储是字节(bytes),但人看的是GB,监控平台展示也常是GB。predict_linear 输出仍是字节,不做转换会导致两个严重问题:
- 阈值写
< 0看似简洁,实则无法区分“还剩1MB”和“已写满”,失去预警价值 - 直接比字节数,数字过大易读错(比如
1073741824是1GB,但没人能一眼识别)
正确做法:统一转GB并向上取整,便于理解和对齐SLA:
ceil(predict_linear(node_filesystem_free_bytes{mountpoint="/"}[2h], 4*3600) / 1024 / 1024 / 1024)
这样结果就是整数GB,告警内容可直接写“预计4小时后根分区剩余空间低于3GB”。
必须加 for + labels + annotations,否则等于没告
单独一个 predict_linear 表达式只是计算,不是可用告警。企业级规则要完整封装在Alertmanager YAML中:
groups:
- name: disk-predict-alerts
rules:
- alert: DiskSpaceExhaustionImminent
expr: predict_linear(node_filesystem_free_bytes{mountpoint="/", device!~"tmpfs"}[2h], 4*3600) < 5 * 1024^3
for: 5m
labels:
severity: critical
team: infra
annotations:
summary: "磁盘空间即将耗尽 ({{ $labels.instance }})"
description: "根据最近2小时趋势预测,{{ $labels.instance }} 的 / 分区将在4小时内剩余不足5GB。请立即检查日志、临时文件或规划扩容。"
其中:for: 5m 防止瞬时抖动误报(比如某次备份刚结束,曲线短暂上扬又回落)labels 用于路由到对应值班群或工单系统annotations.description 明确说明数据依据和建议动作,减少沟通成本
配套做两件事,才能真正闭环
predict_linear 只是预警起点。企业级机制必须联动后续动作:
-
自动抑制重复告警:同一台机器连续触发时,第二次起降级为“warning”,避免消息刷屏。用Alertmanager的
inhibit_rules实现 - 反向验证机制:每天凌晨跑一个Job,对比昨日预测值 vs 实际剩余值,记录误差率。若某台服务器连续3天误差>25%,说明其增长非线性,应标记为“需人工建模”,改用分段拟合或日志分析替代

















