Статьи

Zabbix — низкоуровневое обнаружение ядер, процессоров и жесткого диска

Скриншот-от-2013-12-29-165743-e1388332859892 Состояние Zabbix SSD, настроенное для обнаружения низкого уровня

Дома я использую Zabbix для мониторинга своих серверов, он имеет множество интересных функций и может быть значительно расширен с помощью параметров пользователя.

В этом посте я расскажу о Low Level Discovery (LLD). Если вас интересует только конечный результат, зайдите в раздел Заключение, вы можете скачать мой шаблон, содержащий все правила!

Обнаружение низкого уровня (LLD)

LLD — это функция для автоматического обнаружения некоторых свойств отслеживаемого хоста и создания элементов, триггеров и графиков.

По умолчанию Zabbix поддерживает три типа обнаружения элементов:

  • Монтируемые файловые системы
  • Сетевой интерфейс
  • OID SNMP

Первые два очень полезны, так как они по умолчанию предоставят вам, например, свободное место каждой смонтированной файловой системы или пропускную способность, входящую и выходящую из каждого сетевого интерфейса. Поскольку я наблюдаю только за серверами Linux, я не использую последний, но в конечном итоге он заинтересует других людей.

Еще одна очень интересная особенность этой функции заключается в том, что вы можете расширить ее, обнаружив больше предметов. В этой статье я покажу, как обнаружить процессоры, ядра и жесткий диск.

Наиболее важной частью пользовательского обнаружения является создание сценария на отслеживаемых машинах, который может «обнаружить» что-то. Это может быть любой исполняемый файл, важно только то, что он выводит данные в правильном формате. Я должен сказать, что формат довольно уродливый, но это, вероятно, не очень важно. Вот вывод моего сценария обнаружения жесткого диска:

01
02
03
04
05
06
07
08
09
10
11
{
"data":[
    {"{#DISKNAME}":"/dev/sda","{#SHORTDISKNAME}":"sda"},
    {"{#DISKNAME}":"/dev/sdb","{#SHORTDISKNAME}":"sdb"},
    {"{#DISKNAME}":"/dev/sdc","{#SHORTDISKNAME}":"sdc"},
    {"{#DISKNAME}":"/dev/sdd","{#SHORTDISKNAME}":"sdd"},
    {"{#DISKNAME}":"/dev/sde","{#SHORTDISKNAME}":"sde"},
    {"{#DISKNAME}":"/dev/sdf","{#SHORTDISKNAME}":"sdf"},
    {"{#DISKNAME}":"/dev/sdg","{#SHORTDISKNAME}":"sdg"},
]
}

