ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从时序数据到故障预测:系统稳定性保障的工程实践

从时序数据到故障预测:系统稳定性保障的工程实践 在实际的线上系统运维中“预测系统故障”并不是一个实验室概念而是已经在基础设施监控、应用性能管理和智能运维领域逐步落地的一类工程实践。近期Sequoia 孵化的 Empirik 从母体独立并完成 2100 万美元种子轮融资其核心方向就是通过时序数据分析、异常检测和根因定位来提前预判系统故障。这件事让“故障预测”重新回到开发者和运维人员的视野里。本文不评价商业事件本身而是围绕“预测系统故障”这条技术主线说明它解决什么问题、由哪些环节组成、如何用最小示例跑通一个故障预测原型以及进入生产环境前需要补齐哪些能力。在常见的监控体系里大家更多是在做“事后响应”监控面板告警、日志关键字匹配、人工登录服务器查看指标。故障预测则希望把时间轴向左移在指标出现明显劣化之前通过历史数据、趋势变化和相关性分析给出风险提示。要做到这一点需要数据采集、指标存储、异常检测算法、根因定位和通知触达几个模块共同配合而不是单独靠某一个算法。本文适合有 Python 基础、做过监控系统或日志平台建设、希望把“事后告警”升级成“事前预测”的开发者阅读。读完可以掌握一套可落地的最小故障预测原型知道每个环节为什么这样设计以及常见的踩坑点和排查路径。1. 先理解故障预测系统的技术链路和难点故障预测并不是一个单一算法而是一条完整的数据处理链路。很多团队在这个问题上失败不是算法不够高级而是链路里某个环节的数据质量或时间对齐出了问题。1.1 故障预测要解决的核心问题在传统监控体系中可用性指标通常由四类核心信号构成延迟、流量、错误率和饱和度。这四类信号在 Google 的 SRE 实践中被称为“黄金信号”。故障预测的核心就是在这些指标尚未达到告警阈值时识别出异常的早期形态例如请求错误率在 20 分钟内从 0.1% 缓慢爬升到 0.8%虽然还没到 1% 的告警线但趋势已经不健康。数据库连接池的使用率从 30% 波动上升到 60%持续增长且没有回落迹象。某个微服务的 P99 延迟逐日增加尽管均值还在正常范围。磁盘使用率按当前增长速度预计 48 小时后会打满。这些场景有一个共同特点单看当前时刻系统还没有故障但把时间轴拉长指标的走势已经指向故障。故障预测系统要做的就是把这个“即将出问题”的状态量化出来并提前通知相关人员。技术定义上故障预测可以理解为基于多指标时序数据使用统计模型或机器学习模型输出“未来一个时间窗口内系统进入异常状态的概率或风险等级”的过程。它不同于异常检测异常检测回答的是“当前是否异常”故障预测回答的是“未来是否可能异常”。1.2 完整链路由哪几个环节组成一个可用的故障预测系统至少需要五个环节缺一个都会导致预测结果不可用。数据采集负责从服务器、容器、中间件、应用日志和 APM 探针获取指标。采集方式常见的有两种一种是定时拉取例如 Prometheus 的 exporter 机制另一种是主动推送例如 Telegraf 往 InfluxDB 写入指标。采集环节最容易出现的问题是采样周期不一致和指标缺失。数据存储负责保存时序数据。时序数据库与普通关系型数据库的差别在于它针对时间戳和标签做了大量优化常见选型包括 Prometheus、InfluxDB、TimescaleDB 和 VictoriaMetrics。存储层需要关注保留策略预测模型需要历史数据如果保留时间太短模型就缺少训练样本。特征工程负责把原始指标转换成模型可用的样本。例如把“当前 5 分钟的 P99 延迟”转换成一个特征把“相比前 1 小时同一时刻的环比变化”转换成另一个特征。没有特征工程的模型往往是无效的。模型推理负责输出预测结果。可以用简单的统计方法例如 3-sigma、移动平均、EWMA也可以用机器学习模型例如孤立森林、XGBoost、Prophet 或 LSTM。不同模型适用的场景不同并不存在“越复杂越好”的答案。通知与工单闭环负责把预测结果发送给对应负责人并跟踪这个预测是否命中真实故障。没有反馈闭环预测系统的准确率就无法验证也就无法持续优化。1.3 为什么故障预测比事后告警难得多故障预测最难的地方不是模型而是“预测窗口”和“误报率”之间的平衡。预测时间越早不确定性越大预测时间越晚留给处理的时间越少。实际项目中常常需要根据故障类型分类处理容量类故障例如磁盘写满、连接池耗尽这类故障趋势明显预测窗口可以放到小时级甚至天级。流量突刺类故障例如促销活动带来的高并发通常只能提前分钟级预测更多依赖压测和弹性伸缩策略。代码缺陷类故障例如发布后引入的空指针异常或死循环这类故障往往没有明显的指标趋势主要靠发布对比、错误日志聚类和链路追踪定位。理解这个分类很重要。如果团队希望用一套模型同时预测所有故障类型最终大概率得到的是一个误报率很高的系统运维人员很快就会对告警失去信任。这里的工程判断是故障预测系统应该先从“趋势型故障”切入也就是容量类、缓慢劣化类的问题这类问题特征清晰数据充分模型效果好业务价值也明显。解决完趋势型故障后再逐步扩展到突刺型故障和发布型故障不要一开始就追求全类型覆盖。注意不要只把“模型准确率”作为故障预测系统的唯一指标。在真实运维场景中漏报率和误报率的代价完全不同。漏报意味着系统出故障但没提前发现误报意味着团队花费人力核查但无事发生。两者需要分开统计而不是混在一个准确率里。2. 设计一套最小可复现的故障预测原型理解链路后先用一个最小例子把系统跑起来。这里不依赖大型大数据平台只使用 Python 和几个常见库在一台普通开发机上即可运行。原型的目的是验证“采集 - 特征 - 预测 - 通知”这条链路是否能走通不追求生产级性能。2.1 准备环境和依赖假设已经在 Linux 或 macOS 环境安装了 Python 3.9 以上版本并可以使用 pip。建议使用虚拟环境隔离依赖。mkdir fault_prediction_demo cd fault_prediction_demo python3 -m venv venv source venv/bin/activate需要安装的依赖如下库名用途说明pandas数据处理时序数据的清洗、对齐和特征构造numpy数值计算统计计算和数组运算scikit-learn机器学习提供孤立森林、随机森林等模型matplotlib可视化查看原始曲线和预测结果requestsHTTP 请求发送 Webhook 通知pip install pandas numpy scikit-learn matplotlib requests版本方面如果原始环境没有锁定版本建议不要直接装最新版。可以先按照当前 pip 解析出的版本安装跑通后再固化到 requirements.txt。如果安装时出现依赖冲突优先查看 pandas 和 numpy 的版本兼容性声明这是最容易出问题的地方。2.2 生成一份带有“缓慢劣化”趋势的模拟指标数据真实项目里可以直接从 Prometheus 或日志平台导出指标但为了演示先构造一份带有明显趋势变化的时序数据。模拟一个 Web 服务的“请求错误率”指标每秒一个采样点共生成 7200 个点覆盖 2 小时。前 1 小时错误率在 0.1% 上下波动后 1 小时逐步爬升到 1.5%。import numpy as np import pandas as pd np.random.seed(42) # 时间轴2 小时每秒一个点 timestamps pd.date_range(2025-01-01 10:00:00, periods7200, freqS) n len(timestamps) # 基线错误率0.1% base_error_rate 0.001 # 前 3600 秒正常波动后 3600 秒缓慢上升 trend np.zeros(n) trend[3600:] np.linspace(0, 0.014, n - 3600) # 添加随机噪声 noise np.random.normal(0, 0.0002, n) error_rate base_error_rate trend noise error_rate np.clip(error_rate, 0, None) df pd.DataFrame({ timestamp: timestamps, error_rate: error_rate }) df.to_csv(error_rate.csv, indexFalse) print(df.head(10)) print(df.describe())这段代码生成了一个 CSV 文件包含 timestamp 和 error_rate 两列。关键点在于后半段数据的上升是“缓慢”的不是突然从 0.1% 跳到 1.5%而是用 np.linspace 在 3600 秒内线性增长。这个过程模拟了生产环境中连接池逐步耗尽或上游依赖逐步变慢时的指标形态是故障预测最典型的应用场景。2.3 使用 EWMA 和 3-sigma 组合做第一版预测第一版原型不急于上机器学习。使用 EWMA指数加权移动平均和标准差阈值来识别异常趋势。EWMA 对近期数据赋予更高权重可以快速反映趋势变化同时对随机噪声有一定的平滑作用。import pandas as pd import numpy as np df pd.read_csv(error_rate.csv, parse_dates[timestamp]) # 计算指数加权移动平均 df[ewma] df[error_rate].ewm(span60, adjustFalse).mean() # 计算滚动标准差窗口取 5 分钟 df[rolling_std] df[error_rate].rolling(window300, min_periods1).std() # 设置安全边界均值 3 倍标准差 df[upper_bound] df[ewma] 3 * df[rolling_std] df[anomaly] df[error_rate] df[upper_bound] # 统计异常点数量 print(df[anomaly].value_counts()) # 输出最后 20 条明细查看趋势 print(df.tail(20).to_string())运行后会发现异常点主要集中在后半段前半段几乎没有。这表明模型已经能够识别出“趋势性抬升”而不是把正常的随机波动当作异常。这里需要解释为什么不用简单的固定阈值。固定阈值的问题在于没有考虑指标自身的波动幅度。有的服务错误率本身就存在 0.2% 的正常抖动有的服务长期保持在 0.01% 以下。静态阈值很难同时适配这两种服务。用滚动标准差生成动态边界本质上是让系统“自适应”当前指标的波动范围。2.4 把“当前是否异常”升级为“未来是否可能异常”单纯检测当前异常还不够。原型的目标是预测所以要增加一个“未来窗口风险评分”的逻辑。思路是如果最近 5 分钟内异常点的密度持续增加且 EWMA 曲线的斜率持续为正就认为未来 10 分钟的风险升高。# 计算异常密度最近 300 秒内异常点占比 df[anomaly_density] df[anomaly].rolling(window300, min_periods1).mean() # 计算 EWMA 曲线斜率当前值与 5 分钟前值的差 df[ewma_slope] df[ewma] - df[ewma].shift(300) # 风险评分异常密度和斜率的加权组合 df[risk_score] 100 * (0.6 * df[anomaly_density] 0.4 * (df[ewma_slope] 0).astype(float)) # 定义风险等级 def risk_level(score): if score 60: return high elif score 30: return medium else: return low df[risk_level] df[risk_score].apply(risk_level) # 查看风险等级切换的时间点 transitions df[df[risk_level] ! df[risk_level].shift(1)] print(transitions[[timestamp, error_rate, ewma, anomaly_density, risk_score, risk_level]].head(20))这段代码的核心是把两个信号融合成一个风险分异常点密度反映了异常状态的“持续性”EWMA 斜率反映了趋势的“方向”。只有密度高或只有斜率正风险都适中两个条件同时满足风险才会升到 high。从输出中可以看到risk_level 从 low 切换到 medium 或者 high 的时间点通常出现在后半小时也就是指标还在上升初期还没有到达真正的故障阈值。这就是“预测”的含义不是在错误率已经告警时才发出通知而是在错误率从 0.1% 开始爬升的早期阶段系统已经给出 medium 或 high 风险信号。3. 把原型扩展到真实监控数据的关键差异模拟数据跑通后很多人会直接拿真实数据套用上面的代码结果发现效果很差。原因不是代码问题而是真实数据和模拟数据之间存在几个容易被忽略的差异。3.1 时间对齐与缺失值处理方式模拟数据是完美的每秒一个点没有断点没有重复时间戳。真实监控数据的常见问题是指标采集可能不稳定某些时间段完全没有数据。同一个时间戳可能被写入多条记录。不同指标的时间戳不对齐A 指标和 B 指标无法直接做特征拼接。在建立预测模型之前必须先做时间对齐。推荐的顺序是先去重再重采样再插值。import pandas as pd df pd.read_csv(real_metric.csv, parse_dates[timestamp]) # 去重同一时间戳只保留最后一条 df df.drop_duplicates(subsettimestamp, keeplast) # 按 10 秒频率重采样空值用线性插值填充 df df.set_index(timestamp).resample(10S).mean() df[error_rate] df[error_rate].interpolate(methodlinear) # 前向填充零值但要注意零值可能是真 0 也可能是缺失 df[error_rate] df[error_rate].fillna(methodffill) df df.reset_index()这里要注意插值的适用场景。线性插值适合短时间段的缺失例如小于 1 分钟的缺口如果数据缺失了 1 小时线性插值会引入大量虚假样本这时应该直接剔除该时间段或者标记为无效数据。另一个容易踩的坑是“零值填充”。在错误率指标里0 是一个合法值代表没有错误在 CPU 使用率指标里0 也可能代表采集异常。不同指标对缺失值和零值的语义完全不同不能统一处理。3.2 周期性与突发流量带来的误报Web 服务的指标通常有周期性白天高峰、夜间低谷工作日、周末各不相同整点可能因为定时任务产生尖刺。3-sigma 方法对这类周期性数据很不友好。例如夜间错误率本身很低标准差极小任何一点抖动都可能被判定为异常。改进方法有两种。第一种是把“同比”作为特征也就是对比今天当前时刻和历史上同一时刻的值而不是对比前一个时刻。第二种是使用 Prophet 这类能够建模周期性的模型。from prophet import Prophet model_df df.rename(columns{timestamp: ds, error_rate: y}) prophet_model Prophet( yearly_seasonalityFalse, weekly_seasonalityTrue, daily_seasonalityTrue, changepoint_prior_scale0.05 ) prophet_model.fit(model_df) future prophet_model.make_future_dataframe(periods30, freq10S) forecast prophet_model.predict(future) # 查看预测结果与实际值的偏差 df_forecast forecast[[ds, yhat, yhat_lower, yhat_upper]] print(df_forecast.tail(10).to_string())Prophet 的原理是把时间序列拆分成趋势项、周期项和节假日效应再分别建模。它能够自动识别每天、每周的周期性模式所以对周期性强的指标更友好。但代价是计算量明显高于 EWMA在指标数量大时不适合对所有指标全量预测。生产中通常先用 EWMA 做快速筛查只有风险指标才交给 Prophet 精测。引入周期性建模后常见的误报场景会明显减少。但也会带来一个新问题真正的异常往往掩盖在周期趋势里。例如系统已经出现性能劣化但因为最近一周的整体指标也在缓慢上升模型部分吸收了这种上升趋势导致预测边界也上移了异常反而被平滑掉。这个问题没有完美解法只能通过控制 changepoint_prior_scale 参数来调节。该参数越大模型就越容易拟合突变越小趋势越平滑。实际项目中建议在 0.01 到 0.1 之间做网格搜索不要默认使用一个值。3.3 多指标联动比单指标判断更可靠单指标的局限在于很多故障是多因素共同作用的结果。比如数据库慢查询变多可能导致应用延迟上升也可能导致连接池占用变高还可能触发重试从而抬高流量。只看一个指标很难判断根因但把多个指标放在一起往往能还原故障因果链。在原型里加入多指标判断时最常见的错误是把多个指标直接拼接成一个模型输入然后靠模型自动学习。这个思路没有错但前提是特征工程要做好。至少需要三类特征统计特征当前时刻的均值、分位数、标准差。趋势特征相比 5 分钟前、15 分钟前、60 分钟前的变化量。相关性特征当前指标与其他指标在过去 1 小时内的相关系数或者 Spearman 秩相关系数。# 伪代码示例演示多指标特征构造思路 def build_features(df_metrics, lookback_minutes[5, 15, 60]): features pd.DataFrame(indexdf_metrics.index) for col in [error_rate, p99_latency, db_conn_usage]: # 统计特征 features[f{col}_mean_5m] df_metrics[col].rolling(5min).mean() features[f{col}_std_5m] df_metrics[col].rolling(5min).std() # 趋势特征 for lb in lookback_minutes: features[f{col}_delta_{lb}m] df_metrics[col] - df_metrics[col].shift(f{lb}min) # 相关性特征 features[corr_error_latency] ( df_metrics[error_rate].rolling(60min).corr(df_metrics[p99_latency]) ) return features这里有个容易犯的错误滚动窗口的时间单位必须与索引的时间频率一致。如果 DataFrame 的索引是 datetime 类型且频率是 10 秒那么 rolling(5min) 会自动按时间窗口计算但如果索引不是 datetime 类型rolling(300) 只会按行数计算两者结果会完全不同。3.4 模型选择统计方法、树模型还是深度学习不同的故障预测问题适合不同的模型。这里整理了一张选型表方便根据实际情况做判断。模型类型代表方法适合场景主要局限资源消耗统计方法EWMA、3-sigma、Holt-Winters单指标、趋势明显、无强周期不能处理复杂周期和多指标极低时间序列模型Prophet、ARIMA、SARIMA强周期指标、需要预测未来趋势需要调参对缺失值敏感中树模型孤立森林、XGBoost、LightGBM多指标特征需要非线性拟合需要大量历史样本特征工程复杂中深度学习LSTM、Transformer 类时序模型长周期依赖、大规模多指标训练成本高解释性差高实际项目里推荐“分级预测”先使用统计方法做全量指标的快速筛查节省计算资源命中可疑指标后再用 Prophet 或树模型做深入预测深度学习模型建议放在离线分析场景例如对故障案例做批量复盘而不是直接跑在线预测。深度学习模型解释性差运维人员很难接受一个“模型认为会出问题但不能说明为什么”的告警。4. 故障预测系统的生产落地与验证优化原型和真实数据跑通后距离生产可用还有一段距离。生产环境必须考虑数据质量、模型评估、告警触达和持续优化这几个问题。这里给出生产化部署的关键步骤和排查清单。4.1 预测结果的验证方式命中率、提前量和误报率生产环境的故障预测系统需要一套评估体系。核心指标有三个命中率预测为 high 或 medium 风险的时间段内是否真的在指定时间窗口内发生了故障或告警。提前量从预测风险升级到真正触达告警阈值之间的时间差。提前量越大系统给运维留出的处理时间越多。误报率预测风险为 high 但实际没有发生故障的比例。这三个指标需要组合评估。不能只看命中率。如果模型把所有时间段都判为 high命中率可能不低但这种预测毫无意义。同样如果模型刻意把风险判定时间延后命中率也能提高但提前量太小失去预警价值。具体实现上可以建一张“预测评估表”CREATE TABLE prediction_evaluation ( id BIGINT PRIMARY KEY AUTO_INCREMENT, metric_name VARCHAR(128) NOT NULL, predict_time DATETIME NOT NULL, risk_level VARCHAR(16) NOT NULL, risk_score DOUBLE NOT NULL, actual_fault BOOLEAN DEFAULT FALSE, fault_time DATETIME, hit_flag BOOLEAN DEFAULT FALSE, lead_minutes INT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP );每次产生风险预测后把预测结果写入这张表。故障事件发生后通过回填 actual_fault 和 fault_time就可以计算出命中率、提前量和误报率。这张表是故障预测系统持续优化的基础没有评估数据就无法判断模型改动是变好了还是变坏了。4.2 告警触达设计不要把所有风险都发给所有人故障预测系统的告警策略与普通监控不同。普通监控是“出了问题才发”预测系统是“可能会出问题就发”所以天然有更高的误报率。如果把所有 medium 及以上风险都推送到同一个值班群很容易造成告警疲劳。推荐的做法是分级触达low 风险不推送只记录。medium 风险每天汇总一次或者只在连续 3 个周期都保持 medium 时才推送。high 风险立即推送且需要包含模型判断依据哪个指标、什么时间窗口、预测可能是什么问题。告警消息应尽量结构化方便后续自动处理{ alert_id: fa5a31f0-8f8e-4a8b-9f2d-2c8b8c2a7f4b, metric: error_rate, service: order-service, risk_level: high, risk_score: 82.4, predict_window: { start: 2025-01-01T10:00:00Z, end: 2025-01-01T10:10:00Z }, evidence: { ewma_slope: 0.0032, anomaly_density: 0.78, error_rate_5m_ago: 0.24, error_rate_now: 0.62 }, suggest: check-db-conn-pool }evidence 字段非常关键。它记录模型判断为 high 的依据方便接收人快速判断这个告警是否可信。如果没有这一项运维人员收到告警后还是要去查监控预测系统的价值就少了一半。4.3 上线前需要完成的检查清单在把故障预测系统接入生产环境之前建议逐项确认以下内容检查项检查内容未通过时的表现数据完整性指标是否有超过 10% 的时间缺失模型输出不稳定频繁波动时间对齐多指标是否按同一时间基准对齐特征拼接出错预测结果滞后历史数据长度是否至少有 7 天的历史数据用于建模周期性模式无法被学习预测窗口合理性预测窗口是否与故障处理时间匹配告警太早或太晚失去价值告警频率限制是否对相同风险做告警去重同一问题重复推送造成告警疲劳反馈闭环是否记录预测结果与真实故障的对应关系无法评估模型效果难以迭代回滚方案模型升级失败时能否快速切回旧模型预测故障时反而因模型故障引发新问题其中“告警频率限制”容易被忽略。常见做法是使用布隆过滤器或 Redis 中的滑动窗口对相同的 servicemetricrisk_level 组合做冷却例如 30 分钟内不重复推送相同风险。4.4 上线后的迭代路径从预测成功率到根因定位系统上线后迭代方向不是无限提升预测准确率而是逐步把预测和根因定位、自动恢复联动起来。第一阶段先做“预测通知”。目标是让运维人员意识到系统能在故障发生前给出提示并且提示的可信度可以接受。第二阶段做“预测分类”。当预测命中后自动关联相关指标和日志。例如命中“订单服务错误率可能升高”自动拉取该服务最近的发布记录、依赖的数据库慢查询日志、上游服务的响应时间等数据减少人工排查范围。这一步通常依赖链路追踪系统例如 SkyWalking 或 OpenTelemetry 生成的数据。第三阶段做“预测动作”。对于容量类风险可以在确认场景后自动扩容对于配置类风险可以自动拉起配置对比任务。但这一步要非常谨慎自动化操作必须配有人工审批或完整的回滚能力否则预测系统的误判会直接导致线上变更事故。如果原始项目中使用的是 Python 技术栈生产环境建议把模型服务独立部署使用 FastAPI 暴露预测接口与监控采集服务解耦。这样模型升级时不影响监控主链路模型挂掉时也不影响现有告警系统。注意故障预测系统是现有监控体系的增强不是替代。在任何情况下都要保留原来的阈值告警能力。预测模型可能有 bug训练数据和线上数据分布可能漂移只有兜底告警始终在线才能保证最基本的故障发现能力。4.5 常见踩坑点与排查路径故障预测系统调试过程中以下几个问题出现频率最高建议按“先数据后模型再告警”的顺序排查。问题现象常见原因检查方式处理建议预测结果一直为 low真实故障未提前发现模型参数太保守或历史数据中没有相似故障模式查看模型输出分布检查异常密度是否在多数时间为 0调低 risk_score 的 high 阈值或调整 EWMA span 参数预测结果频繁为 high但实际没有故障数据存在周期性尖刺或告警冷却机制缺失对比高频告警时间段与历史周期性规律引入 Prophet 周期性建模增加告警冷却重启模型后预测结果变化很大训练数据只用了启动前的部分数据模型未热启动检查模型加载方式确认是否加载了最新训练权重增加模型版本管理训练完成后先压测再切换多指标特征拼接后性能明显下降特征维度过多训练样本不足检查特征数量与训练样本量的比例做特征重要性筛选优先保留与故障相关性高的特征指标有小时级延迟预测结果总落后上游采集链路排队或写入延迟对比原始数据时间戳与入库时间优化采集链路必要时使用消息队列削峰排查路径的核心原则是先确认数据时间轴上是否连续、对齐、无异常跳变再检查算法输出是否合理最后才看告警触达和通知链路。很多“模型不准”的问题最终都定位到数据采集端。5. 从故障预测到智能运维的扩展建议故障预测系统只是智能运维的一部分。系统稳定运行一段时间后可以沿着以下方向扩展。第一个方向是“预测覆盖范围扩展”。从错误率、延迟等业务指标扩展到基础设施指标CPU、内存、磁盘、中间件指标Kafka 消费积压、连接池状态、依赖外部服务指标。覆盖范围越广越容易在故障发生时快速判断影响面。第二个方向是“自动根因分析”的逐步落地。预测命中后系统自动检索关联指标变化时间点、发布记录、日志异常聚类生成一份“可能原因排序”的摘要。初期可以先用人肉核对的方式验证根因分析的准确性等准确率稳定后再开放给值班人员参考。第三个方向是“预测模型的可解释性”。运维团队和业务团队对故障预测系统建立信任需要过程。模型输出的每一项风险都要能追溯到具体指标和具体时间段不能只给一个黑盒分数。可以输出 SHAP 摘要或特征贡献排序即使最终决策由人来做也能让决策有依据。第四个方向是“离线复盘和模型更新”。每次发生故障后把故障前后 1 小时的所有指标数据追加到历史样本集重新训练模型验证新模型是否能更早识别同类故障。这个流程应该自动化至少也要半自动化否则模型不会随系统变化而进化。这里要特别提醒一点故障预测不是一项“上线即完成”的工作。系统在运行指标分布会随业务迭代、架构调整、流量结构变化而漂移模型效果会逐步下降。因此需要建立周期性评估机制建议至少每周计算一次命中率和误报率每月评估一次是否需要重训练。把评估和重训流程固化下来比追求某一次实验的指标提升更有长期价值。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进