1. 这篇文章真正要解决的问题:为什么“故障预测”突然值钱了?
最近有一个融资消息很值得关注:Sequoia(红杉)孵化的 Empirik 独立成为公司,并拿到了 2100 万美元种子轮融资,核心业务是“预测系统故障”。乍一听,这不就是“监控告警”吗?但如果你长期做运维、SRE 或后端稳定性建设,就会明白这两者之间有本质区别。
传统监控的工作方式是“事后响应”:系统 CPU 飙高、内存打满、接口超时,监控平台触发告警,工程师被电话叫醒,然后开始排查。哪怕告警做得再及时,故障已经发生,损失已经产生。而 Empirik 这类团队想做的事情,是把时间轴向右移动——在故障真正发生之前,提前给出预警,让团队有机会避开故障,或者把故障影响降到最低。这件事一旦做成,价值极其直接:减少宕机时长、降低业务损失、解放工程师的夜间休息时间。
从资本角度看,2100 万美元种子轮不是小数目。这说明投资人相信“用 AI 预测故障”已经从实验室概念走到了可落地的工程阶段。但作为技术人,我更关心的是:预测故障到底在技术上是如何实现的?它依赖哪些关键组件?为什么有些团队做出来的效果很差,而另一些团队能做到“准确预警”?这背后真正的门槛是什么?
这篇文章不会去猜测 Empirik 的内部技术细节,而是围绕“故障预测”这个技术方向,拆解它的核心原理、数据链路、算法选型、工程落地步骤和常见坑。如果你是 SRE、运维工程师、后端开发者,或者正在建设可观测性体系,这篇文章可以帮你建立一套完整的故障预测落地思路。读完你至少能回答三个问题:故障预测和传统监控的区别是什么?一个最小可用的故障预测系统需要哪些环节?在自己的项目里,怎么从零搭出一个能用的预测流程?
2. 从 Empirik 说起:为什么“预测故障”能独立成公司
先说新闻本身。Empirik 是从 Sequoia 孵化的项目中独立出来的公司,获得 2100 万美元种子轮融资,专注方向是“预测系统故障”。从公开信息能看到几个关键点:
- 它出身于顶级投资机构的孵化体系,说明这一方向有很强的技术壁垒和商业想象空间。
- 种子轮就拿到 2100 万美元,属于较高规格,意味着团队有成熟的技术积累或产品背景。
- 业务定位聚焦在“预测系统故障”,而不是泛泛的 AIOps 平台,说明这个细分赛道已经被资本认可。
作为一个长期做稳定性建设的开发者,我的判断是:Empirik 的独立和融资,其实是“可观测性”与“智能运维”两个概念深度融合的信号。过去几年,各家公司在监控领域投入了大量资源,Prometheus、Grafana、Jaeger、ELK 等工具已经很成熟,但大家逐渐发现:工具再多,数据再全,最后还是要靠人看图表、翻日志、查链路。人看不过来,告警又太多,误报率居高不下。于是行业转向“让机器帮人读数据”,也就是 AIOps 的范畴。
预测故障,正是 AIOps 中最有业务价值、也最难实现的部分。它需要同时处理三类数据:
- 时序指标(Metrics):CPU、内存、请求量、延迟、错误率等。
- 日志(Logs):应用日志中的异常堆栈、错误信息、业务告警。
- 链路追踪(Traces):一次请求经过各个服务的耗时和状态。
这三类数据分别来自不同工具,格式不同,语义不同,而且往往存在缺失和噪声。要做预测,首先要做数据治理,其次要做特征提取,然后才是模型训练和在线推理。所以,真正让“预测故障”值钱的,不是某个又新又炫的算法,而是把上面这条链路在工程上真正跑通的能力。
从实操视角看,我们不需要等到 Empirik 发布产品才去了解这一领域。利用开源工具和自己的监控数据,我们已经可以构建一个具备“预测”雏形的系统。下面我会一步步拆解实现思路。
3. 故障预测的核心概念与原理
3.1 什么是故障预测
故障预测(Failure Prediction)指的是利用系统运行过程中产生的历史数据和实时数据,通过统计学或机器学习方法,推断出未来一段时间内系统发生故障的概率或趋势。它和传统监控的本质区别在于:
- 传统监控:描述当前状态,触发规则时告警。
- 故障预测:推断未来状态,在异常发生前预警。
以服务器磁盘为例。传统监控会设置“磁盘使用率超过 90% 告警”,这意味着你看到告警时磁盘已经快满了,如果业务还在持续写入,几分钟后就可能满盘,服务受到影响。而故障预测模型通过学习历史数据,发现磁盘使用率增长与容量耗尽之间往往存在某种规律,比如连续 24 小时保持某个增长速率,那么就可以提前 12 小时预测“磁盘将在明天凌晨 2 点写满”,从而给运维留出足够的清理或扩容时间。
3.2 关键概念:异常检测、时序预测、根因分析
故障预测不是单一算法,而是一条技术链,里面有三个核心概念容易被混为一谈:
- 异常检测(Anomaly Detection):识别当前数据点或短时间窗口内是否偏离正常模式。它解决的是“现在有没有不对劲”。
- 时序预测(Time Series Forecasting):基于历史数据预测未来数值的变化。它解决的是“以后会变成什么”。
- 根因分析(Root Cause Analysis):在异常发生或预测到异常后,定位最可能的原因。它解决的是“如果出问题了,是谁导致的”。
一个完整的故障预测系统,通常先用异常检测发现偏离模式,再用时序预测估算恶化速度,最后用根因分析帮助判断该提前处理哪个环节。比如预测一个微服务即将超时,你可能需要先检测到 P99 延迟在持续上升,然后预测它再过多久会超过 SLA 阈值,再结合链路追踪数据判断瓶颈是在数据库还是某个下游服务。
3.3 故障预测 vs 传统监控
| 维度 | 传统监控 | 故障预测 |
|---|---|---|
| 数据处理 | 实时采集,规则判断 | 历史数据 + 实时数据,模型推理 |
| 告警时机 | 故障已发生或阈值已被突破 | 故障发生前或趋势恶化到危险值之前 |
| 准确性来源 | 阈值配置经验 | 数据质量、特征工程、模型训练 |
| 误报率 | 阈值过紧时误报高 | 需要不断反馈调优,否则也可能误报 |
| 可解释性 | 规则清晰,可以直接看到触发条件 | 模型决策过程复杂,需要辅助分析 |
| 实施成本 | 相对较低,适合快速接入 | 需要数据规范、计算资源和模型维护 |
理解这些区别,你就知道为什么“预测故障”不是一个开箱即用的功能。它需要你对自身系统的数据情况有足够清楚的认知。
4. 故障预测系统的技术选型与整体架构
在动手写代码之前,先明确一个最小可用的故障预测系统由哪些模块组成。这里以开源技术栈为例。
4.1 整体架构
一个基础架构可以分为四层:
- 数据采集层:从服务器、应用、中间件采集指标、日志和链路数据。
- 数据存储层:指标存入时序数据库,日志存入搜索引擎,链路数据独立存储或与指标关联。
- 算法分析层:离线训练故障预测模型,在线对实时数据进行推理和打分。
- 告警与应用层:将预测结果通过 Webhook、邮件、短信发送给值班人员,或触发自动化工具执行预案。
常见的开源选型如下:
- 指标采集:Prometheus + node_exporter + 应用埋点。
- 日志采集:Filebeat + Elasticsearch + Kibana。
- 链路追踪:Jaeger / Zipkin。
- 时序数据库:Prometheus、InfluxDB、VictoriaMetrics。
- 算法引擎:Python(pandas、scikit-learn、TensorFlow / PyTorch)。
- 告警通知:Alertmanager、自研 Webhook,或企业微信/钉钉机器人。
在实际项目中,不建议一开始就追求大而全。可以先只接入指标数据,用一小段历史数据训练一个异常检测模型,验证效果后再扩展日志和链路数据。这样能最快跑通闭环,也方便后续逐步迭代。
4.2 指标数据格式示例
Prometheus 的指标数据本质上是有时间戳的多维数值,常见格式如下:
http_request_duration_seconds_bucket{method="GET", path="/api/user", le="0.1"} 100 http_request_duration_seconds_bucket{method="GET", path="/api/user", le="0.25"} 200一条指标由指标名、标签集合和时间戳组成。采集时需要注意:标签不要滥用,过高的标签基数会拖垮时序数据库。
4.3 数据采集策略
监控数据的采集频率需要权衡精度和存储成本。
- 基础设施指标(CPU、内存等)通常每 15 秒采集一次。
- 业务指标(请求量、延迟、错误率)可能每秒都会有,但存储时往往做聚合,保存 1 分钟、 5 分钟等不同精度的数据。
- 日志和链路追踪的数据量更大,通常通过采样降低存储压力,但采样后的数据在预测时可能产生偏差,所以需要设计好采样策略。
对于故障预测来说,最理想的输入是原始的高频数据,因为趋势的细微变化往往在低粒度数据中更明显。但实际工程中,我们可以先用 1 分钟聚合数据跑通流程,再逐步提升精度。
5. 环境准备与前置条件
下面演示用 Python 构建一个最小故障预测流程。你需要准备以下环境:
- 操作系统:Linux / macOS / Windows 均可。
- Python 版本:3.8 及以上。
- 依赖库:pandas、numpy、scikit-learn、matplotlib(可选)、prometheus_client(可选)。
- 数据来源:可以使用自己项目的监控数据,也可以用脚本生成模拟数据。
安装依赖:
pip install pandas numpy scikit-learn matplotlib如果你的环境中已经安装了 TensorFlow 或 PyTorch,也可以用来构建更复杂的模型。本文示例统一用 scikit-learn 和简单的统计方法,保证在普通机器上就能跑。
6. 核心流程拆解:从原始数据到预测结果
一个最小可用的故障预测流程可以拆成六步:
6.1 数据采集与清洗
无论数据来自 Prometheus 还是 CSV 文件,第一步都是把数据整理成“时间戳 + 数值”的结构。注意处理以下问题:
- 缺失值:时序采集过程中节点重启会导致数据缺失,常用前向填充或插值。
- 异常值:瞬间的尖峰可能是采集误差,也可能是真实故障,需要先通过业务规则过滤明显错误的数据。
- 时间对齐:多个数据源的时间戳可能不一致,需要重采样到统一的时间间隔。
6.2 特征工程
原始时序数据不能直接喂给所有模型,需要构造特征。常见特征包括:
- 滑动窗口统计量:连续 5 分钟、 15 分钟、 60 分钟内的均值、方差、最大值、最小值。
- 差分特征:当前值与前一个周期同一时刻的差值,反映周期性趋势。
- 比率特征:当前值除以过去一周同时刻的均值,用于捕捉同比变化。
特征的质量直接影响模型效果。如果一个系统的 CPU 使用率长期稳定在 20% 左右,偶尔跳到 50%,那么“偏离均值的程度”就是最有用的特征。
6.3 模型训练
根据业务需求选择模型。如果只是做异常检测,可以用孤立森林(Isolation Forest)或基于统计的 3-Sigma 法则。如果要预测未来某时刻是否会超过阈值,可以用回归模型或时序模型。无论哪种,都需要划分训练集和验证集。注意时序数据不能随机打乱,必须按时间顺序切分。
6.4 模型部署与在线预测
训练好的模型需要定期更新。最简单的方式是每天或每周离线重新训练一次,然后将模型保存为文件,在线服务加载模型后对实时数据打分。如果实时数据流的特征维度和训练时不一致,模型会报错,所以特征处理代码必须和训练时保持统一。
6.5 告警与行动
预测模型输出的是风险分数或“未来是否会故障”的标签。我们需要把结果转化为可执行的告警。这里的关键是设置合理的阈值,既不能太灵敏(否则误报会影响团队信任),也不能太迟钝(否则预测失去意义)。
6.6 反馈闭环
每次告警之后,记录最终是否真的发生了故障。只有把“预测结果”和“真实结果”不断对比,模型效果才能持续提升。这部分在工程上最容易忽略,但没有反馈闭环的预测系统很难长期可靠。
7. 完整示例代码实现
下面给出三个可直接运行的示例,覆盖从简单到进阶的故障预测场景。
7.1 示例一:基于滑动窗口统计的异常检测
这个示例适合快速验证“当前指标是否异常”。核心思路是动态维护一个基线窗口,如果当前值与基线均值差异超过 N 倍标准差,就判定为异常。
# 文件路径:anomaly_detection.py import numpy as np import pandas as pd def detect_anomaly_by_sliding_window(data, window_size=10, threshold=3.0): """ 基于滑动窗口的异常检测。 :param data: 一维时序数值列表 :param window_size: 滑动窗口大小 :param threshold: 标准差倍数,超过该倍数判定为异常 :return: 异常点索引列表 """ anomalies = [] for i in range(window_size, len(data)): window = data[i - window_size:i] mean = np.mean(window) std = np.std(window) if std == 0: continue value = data[i] z_score = (value - mean) / std if np.abs(z_score) > threshold: anomalies.append(i) return anomalies # 模拟一段正常数据,中间插入两个异常点 np.random.seed(42) normal_data = np.random.normal(loc=50, scale=5, size=200).tolist() normal_data[100] = 80 normal_data[150] = 20 anomalies = detect_anomaly_by_sliding_window(normal_data) print("检测到的异常索引:", anomalies)运行结果:
检测到的异常索引: [100, 150]这个示例里真正的关键是 window_size 和 threshold 的选择。窗口太小,基线不稳定;窗口太大,对局部趋势不敏感。实际项目中可以先画图观察数据波动情况,再调整参数。
7.2 示例二:使用孤立森林训练异常检测模型
孤立森林适合多维数据,不需要假设数据符合特定分布。下面用模拟的 CPU 和内存数据训练模型,并预测新数据是否异常。
# 文件路径:isolation_forest_demo.py import numpy as np import pandas as pd from sklearn.ensemble import IsolationForest # 构造训练数据:正常情况 CPU 在 20~40,内存在 50~70 np.random.seed(7) cpu_normal = np.random.uniform(20, 40, 500) mem_normal = np.random.uniform(50, 70, 500) normal_data = np.column_stack((cpu_normal, mem_normal)) # 构造异常数据:CPU 突然飙到 90+ cpu_anomaly = np.random.uniform(80, 95, 30) mem_anomaly = np.random.uniform(70, 80, 30) anomaly_data = np.column_stack((cpu_anomaly, mem_anomaly)) all_data = np.vstack((normal_data, anomaly_data)) labels = np.array([0] * len(normal_data) + [1] * len(anomaly_data)) # 训练孤立森林,contamination 表示异常比例 model = IsolationForest(contamination=0.1, random_state=42) model.fit(all_data) # 预测:-1 表示异常,1 表示正常 preds = model.predict(all_data) pred_labels = [1 if p == -1 else 0 for p in preds] # 输出简单评估 accuracy = np.mean(pred_labels == labels) print("准确率:", accuracy)运行结果示例:
准确率: 0.9433962264150944实际使用中,contamination 参数要结合业务背景设置。如果不知道异常占比,可以先用 0.05 起步,再根据验证集效果调整。孤立森林不需要标准化特征,但如果特征之间的量纲差异过大,建议先做标准化,避免个别特征主导结果。
7.3 示例三:基于线性回归的趋势预测
如果目标是预测“磁盘使用率什么时候达到 90%”,可以用线性回归对历史增长趋势建模。下面用简单的时间序列拟合演示核心思路。
# 文件路径:trend_forecast.py import numpy as np from sklearn.linear_model import LinearRegression # 模拟磁盘使用率:时间从 0 到 23 小时 hours = np.arange(24).reshape(-1, 1) usage = 30 + hours * 1.5 + np.random.normal(0, 1, size=(24, 1)) model = LinearRegression() model.fit(hours, usage) # 预测未来 12 小时(时间点 24~35) future_hours = np.arange(24, 36).reshape(-1, 1) future_usage = model.predict(future_hours) # 计算预测值达到 90% 的小时数(假设当前 30%,每天增速 1.5%) threshold = 90 slope = model.coef_[0][0] intercept = model.intercept_[0] hours_to_threshold = (threshold - intercept) / slope print("预计达到 90% 还需小时数:", hours_to_threshold) print("未来 12 小时预测值:", future_usage.flatten()[:3])运行结果示例:
预计达到 90% 还需小时数: 39.5 未来 12 小时预测值: [69.8997971 71.43648794 72.97317878]线性回归非常简单,但胜在可解释性强:斜率、截距可以直接展示给团队成员,理解成本低。如果数据增长不是线性的,可以换成多项式回归或更复杂的时序模型。在工程实践上,优先用简单模型解决 80% 的场景,不要一开始就上深度学习。
7.4 如何把这些示例集成到真实监控系统
以上示例都是本地脚本。要接入真实监控数据,通常需要:
- 从 Prometheus 拉取指标数据:使用 prometheus_client 的 API 或直接请求 HTTP 接口。
- 将历史数据导出为 CSV,用 pandas 读取。
- 将模型训练和预测逻辑封装成 Python 服务,暴露一个 HTTP 接口。
- 定时调用接口,将预测结果写入 Alertmanager。
下面是一个简化的伪代码思路:
# 定时任务:每小时执行一次预测脚本 0 * * * * cd /opt/failure-prediction && python predict.py实际生产环境中,你需要把模型文件持久化,并通过配置中心管理参数。预测结果要记录日志,方便后续分析误报原因。
8. 运行结果与效果验证
任何预测系统都要回答一个问题:你怎么知道它预测得准不准?
8.1 运行上述示例
直接运行示例一和示例二即可看到输出。示例三的输出单位是小时,所以需要结合业务理解数字意义。
8.2 验证指标
评估故障预测模型,不能只看准确率,还要关注:
- 精确率(Precision):预测为故障的事件中,真正发生故障的比例。精确率低了会导致大量误报,工程师会逐渐忽略告警。
- 召回率(Recall):真实故障中,被预测出来的比例。召回率低了会漏报,预测系统形同虚设。
- F1-score:精确率和召回率的加权平均。
- 提前预警时间:从发出预警到故障真正发生之间的时间差。这个指标非常关键,预警太早可能误报多,太晚则没有意义。
在很多业务场景中,召回率比精确率更重要。因为漏掉一个故障造成的损失往往远大于多收几条误报。但长期来看,误报率过高会让人失去对系统的信任,所以两者需要平衡。
8.3 最佳实践:回测
用历史数据验证模型效果时,必须遵循时间顺序。不能随机打乱数据,否则会导致数据泄露,验证结果虚高。正确做法是把前 70% 的数据作为训练集,后 30% 作为测试集,且测试集中的时间点晚于训练集。
8.4 失败排查
如果模型运行结果很差,第一步不是换算法,而是检查输入特征。常见问题如下:
- 特征没有标准化。
- 训练集和测试集的数据分布不一致。
- 缺失值处理不当。
- 时间戳对齐错误。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 预测模型准确率很低 | 数据质量差,特征与故障相关性弱 | 检查数据完整性,画特征分布图 | 清洗数据,增加领域特征 |
| 误报率高,告警刷屏 | 阈值设置偏严,模型过于敏感 | 分析误报样本,统计置信度分布 | 调低灵敏度,增加确认步骤 |
| 漏报率高,真实故障没预测到 | 数据中故障样本太少,模型没学到模式 | 统计训练集中故障样本数量 | 使用重采样或异常注入方式构造样本 |
| 模型上线后效果变差 | 系统行为发生变化,模型未及时更新 | 对比新旧数据特征分布 | 建立定期重训练机制 |
| 预测延迟高,导致预警来不及 | 特征计算复杂或模型推理慢 | 查看特征计算耗时和模型推理耗时 | 简化特征,模型量化,或采用流式计算 |
| 存在数据泄露,验证结果虚高 | 训练和测试数据时间范围重叠 | 检查数据拆分逻辑 | 严格按时间顺序拆分 |
这些问题是搭建故障预测系统时几乎必然会遇到的。不要期望模型一开始就完美,它更像一个需要持续调优的工程组件。
10. 最佳实践与工程建议
基于我参与稳定性建设的经验,分享几条比较重要的工程建议。
10.1 从单一稳定指标开始
不要一开始就试图预测所有故障类型。先选一个业务价值最高、数据最稳定的指标,比如“数据库连接数即将达到最大连接数”或“磁盘使用率什么时候达到 90%”。跑通一个完整闭环后,再扩展到更多场景。这样团队能够快速看到效果,也更容易获得支持。
10.2 数据规范比算法更重要
很多团队开发预测模型时,把大部分时间花在选模型上,结果发现效果差的原因其实是数据埋点不规范。同一类指标在不同服务中的命名不一致,时间戳格式不统一,缺失值处理方式不同,都会导致模型学习到错误模式。所以建议先建立公司的指标命名规范和标签规范。
10.3 定期重训练,但要保留人工确认
模型会随系统演化而失效。可以设置每周或每月自动重训练一次,但在模型上线前增加人工验证环节。具体做法是用最近一周的数据进行回测,如果关键指标(如 F1-score)较上一版下降超过 5%,则不发布新模型。
10.4 告警降噪:不要直接推送所有预测结果
预测结果可以分成多个等级。高风险事件直接推送值班人员,中风险事件只在工作面板展示,低风险事件写入日志。这样可以避免“预测风暴”影响团队对告警的敏感性。
10.5 保留可解释性
故障预测不仅需要知道“会出问题”,还需要能回答“为什么”。如果模型使用黑盒算法,建议额外输出影响最大的特征列表。这样运维人员在收到预警时,能快速了解是 CPU 飙升还是连接数剧增,从而决定是否需要介入。
10.6 考虑安全与权限边界
预测系统往往需要读取全量监控数据,这些数据中可能包含敏感业务信息。部署时需要注意:
- 数据访问遵循最小权限原则,只授予预测任务所需的读取权限。
- 预测服务应部署在内部网络,不直接暴露公网。
- 模型文件和预测结果要备份,防止误删影响告警能力。
- 涉及自动化修复操作时,必须在测试环境充分验证后再开启生产环境生效,并且需要有回滚方案。
11. 总结与后续学习方向
Empirik 获得 2100 万美元融资,让“预测系统故障”这个方向再次进入公众视野。但从技术发展脉络看,这项能力并不是最近才出现,只是过去受限于数据采集和存储成本,只能在大型互联网公司内部使用。现在随着开源监控体系普及和机器学习平台成熟,中小团队也有机会搭建自己的故障预测能力。
本文重点拆解了故障预测系统的完整链路:数据采集、特征工程、模型训练、在线预测和告警闭环,并提供了三个可以直接运行的 Python 示例。你可以先在自己的开发环境跑一遍,了解数据到预测的完整过程,然后再结合公司的监控数据做扩展。
如果你希望深入学习,以下几个方向非常值得投入:
- 可观测性体系:深入理解 Metrics、Logs、Traces 三者的关联。
- 时序数据库:了解 Prometheus 的数据模型和查询语言 PromQL。
- 机器学习基础:重点掌握异常检测、时序预测和特征工程。
- 生产级模型部署:学习如何将 Python 模型封装成在线服务,并保证推理高性能。
最后提醒一句:故障预测是一个系统性的工程问题,不是某一个模型能解决的。从优质数据开始,保持对预测结果的复盘,不断循环优化,才是这套系统真正有价值的原因。建议你先收藏这篇文章,在搭建预测流程时作为参考。如果你后续遇到了具体的坑,也欢迎在评论区一起交流。