meimei10251314 发表于 2018-1-2 07:27:08

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\s|\sxvd\s|\svd\s'| awk '{print $3}'|sort|uniq 2>/dev/null"  
t
=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()  
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'  
4297329
  


三、zabbix web界面配置
  由于本人单台测试就没有创建模板,直接在需要监控的主机上添加的(服务器多的话会很麻烦)。也可以创建一个通用模板,后期设备多了后直接使用这个模板,会减少许多工作量。
  进入web界面-->Configuration-->Hosts-->想要监控主机的Discovery-->Create discovery rule
https://images2015.cnblogs.com/blog/835633/201706/835633-20170609153845903-72805264.png
https://images2015.cnblogs.com/blog/835633/201706/835633-20170609155146309-309600450.png
  填写规则名称跟key,其余默认信息即可,填写好后点击add保存。
https://images2015.cnblogs.com/blog/835633/201706/835633-20170609160107372-1977022339.pnghttps://images2015.cnblogs.com/blog/835633/201706/835633-20170609160333122-1164431894.png
  添加item prototypes,点击item prototypes-->create item prototypes。填写对应信息。
https://images2015.cnblogs.com/blog/835633/201706/835633-20170609162202043-564541043.png
  说明:创建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。填写对应信息。
https://images2015.cnblogs.com/blog/835633/201706/835633-20170609163214184-970472692.png
  注意:graph prototype name需要使用脚本中设置的变量{#DISK_NAME},来获取每一块设备名称。否则会报错,不能成功创建图形。点击Add prototype后会弹出所有设置好的item prototype,全选以后点击Add就能添加图形界面。
  至此zabbix自动发现并监控磁盘IO完成,由于本人水平有限,在最后的图形配置这里遇到问题,查找许多资料以后才发现graph prototype name是需要使用脚本中设置的变量{#DISK_NAME},来获取每一块设备名称,而不是自己定义的。
  下图为配置好后的显示效果。
https://images2015.cnblogs.com/blog/835633/201706/835633-20170609163709731-621735046.png
页: [1]
查看完整版本: zabbix 3.2.6自动发现磁盘并监控磁盘io