
Универсальный мониторинг в Docker: объединяем Zabbix, Prometheus и Grafana. Восстановление дашбордов из JSON, мониторинг Docker, Postgres
Продолжаем наш цикл Grafana + Zabbix, только сегодня к нему присоединиться третий богатырь мониторинга Prometheus.
Prometheus — это система мониторинга и оповещения. Представим, что это такой "диспетчер", который постоянно ходит по вашим сервисам и спрашивает: "Как дела? Сколько запросов обработал? Не перегрелся ли процессор?". Он забирает с сервисов метрики (числовые показатели) и складывает их в свою базу данных. Умеет не только собирать, но и ругаться, если что-то пошло не так. Да-да, "диспетчер-начальник" 😄
Дашборды в Grafana — это "приборная панель" нашего сервера. Если Prometheus — это база данных с цифрами, то Grafana — это красивые графики и таблички, которые эти цифры визуализируют. Можно увидеть:
-
График загрузки CPU (скачет как кардиограмма)
-
Сколько памяти жрет каждый контейнер Docker
-
Кто сейчас подключен к PostgreSQL
-
Очередь запросов и ошибки
Что у нас в архитектуре:
-
Zabbix — классический мониторинг (серверов, сетей)
-
Prometheus — современный мониторинг (контейнеров, микросервисов)
-
Grafana — универсальный "пульт управления" для всего этого
Так как снова предыдущего стенда под рукой нет, я собрал новый на docker контейнерах благодаря docker compose из предыдущей статьи. Предварительно настроил связь Zabbix, создал элементы данных и триггеры все по аналогии с предыдущей статье для машины entnet-21.
- entnet-21 (на нем docker контейнеры zabbix, grafana, postgresql, prometheus, node-exporter, cadvisor, postgres-exporter)
Docker контейнеры:
- 1) zabbix-db (База данных postgresql для Zabbix)
- 2) grafana-db (База данных postgresql для Grafana)
- 3) zabbix-server (отдельно контейнер с zabbix-server)
- 4) zabbix-web (отдельно контейнер с web для zabbix)
- 5) grafana (сервер grafana)
- 6) prometheus (сервер мониторинга своего рода Zabbix)
- 7) node-exporter (контейнер датчик по сбору информации с сервера)
- 8) cadvisor (контейнер по сбору информации о docker контейнерах)
- 9) postgres-exporter (контейнер который смотрит за базой данных postgres)
Приложу свой docker compose (может кому пригодиться) (Zabbix + Postgres + Grafana + Postgres)
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:
Восстановление дашборда zabbix из json файла
Теперь представим ситуацию, мы случайно удалили дашборд zabbix или переехали на новый сервер, да все что угодно может случиться, то не уж то все заново рисовать? Что же нам тогда делать? Если вы сохранили дашборд в виде json, как показывал это ранее (что можно сохранить его в два клика), то восстановить не составит труда.
Открываем наш чистый дашборд

Нажимаем New -> Import

Откроется страница с импортом. Тут можно: перетащить сюда файл с json, вставить код с json, ввести id дашборда и скачать его с grafana в интернете (об этом чуть позже по статьей дальше). Мы же выберем json файл с нашего устройства.

Выбираем наш json файл


Он сам подставил название и id нашего дашборда, а теперь нажимаем Import.

Отлично, наш дашборд восстановлен! То что No data - это хорошо, у нас же сейчас новый zabbix сервер и новые машины в стенде, по этому он не знает наш zabbix и хосты. В моем случае нужно просто указать новые связи и все заработает, чем мы и займемся.
Каждый блок нужно отредактировать и указать новые связи с zabbix и хостом из стенда.


Видим что Host у нас entnet-s03, но у нас доступа сейчас к нему нет и по этому нам нужно переделать под entnet-21.

Выбираем нашу хост машину

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


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

На этом наше восстановление завершено. Если бы у нас в сети был действующий сервер и мы не пересоздавали его заново, то восстановление прошло бы в два клика. Но в данном примере, мы рассмотрели более интересную ситуацию.
В качестве бонуса, я создам еще один элемент данных для отображения использования объема оперативной памяти, чтобы отслеживать сколько ее занято контейнерами и прочее. По умолчанию zabbix не предоставляет этих данных.
Проверим память с помощью утилиты free.
free -h

