Это старая версия документа!
Как мониторить дисковую активность с помощью zabbix писалось уже не раз, но ни один из вариантов меня полностью не устроил и я взял что-то из одного рецепта, что-то из другого, а что-то реализовал сам. В итоге получилось решение, которое устраивает меня и чтобы не забыть как я это сделал было решено задокументировать :) На все сторонние скрипты и идеи в конце статьи указаны ссылки.
Для мониторинга используется утилита iostat из пакета sysstat. Она в течерии минуты записывает показания в файл(с интервалом в одну секунду), а затем zabix-агент считывает среднеарифмитическое. Для автоподключения дисков к мониторингу был написан свой скрипт, который выполняет поиск блочных устройств, но не просто всех имеющихся, а по определенным, нужным мне критериям, т.е. поиск начинается с просмотра всех примонтированных файловых систем и определения их блочных устройств, далее если это логические устройства, они отсекаются, например вместо sda1 и sda2 будет мониториться только sda и т.д.
Устанавливаем пакет sysstat. С помощью утилиты iostat из этого пакета будем собирать статистику загруженности дисков и сохранять в файл.
# apt-get install sysstat
Далее создаем скрипт, который будет собирать данные в течении 55с и сохранять их в файл /opt/zabbix/iostat_collect.sh:
#!/bin/bash # Script for iostat monitoring # Author Epikhin Mikhail # michael at nomanlab.org SECONDS=55 TOFILE=/tmp/iostat.log IOSTAT=/usr/bin/iostat DISK=$($IOSTAT -x 1 $SECONDS | awk 'BEGIN {check=0;} {if(check==1 && $1=="avg-cpu:"){check=0}if(check==1 && $1!=""){print $0}if($1=="Device:"){check=1}}' | tr '\n' '|') echo $DISK | sed 's/|/\n/g' > $TOFILE echo 0
Добавляем этот скрипт в крон, чтобы он выполнялся каждую минуту /etc/crontab:
И перезапускаем крон:
# /etc/init.d/crond restart
Теперь каждую минуту в файле /tmp/iostat.log будет появляться ежесекундная статистика по загрузке дисков.
Далее создаем скрипт, который будет парсить этот лог и считать среднеарифмитическое для заданного диска и заданного параметра /opt/zabbix/iostat_parse.sh:
#!/bin/bash # Script for disk monitoring # Author Epikhin Mikhail # michael.nomanlab.org # version 1.1 NUBMER=100500 FROMFILE=/tmp/iostat.log DISK=$1 METRIC=$2 case "$2" in "rrqm/s") NUMBER=2 ;; "wrqm/s") NUMBER=3 ;; "r/s") NUMBER=4 ;; "w/s") NUMBER=5 ;; "rsec/s") NUMBER=6 ;; "wsec/s") NUMBER=7 ;; "avgrq-sz") NUMBER=8 ;; "avgqu-sz") NUMBER=9 ;; "await") NUMBER=10 ;; "svctm") NUMBER=11 ;; "util") NUMBER=12 ;; esac cat $FROMFILE | grep $DISK | tail -n +2 | tr -s ' ' | cut -f$NUMBER -d' ' | awk 'BEGIN {sum=0.0;count=0;} {sum=sum+$1;count=count+1;} END {printf("%.2f\n", sum/count);}' #iostat -x | grep $1 | tr -s ' ' | cut -f$NUMBER -d' '
И еще один скрипт, которые будет выполнять поиск использующихся устройств /opt/zabbix/devs_discovery.py:
#!/usr/bin/env python import os import re devs = [] mountsFD = open("/proc/mounts", "ro") mounts = mountsFD.readlines() jsonData = '{\n"data":[\n\n' mountPoint = '' md = re.compile('^md[0-9]+$') for line in mounts: if line.startswith("/dev"): lineParts = line.split(" ") mountPoint = lineParts[1] if "/dev/mapper/" in lineParts[0]: dev = os.readlink(lineParts[0]).split("../")[1] else: dev = lineParts[0].split("/dev/")[1] # if not MD-drive if not md.match(dev): # removing numbers from string dev = ''.join([i for i in dev if not i.isdigit()]) mountPoint = "" if dev not in devs: if jsonData != '{\n"data":[\n\n': jsonData += ',\n' jsonData += """{"{#DEV}": "%s", "{#MOUNTPOINT}": "%s"}""" % (dev, mountPoint) mountPoint = "" devs.append(dev) mountsFD.close() jsonData += "\n\n]\n}" print(jsonData)
Подготовка системы закончена.