Zabbix自带的对于Linux系统基础监控模板虽然常见的CPU、内存、磁盘、网卡、进程等都有监控,但是没有网络连接状态监控和磁盘IO监控。下面给出磁盘IO状态监控方法。
(先看文章最后关于iostat的坑)这里监控磁盘IO状态其实就是取iostat命令的值,所以你的客户端必须要能够使用iostat命令。
1 |
$ iostat -xc |
首先建立一个脚本目录用来存放自动发现和取值得脚本。
1 |
$ mkdir /etc/zabbix/zabbix_agentd.d/scripts/ |
我们需要在zabbix-agent端建立一个磁盘设备自动发现脚本,因为你不确定你的主机有几块磁盘(要注意如果你的磁盘名称比较特别你需要改一改这个脚本),放在固定目录下。
1 |
$ cat /etc/zabbix/zabbix_agentd.d/scripts/disk_discovery.py |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#/usr/bin/python #This script is used to discovery disk on the server import subprocess import json args="cat /proc/diskstats |grep -E '\ssd[a-z]\s|\sxvd[a-z]\s|\svd[a-z]\s'\dm-[0-9]\s | awk '{print $3}'|sort|uniq 2>/dev/null" #args="grep -sE "\bsd[a-z]\b|\bxvd[a-z]\b|\bvd[a-z]\b" /proc/diskstats | awk '{print $3}' | sort | uniq" t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0] disks=[] for disk in t.split('\n'): if len(disk) != 0: disks.append({'{#DISK_NAME}':disk}) print json.dumps({'data':disks},indent=4,separators=(',',':')) |
执行看一下结果。
1 2 3 4 5 6 7 8 |
$ python /etc/zabbix/zabbix_agentd.d/scripts/disk_discovery.py { "data":[ { "{#DISK_NAME}":"sda" } ] } |
这也是zabbix自动发现的固json格式,启动{#DISK_NAME}这个变量在zabbix创建自动发现中的item时需要调用,后面再看。
然后再建立一个用来取iostat命令值的shell脚本。
1 |
$ cat /etc/zabbix/zabbix_agentd.d/scripts/disk_status.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#/bin/sh device=$1 item=$2 case $item in rrqm) iostat -dxkt |grep "\b$device\b"|tail -1|awk '{print $2}' ;; wrqm) iostat -dxkt |grep "\b$device\b"|tail -1|awk '{print $3}' ;; rps) iostat -dxkt |grep "\b$device\b"|tail -1|awk '{print $4}' ;; wps) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $5}' ;; rKBps) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $6}' ;; wKBps) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $7}' ;; avgrq-sz) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $8}' ;; avgqu-sz) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $9}' ;; await) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $10}' ;; r_await) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $11}' ;; w_await) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $12}' ;; svctm) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $13}' ;; util) iostat -dxkt |grep "\b$device\b" |tail -1|awk '{print $14}' ;; esac |
这个脚本需要传输两个位置参数,执行结果如下。
1 2 |
$ bash /etc/zabbix/zabbix_agentd.d/scripts/disk_status.sh sda await 2.00 |
你应该发现了
脚本都建立完之后,再就是在zabbix-agent端建立一个配置文件,在/etc/zabbix/zabbix_agentd.d/目录下。
1 |
$ cat /etc/zabbix/zabbix_agentd.d/userparameter_disk.conf |
1 2 |
UserParameter=disk.discovery[*],python /etc/zabbix/zabbix_agentd.d/scripts/disk_discovery.py UserParameter=disk.status[*],/bin/bash /etc/zabbix/zabbix_agentd.d/scripts/disk_status.sh $1 $2 |
这里是固定zabbix的固定写法,建立两个key,分为为disk.discovery和disk.status。
其中disk.discovery这个key比较简单,就是给zabbix做自动发现的。zabbix配置如下:
你可以选择为磁盘状态新创建一个template,或者在现有的template里面添加一个自动发现。创建自动发现其中的key就是上面再userparameter_disk.conf文件中定义的。
好,创建完自动发现后就说disk.status这个key。
1 |
UserParameter=disk.status[*],/bin/bash /etc/zabbix/zabbix_agentd.d/scripts/disk_status.sh $1 $2 |
我在key后面执行了我提前定义的脚本,并且给了位置变量。这里需要注意,我传的$1、$2位置变量同样会传给disk.status这个key当参数,这样一来我们在zabbix中配置item时就可以引用了。如下:
保存完之后如下图:
然后重启zabbix-agent端即可,如果出现not supported,可以试着把Administration–>General–>Other–> 参数的值调小一点。(Other选择在右边下拉框最后一个选项)
最终都没有问题后,展现的结果如下图正常监控。
一个item成功添加完成后,剩余的工作就是重复性了。把disk_status.sh脚本中定义的监控项都给添加进zabbix中。最后全部添加完的效果图就是这样的了。
我一共添加了13个磁盘监控项,从上图可以看出,自动发现了两块磁盘sda和dm-0都进行了这13项监控。
这里说一个坑,在真正使用过程中,发现iostat有bug,必须要这样使用iostat -dxkt 2 4,表示每2秒获取一次数据,一共获取4次(取几次任意),得到的数据才是正确的。你可以试试把秒数去掉,手动执行iostat -dxkt命令,多次执行其状态值是一样的,不会改变,妈蛋。
所以监控不能像上面写的那样,每次获取状态值时执行一次iostat命令。可以在被监控端丢一个定时任务(一分钟执行一次),把结果保存到一个文件中,如下:
1 |
iostat -dxkt 2 4 > /tmp/.disk_status.log |
或者当守护进程放在后台运行。
然后采集脚本/etc/zabbix/zabbix_agentd.d/scripts/disk_status.sh中iostat命令换成cat /tmp/.disk_status.log |grep “\b$device\b” |tail -1|awk ‘{print $11}’即可。
由于iostat工具也是从/proc/diskstats文件中读取的数据,所以监控也可以直接从这个文件中取值。思路跟上面差不多,但需要学习一下/proc/diskstats文件中各个字段的含义。并且/proc/diskstats文件中的值大部分都是累积值,所以需要使用zabbix的Delta(speed per second)功能来得出每秒的值。具体参考:http://www.ywnds.com/?p=4516。