zabbix添加磁盘自动发现及磁盘io监控

问题

zabbix-agent 官方不提供磁盘 io 监控功能,需要自定义监控项监控磁盘 io。服务器磁盘数量不固定,需要使用自动发现规则,自动发现磁盘并对每个磁盘的性能进行监控。

结论

使用自动发现、监控项原型、自定义监控项能方便的为服务器添加 io 监控。可将 agent 的配置作为自定义的 rpm 包,使用定制 rpm 包安装会自动添加这些配置文件和脚本。

配置

1 zabbix-agent 端配置

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
45
46
47
48
49
50
51
## zabbix-agent 配置文件目录结构
[root@localhost zabbix]# tree /etc/zabbix/
/etc/zabbix/
├── zabbix_agentd.conf
└── zabbix_agentd.d
├── disk_discovery.sh
├── userparameter_disk_io_status.conf
└── userparameter_mysql.conf
## 确保zabbix-agent.conf中配置文件包括 zabbix_agent.d 目录
[root@localhost zabbix]# grep zabbix_agentd.d zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf

# zabbix_agentd.d目录中两个文件
# disk_discovery.sh为磁盘发现,返回json格式数据供zabbix-server自动添加监控项
[root@localhost zabbix_agentd.d]# ./disk_discovery.sh
{"data":[{"{#DISKNAME}":"sda"},{"{#DISKNAME}":"sdb"}]}

[root@localhost zabbix_agentd.d]# cat disk_discovery.sh
#!/bin/bash
#
diskarray=(`cat /proc/diskstats |grep -E "\<sd[a-z]\>|\<xvd[a-z]\>|\<vd[a-z]\>" |awk '{print $3}'`)
length=${#diskarray[@]}
printf "{\"data\":["
for ((i=0;i<$length;i++))
do
printf '{'
printf "\"{#DISKNAME}\":\"${diskarray[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "]}\n"

## userparameter_disk_io_status.conf 为自定义监控io的监控项,要用到iostat命令,需安装sysstat
[root@localhost zabbix_agentd.d]# cat userparameter_disk_io_status.conf
UserParameter=disk.discovery,/etc/zabbix/zabbix_agentd.d/disk_discovery.sh
UserParameter=io.tps[*],iostat -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$2}'
UserParameter=io.read.KBps[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$6}'
UserParameter=io.write.KBps[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$7}'
UserParameter=io.avg.requests.size[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$8}'
UserParameter=io.avg.queue.length[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$9}'
UserParameter=io.await[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$10}'
UserParameter=io.read.await[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$11}'
UserParameter=io.write.await[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$12}'
UserParameter=io.avg.service.time[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$13}'
UserParameter=io.util[*],iostat -x -k -d $1 1 2 |grep $1 |tail -n 1 |awk '{print $$14}'
## 本地测试自定义监控项
[root@localhost zabbix_agentd.d]# zabbix_agentd -t io.tps[sda]
io.tps[sda] [t|0.00]
[root@localhost zabbix_agentd.d]# zabbix_agentd -t io.read.KBps[sda]
io.read.KBps[sda] [t|0.00]

本地监控测试成功后,再到服务端设置。

2 服务端设置

  1. 模板中创建自动发现规则

image.png

  1. 创建监控项原型

#DISKNAME 由 disk.discovery 返回。服务端测试方式为 zabbix-get -s host -k disk.discovery

image.png

  1. 创建图形原型,自动生成图形

image.png

image.png

效果

服务器关联模板后,会自动发现所有硬盘,并对每块硬盘添加 io 相关监控项。

image.png