Видим, что занято 2,7 ГиБ. Давайте будем их парсить с помощью grep и awk, а данные будем получать не в h (человекочитаемый формат), а в байтах b (чтобы заббикс легко их мог понимать).

Создаем кастомный элемент, как мы делали это в предыдущей статье. Я опущу создание элемента на zabbix, там все по умолчанию, как делали ранее. P.s.: незабываем обновить соединения zabbix с grafana через раздел Connection, иначе мы не будем видеть созданный нами элемент, так как синхронизация проходит через несколько минут или часов. Заходим в соединения с zabbix и в самом низу снова нажимаем connect. Так мы обновим наши связи и grafana увидит новый элемент.

Я создал дубликат блока с озу и изменил под данные ram.used. Получилась вот такая картина, теперь я вижу сколько оперативной памяти у меня задействовано в данный момент.
Создание контейнеров для работы с prometheus
Приложу свой docker compose prometheus (незабываем менять на свои данные) (prometheus + node-exporter + cadvisor + postgres-exporter)
Создаем файл и записываем в него наш compose файл.
vim docker-compose-prometheus.yml
services:
prometheus:
image: prom/prometheus:v2.54.1
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=15d'
- '--web.enable-lifecycle'
networks:
- monitoring-net
restart: unless-stopped
node-exporter:
image: prom/node-exporter:v1.8.2
container_name: node-exporter
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
networks:
- monitoring-net
restart: unless-stopped
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.49.1
container_name: cadvisor
ports:
- "8081:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
networks:
- monitoring-net
restart: unless-stopped
postgres-exporter:
image: prometheuscommunity/postgres-exporter:v0.15.0
container_name: postgres-exporter
ports:
- "9187:9187"
environment:
DATA_SOURCE_NAME: "postgresql://zabbix:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. .0.3:5432/zabbix?sslmode=disable"
networks:
- monitoring-net
restart: unless-stopped
networks:
monitoring-net:
driver: bridge
external: true
name: "grafanazabbix_monitoring-net"
volumes:
prometheus_data:
Данный конфиг из коробки будет работать только с предыдущей связкой контейнеров zabbix + grafana, если вы поднимали не в контейнере или с другими портами и данными, то их необходимо указать в этом конфиге. Здесь прописаны названия и сеть контейнеров zabbix + grafana. Так же, рядом с этим конфигом должен лежать конфиг для prometheus.
Как вы могли заметить, в конфиге я указываю ip адрес докер контейнера, а так же учетную запись и пароль от базы данных zabbix.
postgres-exporter:
image: prometheuscommunity/postgres-exporter:v0.15.0
container_name: postgres-exporter
ports:
- "9187:9187"
environment:
DATA_SOURCE_NAME: "postgresql://zabbix:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. .0.3:5432/zabbix?sslmode=disable"
networks:
- monitoring-net
restart: unless-stopped
Чтобы узнать внутренний ip адрес контейнера, я использовал команду
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' grafanazabbix-zabbix-db-1

Теперь создаем конфиг для prometheus
vim prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
- job_name: 'postgres'
static_configs:
- targets: ['postgres-exporter:9187']
Так как я использую контейнеры, я пишу название контейнера и его порт, если у вас на серверах эти сервисы, то вы указываете IP и порт.

Теперь пойдем собирать контейнеры. Так как я уже использую docker compose для zabbix и grafana, я создал отдельный файл с другим названием и при запуске docker compose, через ключ -f нужно указать файл с другим названием.
docker compose -f docker-compose-prometheus.yml up -d

Снова создаем пустой дашборд и выбираем импортировать, как говорилось ранее

В поле "Find and import dashboards for common applications..." вводим ID дашборда и нажимаем кнопу справа Load.
Вводим ID который ниже:
- 1860

Node Exporter (смотрит за сервером)
Что делает: Следит за состоянием самого компьютера (хоста), на котором всё запущено.
Аналогия: Это датчик, который прилепили к нашему системному блоку. Он измеряет температуру процессора, обороты кулеров, сколько оперативки свободно, не забит ли жесткий диск.
Зачем нужен: Чтобы мы знали, не перегревается ли наш сервер, не закончилось ли место на диске, не пора ли добавить оперативной памяти.

