Frankenstine
@Frankenstine
Сисадмин

Как сделать мониторинг в Zabbix множественных параметров через один вызов скрипта?

Изучаю возможности "самонастройки" мониторинга Zabbix и не могу понять как работает механизм прототипирования произвольных данных. Всё что я тут излагаю, касается Zabbix версии 4.0

Допустим у нас есть кластер k8s, в котором есть заранее неизвестное количество нод. Две-три, как правило. И мы хотим настроить мониторинг через Zabbix использование на этих нодах ресурсов, процессорных и оперативки.
Поскольку неизвестно их точное количество (оно может меняться), то используем механизм низкоуровневого обнаружения.
Пишем простой скрипт
Скрипт получения названий нод
#!/bin/bash
echo '{ "data":['
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes | jq -r '.items[].metadata' | sed 's/"name"/"{#NODENAME}"/g' | sed 's/^}/}\,/g' | sed '$ d'
echo '}] }'


Грубо, но сработает - отдаёт нужный для LLD механизма json. Запихиваем это в UserParameter и создаём правило обнаружения, вызывающее его.
Вопрос первый, который не понятен на данном этапе: нужно ли в этом правиле обнаружения добавлять фильтр "макрос {#NODENAME} соответствует регулярке *"?
Теперь нужно сделать прототип элемента данных. Дёргать kubectl для получения каждого параметра отдельно это не то что плохо - это ужасно. Значит, нужно один раз получить все нужные данные и затем их парсить.
Допустим, делаем такой скрипт
Скрипт выдающий ресурсы

#!/bin/bash

kubectl top node --no-headers > /tmp/res.txt
nodes_list=$(awk '{printf "%s\n", $1}' /tmp/res.txt)
nodes_cpu=$(awk '{printf "%i\n", $3}' /tmp/res.txt)
nodes_mem=$(awk '{printf "%i\n", $5}' /tmp/res.txt)

j=1
for i in $nodes_list
do
        /usr/bin/echo $i" cpu" $(echo $nodes_cpu | awk "{print $`echo $j`}")
        /usr/bin/echo $i" ram" $(echo $nodes_mem | awk "{print $`echo $j`}")
        j=$((j+1))
done


На выходе будет такая табличка
выхлоп kubernetes.node.res

testnode-nodes-8a5qa cpu 5
testnode-nodes-8a5qa ram 79
testnode-nodes-8a5qe cpu 11
testnode-nodes-8a5qe ram 40
testnode-nodes-8a5rr cpu 33
testnode-nodes-8a5rr ram 56

Это мы дёргаем за раз вызовом kubernetes.node.res через ещё один UserParameter из протопипа элемента данных с типом text.
Вопрос второй возникает - нужно ли тут делать какую-то предобработку?
И наконец, вычленяем например нагрузку на cpu, создаём зависимый элемент данных, но тут меня накрывает с головой.
Что писать в поле Ключ? Где должен фигурировать макрос {#NODENAME}? Что я упустил / не понял?
  • Вопрос задан
  • 356 просмотров
Решения вопроса 1
vesper-bot
@vesper-bot
Любитель файрволлов
Что писать в поле ключ - pofigchto[{#NODENAME}] примерно вот так, я стараюсь вместо pofigchto писать то, что за смысл собирается в данном итеме. В display name тоже надо куда-то этот {#NODENAME} воткнуть, чтобы когда триггер отработает, было сразу понятно, какой из итемов вылез в ошибку.
Советую кстати собирать сразу json, дело в том, что если в text'е прилетел json, 4.0+ заббикс может создать dependent item из одного из полей этого json, включая прототипы, с помощью data preprocessing, и вот в них уже будут данные, по которым строятся графики и т.п.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@MechanID
Админ хостинг провайдера
1 фильтр нужен только если вам нужно работать не со всеми нодами а только с частью по какомуто критерию.
2 про предобработку и макрос - посмотрите как сделан шаблон "Template Module Linux block devices by Zabbix agent" (у меня уже пятый заббикс но поидее он был такимже и в четвертом) - там берется содержимое файла /proc/diskstats и предобработкой заполняется в массив, после уже дискавери находит нужные блочные устройтва и создает итемы который по имени блочного устройства берут из массива нужное значение.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
Заббиксом не пользовался, но юзаю InfluxDB которая идет с графаной.

Сейчас некоторые вещи кидаю напрямую в инфлюкс так:
resources,nodename=testnode-nodes-8a5qa cpu=5,ram=79

Плюс в том, что у cpu и ram в данном случае timestamp будет совпадать и графики красивее синхронизируются.
И даже интересно, Заббикс такую модель поддерживает, или у него дефолтный флоу другой?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы