第3章 告警产生机制:规则触发、阈值报警与异常检测
告警是怎么产生的?说白了就三条路:规则触发、阈值报警、异常检测。
我见过不少团队,上来就搞复杂算法,结果基础规则都没写好。你想想看,连明确的错误都没抓到,谈何异常检测?所以这一章,我们把三种机制掰开揉碎了讲清楚。
3.1 规则触发——最直接的告警方式
规则触发,就是"如果日志里出现某段文字,就报警"。听起来简单吧?但坑比想象的多。
最常见的做法是关键词匹配。比如日志里有 FATAL、OOM、NullPointerException 这些明显的错误关键字,直接触发告警。我个人习惯把这些关键词维护成一个列表,按业务模块分类,方便后期扩展。
再进阶一点,用正则表达式。比如匹配 "连接超时" 类错误:
ERROR.*(timeout|连接超时|Connection refused)
\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] FATAL .+
我在项目中遇到过一件事:有个服务偶尔报 SocketTimeoutException,但并不是每次都需要告警——它发生在重试逻辑里,是正常现象。结果我们没加排除规则,半夜告警炸了好几次。后来加了白名单过滤,世界清净了。
3.2 阈值报警——静态与动态的博弈
阈值报警,就是当某个指标超过预设的"红线"时触发告警。比如 CPU > 90%、平均响应时间 > 5s、错误率 > 1%。
这里有个很实际的问题:阈值设多少才合理?
设得太低,告警轰炸你。我记得有个项目上线第一天,把 CPU 阈值设在 50%,结果业务高峰时告警几千条。设得太高呢?又可能漏掉真正的风险。
| 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 固定阈值 | 简单、直观、易配置 | 无法适应业务波动,容易误报或漏报 | 系统水位、硬件指标、基础监控 |
| 动态阈值 | 能自适应,减少误报 | 实现复杂,需要历史数据 | 流量波动大、有周期性规律的业务 |
动态阈值怎么做的?说白了就是用历史数据算出一个"合理区间"。比如取过去7天的数据,用 均值 ± 3倍标准差 作为动态边界。一旦指标跌出这个区间就报警。
3.3 异常检测——让机器发现你不知道的事
规则触发和阈值报警,都需要你"提前知道"问题长什么样。那如果遇到没见过的情况呢?这就是异常检测的用武之地了。
常见的方法有两类:
- 统计方法:3-sigma、箱线图(IQR)、移动平均。适合数据分布稳定、周期性明显的场景。
- 机器学习方法:孤立森林、LOF(局部离群因子)、LSTM(时序预测)。适合复杂、非线性、多维度数据。
举个例子,用 3-sigma 检测流量突增:
均值 = 1000 QPS
标准差 = 100 QPS
当前值 = 1500 QPS
差值 = 500 > 3 * 100 → 触发告警
这个逻辑很直观对吧?但要注意:数据必须是正态分布或近似正态,否则 3-sigma 会失效。我在项目中遇到过这种情况:业务流量是双峰分布,用 3-sigma 天天报警,换了箱线法才正常。
3.4 三种机制的对比与选择
三种机制不是互斥的,而是互补的。我一般这么选:
| 维度 | 规则触发 | 阈值报警 | 异常检测 |
|---|---|---|---|
| 适用场景 | 已知明确的错误模式 | 指标类监控、水位控制 | 未知异常、数据漂移 |
| 配置成本 | 低 | 中 | 高 |
| 误报率 | 低(规则精准时) | 中(依赖阈值设定) | 较高(需调参) |
| 漏报率 | 高(未覆盖的模式) | 中(阈值外的异常) | 低(能发现未知) |
| 可解释性 | 高 | 高 | 中低 |
实际项目中,我习惯先用规则触发兜底已知风险,再用阈值报警覆盖指标波动,最后用异常检测查漏补缺。三层叠加,告警覆盖率才能上去。
嗯,这部分就讲到这里。三种机制的底层逻辑清楚了,后面聊"告警聚合"和"抑制"的时候,你才能理解为什么要那样设计。