Zabbix名词解释
host(主机): 要监控的网络设备,可由IP或DNS名称指定。
host group(主机组):主机的逻辑容器,可以包含主机和模板,但同一个组内的主机和模板不能互相链接;主机组通常在给用户或用户组指派监控权限时使用。
item(监控项):一个特定监控指标的相关数据,这些数据来自于被监控对象;item是zabbix进行数据收集的核心,没有item,将没有数据;相对某监控对象来说,每个item都有“key”进行标识。
trigger(触发器):一个表达式,用于评估某监控对象的某特定item内所接收到的数据是否在合理范围内,即阀值;接收到的数据大于阀值时,触发器状态将从OK转变为Problem,当数据量再次回归到合理范围时,其状态将从Problem转换回OK。
event(事件):即发生的一个值得关注的事件,例如触发器的状态转变,新的agent或重新上线的agent的自动注册等。
action(动作):指对于特定事件事先定义的处理方法,通过包含操作(如发送通知)和条件(何时执行操作)。
escalation(报警升级):发送警报或执行远程命令的自定义方案,如每隔5min发送一次警报,共发送5次等。
media(媒介):发送通知的手段和通道,如Email、Jabber或SMS。
notification(通知):通过选定的媒介向用户发送的有关某事件的信息 (可灵活定制mail发送程序)。
remote command(远程命令):预定义的命令,可在被监控主机处于某个特定条件下时自动执行。
template(模板):用于快速定义被监控主机的预设条目集合,通常包含了item、trigger、graph、screen、application以及low-level discovery rule;模板可以直接链接至单个主机。
application(应用):一组item的集合。
web scennaro(web场景):用于检测web站点可用性的一个或多个http请求。
frontend(前端):zabbix的web接口。
Zabbix创建群组
点击创建,输入名称即可,如:Linux Group
Zabbix创建模板
点击创建模板,设置如下内容:
模板名称:Linux Template
可见名称:随意
群组:Linux Group
描述:监控CPU使用率、磁盘使用率、内存使用率、网络丢包率
设置模板宏,可用于触发器的计算
名称:{$HARDUSEVALUE} 值:28 描述:磁盘超过28%
Zabbix创建主机
点击创建主机,配置如下内容:
主机名称:192.168.20.223
可见名称:随意
群组:Linux Group
客户端:安装agent的服务器IP地址+端口(10050)
提供了4种连接方式:
ZBX:安装了agent客户端软件的服务器
SNMP:支持该协议的设备,可能需要手动开启,如摄像头等设备
JMX:java虚拟机监控
IPMI:一般用于连接传感器等设备
设置模板
配置连接成功
Zabbix监控Agent连接情况
选择创建的模板,新增一个监控项,配置如下:
名称:代理连接检查
类型:Zabbix客户端
键值:agent.ping
信息类型:数字(无正负)
单位:无
更新间隔:1m
创建触发器
名称:代理连接检查触发器 严重性:严重 问题表现形式,当60秒获取不到数据,即等于1时触发严重告警,注意这里设置的频率最好和监控项保持一致,即1分钟请求一次,等于0时恢复告警: {Linux Template:agent.ping.nodata(60)}=1 恢复表达式: {Linux Template:agent.ping.nodata(60)}=0
Zabbix监控磁盘剩余空间
选择创建的模板,新增一个监控项,配置如下:
名称:磁盘剩余空间 类型:Zabbix客户端 键值:vfs.fs.size[/,free] (键值模式有:total默认全部,free空闲,used使用,pfree空闲百分比,pused使用百分比) (例子:C盘总容量:vfs.fs.size[c:,total]) 信息类型:数字(无正负) 单位:B
创建触发器
名称:磁盘剩余空间触发器 严重性:严重 问题表现形式,当内存小于40G触发严重告警,大于40G恢复告警: {Template Disk Free Size:vfs.fs.size[/,free].last()}<40000000000 恢复表达式: {Template Disk Free Size:vfs.fs.size[/,free].last()}>=40000000000 问题事件生成模式:多重
Zabbix监控磁盘使用率
选择创建的模板,新增一个监控项,配置如下:
名称:磁盘使用率 类型:Zabbix客户端 键值:vfs.fs.size[/,pused] 信息类型:浮点数 单位:%
创建触发器
名称:磁盘使用率超过28% 严重性:严重 问题表现形式,当磁盘使用率大于28%触发严重告警,小于28%恢复告警: {Linux Template:vfs.fs.size[/,pused].last()}>=28 恢复表达式: {Linux Template:vfs.fs.size[/,pused].last()}<28
Zabbix监控CPU空闲率
在添加主机时,由于已经链接了Template OS Linux by Zabbix agent模板(该模板还链接了Template Module
Linux CPU by Zabbix agent等若干个其他模板),Template Module Linux CPU by Zabbix agent模板自带了许
多监控项,其中包括CPU idle time 监控项,因此可以直接使用该监控项监控主机CPU空闲率数值,无需自定义监
控项,只需要添加一个触发器(Trigger)来读取监控项触发告警即可。
注: zabbix自带模板中,有许多监控项可以直接利用起来,无需再单独创建监控项,使用时可先在已有模板中查找
下可用的监控项。
找到模板Template Module Linux CPU by Zabbix agent,然后添加一个触发器:
名称:CPU空闲率触发器 严重性:严重 问题表现形式,在5分钟内CPU平均空闲率如果高于80%,那么将触发问题: {Template Module Linux CPU by Zabbix agent:system.cpu.util[,idle].avg(5m)}>=80 恢复表达式: {Template Module Linux CPU by Zabbix agent:system.cpu.util[,idle].avg(5m)}<80
注:这里修改了zabbix自带的模板(Template Module Linux CPU by Zabbix agent),为其添加了一个新的触发
器,在实际使用中,要谨慎操作,因为链接了该模板的主机触发器都会被修改,因此实际使用中需要对这种操作进
行评估。
Zabbix监控CPU使用率
选择创建的模板,新增一个监控项,配置如下:
名称:CPU使用率
类型:Zabbix客户端
键值:system.cpu.util[,,]
信息类型:浮点数
单位:%
创建触发器
名称:CPU使用率超过1% 严重性:严重 问题表现形式,当CPU使用率大于1%触发严重告警,小于1%恢复告警: {Linux Template:system.cpu.util[,,].last()}>=1 恢复表达式: {Linux Template:system.cpu.util[,,].last()}<1
Zabbix监控内存占用率
在上面的步骤中添加了磁盘剩余空间、CPU空闲率等监控,可以直接使用了Zabbix客户端类型的监控项的键值,但是有些监控项可能不能直接获取,需要通过计算的方式来获取,例如监控内存占用率,虽然可以使用vm.memory.size这个键值,但是得到值并不是我们所期望的,虽然mode中有pused (used, percentage),但是"used"="total - free"而 "available"="free + buffers + cached"(内核版本Linux<3.14),实际想要的值:(available - total) / total,因此需要使用可计算的键值类型来设置监控项。
选择创建的模板,新增一个监控项,配置如下:
名称:内存占用率 类型:可计算的 键值:memory.utilization 公式: 100*(last("vm.memory.size[total]")-last("vm.memory.size[available]"))/last("vm.memory.size[total]") 信息类型:浮点数 单位:%
注意:如果新创建的模板,需要先添加2个计算时用到的监控项,不然内存使用率无法计算
创建触发器
名称:内存占用率超过80% 严重性:严重 问题表现形式,当内存占用率超过80%触发严重告警,小于80%恢复告警: {Linux Template:memory.utilization.last()}>=80 恢复表达式: {Linux Template:memory.utilization.last()}<80
Zabbix监控丢包率
方案一:使用自带模板(Template Module ICMP Ping)
监控项含义:
ICMP loss:表示丢包率
ICMP ping:表示是否可PING通
ICMP response time:表示响应时间
方案二:自定义监控项
选择创建的模板,新增一个监控项,配置如下:
名称:网络丢包率
类型:简单检查
键值:icmppingloss
信息类型:浮点数
单位:%
创建触发器
名称:网络丢包率 严重性:严重 问题表现形式,当网络丢包率等于1时触发严重告警,等于0时恢复告警: {Linux Template:icmppingloss.last()}=1 恢复表达式: {Linux Template:icmppingloss.last()}=0
Zabbix创建图形
在首页仪表盘里创建图形,实时查看监控项的数据值:
Zabbix自定义脚本告警
1)创建报警媒介
名称:告警全局脚本
类型:脚本
脚本名称:和自定义的脚本文件名称一致(alert.sh)
脚本参数,这里设置的顺序会对应脚本里的$1、$2、$3:
{ALERT.SENDTO}:发送给谁(对应操作里面的用户)
{ALERT.SUBJECT}:概要(对应操作里面的主题)
{ALERT.MESSAGE}:告警内容 (对应操作里面的消息)
2)创建动作
主题:服务器:{HOST.NAME}发生{TRIGGER.NAME}故障!
告警主机ID:{HOST.ID}
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
3)配置用户媒介
用于配置发送给某些人查看,名字要是系统里面有的,否则会提示No media defined for user.
4)编写脚本并且将脚本上传至服务器
alert.sh脚本内容如下:
#!/bin/bash # $1 $2 $3分别代表第一步设置的3个参数。$3是一数组的形式,用for才可以遍历 for i in $3 do echo $i>>/usr/lib/zabbix/alertscripts/1.txt #这里要写绝对路径,否则会提示没有权限 done #这里就可以用脚本完成很多工作了,调用第三方api等
拷贝到容器
docker cp alert.sh zabbix-server-mysql:/usr/lib/zabbix/alertscripts/
进入容器查看脚本
[root@localhost ~]# docker exec -it zabbix-server-mysql /bin/bash bash-5.0$ cat /usr/lib/zabbix/alertscripts/alert.sh #!/bin/bash # $1 $2 $3分别代表第一步设置的3个参数。$3是一数组的形式,用for才可以遍历 for i in $3 do echo $i>>/usr/lib/zabbix/alertscripts/1.txt #这里要写绝对路径,否则会提示没有权限 done #这里就可以用脚本完成很多工作了,调用第三方api等
5)由于目前该文件只有读写权限,所以无法执行,Zabbix报错:
Cannot execute command "/usr/lib/zabbix/alertscripts/alert.sh": [13] Permission denied
解决方法:
查看当前文件权限
bash-5.0$ ls -l /usr/lib/zabbix/alertscripts
total 4
-rw-r--r-- 1 root root 309 Sep 27 06:26 alert.sh
修改文件权限
-rw------- (600) //只有拥有者有读写权限。
-rw-r--r-- (644) //只有拥有者有读写权限;而组用户和其他用户只有读权限。
-rwx------ (700) //只有拥有者有读、写、执行权限
-rwxr-xr-x (755) //拥有者有读、写、执行权限;而组用户和其他用户只有读、执行权限
-rwx--x--x (711) //拥有者有读、写、执行权限;而组用户和其他用户只有执行权限
-rw-rw-rw- (666) //所有用户都有文件读、写权限
-rwxrwxrwx (777) //所有用户都有读、写、执行权限
// 只修改当前文件或文件夹 chmod 644 ./fire // -R 递归修改(就是将嵌套在很多文件夹中的文件权限修改了,如果没有这个,只能到指定的文件夹下进行修改) // 当前文件夹和文件夹下所有文件统一修改 chmod -R 644 ./fire
数字权限使用规则:
数字 4 、2 和 1表示读、写、执行权限即r=4,w=2,x=1
组合如下
rwx = 4 + 2 + 1 = 7
rw = 4 + 2 = 6
rx = 4 +1 = 5
若要同时设置 rwx (可读写运行)权限则将该权限位设置为 4 + 2 + 1 = 7
若要同时设置 rw-(可读写不可运行)权限则将该权限位设置为 4 + 2 = 6
若要同时设置 r-x(可读可运行不可写)权限则将该权限位设置为 4 +1 = 5
例子:
这里修改原始文件权限,然后重新拷贝到容器进行覆盖
chmod 777 ./alert.sh
Zabbix发送告警至后台接口
1)定义alert.sh脚本内容
$1:对应主题,设置url路径
$2:对应消息,设置传输参数
curl -H "Content-Type:application/json" -X POST -d "{$2}" $1 >> ./alert.log
2)配置动作
主题,后台接口地址:
http://192.168.20.24:8003/monitorAlert/add
消息,Json传输对象:
"hostId":"{HOST.ID}","hostName":"{HOST.NAME}","hostIp":"{HOST.IP}","itemName":"{ITEM.NAME}","itemValue":"{ITEM.LASTVALUE}","triggerLever":"{TRIGGER.SEVERITY}","triggerStatus":"{TRIGGER.STATUS}","triggerName":"{TRIGGER.NAME}","eventDate":"{EVENT.DATE} {EVENT.TIME}","eventId":"{EVENT.ID}"
注意:如itemValue=1.71 %,值和单位中间有一个空格,后台会无法解析,解决方法将所有监控项的单位去除,然后通过后台接收之后处理。
恢复操作也是一致,后台可以根据其中的参数判断是新增告警还是恢复告警:
后台接收实例:
告警
hostId=10372, hostName=192.168.20.223, hostIp=192.168.20.223, itemName=CPU使用率, itemValue=1.478697, triggerLever=Average, triggerStatus=PROBLEM, triggerName=CPU使用率超过1%, eventDate=2020.10.29 07:24:01, eventId=9385
恢复
hostId=10372, hostName=192.168.20.223, hostIp=192.168.20.223, itemName=CPU使用率, itemValue=0.780989, triggerLever=Average, triggerStatus=OK, triggerName=CPU使用率超过1%, eventDate=2020.10.29 07:24:01, eventId=9385
3)执行脚本报错
将脚本拷贝至容器
docker cp alert.sh zabbix-server-mysql:/usr/lib/zabbix/alertscripts/
如果报错,无法执行curl命令,则是docker容器没有该命令工具
首先查看docker容器服务器类型:
docker exec -it zabbix-server-mysql /bin/bash #进入容器
cat /etc/issue #查看容器服务器类型
发现是Alpine Linux 3.12服务器,很多镜像都是使用Alpine作为基础镜像,体积小,但Alpine精简了很多基础组件因此调试起来很麻烦。下方总结了常用的Alpine组件安装方法:
功能 | 命令 | 备注 |
---|---|---|
镜像加速 | sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories |
将原装的Alpine库替换成国内的ustc库 |
apk库更新 | apk update |
|
安装ping | apk add curl |
安装curl |
安装telnet | apk add busybox-extras |
|
偷懒N合1 | sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && apk update && apk add curl && apk add busybox-extras |
在安装CURL过程中出现,没有操作权限
ERROR: Unable to lock database: Permission denied ERROR: Failed to open apk database:
解决方案,删除容器,在重新创建时加上用户-u="root",安装CURL成功
docker run -u="root" --privileged=true -v /usr/zabbix:/etc/zabbix --name zabbix-server-mysql -t -e DB_SERVER_HOST="192.168.20.223" -e DB_SERVER_PORT=3307 -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="admins" -e ZBX_JAVAGATEWAY="zabbix-java-gateway" --link mysql-server:mysql --link zabbix-java-gateway:zabbix-java-gateway -p 10051:10051 -d zabbix/zabbix-server-mysql:latest
时间差8小时问题
在 Docker Hub 中的 MySQL 官方镜像中,时区是使用了世界标准时间(UTC)。因为在中国使用,所以需要把时区改成东八区的。 不然数据保存到数据库时差8小时,后台获取也差8小时。
1)修改数据库时间
临时修改:进入数据库修改时区
show variables like '%time_zone%'; //查询当前时区 set global time_zone='+8:00'; //在标准时区上加+8小时,即东8区时间 flush privileges; # 立即生效
查看数据库当前时间
select now();
永久修改:生成容器时加上-e TZ=Asia/Shanghai,如:
docker run --name mysql-server -t -p 3307:3306 -e TZ=Asia/Shanghai -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix_pwd" -e MYSQL_ROOT_PASSWORD="admins" -d mysql:5.7 --character-set-server=utf8 --collation-server=utf8_bin
2)修改容器时间
进入容器
docker exec -it mysql-server /bin/bash
查看时间
date
方式一:将服务器时间文件拷贝到容器,注意,如果服务器时间格式不正确,先修改服务器时间,再次查看会显示正确时间
docker cp /etc/localtime mysql-server:/etc/localtime
方式二:在创建容器时,挂载文件
-v /etc/localtime:/etc/localtime
方式三:设置容器时间格式
-e PHP_TZ="Asia/Shanghai"