Представим ситуацию, что у нас давно уже эксплуатируется Zabbix сервер и есть некоторые даже дашборды в нем, но мы хотим более гибкий и универсальный подход в мониторинге, а так же использовать одну площадку для мониторинга. В этой статье, мы рассмотрим как подружить наш Zabbix сервер с Grafana и построить дашборд используя данные с Zabbix.
У нас есть статья, как поднять Zabbix, а так же Grafana с базой данных.
Так как предыдущего стенда под рукой нет, я собрал новый на docker контейнерах.
- entnet-177
- entnet-s03 (на нем docker контейнеры zabbix, grafana, database)
Docker контейнеры:
- 1) zabbix-db (База данных postgresql для Zabbix)
- 2) grafana-db (База данных postgresql для Grafana)
- 3) zabbix-server (отдельно контейнер с zabbix-server)
- 4) zabbix-web (отдельно контейнер с web для zabbix)
- 5) grafana (сервер grafana)
Приложу свой docker compose (может кому пригодиться)
version: '3.8'
services:
zabbix-db:
image: postgres:15
environment:
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: Qwerty12
POSTGRES_DB: zabbix
volumes:
- zabbix_db_data:/var/lib/postgresql/data
networks:
- monitoring-net
grafana-db:
image: postgres:15
environment:
POSTGRES_USER: grafana
POSTGRES_PASSWORD: Qwerty12
POSTGRES_DB: grafana
volumes:
- grafana_db_data:/var/lib/postgresql/data
networks:
- monitoring-net
zabbix-server:
image: zabbix/zabbix-server-pgsql:alpine-7.0-latest
ports:
- "10051:10051"
environment:
DB_SERVER_HOST: zabbix-db
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: Qwerty12
POSTGRES_DB: zabbix
depends_on:
- zabbix-db
networks:
- monitoring-net
zabbix-web:
image: zabbix/zabbix-web-nginx-pgsql:alpine-7.0-latest
ports:
- "8080:8080"
environment:
ZBX_SERVER_HOST: zabbix-server
DB_SERVER_HOST: zabbix-db
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: Qwerty12
POSTGRES_DB: zabbix
depends_on:
- zabbix-server
- zabbix-db
networks:
- monitoring-net
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
networks:
- monitoring-net
networks:
monitoring-net:
driver: bridge
volumes:
zabbix_db_data:
grafana_data:
grafana_db_data:


Как видим, наши grafana и zabbix благополучно работают. Стенд готов к работе. Теперь давайте на машину entnet-177 поставим zabbix-agent и добавим ее на zabbix сервере, чтобы собирать с нее данные.
Ставим zabbix-agent на машину
sudo apt install -y zabbix-agent

Теперь нужно сообщить нашему агенту куда отправлять данные. Для этого откроем конфиг /etc/zabbix/zabbix_agentd.conf
sudo vim /etc/zabbix/zabbix_agentd.conf
Найдем Server, ServerActive и заменим 127.0.0.1 на IP сервера zabbixServer=ВАШ_IP_ZABBIX_SERVERServerActive=ВАШ_IP_ZABBIX_SERVERHostname=entnet-177
Сохраняем и перезапускаем zabbix-agent
sudo systemctl restart zabbix-agent
Все, агент поставлен, но теперь нужно добавить узел на zabbix, чтобы он подключился к нашему агенту. Перейдем на zabbix сервер.
Monitoring -> Hosts -> Create host
или
Мониторинг -> Узлы сети - Создать узел сети
если у вас на русском.


После добавления, пройдет пару минут и наш хост стал зеленым (значит все хорошо, если горит серым и прошло пару минут, значит что-то пошло не так и синхронизации нет).
![]()
Для удобства, я создал группу узлов и назвал ее Docker.
Data collection -> Host groups -> Create host group
или
Сбор данных -> Группы узлов сети -> Создать группу узлов сети


Отлично, машина entnet-177 добавлена, данные собираются. По аналогии создадим узел entnet-s03 и добавим его в Docker.
Но я хочу не просто данные собирать, а контролировать статус службы docker, к сожалению из коробки это делать нельзя, по этому, бонусом я покажу как настроить свой кастомный элемент и настроим триггер на срабатывание.
На машине entnet-177 откроем конфиг с настройками zabbix-agent
sudo vim /etc/zabbix/zabbix_agentd.conf
Найдем строку с Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf
Если она есть, то оставляем, если нету, допишем как выше показал.

Создаем кастомный конфиг
sudo vim /etc/zabbix/zabbix_agentd.conf.d/userparametr_docker.conf
В этот конфиг вставляем
UserParameter=docker.service.status.numeric, if systemctl is-active docker.service >/dev/null 2>&1; then echo 1; else echo 0; fi
Что он делает:
-
Ключ:
docker.service.status.numeric -
Логика:
-
Проверяет статус сервиса Docker через
systemctl is-active -
Если сервис активен (работает) → возвращает
1 -
Если сервис неактивен (остановлен) → возвращает
0 -
>/dev/null 2>&1скрывает все выводы команды (stdout и stderr)
-
То есть синтаксис вот такой:
UserParameter=<уникальный_ключ>,<команда_в_терминале>

