告警分类方法:按严重级、按来源、按类型

告警分类这事儿,说简单也简单,说复杂真能把你绕晕。我刚带团队那会儿,遇到过一个线上事故——半夜三点告警响成一片,值班同事根本分不清哪个该先处理。后来复盘发现,就是分类没做好。所以今天咱们聊聊,怎么把告警分门别类,让巡检和处置变得轻松。

为什么需要分类?

你想想看,一天几千条告警,如果全堆在一起,跟没告警有啥区别?分类的核心目的就两个:

  • 确定优先级:哪些要立刻响应,哪些可以等上班再看
  • 明确责任人:是网络组、应用组还是安全组的事

我个人习惯,分类维度至少要有三个:严重级、来源、类型。三者的关系,我画了张图,你先有个整体印象。

告警分类三要素关系图

告警分类三要素 告警 按严重级 按来源 按类型 三个维度缺一不可,组合使用才能精准定位问题 例如:严重级P1 + 来源:数据库 + 类型:连接数超限

按严重级分类

这是最直观的分类方式。说白了就是——先救火,再补墙。我在项目中一般把严重级分成四级:

级别 定义 响应要求 典型例子
P1(致命) 业务完全中断,核心服务不可用 立即响应,5分钟内拉起线上会 支付接口挂死、数据库主库宕机
P2(严重) 重要功能受损,影响用户体验 15分钟内响应,1小时内处置 某个省份用户登录延迟、缓存雪崩
P3(警告) 非核心功能异常,业务可降级运行 1小时内确认,8小时内修复 日志采集队列积压、非关键告警阈值超限
P4(提示) 不影响业务,但需要关注 日常巡检时处理 磁盘使用率超过80%、老旧证书即将过期

我的经验:分级千万别搞太多等级。以前见过有人分了8级,结果值班同事面对P5和P6根本分不清哪个更重要。4级刚刚好,人脑的短期记忆就这么大。

按来源分类

告警从哪来的?这决定了你找谁去处理。我习惯把来源分成这几类:

  • 基础设施层:服务器CPU、内存、磁盘、网络设备。曾经有一次,交换机端口CRC错误暴增,应用组和数据库组互相甩锅,最后发现是网线没插紧。
  • 中间件/数据库:MySQL、Redis、Nginx、Kafka等。这类告警通常需要DBA或中间件运维介入。
  • 应用层:业务接口响应慢、错误率升高、服务间调用超时。别忘了,很多应用层的根因其实在底层。
  • 安全层:入侵检测、病毒扫描、异常登录。安全告警往往需要联动安全运营中心(SOC)处置。
  • 业务层:订单量异常、用户投诉率飙升。这类告警需要业务产品负责人一起看。

避坑指南:我曾经把来源标签打得太粗,一个“中间件”标签下混了MySQL、Redis、ES十几种组件。结果值班同事看到告警还得先查文档确认是哪个中间件。现在我的规则是:来源标签精确到组件名,比如“MySQL-主库”、“Redis-集群A”。

按类型分类

类型分类告诉我们——问题到底是什么。我把常见告警类型归纳为四类:

类型 说明 举例
阈值告警 指标超过预设阈值 CPU>90%、连接数>500
变化率告警 指标在短时间内剧烈波动 流量5分钟飙升10倍、错误率突增
状态告警 服务状态切换 进程退出了、端口不通、心跳丢失
日志告警 日志中出现特定关键字 OOM、空指针、SQL语法错误

我个人觉得,变化率告警往往比阈值告警更有价值。为什么?因为阈值告警你可能会收到“CPU 91%”这种接近阈值的告警,但实际业务没受影响。而流量突然翻倍,往往意味着营销活动或者攻击,需要立刻确认。

如何组合使用?

光分类还不够,你得把它们组合起来。我在项目里是用一个标签系统来完成的:

# 以Prometheus告警规则为例
- alert: MySQL连接数过高
  expr: mysql_global_status_threads_connected > 500
  for: 2m
  labels:
    severity: P2
    source: MySQL-主库
    type: 阈值告警
  annotations:
    summary: "MySQL主库连接数超过500"
    description: "当前值: {{ $value }}"

你看,一条告警包含了三个维度的标签。这样做的好处:

  • 告警聚合时按严重级+来源排序,优先处理P1+应用层的组合
  • 值班同事一看标签就知道该找谁,不用再查文档
  • 后期做告警收敛(告警压缩、抑制)时,更容易判断哪些告警是同一个根因

重要提醒:分类标签必须规范化,用统一的命名规则。我在公司里推行过“源_组件_严重级”的格式,比如“INFRA_CPU_P1”、“DB_REDIS_P3”,避免了团队内部的理解偏差。

分类的自动化落地

最后聊点落地的事。手动给告警打标签?不现实,几千条你打不完。得靠自动化:

  • Prometheus + Alertmanager:在告警规则中定义labels字段,天然支持
  • Elasticsearch + Watcher:通过查询条件区分告警类型,输出带标签的Webhook
  • 自定义脚本:从日志中提取关键字,匹配分类规则,推送至告警平台

我曾经接手过一个遗留系统,告警全是“error: something happened”,没有任何结构化信息。后来写了个脚本,用正则解析报错信息,打上“类型”标签,再通过告警平台去重和升级。效果立竿见影,值班同事说“总算知道该先修什么了”。

一句话总结:分类不是目的,让告警能被快速理解和响应才是。严重级、来源、类型三合一套上去,你的告警系统就成功了一半。