Яндекс

Стек Grafana: Zabbix, Prometheus, Grafana

Универсальный мониторинг в Docker: Zabbix, Prometheus, Grafana

(4 Votes)

Универсальный мониторинг в 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

Как они взаимодействуют (коротко):

  1. Node Exporter стучит в железо сервера

  2. cAdvisor стучит в Docker

  3. Postgres Exporter стучит в базу данных

  4. Все они отдают данные контейнеру Prometheus

  5. Prometheus эти данные складывает к себе на склад

  6. А уже Grafana (из первого файла docker compose) приходит на склад Prometheus, забирает данные и рисует красивые графики


Подведем небольшой итог:

Мы научились устанавливать grafana-server, настраивать связь с базой данных postgres, настраивать связь с zabbix-server и забирать от туда данные, научились восстанавливать дашборды, а так же использовать уже готовые в связке с prometheus. Как вы понимаете, это лишь малая часть, что можно сделать. Можно комбинировать и выводить разные вещи. Это очень мощный инструмент мониторинга, а в стеке с zabbix, prometheus дает неплохой такой прирост в мониторинге. При грамотно настроенной системе мониторинга, вы всегда будете в курсе событий в своей инфраструктуре. Как пример, на prometheus можно настроить loki и promtail (локи собирает логи с сервера, а promtail их собирает в метрики и передает в prometheus), тем самым нам не нужно заходить на сервер и смотреть логи на нем, мы можем зайти в grafana и прямо в дашборде прочесть логи, пропарсить и найти ошибку или событие через поисковик в реальном времени. Если еще добавить alertmanager, то вы будете в курсе поломки прежде, чем пользователи поймут, что что-то сломалось.

Удачи в настройке своего grafana на стероидах под соусом трех богатырей (Grafana, Zabbix, Prometheus) 😉

Добавить комментарий

Будьте взаимовежливы и корректны.

Все сообщения проходят премодерацию.

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


На развитие проекта

Вход
hacklink serp takip teknik seo rehberi icerik optimizasyonu yerel seo google algoritma guncellemeleri backlink stratejileri backlink nedir dofollow nofollow backlink guest post backlink anchor text optimizasyonu broken link building core web vitals seo schema markup site hizi optimizasyonu mobile first indexing xml sitemap robots txt seo uyumlu icerik anahtar kelime arastirmasi eeat google kalite google analytics seo rakip analizi seo seo raporlama metrikleri google my business seo yerel arama siralama hacklink panel jojobet matbet matbet matbet holiganbet holiganbet güncel Holiganbet güncel giriş Jojobet Jojobet giriş Jojobet güncel Jojobet Güncel Giriş Jojobet Telegram meritking meritking Jojobet Pusulabet matbet jojobet Jojobet Jojobet giriş Jojobet güncel Jojobet Güncel Giriş Jojobet Telegram Jojobet Telegram giriş Jojobet Telegram güncel роуминг МТС в Дубае jojobet Casibom Casibom giriş Casibom güncel Casibom Casibom giriş Casibom güncel Casibom Casibom giriş Casibom güncel Casibom Casibom giriş Casibom güncel Casibom Casibom giriş Casibom güncel jojobet giriş jojobet jojobet jojobet galabet giriş galabet Casibom Casibom giriş Casibom güncel Casibom Casibom giriş Casibom güncel Casibom Casibom giriş Casibom güncel Casibom Casibom giriş Casibom güncel matbet matbet matbet matbet matbet matbet matbet matbet matbet kavbet kavbet kavbet betebet interbahis interbahis kingroyal kingroyal kingroyal kingroyal kingroyal interbahis kingroyal interbahis interbahis kingroyal Casibom Casibom giriş Casibom güncel kingroyal kingroyal giriş jojobet Meritking Meritking giriş Meritking güncel Holiganbet Holiganbet giriş Holiganbet güncel Jojobet Jojobet giriş Jojobet güncel Betebet Betebet giriş Betebet güncel holiganbet Holiganbet Holiganbet giriş Holiganbet güncel Holiganbet Holiganbet giriş Holiganbet güncel Holiganbet Holiganbet giriş Holiganbet güncel Holiganbet Holiganbet giriş Holiganbet güncel Holiganbet Holiganbet giriş Holiganbet güncel interbahis kingroyal piabet Holiganbet Holiganbet giriş Holiganbet güncel betlike betticket meritking meritking giriş meritking mobil adres meritking güncel betebet betebet nesinecasino nesinecasino giriş nesinecasino güncel Piabellacasino Piabellacasino giriş Piabellacasino güncel Bahiscasino Bahiscasino giriş Bahiscasino güncel Timebet Timebet giriş Timebet güncel Betebet Betebet giriş Betebet güncel Betebet Betebet giriş Betebet güncel grandpashabet Betasus Betasus giriş Betasus güncel marsbahis