zabbix 3.2.6自动发现磁盘并监控磁盘io

一、监控原理

基本原理:通过分析/proc/diskstats文件,来对IO的性能进行监控。/proc/diskstats文件详细内容此处不再讲解,详见/proc/diskstat文件讲解博客。

二、实现脚本

1.首先需要识别系统有哪些磁盘,在这里使用python脚本实现自动发现系统有哪些磁盘。

脚本如下:

# vim disk_discovery.py 
#/usr/bin/python
import subprocess
import json
args="cat /proc/diskstats |grep -E '\ssd[a-z]\s|\sxvd[a-z]\s|\svd[a-z]\s'| awk '{print $3}'|sort|uniq 2>/dev/null"
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=(',',':'))

如上,这里通过分析/pro/diskstats文件,来找出系统中都有哪些磁盘。

脚本执行出来的结果类似如下:

{
    "data":[
        {
            "{#DISK_NAME}":"dm-0"
        },
        {
            "{#DISK_NAME}":"dm-1"
        },
        {
            "{#DISK_NAME}":"dm-2"
        },
        {
            "{#DISK_NAME}":"sda"
        },
        {
            "{#DISK_NAME}":"sdb"
        }
    ]
}

2.通过脚本分析磁盘IO

# vim disk_status.sh
#/bin/sh
device=$1
DISK=$2

case $DISK in
         read.ops)
            /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $4}'     #//磁盘读的次数
            ;;
         read.ms)
            /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $7}'     #//磁盘读的毫秒数
            ;;
         write.ops)
            /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $8}'     #//磁盘写的次数
            ;;
         write.ms)
            /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $11}'    #//磁盘写的毫秒数
            ;;
         io.active)
            /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $12}'    #//I/O的当前进度,
            ;;
         read.sectors)
            /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $6}'     #//读扇区的次数(一个扇区的等于512B)
            ;;
         write.sectors)
            /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $10}'    #//写扇区的次数(一个扇区的等于512B)
            ;;
         io.ms)
            /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $13}'    #//花费在IO操作上的毫秒数
            ;;
    
esac

3.脚本写好后,需要在zabbix_agentd.conf配置文件中做出相应修改,修改内容如下:

# /usr/local/zabbix/etc/zabbix_agentd.conf
UnsafeUserParameters=1   是否启动用户自定义监控脚本(系统默认为0),1启用;0不启用。由于zabbix监控的方法多样性,一般都采用脚本来实现监控数据的采集,所以建议开启。
UserParameter=disk.discovery,/usr/bin/python /usr/local/zabbix/scripts/disk_discovery.py UserParameter=disk.status[*],/usr/local/zabbix/scripts/disk-status.sh $1 $2

注意:修改配置文件后需要重启zabbix_agentd服务,脚本放置路径与配置文件中要一致。

4.检测能否获取到key值

能否自动发现磁盘,有输出结果说明配置成功。

# /usr/local/zabbix/bin/zabbix_get -s 192.168.0.235 -k 'disk.discovery'
{
    "data":[
        {
            "{#DISK_NAME}":"dm-0"
        },
        {
            "{#DISK_NAME}":"dm-1"
        },
        {
            "{#DISK_NAME}":"dm-2"
        },
        {
            "{#DISK_NAME}":"sda"
        },
        {
            "{#DISK_NAME}":"sdb"
        }
    ]
}

能否获取磁盘IO值,有输出结果说明配置成功。

# /usr/local/zabbix/bin/zabbix_get -s 192.168.0.235 -k 'disk.status[sda,read.ops]'
4297329

三、zabbix web界面配置

由于本人单台测试就没有创建模板,直接在需要监控的主机上添加的(服务器多的话会很麻烦)。也可以创建一个通用模板,后期设备多了后直接使用这个模板,会减少许多工作量。

进入web界面-->Configuration-->Hosts-->想要监控主机的Discovery-->Create discovery rule

 

填写规则名称跟key,其余默认信息即可,填写好后点击add保存。

添加item prototypes,点击item prototypes-->create item prototypes。填写对应信息。

说明:创建item时要注意的是,item prototypes名称、item key都需要使用脚本中设置的变量{#DISK_NAME},来获取每一块设备名称。给item定义key,并且要传递两个参数$1,$2给监测脚本;其中$1需要传递变量{#DISK_NAME},$2传递一个监控值。依次创建其余item prototype,不在一一细说。

 

监控item prototypes名称及key名称

名称: {#DISK_NAME}磁盘读的次数
键值: disk.status[{#DISK_NAME},read.ops]
单位: ops/second
储存值:差量(每秒速率)

名称: {#DISK_NAME}磁盘写的次数
键值: disk.status[{#DISK_NAME},write.ops]
单位: ops/second
储存值:差量(每秒速率)

名称: {#DISK_NAME}磁盘读的毫秒数
键值: disk.status[{#DISK_NAME},read.ms]
单位: ms
储存值:差量(每秒速率)

名称: {#DISK_NAME}磁盘写的毫秒数
键值: disk.status[{#DISK_NAME},write.ms]
单位: ms
储存值:差量(每秒速率)

名称: {#DISK_NAME}读扇区的次数
键值: disk.status[{#DISK_NAME},read.sectors]
单位: B/sec
使用自定义倍数: 512
储存值:差量(每秒速率)

名称: {#DISK_NAME}写扇区的次数
键值: disk.status[{#DISK_NAME},write.sectors]
单位: B/sec
使用自定义倍数: 512
储存值:差量(每秒速率)

创建graph prototype ,点击graph prototype-->create graph prototype。填写对应信息。

注意:graph prototype name需要使用脚本中设置的变量{#DISK_NAME},来获取每一块设备名称。否则会报错,不能成功创建图形。点击Add prototype后会弹出所有设置好的item prototype,全选以后点击Add就能添加图形界面。

至此zabbix自动发现并监控磁盘IO完成,由于本人水平有限,在最后的图形配置这里遇到问题,查找许多资料以后才发现graph prototype name是需要使用脚本中设置的变量{#DISK_NAME},来获取每一块设备名称,而不是自己定义的。

下图为配置好后的显示效果。

 

转载于:https://www.cnblogs.com/ebay/p/6972637.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值