zabbix_iostat
Различия
Показаны различия между двумя версиями страницы.
| — | zabbix_iostat [2022/03/25 14:00] (текущий) – создано - внешнее изменение 127.0.0.1 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== Мониторинг дисковой активности с помощью zabbix ====== | ||
| + | ===== Введение ===== | ||
| + | |||
| + | Как мониторить дисковую активность с помощью zabbix писалось уже не раз, но ни один из вариантов меня полностью не устроил и я взял что-то из одного рецепта, | ||
| + | |||
| + | Для мониторинга используется утилита iostat из пакета sysstat. Она в течерии минуты записывает показания в файл(с интервалом в одну секунду), | ||
| + | |||
| + | |||
| + | ===== Подготовка хоста ===== | ||
| + | |||
| + | Устанавливаем пакет sysstat. С помощью утилиты iostat из этого пакета будем собирать статистику загруженности дисков и сохранять в файл. | ||
| + | |||
| + | # apt-get install sysstat | ||
| + | | ||
| + | Далее создаем скрипт, | ||
| + | |||
| + | #!/bin/bash | ||
| + | | ||
| + | # Script for iostat monitoring | ||
| + | # Author Epikhin Mikhail | ||
| + | # michael at nomanlab.org | ||
| + | | ||
| + | SECONDS=55 | ||
| + | TOFILE=/ | ||
| + | IOSTAT=/ | ||
| + | | ||
| + | DISK=$($IOSTAT -x 1 $SECONDS | awk 'BEGIN {check=0;} {if(check==1 && $1==" | ||
| + | echo $DISK | sed ' | ||
| + | echo 0 | ||
| + | | ||
| + | Добавляем этот скрипт в крон, чтобы он выполнялся каждую минуту / | ||
| + | |||
| + | * * * * * root / | ||
| + | |||
| + | И перезапускаем крон: | ||
| + | |||
| + | # / | ||
| + | | ||
| + | Теперь каждую минуту в файле / | ||
| + | |||
| + | Далее создаем скрипт, | ||
| + | |||
| + | #!/bin/bash | ||
| + | |||
| + | # Script for disk monitoring | ||
| + | # Author Epikhin Mikhail | ||
| + | # michael.nomanlab.org | ||
| + | # version 1.1 | ||
| + | | ||
| + | NUBMER=100500 | ||
| + | FROMFILE=/ | ||
| + | DISK=$1 | ||
| + | METRIC=$2 | ||
| + | | ||
| + | case " | ||
| + | " | ||
| + | NUMBER=2 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=3 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=4 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=5 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=6 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=7 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=8 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=9 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=10 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=11 | ||
| + | ;; | ||
| + | " | ||
| + | NUMBER=12 | ||
| + | ;; | ||
| + | esac | ||
| + | | ||
| + | cat $FROMFILE | grep $DISK | tail -n +2 | tr -s ' ' | cut -f$NUMBER -d' ' | awk 'BEGIN {sum=0.0; | ||
| + | | ||
| + | #iostat -x | grep $1 | tr -s ' ' | cut -f$NUMBER -d' ' | ||
| + | |||
| + | И еще один скрипт, | ||
| + | |||
| + | # | ||
| + | | ||
| + | import os | ||
| + | import re | ||
| + | | ||
| + | devs = [] | ||
| + | mountsFD = open("/ | ||
| + | mounts = mountsFD.readlines() | ||
| + | jsonData = ' | ||
| + | mountPoint = '' | ||
| + | md = re.compile(' | ||
| + | | ||
| + | for line in mounts: | ||
| + | if line.startswith("/ | ||
| + | lineParts = line.split(" | ||
| + | mountPoint = lineParts[1] | ||
| + | | ||
| + | if "/ | ||
| + | dev = os.readlink(lineParts[0]).split(" | ||
| + | | ||
| + | else: | ||
| + | dev = lineParts[0].split("/ | ||
| + | | ||
| + | # if not MD-drive | ||
| + | if not md.match(dev): | ||
| + | # removing numbers from string | ||
| + | dev = '' | ||
| + | mountPoint = "" | ||
| + | | ||
| + | if dev not in devs: | ||
| + | if jsonData != ' | ||
| + | jsonData += ', | ||
| + | jsonData += """ | ||
| + | mountPoint = "" | ||
| + | | ||
| + | devs.append(dev) | ||
| + | | ||
| + | mountsFD.close() | ||
| + | | ||
| + | jsonData += " | ||
| + | | ||
| + | print(jsonData) | ||
| + | |||
| + | Подготовка системы закончена. | ||
| + | ===== Настройка zabbix-агента ===== | ||
| + | |||
| + | В конфиге агента ничего не обычного, | ||
| + | |||
| + | UserParameter=custom.disks.discovery_python,/ | ||
| + | UserParameter=custom.disks.iostat[*],/ | ||
| + | | ||
| + | Первый параметр без аргументов, | ||
| + | |||
| + | Теперь перезапускаем агента и тестируем: | ||
| + | |||
| + | # zabbix_agentd -t custom.disks.discovery_python | ||
| + | custom.disks.discovery_python[/ | ||
| + | " | ||
| + | | ||
| + | {" | ||
| + | {" | ||
| + | {" | ||
| + | {" | ||
| + | | ||
| + | ] | ||
| + | }] | ||
| + | | ||
| + | # zabbix_agentd -t custom.disks.iostat[sdb, | ||
| + | custom.disks.iostat[/ | ||
| + | |||
| + | Если все в порядке, | ||
| + | ===== Настройка zabbix-сервера ===== | ||
| + | |||
| + | Все настройки на стороне сервера проводятся через веб-интерфейс. Вначале создаем шаблон(Configuration -> Templates -> Create template), при добавлении которого хосту, на этом хосте будет производиться мониторинг дисковой активности. Ниже представлен скриншот с параметрами, | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Далее создаем приложение iostat (Configuration -> Templates -> Template IOstat Linux -> Applications): | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Теперь создадим регулярное выражение для фильтрации малоинтересных разделов, | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | Следующий шаг - создание discovery rule, т.е. правила, | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Здесь важными параметры: | ||
| + | |||
| + | * Key - наш собственный ключ, который указали в конфиге агента | ||
| + | * Filter - параметры фильтрации объектов, | ||
| + | |||
| + | Теперь создаем прототипы источников данных, | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | * Key - тут опять же указывается ранее созданный пользовательский параметр и ему передаются два аргумента: | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | Таким образом создается нужное кол-во прототипов данных для интересующих метрик. Поддерживаются следующие метрики: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | И в заключении создаются прототипы графиков. В примере ниже создается график, | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | В итоге у меня получилось четыре прототипа графиков: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ===== Заключение ===== | ||
| + | |||
| + | Полученный результат можно увидеть на скриншотах ниже. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Использованная литература ===== | ||
| + | |||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | - [[https:// | ||
| + | |||
