本文主要分为3个部分
第一部分 前言,主要说说需求和获取数据的命令
第二部分 zabbix,主要说如何利用lld获得想要监控的数据
第三部分 ansible,主要提供一个ansible playbook来分发该监控所需的文件
第一部分 前言部分
最近有一个需求是对系统的IO进行监控,最后决定从iostat获取数据。
这是具体的命令:
iostat -x -d -m 1 3
参数简单解析:
-x Display extended 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 await svctm %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[1]
cmdline = 'cat /tmp/iostat.txt | grep %s' % DISK
(status,output) = commands.getstatusoutput(cmdline)
output_list = output.split()
value = zip(*[iter(output_list)]*12)
if sys.argv[2] == "rrqmps":
print ((float(value[1][1])+float(value[2][1]))/2)
elif sys.argv[2] == "wrqmps":
print ((float(value[1][2])+float(value[2][2]))/2)
elif sys.argv[2] == "rps":
print ((float(value[1][3])+float(value[2][3]))/2)
elif sys.argv[2] == "wps":
print ((float(value[1][4])+float(value[2][4]))/2)
elif sys.argv[2] == "rspeed":
print ((float(value[1][5])+float(value[2][5]))/2)
elif sys.argv[2] == "wspeed":
print ((float(value[1][6])+float(value[2][6]))/2)
elif sys.argv[2] == "await":
print ((float(value[1][9])+float(value[2][9]))/2)
elif sys.argv[2] == "svctm":
print ((float(value[1][10])+float(value[2][10]))/2)
elif sys.argv[2] == "util":
print ((float(value[1][11])+float(value[2][11]))/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
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。