У тебя есть метрики? Дай! Или мониторинг с помощью Prometheus и Grafana за 5 минут
Теорию о пользе и важности мониторинга я опущу. Расскажу на практике: утечка трафика, которую я случайно обнаружил в январе - с монторингом не случилась бы в принципе. Мониторинг может рассылать уведомления о превышении каких-то параметров, а расследование причин в моем конкретном случае заняло бы пару минут, а не часов.
TL:DR
- Устанавливаем docker и docker compose.
- Скачиваем из репозитория Github конфигурационные файлы и изменяем их под свою сеть
- Выполняем комманду
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.
Скачиваем конфигурационные файлы
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
Выбираем, откуда графана будет брать данные - наш источник
Адреc нашего Prometheus
указываем http://prometheus:9090
докер понимает написание адреса в таком виде
Внизу страницы нажимем Save & test
Дашборды
Источник данных настроили, перейдем к самой красоте - графикам.
Вообще Prometheus
и сам может рисовать графики без графаны. Плюс графаны в данном случае - огромный выбор уже готовых наборов графиков (дашбордов), которые достаточно импортировать в свою конфигурацию.
Выберем на сайте самый популярный дашборд
Откроем импорт дашборда в нашей графане
вставим скопированный 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 руб. Поздравляю, вы только что сэкономили эту сумму.