Мониторинг дисков с помощью zabbix

Мониторинг производительности дисковых подсистем с помощью zabbix. Мониторятся следующие параметры.

  • утилизация блочного устройства в % — удобная метрика для отслеживания общей нагрузки на устройстве;
  • latency или отзывчивость — доступна как общая отзывчивость, так и отзывчивость на операциях чтения/записи;
  • величина очереди (в запросах) и средний размер запроса (в секторах) — позволяет оценить характер нагрузки и степень загруженности устройства;
  • текущая скорость чтения/записи на устройство в человекопонятных килобайтах;
  • количество запросов чтения/записи (в секунду) объединенных при постановке в очередь на выполнение;
  • iops — величина операций чтения/записи в секунду;

Для работы нам потребуется утилита iostat входящая в пакет sysstat. Устанавливаем sysstat

yum install sysstat

Создаем директорию для скриптов

mkdir /usr/libexec/zabbix-extensions/scripts/

Создаем первый скрипт для сбора метрик

vi /usr/libexec/zabbix-extensions/scripts/iostat-collect.sh

Копируем в него следующий текст

#!/usr/bin/env bash
# Description: Script for iostat monitoring
# Author: Epikhin Mikhail michael@nomanlab.org
# Revision 1: Lesovsky A.V. lesovsky@gmail.com

SECONDS=$2
TOFILE=$1
IOSTAT="/usr/bin/iostat"

[[ $# -lt 2 ]] && { echo "FATAL: some parameters not specified"; exit 1; }

DISK=$($IOSTAT -xm 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

Создаем второй скрипт для парсинга

vi /usr/libexec/zabbix-extensions/scripts/iostat-parse.sh
#!/usr/bin/env bash
# Description:  Script for disk monitoring
# Author:       Epikhin Mikhail michael@nomanlab.org
# Revision 1:   Lesovsky A.V. lesovsky@gmail.com

NUMBER=0
FROMFILE=$1
DISK=$2
METRIC=$3

[[ $# -lt 3 ]] && { echo "FATAL: some parameters not specified"; exit 1; }
[[ -f "$FROMFILE" ]] || { echo "FATAL: datafile not found"; exit 1; }

case "$3" in
"rrqm/s")
        NUMBER=2
;;
"wrqm/s")
        NUMBER=3
;;
"r/s")
        NUMBER=4
;;
"w/s")
        NUMBER=5
;;
"rkB/s")
        NUMBER=6
;;
"wkB/s")
        NUMBER=7
;;
"avgrq-sz")
        NUMBER=8
;;
"avgqu-sz")
        NUMBER=9
;;
"await")
        NUMBER=10
;;
"r_await")
        NUMBER=11
;;
"w_await")
        NUMBER=12
;;
"svctm")
        NUMBER=13
;;
"util")
        NUMBER=14
;;
*) echo ZBX_NOTSUPPORTED; exit 1 ;;
esac

grep -w $DISK $FROMFILE | tail -n +2 | tr -s ' ' |awk -v N=$NUMBER 'BEGIN {sum=0.0;count=0;} {sum=sum+$N;count=count+1;} END {printf("%.2f\n", sum/count);}'

Даем права на запуск

chmod +x /usr/libexec/zabbix-extensions/scripts/iostat-collect.sh /usr/libexec/zabbix-extensions/scripts/iostat-parse.sh

Создаем файл с ключами zabbix агента

vi /etc/zabbix/zabbix_agentd.d/iostat.conf

Копируем в него следующие ключи

# Disk statistics via iostat (sysstat)
# Attention: Second parameter in iostat.collect must be less than Timeout option in zabbix_agentd.conf
UserParameter=iostat.discovery, iostat -d | awk 'BEGIN {check=0;count=0;array[0]=0;} {if(check==1 && $1 != ""){array[count]=$1;count=count+1;}if($1=="Device:"){check=1;}} END {printf("{\n\t\"data\":[\n");for(i=0;i<count;++i){printf("\t\t{\n\t\t\t\"{#HARDDISK}\":\"%s\"}", array[i]); if(i+1<count){printf(",\n");}} printf("]}\n");}'
UserParameter=iostat.collect,/usr/libexec/zabbix-extensions/scripts/iostat-collect.sh /tmp/iostat.out 8 || echo 1
UserParameter=iostat.metric[*],/usr/libexec/zabbix-extensions/scripts/iostat-parse.sh /tmp/iostat.out $1 $2

Рестартуем агента

systemctl restart zabbix-agent

Скачиваем шаблон для zabbix сервера и устанавливаем.

В итоге должны получить красивые графики, например загрузка диска

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделиться с друзьями:
Comments: 3
  1. Soxar

    iostat -d | awk ‘BEGIN {check=0;count=0;array[0]=0;} {if(check==1 && $1 != «»){array[count]=$1;count=count+1;}if($1==»Device:»){check=1;}} END {printf(«{\n\t\»data\»:[\n»);for(i=0;i<count;++i){printf("\t\t{\n\t\t\t\"{#HARDDISK}\":\"%s\"}", array[i]); if(i+1<count){printf(",\n");}} printf("]}\n");}'

    Эта команда (их параметра в файле iostat.conf) не отрабатывает корректно на Debian10, не выводит список дисков. Соответственно дальше тоже ничего не работает.
    На предыдущих версиях всё нормально.

    1. Сергей

      вопрос решен, вот ответ:

      iostat -d | awk ‘BEGIN {check=0;count=0;array[0]=0;} {if(check==1 && $1!= «»){array[count]=$1;count=count+1;}if($1==»Device»){check=1;}} END {printf(«{\n\t\»data\»:[\n»);for(i=0;i<count;++i){printf("\t\t{\n\t\t\t\"{#HARDDISK}\":\"%s\"}", array[i]); if(i+1<count){printf(",\n");}} printf("]}\n");}'

  2. Demon

    ДД, под винду нет такой штуки? :?:

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

ИТ Проффи

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: