Публикация

У тебя есть метрики? Дай! Или мониторинг с помощью Prometheus и Grafana за 5 минут

Теорию о пользе и важности мониторинга я опущу. Расскажу на практике: утечка трафика, которую я случайно обнаружил в январе - с монторингом не случилась бы в принципе. Мониторинг может рассылать уведомления о превышении каких-то параметров, а расследование причин в моем конкретном случае заняло бы пару минут, а не часов.

TL:DR

  1. Устанавливаем docker и docker compose.
  2. Скачиваем из репозитория Github конфигурационные файлы и изменяем их под свою сеть
  3. Выполняем комманду sudo docker compose up -d
  4. Устанавливаем на узлы Node exporter

Подробнее

Общая схема

  • На устройстве, которое мы хотим мониторить, запускается сервис по сбору различной телеметрии (использование ЦП, памяти, сети и пр.)
  • Эта информация предается на центральный узел, где собирается и хранится в базе данных
  • Grafana берет данные из этой базы и рисует нам красивые графики

Вариантов реализации много, я использовал два, а подробно разберу один:

  1. Telegraf ---> InfluxDB <--- Grafana В данном варианте, на клиенты устанавливается программа Telegraf - она собирает данные и отправляет на центральный узел. На центральном узле используется база данных InfluxDB, куда прилетают метрики от Telegraf’a, а также откуда берет данные графана для построения графиков. Старое и проверенное решение, но мониторить получиться компьютеры, на которые можно установить Telegraf.

  2. Node exporter <--- Prometheus <--- Grafana Более современное решение, его и разберу подробнее. В качестве сборщика данных используется сервис Prometheus. На узлах, которые мы собираемся мониторить - устанавливается программа Node exporter. Отличие от первого варианта Node exporter собирает , но не отправляет метрики на центральный узел. Prometheus сам опрашивает узлы, согласно настройке в конфиг-файле. Графана в первом и во втором случае работает одинаково - она берет данные из центральной базы.

Докер

Делать будем все в контейнерах докера - самый простой и быстрый способ. Для этого нам понадобится сам docker и docker compose.

Скачиваем конфигурационные файлы

1
2
3
4
5
6
7
mkdir -p prometheus/{config,snmp_exporter}
cd prometheus
wget https://raw.githubusercontent.com/andrey-dvur/Scripts/main/Prometheus-Grafana/docker-compose.yml
cd config
wget https://raw.githubusercontent.com/andrey-dvur/Scripts/main/Prometheus-Grafana/config/prometheus.yml
cd ../snmp_exporter
wget https://raw.githubusercontent.com/prometheus/snmp_exporter/snmp.yml

Что же мы скачали:

  • файл docker-compose.yml описывает какие докер контейнеры и с какими параметрами мы будем запускать. На начальном этапе это два контейнера - Prometheus и Grafana.
  • в папку config скачался файл настроек prometheus.yml
  • про файл snmp.yml в папке snmp_exporter расскажу чуть ниже

Указываем в файле prometheus.yml узлы, которые будем мониторить

1
2
3
4
5
6
7
8
9
10
#########  HOMELAB ######################
  - job_name: 'node.A' # Имя узла
    static_configs:
      - targets: ['192.168.88.51:9100'] # hostname/ip-адрес узла, порт 9100 - стандартный для node-exporter
  - job_name: 'node.B'
    static_configs:
      - targets: ['192.168.88.52:9100']
  - job_name: 'node.C'
    static_configs:
      - targets: ['192.168.88.53:9100']

Тут используется синтаксис YAML, поэтому, да, важно количество пробелов-отступов

Переходим в папку prometheus, где находится наш файл docker-compose.yml и запускаем наши контейнеры

1
sudo docker compose up -d

Ждем запуска обоих контейнеров, после этого открываем браузер, вбиваем ip-адрес нашего сервера, на ктором мы только что запустили контейнеры и порт графаны: 3000.

Базовые настройки

http://ip-адрес:3000

Начальные логин/пароль admin/admin

Выбираем, откуда графана будет брать данные - наш источник

Выбираем Prometheus

Адреc нашего Prometheus указываем http://prometheus:9090

докер понимает написание адреса в таком виде

Внизу страницы нажимем Save & test

Ожидаем увидеть:

Дашборды

Источник данных настроили, перейдем к самой красоте - графикам.

Вообще Prometheus и сам может рисовать графики без графаны. Плюс графаны в данном случае - огромный выбор уже готовых наборов графиков (дашбордов), которые достаточно импортировать в свою конфигурацию.

Выберем на сайте самый популярный дашборд

Скопируем его ID

Откроем импорт дашборда в нашей графане

вставим скопированный ID, жмем Load

Укажем источник данных для этого дашборда - наш, уже сконфигурированный Prometheus

Prometheus и Grafana настроили, осталось на сам узел установить Node exporter

Для этого достаточно скачать бинарный файл, распаковать его и запустить. Все, node-exporter запущен, метрики собираются.

Результат достигнут

Node exporter <--- Prometheus <--- Grafana

На узле запущен Node exporter, с него собирает данные Prometheus, а уже из него берет информацию Grafana и отображает в импортированном дашборде.

Дополнения

Помимо Node exporter - у Prometheus огромный выбор и других экспортеров и интеграций. Можно мониторить базы данных, файловые системы, системы логирования и пр.

Например, в нашем файле docker-compose.yml есть сревис cadvisor, он собирает данные по докер контейнерам.

Раскомментируем соответствующую часть

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    ports:
    - 8080:8080
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
    depends_on:
    - redis
  redis:
    image: redis:latest
    container_name: redis
    ports:
    - 6379:6379

Добавим настройки в конфиг-файл prometheus.yml

1
2
3
4
5
  - job_name: cadvisor
    scrape_interval: 5s
    static_configs:
    - targets:
      - cadvisor:8080

Перезапустим наши контейнеры

1
sudo docker compose down
1
sudo docker compose up -d

В этот раз скачаются и запустятся еще два контейнера - cadvisor и redis

Импортируем дашборд для мониторинга контейнеров - например дашборд с ID 179

Теперь мы можем наблюдать статистику по нашим контейнерам. Сколько каждый контейнер использует памяти или потребляет трафика.

SNMP

Хорошо, а что делать с оборудованием на которое лишнего ничего не поставить, роутеры или старые Synology - используем SNMP.

Для примера возьмем роутер Mirkotik, активируем в нем службу SNMP

WebFig ---> IP ---> SNMP ---> Enabled

В нашем файле docker-compose.yml есть контейнер snmp_exporter, он будет собирать данные по SNMP и преобразовавать их в информацию, понятную Prometheus.

Раскомментируем соответствующую часть

1
2
3
4
5
6
7
8
9
10
  snmp_exporter:
    image: prom/snmp-exporter
    container_name: snmp_exporter
    restart: unless-stopped
    volumes:
      - ./snmp_exporter/:/etc/snmp_exporter/
    ports:
      - "9116:9116"
    depends_on:
      - prometheus

Первая буква в SNMP означает Simple - Простой, хотя ничего простого в этом протоколе нет. Каждый производитель использует свои наборы для управления объектами (MIB). В нашем случае мы будем использовать базу, которая подойдет для большинства случаев. Это тот самый файл snmp.yml в папке snmp_exporter, о котором я не рассказал в самом начале.

Добавим настройки в конфиг-файл prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  - job_name: 'mikrotik'
    static_configs:
      - targets:
        - 192.168.88.1 # mikrotik_ip
    metrics_path: /snmp
    params:
      module: [mikrotik]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: snmp_exporter:9116

Перезапустим наши контейнеры

1
sudo docker compose down
1
sudo docker compose up -d

Скачается и запустится еще контейнер - snmp_exporter

Импортируем дашборд для мониторинга контейнеров - мне понравился дашборд с ID 14420

Mikrotik

А еще

Можно создавать свои графики и настраивать уведомления о событиях. Процесс улучшайзинга графаны - бесконечен.

Заключение

Пока создавал статью наткнулся на курсы по grafana/prometheus - стоимостью 20 000 руб. Поздравляю, вы только что сэкономили эту сумму.

Публикация защищена лицензией CC BY 4.0 .