Zabbix告警触发流程是:
监控项——触发器——告警操作(邮件,短信,微信,钉钉,执行命令)
监控项一般负责收集数据,触发器用于为监控项所收集的数据定义阙值在监控项数据超出合理范围时发送告警信息。
一个监控项可以关联多个触发器,为一个监控项定义不同阙值的触发器,可以实现不同级别的报警功能。每一个触发器只能关联一个监控项。
触发器由一个表达式构成,定义了监控项所采集数据的阙值,采集的数据超出了触发器阙值,触发器状态变成"PROBLEM",修复问题采集的数据正常后,触发器状态恢复成OK
触发器表达式形式如下:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
可以理解为:
{主机:key.函数(parameter)}+表达式运算符+常数
示例:
{Zabbix server:vfs.file.cksum[/etc/passwd].diff()}>0
其中Zabbix server是主机,vfs.file.cksum[/etc/passwd]是key,diff()是函数(参数),>是表达式运算符
触发器支持的运算符,按照优先级由高到低列出
优先级 | 运算符 | 定义 |
---|---|---|
1 | not | 非 |
2 | * | 乘 |
/ | 相除 | |
3 | + | 相加 |
- | 相减 | |
4 | < | 小于 |
<= | 小于等于 | |
> | 大于 | |
>= | 大于等于 | |
5 | = | 相等 |
<> | 不等于 | |
6 | and | 与 |
7 | or | 或 |
其中,not,and,or运算符区分大小写,必须为小写
示例如下:
not{Zabbix server:net.tcp.listen[3306].last()}>0
3306端口侦听值小于等于0,则触发报警,数据库服务挂了
1)abschange
支持类型:float、int、str、text、log
作用:返回最近获得的值与之前获得值差的绝对值,对于字符串类型:0表示相等,1表示不同
2)avg()函数
{Zabbix server:zabbix[process,alert manager,avg,busy].avg(10m)}>75
参数:秒或#num,#num表示最近num次的值
支持类型:float、int
作用:返回一段时间的平均值
示例:avg(5):最后5秒的平均值
avg(#5):表示最近5次得到值的平均值
avg(3600,86400):表示一天前的一个小时的平均值,仅有一个参数,表示指定时间的平均值,从现在开始算起。有第二个参数,表示飘逸,从第二个参数前开始算时间。
3)max()函数
{Zabbix server:zabbix[rcache,buffer,pused].max(10m)}>75
参数:秒或#num
支持值类型:float、int
作用:返回指定时间间隔的最大值
4)min()函数
{Zabbix server:system.cpu.util.min(5m)}>{$CPU.UTIL.CRIT}
参数:秒或#num
支持值类型:float、int
作用:返回指定时间间隔的最小值
5)nodata()
{Template OS Linux:agent.ping.nodata(5m)}=1
参数:秒
作用:nodata()函数监控Zabbix agent数据收集,如果指定时间以内Zabbix agent没有收到最新的监控数据,就会触发告警
6)change()
{Template OS Linux:system.uptime.change(0)}<0
支持类型:float、int、str、text、log
作用:返回最近获得值与之前获得值的差值,对于字符串0表示相等,1表示不同
7)count()
参数:秒或#num
支持类型:float、int、str、text、log
作用:返回指定时间间隔内数值的统计
示例:
count(600,12,“gt”,86400)24小时之前的10分钟内值大于12的个数,
其中eq:相等,ne:不相等,gt:大于
ge:大于等于,lt:小于,le:小于等于
like:内容匹配
8)date
作用:返回当前的时间,格式YYYYMMDD
9)dayofmonth
作用:返回当前是本月的第几天
10)dayofweek
作用:返回当前是本周的第几天
11)delta
作用:返回时间间隔以内的最大值与最小值
12)diff()函数
{Zabbix server:vfs.file.cksum[/etc/passwd].diff()}>0
支持值类型:float,int,str,text,log
作用:diff()函数主要是用来对比监控项前后两个值是否发生了变化,如果发生变化就会触发告警,返回值为1表示最近的值与之前的值不同,0为其他情况
13)fuzzytime
参数:秒
支持值类型:float、int
作用:返回值为1表示监控项值的时间戳比ZabbixServer时间多N秒,0为其他,常使用system.localtime来检查本地时间是否与Zabbixserver时间相同
{MySQL_DB:system.localtime.fuzzytime(10)}=0
主机MySQL_DB当前服务器时间如果与zabbix server之间的时间相差10秒以上,表达式返回true,触发器状态改变为“problem”
14)last()
{Zabbix server:net.tcp.port[127.0.0.1,10050].last()}<>1
参数:秒或#num
支持值类型:float、int、str、text、log
last(0,86400)返回前一天的最近的值
net.tcp.listen[port],监控Zabbix server客户端10050端口,一直在监听返回值是1,否则返回值是0,当返回值不等于1通过触发器产生报警。
主机Zabbix server模板中创建触发器,当采集到的数据值不等于1时触发告警
1)设置报警媒介类型,脚本名称为zabbix_monitor_test.py
2)信息模板的类型选择:问题模板
主题:
Problem: {EVENT.NAME}
消息:
Problem started at {EVENT.TIME} on {EVENT.DATE}
Problem name: {EVENT.NAME}
Host: {HOST.NAME}
Severity: {EVENT.SEVERITY}
Operational data: {EVENT.OPDATA}
Original problem ID: {EVENT.ID}
{TRIGGER.URL}
3)设置报警媒介类型的选项
4) 部署python脚本
监控脚本应该存放到/usr/lib/zabbix/alertscripts目录下
cat /etc/zabbix/zabbix_server.conf
#查看监控脚本位置
AlertScriptsPath=/usr/lib/zabbix/alertscripts
设置zabbix_agent允许以root用户运行,确保可以执行python脚本
vim /etc/zabbix/zabbix_agentd.conf
AllowRoot=1
设置后重启zabbix_agent,查看zabbix-agent的状态
systemctl restart zabbix-agent
systemctl status zabbix-agent
zabbix_monitor_test.py实现获取监控信息,并往钉钉群推送告警信息
脚本放到/usr/lib/zabbix/alertscripts/目录下:
#!/usr/local/bin/python3
import time # 时间模块
import os, sys
import requests
import json
api_url = 'https://oapi.dingtalk.com/robot/send?access_token=25fad8baeaa9b07c16ab71e8c023398fb5ee1fe4b1f346af292899dff0ea8b36'
headers = {'Content-Type': 'application/json;charset=utf-8'}
# 往钉钉群推送消息
def msg(text):
json_text = {
"msgtype": "markdown",
"markdown": {
"title": "编组状态通知",
"text": text
}
}
print(requests.post(api_url, json.dumps(json_text), headers=headers).content)
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
这里是为管理员用户设置钉钉告警
报警媒介选择钉钉报警
要赋予用户有读写权限
动作可以有多种事件源,主机、主机群组、应用集、模板、触发器等
这里选择触发器,选择Zabbix server: 监控端口这个触发器事件,然后选择添加动作。
1)添加动作
监控项遇到问题,就会触发动作,往钉钉群中推送报警信息
如下图所示选择动作对应的触发器:监听10050端口失败触发报警
2)设置操作
主题:故障{TRIGGER.STATUS},服务器:{HOSTNAME},发生:{TRIGGER.NAME}故障!
消息:
{
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
告警项目:{ITEM.NAME}
告警时间:{EVENT.DATE}{EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.VALUE}
}
3)设置恢复操作
操作类型:选择通知所有参与者
主题:恢复{TRIGGER.STATUS},服务器:{HOSTNAME1}:{TRIGGER.NAME}已恢复
消息:{
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE}{EVENT.TIME}
故障持续时间:{EVENT.AGE}
恢复时间:{EVENT.RECOVERY.TIME}
告警等级:{TRIGGER.SEVERITY}
}
动作设置完如下图所示:
成功设置了动作,动作名称为:钉钉推送告警
为了触发告警,设置监听返回值为1时就触发告警
{Zabbix server:net.tcp.port[127.0.0.1,10050].last()}=1
如下图所示:成功触发触发器告警,往钉钉群推送告警信息
钉钉群收到的告警信息如下所示:
修复问题,触发动作恢复操作,会往钉钉群里推送问题已解决信息,如下图所示:
#测试直接通过修改触发器监控项的值修复问题
{Zabbix server:net.tcp.port[127.0.0.1,10050].last()}=1