Отлично, как мы видим, мы лишь указали id дашборда и он уже загрузил готовый шаблон. Осталось сообщить ему источник данных. Но мы его еще не создали. Давайте сначала проверим, собирает ли наш prometheus что нибудь.
Перехожу в браузере по localhost:9090 - это контейнер с prometheus.

Видим, что prometheus собирает успешно метрики с других контейнеров. Отлично, значит пойдем добавлять новое соединение на grafana.

Находим prometheus, выбираем его и указываем наш контейнер.

После успешного добавления, возвращаемся на дашборд node exporter и выбираем источник Datasource (наш созданный prometheus соединение). Если все сделали правильно, то данные автоматически появятся.

Данные пошли появляться. Если опустить дашборд ниже, то видим, что тут очень много всего. Что душе угодно можно отслеживать. Каждый чих виден 😀


Мы видим, что нам не обязательно иметь zabbix (если нужно мониторить пару машин), мы можем собирать данные непосредственно с конкретного сервера.
Теперь создадим другой дашборд по мониторингу docker на нашем хосте entnet-21.
Создаем новый дашборд и выбираем снова Import.
Вводим ID который ниже:
- 14282
cAdvisor (смотрит за Docker-контейнерами)
Что делает: Следит за тем, что происходит внутри каждого работающего контейнера.
Аналогия: Представим, что каждый контейнер — это отдельная квартира в многоквартирном доме. cAdvisor — это управляющий, который ходит и смотрит, сколько каждая квартира жрет электричества, воды и не засорила ли трубу.
Зачем нужен: Чтобы видеть, какой конкретно контейнер нагружает систему больше всего и не пора ли его перезапустить.


Теперь создадим другой дашборд по мониторингу базы данных postgres.
Создаем новый дашборд и выбираем снова Import.
Вводим ID который ниже:
- 9628
Postgres Exporter (смотрит за базой данных)
Что делает: Подключается к PostgreSQL (в нашем случае к базе Zabbix) и вытаскивает оттуда статистику.
Аналогия: Это такой "шпион", который сидит внутри базы данных и регулярно докладывает: сколько сейчас запросов выполняется, кто подключился, нет ли медленных и проблемных запросов, всё ли хорошо с базой.
Зачем нужен: Чтобы мы знали, не "легла" ли база, не пора ли создать индексы, и почему вдруг всё начало тормозить.

При импорте можем сразу указать источник prometheus.


Есть еще один дашборд для postgres
Создаем новый дашборд и выбираем снова Import.
Вводим ID который ниже:
- 14114


Как они взаимодействуют (коротко):
-
Node Exporter стучит в железо сервера
-
cAdvisor стучит в Docker
-
Postgres Exporter стучит в базу данных
-
Все они отдают данные контейнеру Prometheus
-
Prometheus эти данные складывает к себе на склад
-
А уже Grafana (из первого файла docker compose) приходит на склад Prometheus, забирает данные и рисует красивые графики
Подведем небольшой итог:
Мы научились устанавливать grafana-server, настраивать связь с базой данных postgres, настраивать связь с zabbix-server и забирать от туда данные, научились восстанавливать дашборды, а так же использовать уже готовые в связке с prometheus. Как вы понимаете, это лишь малая часть, что можно сделать. Можно комбинировать и выводить разные вещи. Это очень мощный инструмент мониторинга, а в стеке с zabbix, prometheus дает неплохой такой прирост в мониторинге. При грамотно настроенной системе мониторинга, вы всегда будете в курсе событий в своей инфраструктуре. Как пример, на prometheus можно настроить loki и promtail (локи собирает логи с сервера, а promtail их собирает в метрики и передает в prometheus), тем самым нам не нужно заходить на сервер и смотреть логи на нем, мы можем зайти в grafana и прямо в дашборде прочесть логи, пропарсить и найти ошибку или событие через поисковик в реальном времени. Если еще добавить alertmanager, то вы будете в курсе поломки прежде, чем пользователи поймут, что что-то сломалось.
Удачи в настройке своего grafana на стероидах под соусом трех богатырей (Grafana, Zabbix, Prometheus) 😉

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