Сохраняем и перезапускаем службу zabbix-agent:
sudo systemctl restart zabbix-agent
Снова возвращаемся в zabbix и создадим новый элемент (item), чтобы он собирал эти данные.
В узлах сети (Hosts) находим нашу entnet-177, нажимаем на нее левую кнопку мыши, откроется список, ищем там Элементы данных (Items) -> Создать элемент данных
Заполняем как по образцу на скриншоте ниже.
- Name: ваше название элемента;
- Type: Zabbix agent (active);
- Key: ваш ключ, который задали в файле директории
/etc/zabbix/zabbix_agentd.conf.d; - Type of information: Numeric (unsigned) - тип информации, в нашем случае 0 или 1, значит Numeric.
Дальше я оставил все по умолчанию.

Сохраняем. Теперь у нас хост entnet-177 будет еще собирать статус службы docker. Аналогично проделываю операцию с entnet-s03, только на него еще создам триггер на срабатывание, если упадет служба. В данном стенде это бессмысленно, ведь тогда упадет весь докер, а вслед за ним zabbix, grafana и базы данных и настраивать триггер на entnet-s03 бесполезно. По этому я просто покажу для наглядности.


С триггером ничего сложного. Нажимаем добавить или Add, находим наш item, выбираем его, далее указывает при каком параметре срабатывать, в моем случае 0 - неактивно, 1 - активно, значит если элемент отдает 0, значит срабатывать.
Создал триггер так же на entnet-177 (на этой машине служба docker неактивна).



Отлично, триггер отрабатывает как надо. На этом наша настройка zabbix завершена, теперь перейдем к установки плагина и подключение к grafana.
Установка и настройка плагина Zabbix
Заходим на графана сервер. На главной, слева в меню находим Connections, переходим туда и нажимаем Add new connection.

Вбиваем в поисковике zabbix


Нажимаем Install

Далее необходимо включить плагин - Enable

Переходим в Home -> Connections -> Data sources
Ищем zabbix

Откроется страница с настройками

Заполняем данные:
- Connection
- url: вставляем вашу ссылку на zabbix (так как у меня это контейнеры и в одной сети, по этому я просто пишу zabbix-web:8080/api_jsonrpc.php)
- Authentication
- User: ваш_логин_от_zabbix
- Password: ваш_пароль_от_zabbix
- Zabbix Connection
- Auth type: API token
Советую создать отдельную учетную запись и разраничить ей права доступа на определенные группы хостов. В моем случае, я создал отдельного пользователя grafana-user, создал отдельную группу API, накинул права (у каждого индивидуально под его требования). Сгенерировал через Admin ключ API для пользователя grafana-user и указал на grafana-server в Auth type: здесь вставляем ключ API сгенерированный на zabbix.
Заходим в Users -> API tokens
или Пользователи -> API токены
создаем API



Копируем наш токен (запишите его, больше посмотреть его не получится, только удалить и создать новый).

Сохраняем и если все успешно, увидим следующее окно

В нашем списке появилась zabbix


В целом, установка и настройка завершена. Теперь давайте попробуем что нибудь нарисовать с данных из zabbix.
Рисуем дашборд на основе данных из Zabbix
Выбираем группу которую мы создавали Docker и выбираем хост entnet-177.

Теперь найдем наш кастомный элемент

Вот такие получились данные, мы можем построить графики на основе этих данных или выводить статичные данные.
Посмотрим готовые шаблоны

Мне понравился зеленый квадрат, давайте возьмем его за основу.

Что-то не очень информативно. Можно запомнить, что 0 - это недоступно, а 1 - доступно, но мы же в айти, а значит будем править шаблон.
Добавим условие справа в меню, найдем Value mapping, добавим условия, что если 0 - то красный цвет фона, а если 1, то зеленый.



Смотрим результат


Отлично, уже лучше. Сразу информативней стало, что служба недоступна.
Давайте создадим дубликат, чтобы заново не заполнять только уже для машины entnet-s03.


Теперь отредактируем этот шаблон и изменим машину с entnet-177, на entnet-s03, так как у нас одинаковые названия элементов.

Служба сразу сменила цвет, как только выбрали машину entnet-s03


Теперь давайте выведем размер корневого раздела машины entnet-177, ведь видели проблему с местом на zabbix.

Так же давайте выведем таблицу со всеми проблемами с zabbix, но только для группы Docker.

Что-то похожее можно и на zabbix нарисовать, но не так информативно и гибче.

Бонусом, давайте еще мониторить температуру с процессора на машине entnet-s03, ведь это сердце нашего стенда. Установим пакет для отслеживания температуры.
sudo apt install -y lm-sensors
Запускаем его и даем разрешения необходимые (под разные цели, разные разрешения).
sudo sensors-detect
Готово, теперь можно всегда отслеживать в ручном режиме с помощью команды температуру
sensors
Создадим новый, кастомный элемент для отслеживания температуры на машине entnet-s03
sudo vim /etc/zabbix/zabbix_agentd.conf.d/userparametr_temp.conf
UserParameter=cpu.temp, sensors | awk '/Package id 0:/ {print $4}' | tr -d '+°C'
UserParameter=cpu.core0.temp, sensors | awk '/Core 0:/ {print $3}' | tr -d '+°C'
Создаем новый элемент на zabbix


Отлично, видим, что температура у нас собирается. Теперь вернемся на графану и выведем ее туда.
Создадим дубликат ранее созданной статус службы, изменим элемент и value mapping, настроим на range.


Теперь давайте посмотрим итоговый дашборд, который у меня получился.

На этом все. Как видите, ограничений нет, только ваша фантазия. Самое что главное, можно экспортировать шаблоны и импортировать на другие сервера. Удачи в построении своих дашбордов!

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