Вы можете иметь столько ключей для каждого обнаруженного элемента, но формат должен оставаться прежним. В прототипах элементов, триггеров и графиков вы будете использовать {#DISKNAME} или {#SHORTDISKNAME} для использования обнаруженных значений.

После того, как вы создали свои скрипты, вы должны зарегистрировать его в конфигурации zabbix как пользовательский параметр. Например, если вы используете демон zabbix, вам нужны эти строки в /etc/zabbix/zabbix_agentd.conf:

1
2
3
4
5
EnableRemoteCommands=1
...
UnsafeUserParameters=1
...
UserParameter=discovery.hard_disk,/scripts/discover_hdd.sh

Теперь, когда вы создадите правило обнаружения, вы можете использовать discovery.hard_disk в качестве ключа.

Правило обнаружения само по себе полезно без прототипов, вы можете создавать три типа прототипов:

  • Прототип предмета: это создаст новый предмет для каждой обнаруженной сущности
  • Прототип триггера: это создаст новый триггер для каждой обнаруженной сущности.
  • График Прототип: Это создаст график для каждой обнаруженной сущности.

Наиболее полезными являются, безусловно, предмет и триггеры-прототипы. Самая большая проблема с графиками заключается в том, что вы не можете создать сводный график для каждого обнаруженного элемента. Например, если вы записываете температуру ядер вашего процессора, вы не можете автоматически создать график с температурой каждого обнаруженного ядра. Для этого вам нужно создать график на каждом хосте. Что делает, имхо, графические прототипы довольно бесполезными. Так или иначе…

В следующем разделе я покажу, как я создал правила обнаружения для жесткого диска, процессорных и процессорных ядер.

Откройте для себя жесткий диск

Сценарий обнаружения действительно прост:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
#!/bin/bash
 
disks=`ls -l /dev/sd* | awk '{print $NF}' | sed 's/[0-9]//g' | uniq`
 
echo "{"
echo "\"data\":["
 
for disk in $disks
do
    echo "    {\"{#DISKNAME}\":\"$disk\",\"{#SHORTDISKNAME}\":\"${disk:5}\"},"
done
 
echo "]"
echo "}"

Он просто перечисляет все устройства / dev / sdX, удаляет номер раздела и удаляет дубликаты, чтобы в конце был только жесткий диск.

Я создал несколько прототипов предметов для каждого жесткого диска. Вот несколько примеров использования SMART (вы можете скачать шаблон со всеми элементами в разделе Заключение):

  • Необработанная частота чтения
  • Время раскрутки
  • SSD Life Left
  • температура

Вы можете заметить, что некоторые из них имеют смысл только для SSD (SSD Life Left), а некоторые другие не имеют никакого смысла для SSD (Spin Up Time). Это не проблема, поскольку они будут помечены как не поддерживаемые Zabbix.

Все эти данные собираются с помощью утилиты smartctl.

Я также создал триггер, чтобы указать на предстоящий сбой жесткого диска:

  • Срок службы SSD оставлен слишком низким
  • Количество перераспределенных секторов слишком мало

Я только что использовал пороговое значение, сообщаемое smartctl, они могут отличаться от одного производителя диска к другому. Я не очень доверяю этим значениям, так как диск обычно выходит из строя перед переходом к порогу, но в любом случае это может быть хорошим показателем.

Откройте для себя процессоры

Вот скрипт для обнаружения процессоров:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
#!/bin/bash
 
cpus=`lscpu | grep "CPU(s):" | head -1 | awk '{print $NF}'`
cpus=$(($cpus-1))
 
echo "{"
echo "\"data\":["
 
for cpu in $(seq 0 $cpus)
do
    echo "    {\"{#CPUID}\":\"$cpu\"},"
done
 
echo "]"
echo "}"

Он просто использует lscpu и анализирует свои выходные данные, чтобы найти номер ЦП, а затем создает запись для каждого ЦП.

У меня есть только один элемент для каждого процессора: загрузка процессора.
Я не создал здесь никакого триггера.

Откройте для себя ядра процессора

Непосредственно перед этим мы обнаружили процессоры, но также интересно обнаружить ядра. Если у вас нет Hyperthreading, результат будет таким же. Особенно интересно узнать температуру каждого ядра. Вот сценарий:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
#!/bin/bash
 
cores=`lscpu | grep "Core(s) per socket:" | awk '{print $NF}'`
cores=$(($cores-1))
 
echo "{"
echo "\"data\":["
 
for core in $(seq 0 $cores)
do
    echo "    {\"{#COREID}\":\"$core\"},"
done
 
echo "]"
echo "}"

Он работает так же, как и предыдущий скрипт.

Я создал только один прототип элемента, чтобы получить температуру каждого ядра с помощью lm_sensors.

Заворачивать

Вот весь UserParameter, необходимый для открытия и работы элементов:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
### System Temperature ###
UserParameter=system.temperature.core[*],sensors|grep Core\ $1 |cut -d "(" -f 1|cut -d "+" -f 2|cut -c 1-4
 
### DISK I/O###
UserParameter=custom.vfs.dev.read.ops[*],cat /proc/diskstats | egrep $1 | head -1 | awk '{print $$4}'
UserParameter=custom.vfs.dev.read.ms[*],cat /proc/diskstats | egrep $1 | head -1 | awk '{print $$7}'
UserParameter=custom.vfs.dev.write.ops[*],cat /proc/diskstats | egrep $1 | head -1 | awk '{print $$8}'
UserParameter=custom.vfs.dev.write.ms[*],cat /proc/diskstats | egrep $1 | head -1 | awk '{print $$11}'
UserParameter=custom.vfs.dev.io.active[*],cat /proc/diskstats | egrep $1 | head -1 | awk '{print $$12}'
UserParameter=custom.vfs.dev.io.ms[*],cat /proc/diskstats | egrep $1 | head -1 y| awk '{print $$13}'
UserParameter=custom.vfs.dev.read.sectors[*],cat /proc/diskstats | egrep $1 | head -1 | awk '{print $$6}'
UserParameter=custom.vfs.dev.write.sectors[*],cat /proc/diskstats | egrep $1 | head -1 | awk '{print $$10}'
UserParameter=system.smartd_raw[*],sudo smartctl -A $1| egrep $2| tail -1| xargs| awk '{print $$10}'
UserParameter=system.smartd_value[*],sudo smartctl -A $1| egrep $2| tail -1| xargs| awk '{print $$4}'
 
### Discovery ###
UserParameter=discovery.hard_disk,/scripts/discover_hdd.sh
UserParameter=discovery.cpus,/scripts/discover_cpus.sh
UserParameter=discovery.cores,/scripts/discover_cores.sh

(это должно быть установлено в zabbix_agentd.conf)

Вы также должны дать zabbix право использовать sudo с smartctl. Для этого вам нужно отредактировать файл / etc / sudoers и добавить следующую строку:

1
ALL ALL=(ALL)NOPASSWD: /usr/sbin/smartctl

Вывод и загрузка

Я надеюсь, что это поможет некоторым людям использовать обнаружение низкого уровня в своей установке Zabbix Monitoring.

LLD значительно облегчает создание нескольких элементов обнаружения для хостов с различным оборудованием или конфигурацией. Однако у него есть некоторые проблемы, для которых я еще не нашел правильного решения. Во-первых, вы должны продублировать клиентские скрипты на каждом хосте (или, по крайней мере, иметь их на общем ресурсе, доступном для каждого из них). Затем конфигурация каждого агента также дублируется в конфигурации каждого хоста. Самой большой проблемой, я думаю, является тот факт, что вы не можете автоматически создавать граф с сгенерированными элементами каждой обнаруженной сущности. Например, мне пришлось создать график температуры процессора на каждом моем хосте. Если у вас мало хостов, как у многих, это приемлемо, но если у вас сотни хостов, вы просто не делаете этого.

Все сценарии и файл экспорта шаблонов доступны в репозитории zabbix-lld . Чтобы все работало, вам нужны утилиты lscpu, lm_sensors и smartmontools.

Если у вас есть какие-либо вопросы или если что-то не работает (я не даю никаких гарантий, но это должно работать на большинстве последних машин с Linux), не стесняйтесь комментировать этот пост.