Пришло время заняться получением конкретных метрик производительности и в этом нам помогут прототипы элементов данных. В прошлой статье Низкоуровневое обнаружение в ZABBIX: правила LLD мы пока что добились только выдачей списка дисков со стороны агента Zabbix, но это явно не то, на чем хотелось бы остановиться.
Если вам интересна тематика ZABBIX, рекомендую обратиться к основной статье – Система мониторинга ZABBIX, в ней вы найдете дополнительную информацию.
Содержание
Прототипы элементов данных
Для “отсутствующих на прошлом занятии” небольшое введение сразу ниже.
Введение
В прошлой статье (Низкоуровневое обнаружение в ZABBIX: правила LLD) мы добились того, что агент Zabbix возвращал набор отслеживаемых объектов в формате json. В моем примере это просто список имен дисков. Сам по себе этот список не представляет никакой ценности. Для целей мониторинга значимыми являются лишь метрики производительности каждого из этих дисков.
А вот как получить эти метрики, читайте ниже.
Метрики производительности
Напомню, что данные я вытаскиваю с помощью утилиты iostat:
Столбцы rrqm/s, wrqm/s, r/s, etc… как раз и являются метриками (которые надо ещё уметь правильно читать и расшифровывать, но это другая история).
Скрипт
Задача немного проясняется – нужно написать скрипт, который бы принимал как аргумент следующие параметры:
- Имя файла с выводом программы iostat (например iostat -d -x >/tmp/iostat.output);
- Имя диска (например sda, как на скриншоте выше);
- Имя столбца данных, в котором находится значение нужной метрики (в качестве примера пусть будет последний столбец %util).
Вот одна из вариаций (скрипт iostat.data.sh):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin iostat_refresh=60 # iostat ouput file refresh time in seconds param_column=0 # the number of iostat output column date_diff=0 # date difference in sec #------------------------------------------------------------------------- # chech file exist and comparation of current time with last file # modification time #------------------------------------------------------------------------- if [ -f "$1" ]; then #get difference between (current time) and (the last file modification time): let " date_diff = \ $( date +'%s' -d "$(date +"%Y/%m/%d %H:%M:%S")" ) - \ $( date +'%s' -d "$(stat "$1" | sed -r '6!d;s/^.*([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*/\1/')" ) \ " if (( date_diff > iostat_refresh )); then iostat -d -x > "$1" fi else iostat -d -x > "$1" fi #------------------------------------------------------------------------- # case third param (disk metric) # and get needed column with awk #------------------------------------------------------------------------- case "$3" in "rrqm/s") param_column=2 ;; "wrqm/s") param_column=3 ;; "r/s") param_column=4 ;; "w/s") param_column=5 ;; "rkB/s") param_column=6 ;; "wkB/s") param_column=7 ;; "avgrq-sz") param_column=8 ;; "avgqu-sz") param_column=9 ;; "await") param_column=10 ;; "r_await") param_column=11 ;; "w_await") param_column=12 ;; "svctm") param_column=13 ;; "%util") param_column=14 ;; *) printf '%s\n' "invalid param!" ;; esac awk -v a_disk_name="$2" -v a_param_column="$param_column" '$1 ~ a_disk_name {sub(",",".",$a_param_column);print $a_param_column}' "$1" |
Использовать скрипт очень просто:
1 2 3 |
./iostat.data.sh "/tmp/iostat.data.output" "sda" "%util" 0.69 |
Он возвращает численный параметр на пересечении столбца (%util) и строки с именем диска (sda). Теперь дело за малым, нужно просто в агенте Zabbix добавить пользовательский параметр:
1 |
UserParameter=iostat.data[*],/path/to/iostat.data.sh /tmp/iostat.data.output $1 $2 |
Первый позиционный параметр для скрипта – это имя файла с выводом iostat, а в параметры $1 и $2 будут передаваться имя диска и имя столбца вывода iostat соответственно как в примере выше.
Обновление данных
Данные утилиты iostat я вывожу во временный файл /tmp/iostat.data.output, но, как вы можете догадаться, они будут устаревать. Важно своевременно их обновлять, чтобы получать актуальные метрики производительности.
Сделать это можно двумя путями. Первый из них – реализовать обновление файла внутри скрипта. Именно это я и сделал.
Второй способ более интересный – организовать обновление данных через другой скрипт, вызываемый через UserParameter обычным элементом данных в шаблоне. Например именно так реализовано в шаблоне мониторинга Iostat-Disk-Utilization-Template 1, который уже давно ходит по просторам интернета (кстати, по его установке у меня есть отдельная статья – Мониторинг дисков ZABBIX – но она немного устарела).
Вариант интересен прежде всего тем, что позволяет не переполнять основной скрипт, но он скрывает в себе несколько подводных камней:
- Появляется дополнительный UserParameter с отдельным скриптом со всеми вытекающими (сложнее отлаживать, поддерживать, вникать в работу);
- Нет железной гарантии, что данные от iostat будут всегда самые свежие;
- Придется отслеживать дополнительный элемент данных на предмет получения самой актуальной статистики по производительности.
Все эти моменты склонили меня в пользу первого варианта, хоть и в нем на получение каждого значения (а таких десятки) выполняется сравнение времени создания файла.
Создание прототипов
К каждому правилу низкоуровневого обнаружения добавляются один или несколько прототипов элементов данных. Чтобы лучше понимать – каждому элементу прототипа данных соответствует один столбец вывода iostat.
Рассмотрим пример создания прототипа. Необходимо зайти в ваш шаблон, далее Правила обнаружения – Прототипы элементов данных – Создать прототип элемента данных.
Обратите внимание на макрос {#BLKDEV} – он автоматически заменится именем диска. Напомню, что имена дисков в формате json я вытаскивал в предыдущей статье. То есть, если у нас три диска, то после создания этого прототипа элемента данных мы получим три метрики %util по одной для каждого диска. Всего iostat выводит 13 метрик (у вас будет 13 прототипов элементов данных в шаблоне).
Уже после создания первого прототипа данных вы можете зайти в Мониторинг – Последние данные и выбрать нужный хост, чтобы понаблюдать как появится по одной метрике для каждого диска.