告警分类与优先级

告警系统每天能吃掉几千条事件,但真正需要立刻动手的,可能就那么几条。如何不让自己被垃圾告警报摊,又不错过致命问题?

我个人习惯先把告警按维度拆开——严重程度、影响范围、业务层级、是否紧急。分清楚后,优先级自然就出来了。

为什么要分类?

说白了,就是解决两个痛点:告警风暴和优先级混淆。我经历过一次线上故障,同一个磁盘 IO 抖动推送了 2000 条告警,结果真正关键的连接池打满的消息被淹掉了。后来我们重构了分类体系,把“同因合并”和“降噪”写进了规则里。

另一个问题是,P0 和 P4 混在一起,值班的人根本分不清先后。我曾经见过运维组把一条“单节点 CPU 超 90%”的告警提了 P1,但那个节点其实是离线降级节点,用户无感知。这就是分类没做准。

分类维度

我一般用四个维度切分告警,每个维度给一个权重,最后算总分定优先级。

维度 等级/取值 说明
严重程度 Critical / Major / Minor / Warning 技术层面,看服务是否中断、数据是否丢失
影响范围 全局 / 部分 / 单点 / 无影响 影响多少个用户或业务模块
业务层级 核心链路 / 重要功能 / 附属功能 / 非关键 按业务价值排序,交易链路 > 配置管理
紧急程度 分钟级 / 小时级 / 天级 / 计划处理 匹配 SLA 要求,看是否需要立刻响应
小技巧:别只依赖技术严重度。我曾经把一个磁盘用量 98% 的告警打成了 P3,但那是核心数据库的归档盘,再涨下去主从同步会卡死。后来我们在规则里加了“业务层级+影响范围”的联合判定,才把这类告警拉高为 P2。

优先级矩阵

光有维度不够,还得把维度组合成优先级等级。下面是我常用的一套五级分级(P0~P4),跟多数工单系统兼容。

优先级 定义 响应时间 例子
P0 核心服务完全不可用,或数据丢失 立即响应,5 分钟内确认 支付接口返回率 0%、主库宕机
P1 核心功能严重退化,但未中断 15 分钟内响应 API 延迟 > 2s、连接池耗尽 80%
P2 重要功能受影响,有工作替代 1 小时内响应 缓存集群降级、非核心页面报错
P3 非关键问题,不影响用户 4 小时内处理 备份失败、磁盘用量超 85%
P4 优化类、信息类告警 下一个迭代处理 日志告警、过期的证书提醒

关键规则:P0 和 P1 必须带自动通知(电话+微信+短信),P2 以下只走工单。别把 P3 都推成即时消息,不然值班手机震到没电。

优先级计算的自动化

手动定级太慢,而且容易出错。我推荐用决策树或者打分表,把四个维度的值映射成一个数字。

# 伪代码示例:告警优先级计算
def get_priority(severity, scope, biz_level, urgency):
    score = 0
    if severity == 'Critical':    score += 40
    elif severity == 'Major':     score += 25
    elif severity == 'Minor':     score += 10
    
    if scope == 'Global':         score += 30
    elif scope == 'Partial':      score += 15
    
    if biz_level == 'Core':       score += 20
    elif biz_level == 'Important': score += 10
    
    if urgency == 'Minute':       score += 30
    elif urgency == 'Hour':       score += 15
    
    if score >= 90:  return 'P0'
    if score >= 70:  return 'P1'
    if score >= 40:  return 'P2'
    if score >= 20:  return 'P3'
    return 'P4'
避坑指南:我曾经遇到过使用固定阈值打分的场景,某个节点的网络丢包 5% 被算成了 P2,但因为该节点处理的是用户登陆回调,一旦丢包就会踢掉大量在线用户。所以单纯的分值计算要叠加“业务上下文”权重,我建议在规则里加一个“关键节点标识”字段,给特定机器加 20 分。

分类后的收敛与降噪

优先级定出来后,还有个常见问题——同一条告警反复推送怎么办?

我的做法是三步:合并(相同根因在窗口期内只推一条)、抑制(比如主库挂后,从库只读告警和连接池告警都应该被主库告警抑制)、聚合(同一个服务节点的不同指标告警,聚合成一条服务健康告警)。

举个例子:某个微服务有 10 个实例,3 个实例返回 5xx。如果不聚合,你收到 3 条独立告警;聚合并抑制相同实例的后续告警后,只产生一条“服务 A 健康度下降”的 P1 告警,附带上故障实例列表。

整体流程框架

下面这张图展示了从告警产生到进入不同处理队列的完整路径。我建议在工单系统初始化时就把这些规则配置好,后面减少人工干预。

告警分类与优先级流程 告警原始事件 严重程度判定 影响范围判定 业务层级判定 优先级得分计算 等级判定 P0: 立即响应 P1: 15分钟响应 P2: 1小时响应 P3/P4: 排队处理 说明:告警经过四个维度判定后,进入得分计算和分级决策,最终分配到不同的处理队列。 P0/P1 必须配置电话+微信即时通知,P2 以下只走工单系统。

实践中要注意的坑

  1. 不要给告警打固定等级:比如把“磁盘使用率 > 95%”永远定为 P3。它在凌晨可能只是报告,但大促时磁盘 IO 吃紧就可能变成 P1。我建议把阈值关联到当前业务水位,动态调整优先级。
  2. 避免 P0 过多:如果每天有 30 条 P0,那 P0 就失去了意义。我建议把 P0 的门槛抬高——必须是“核心服务完全中断”或“用户数据不可恢复性丢失”。其他只能打 P1 或更低。
  3. 工单衰减策略:告警连续重复推送 3 次以上且没有人工确认,自动降级一级。我曾经被一个告警每 5 分钟推送一次,持续半小时,最后大家直接忽略了那条告警——后来真出问题了才发现。
切记:分类和优先级不是一次配置完就结束的。每季度至少要复盘一次告警分布,看看有多少 P0 是“假紧急”,有多少 P3 其实长期被忽略但潜在风险很大。调整规则,才能让分级体系一直有效。