Изучаю возможности "самонастройки" мониторинга 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}? Что я упустил / не понял?