Теорию о пользе и важности мониторинга я опущу. Расскажу на практике: утечка трафика, которую я случайно обнаружил в январе - с монторингом не случилась бы в принципе. Мониторинг может рассылать уведомления о превышении каких-то параметров, а расследование причин в моем конкретном случае заняло бы пару минут, а не часов.
TL:DR
- Выполняем комманду sudo docker compose up -d
- Устанавливаем на узлы Node exporter
Подробнее
Общая схема
- На устройстве, которое мы хотим мониторить, запускается сервис по сбору различной телеметрии (использование ЦП, памяти, сети и пр.)
- Эта информация предается на центральный узел, где собирается и хранится в базе данных
- Grafana берет данные из этой базы и рисует нам красивые графики
Вариантов реализации много, я использовал два, а подробно разберу один:
- Telegraf ---> InfluxDB <--- Grafana. В данном варианте, на клиенты устанавливается программа Telegraf - она собирает данные и отправляет на центральный узел. На центральном узле используется база данных InfluxDB, куда прилетают метрики от Telegraf’a, а также откуда берет данные графана для построения графиков. Старое и проверенное решение, но мониторить получиться компьютеры, на которые можно установить Telegraf.
- Node exporter <--- Prometheus <--- Grafana. Более современное решение, его и разберу подробнее. В качестве сборщика данных используется сервис Prometheus. На узлах, которые мы собираемся мониторить - устанавливается программа Node exporter. Отличие от первого варианта Node exporter собирает , но не отправляет метрики на центральный узел. Prometheus сам опрашивает узлы, согласно настройке в конфиг-файле. Графана в первом и во втором случае работает одинаково - она берет данные из центральной базы.
Докер
Делать будем все в контейнерах докера - самый простой и быстрый способ. Для этого нам понадобится сам docker и docker compose.
Скачиваем конфигурационные файлы
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 узлы, которые будем мониторить
######### 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, поэтому, да, важно количество пробелов-отступов, не копируйте вставки отсюда - ориентируйтесь на файлы с GitHub или оригинал статьи.
Переходим в папку prometheus, где находится наш файл docker-compose.yml и запускаем наши контейнеры
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, он собирает данные по докер контейнерам.
Раскомментируем соответствующую часть
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
- job_name: cadvisor
scrape_interval: 5s
static_configs:
- targets:
- cadvisor:8080
Перезапустим наши контейнеры
sudo docker compose down
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.
Раскомментируем соответствующую часть
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
- 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
Перезапустим наши контейнеры
sudo docker compose down
sudo docker compose up -d
Скачается и запустится еще контейнер - snmp_exporter
Импортируем дашборд для мониторинга контейнеров - мне понравился дашборд с ID 14420
Mikrotik
А еще
Можно создавать свои графики и настраивать уведомления о событиях. Процесс улучшайзинга графаны - бесконечен.
Заключение
Пока создавал статью наткнулся на курсы по grafana/prometheus - стоимостью 20 000 руб. Поздравляю, вы только что сэкономили эту сумму.