4. Zabbix触发器与告警:触发器表达式编写、告警媒介配置(邮件/钉钉/微信)、告警升级机制
各位同学,咱们今天聊点实在的。监控系统装好了,数据也采上来了,然后呢?
说白了,如果没人看,那监控就是一堆数字。真正让监控活起来的,是触发器(Trigger)和告警(Action)。
我刚开始搞运维那会儿,就吃过这个亏。数据全在,但服务器挂了半小时我才知道。嗯,从那以后,我对触发器这块就格外上心。
4.1 触发器表达式:监控的“大脑”
触发器是什么?它就是一个条件判断。当采集到的数据满足某个条件时,触发器就“触发”了。
我个人习惯把触发器比作一个哨兵。哨兵不睡觉,一直盯着数据看。
4.1.1 表达式的基本语法
触发器的核心是表达式。它的格式长这样:
{主机:键值.函数(参数)} < 操作符 > 常量
举个例子:
{web-server:system.cpu.load[all,avg1].last()}>5
这个表达式的意思是:主机 web-server 的 CPU 1分钟平均负载,最近一次的值,大于5。
咱们拆开来看:
- 主机:web-server,就是你要监控的那台机器。
- 键值:system.cpu.load[all,avg1],这是采集项。
- 函数:last(),取最近一次的值。常用的还有 avg()、min()、max()、count() 等。
- 操作符:>,大于。
- 常量:5,阈值。
4.1.2 常用函数与场景
函数是触发器的灵魂。不同的函数,解决不同的问题。
| 函数 | 说明 | 典型场景 |
|---|---|---|
| last() | 最近一次的值 | CPU负载、内存使用率 |
| avg() | 指定时间段的平均值 | 网络流量、磁盘IO |
| min()/max() | 指定时间段的最小/最大值 | 温度监控、峰值检测 |
| count() | 统计满足条件的次数 | 错误日志出现次数 |
| change() | 与上一次值的差值 | 文件大小变化、进程数变化 |
| nodata() | 指定时间内无数据 | 主机宕机、agent停止 |
举个例子,我曾经遇到过一个场景:某台数据库服务器,磁盘IO突然飙升。如果用 last() 判断,很容易误报。因为磁盘IO本来就是波动的。
我当时用的是 avg(5m) 函数,取5分钟的平均值。这样就把毛刺过滤掉了,告警准确率提升了不少。
4.1.3 复杂表达式与多条件组合
有时候,一个条件不够。比如:CPU高负载持续5分钟,并且内存也快满了,才告警。
这时候就需要用逻辑运算符:
{server:cpu.load.avg(5m)}>5 and {server:vm.memory.size[pused].last()}>90
Zabbix 支持 and、or、not 三种逻辑运算。你想想看,这就像写 if 语句一样,灵活得很。
4.2 告警媒介配置:让消息飞到你手里
触发器触发了,然后呢?得通知人啊。Zabbix 支持多种告警媒介(Media Type)。
我个人最常用的三种:邮件、钉钉、微信。咱们一个一个说。
4.2.1 邮件告警配置
邮件是最传统的。配置起来也最简单。
步骤大致如下:
- 管理 → 报警媒介类型 → 创建媒体类型
- 类型选择“Email”
- 配置SMTP服务器、端口、账号密码
- 在用户设置中,关联该媒介,填写收件邮箱
这里有个坑:很多企业邮箱的SMTP需要开启“客户端授权码”,而不是直接用登录密码。我当年第一次配的时候,卡在这步卡了半天。
4.2.2 钉钉告警配置
钉钉告警,说白了就是通过Webhook发消息到群机器人。
配置分两步:
- 在钉钉群里添加一个自定义机器人,拿到Webhook地址。
- 在Zabbix里创建一个“Webhook”类型的媒介,填入地址和消息模板。
消息模板长这样:
{
"msgtype": "text",
"text": {
"content": "告警: {TRIGGER.NAME}\n主机: {HOST.NAME}\n时间: {EVENT.DATE} {EVENT.TIME}\n状态: {TRIGGER.STATUS}"
}
}
嗯,这里要注意:钉钉的Webhook有频率限制。如果告警太多,会被限流。我建议在触发器里加个条件,比如连续3次才触发,避免刷屏。
4.2.3 微信告警配置
微信告警,通常用的是企业微信。个人微信的机器人限制太多,不推荐。
企业微信的配置思路和钉钉类似:
- 创建企业微信群机器人
- 获取Webhook地址
- 在Zabbix里配置Webhook媒介
消息模板示例:
{
"msgtype": "markdown",
"markdown": {
"content": "## 告警通知\n> **告警名称**: {TRIGGER.NAME}\n> **主机**: {HOST.NAME}\n> **当前值**: {ITEM.LASTVALUE}\n> **时间**: {EVENT.DATE} {EVENT.TIME}"
}
}
4.3 告警升级机制:别让告警石沉大海
你有没有遇到过这种情况:半夜收到一条告警,看了一眼觉得不严重,翻个身继续睡。结果第二天发现,服务器挂了。
告警升级机制,就是为了解决这个问题的。
4.3.1 什么是告警升级
告警升级,就是当一个问题持续未解决,告警的严重程度会逐步提升,通知的人也越来越多、级别越来越高。
举个例子:
- 第1次告警:发邮件给值班工程师
- 5分钟后未恢复:发钉钉给值班工程师+组长
- 10分钟后未恢复:打电话给部门经理
你想想看,这样是不是就没人敢忽视告警了?
4.3.2 在Zabbix中配置升级
Zabbix的告警升级,是通过Action的“操作”和“恢复操作”来实现的。
配置步骤:
- 配置 → 动作 → 创建动作
- 设置触发条件(比如:触发器严重性≥警告)
- 在“操作”标签页,添加多个步骤
每个步骤可以设置:
- 步骤持续时间(比如:5分钟)
- 发送给谁(用户或用户组)
- 使用哪种媒介(邮件、钉钉、微信)
配置界面大概长这样:
步骤1: 持续时间 5分钟 → 发送给 值班组 → 使用 邮件
步骤2: 持续时间 10分钟 → 发送给 运维组 → 使用 钉钉
步骤3: 持续时间 15分钟 → 发送给 管理层 → 使用 微信+电话
4.3.3 升级策略的设计思路
告警升级不是越复杂越好。我个人的设计原则是:
- 分级明确:普通告警、重要告警、紧急告警,升级路径不同。
- 时间合理:给一线人员留够处理时间,别动不动就升级。
- 闭环确认:问题解决后,要能自动关闭告警,避免持续骚扰。
举个例子,我在上一家公司设计的升级策略:
| 告警级别 | 步骤1 | 步骤2 | 步骤3 |
|---|---|---|---|
| 警告 | 邮件→值班人 | 无 | 无 |
| 严重 | 钉钉→值班组 | 邮件→组长 | 无 |
| 灾难 | 微信→全体运维 | 电话→组长 | 电话→经理 |
这个策略用了两年,效果不错。既保证了告警有人处理,又不会过度打扰管理层。
4.4 小结
好了,这一章的内容就这些。咱们回顾一下:
- 触发器表达式是监控的“大脑”,要掌握 last()、avg()、nodata() 等常用函数。
- 告警媒介配置,邮件、钉钉、微信各有特点,选适合自己团队的。
- 告警升级机制,是防止告警被忽视的最后一道防线。
说实话,告警这块做好了,运维工作能轻松一大半。我见过太多团队,监控配得花里胡哨,结果告警全被忽略了。嗯,那还不如不配。
下一章,咱们聊聊Zabbix的自动化发现和注册。到时候你会发现,批量管理几百台服务器,其实也没那么难。