• 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('
    '):
        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 "$device" | head -1 | awk '{print $4}'     #//磁盘读的次数
                ;;
             read.ms)
                /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $7}'     #//磁盘读的毫秒数
                ;;
             write.ops)
                /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $8}'     #//磁盘写的次数
                ;;
             write.ms)
                /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $11}'    #//磁盘写的毫秒数
                ;;
             io.active)
                /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $12}'    #//I/O的当前进度,
                ;;
             read.sectors)
                /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $6}'     #//读扇区的次数(一个扇区的等于512B)
                ;;
             write.sectors)
                /bin/cat /proc/diskstats | grep "$device" | head -1 | awk '{print $10}'    #//写扇区的次数(一个扇区的等于512B)
                ;;
             io.ms)
                /bin/cat /proc/diskstats | grep "$device" | 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},来获取每一块设备名称,而不是自己定义的。

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

  • 相关阅读:
    学生管理系统报错(一)
    POJ3264 Balanced Lineup
    MySQL主从复制和读写分离
    身边的同事辞职去旅行
    怎样查看eclipse是32位还是64位
    Mule ESB-3.Build a webservice proxy
    《Head First 设计模式》学习笔记——复合模式
    DecimalFormat格式化输出带小数的数字类型
    黑马day01 笔记
    [Swift]LeetCode835. 图像重叠 | Image Overlap
  • 原文地址:https://www.cnblogs.com/ebay/p/6972637.html
Copyright © 2020-2023  润新知