lishenghan 发表于 2019-1-25 07:40:33

使用iostat和LLD实现zabbix监控IO性能

  本文主要分为3个部分
  第一部分 前言,主要说说需求和获取数据的命令
  第二部分 zabbix,主要说如何利用lld获得想要监控的数据
  第三部分 ansible,主要提供一个ansible playbook来分发该监控所需的文件
  第一部分 前言部分
  最近有一个需求是对系统的IO进行监控,最后决定从iostat获取数据。

  这是具体的命令:
iostat -x -d -m 1 3  参数简单解析:
  -x   Displayextended statistics
  -d   Display the device utilization report
  -m   Display statistics in megabytes per second instead of blocks or kilobytes per second
  

  那么为什么要 1 3呢?
  我们用
iostat -x -d -m 1  多次测试,会发现第一次输出的值变动不大,第二次,第三次输出的值会有一定的变化,因此我更偏向与取第二次,第三次的值做平均
  命令的输出格式如下:
Device:         rrqm/s   wrqm/s   r/s   w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   awaitsvctm%util  可以较好地满足我们的监控需求

  

  第二部分 zabbix部分
  接下来,我们就用zabbix的LLD来自动发现当前系统的Device值
  cat /etc/zabbix/scripts/io_discovery.py
#!/bin/env python
import os
import commands
(status,output) = commands.getstatusoutput("iostat -x -d -m| sed -n '4,$p' | grep -v ^$|awk '{print $1}'")
DISKS = output.split()
print '{'
print '\t"data":['
count = 1
for key in DISKS:
    print '\t{'
    if count < len(DISKS):
      print '\t\t"{#DISK}":"%s"},' % key
    else:
      print '\t\t"{#DISK}":"%s"}' % key
    count += 1
print '\t]'
print '}'  

  拿到Device以后,用脚本来获取对应的数值
  cat /etc/zabbix/scripts/userparameter_diskio.py
#!/bin/env python
import commands
import sys
DISK = sys.argv
cmdline = 'cat /tmp/iostat.txt | grep %s' % DISK
(status,output) = commands.getstatusoutput(cmdline)
output_list = output.split()
value = zip(**12)
if sys.argv == "rrqmps":
    print ((float(value)+float(value))/2)
elif sys.argv == "wrqmps":
    print ((float(value)+float(value))/2)
elif sys.argv == "rps":
    print ((float(value)+float(value))/2)
elif sys.argv == "wps":
    print ((float(value)+float(value))/2)
elif sys.argv == "rspeed":
    print ((float(value)+float(value))/2)
elif sys.argv == "wspeed":
    print ((float(value)+float(value))/2)
elif sys.argv == "await":
    print ((float(value)+float(value))/2)
elif sys.argv == "svctm":
    print ((float(value)+float(value))/2)
elif sys.argv == "util":
    print ((float(value)+float(value))/2)  这里还需要一个crontab来生成/tmp/iostat.txt文件
  * * * * * iostat -x -d -m 1 3 > /tmp/iostat.txt
  

  接着写一个自定义配置文件
  cat /etc/zabbix/zabbix_agentd.d/userparameter_diskio.conf
UserParameter=diskio_discovery
[*],python /etc/zabbix/scripts/io_discovery.py
UserParameter=diskio
[*],python /etc/zabbix/scripts/userparameter_diskio.py$1 $2  

  接下来需要在zabbix上建一个监控模板,模板在附件里面,本模板适用于zabbix3.2,其他版本请自行测试,可能需要做一些修改
  

  都准备以后可以开始使用了
  首先把相应的脚本和配置文件放到客户机上面,添加cron
  接着把模板导入,在模板里面添加机器,然后restart zabbix 客户端
  

  第三部分 Ansible部分
  如果你有使用ansible,这里可以提供一个playbook,用来分发脚本等工作
- hosts: 客户机
tasks:
    - name: mkdir the scripts dir
      file: path=/etc/zabbix/scripts state=directory
    - name: copy conf files
      copy: src=/etc/zabbix/zabbix_agentd.d/userparameter_diskio.conf   dest=/etc/zabbix/zabbix_agentd.d/
    - name: copy io_discovery.py
      copy: src=/etc/zabbix/scripts/io_discovery.py   dest=/etc/zabbix/scripts/io_discovery.py mode=0755
    - name: copy userparameter_diskio.py
      copy: src=/etc/zabbix/scripts/userparameter_diskio.py   dest=/etc/zabbix/scripts/userparameter_diskio.py mode=0755
    - name: add cron
      cron: name='add iostat cron'minute='*' hour='*' day='*' month='*' weekday='*' job='iostat -x -d -m 1 3 > /tmp/iostat.txt' state=present
      notify:
      - restart zabbix-agent
handlers:
    - name: restart zabbix-agent
      service: name=zabbix-agent state=restarted enabled=yes  

  
  



附件:http://down.运维网.com/data/2368552

页: [1]
查看完整版本: 使用iostat和LLD实现zabbix监控IO性能