Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Предварительные требования
Для работы нам понадобятся:
-
Два облачных сервера с дистрибутивом Linux Ubuntu 24.04.
-
Установленные Docker и Docker Compose на одном из серверов.
-
Telegram-бот и канал — ниже расскажем, как их создать.
Два облачных сервера с дистрибутивом Linux Ubuntu 24.04.
Установленные Docker и Docker Compose на одном из серверов.
Telegram-бот и канал — ниже расскажем, как их создать.
Для серверов выберите конфигурацию с одноядерным процессором, 1 ГБ оперативной памяти, 15 ГБ места на NVMe-диске и публичным IPv4-адресом, который можно заказать при создании сервера или в разделе «Сеть».
Серверы будет установлены в течение пары минут. IPv4-адрес, логин и пароль для подключения по протоколу SSH будут доступны в разделе «Дашборд» для каждого из серверов.
Alertmanager — это компонент с открытым исходным кодом, который работает с уведомлениями, созданными клиентами, например, Prometheus. Его основная цель — принимать, обрабатывать и отправлять уведомления об алертах (оповещениях) конечным получателям.
По умолчанию Alertmanager умеет отправлять уведомления на адрес электронной почты, а также в Slack, PagerDuty, OpsGenie и множество других систем. Однако один из самых популярных и удобных методов для получения уведомлений — это Telegram. Получать уведомления можно прямо в чат или группу; дополнительно поддерживаются языки разметки Markdown и HTML.
Прежде чем приступать к настройке Alertmanager, создадим бота и канал в Telegram.
-
Открываем бота BotFather.
-
Отправляем команду
/newbotдля создания нового бота: -
Необходимо задать название для бота. Назовем его
Server_alerts_bot: -
Далее необходимо придумать юзернейм для бота, который должен заканчиваться на
_bot, например:vm_alert_bot:
Сохраняем API-токен, он нам понадобится для дальнейшей настройки.
Создание канала в Telegram
Далее создадим канал, в который будут отправляться сообщения с алертами.
-
Чтобы создать новый канал в Telegram, нажимаем на кнопку «New Channel»:
-
Придумаем название, например,
Alerts_From_VM: -
Далее выбираем тип канала — приватный (Private Channel):
-
После того как канал был создан, переходим в его настройки и нажимаем на кнопку с администраторами канала:
-
Нам нужно добавить нашего бота с правами администратора. Для этого нажимаем на кнопку «Add Administrator»:
-
При помощи поиска находим нашего бота:
-
Для добавления бота необходимо сначала нажать на кнопку «OK»:
Далее нажимаем на кнопку «Save»:
Мы успешно создали бота и канал. Далее мы произведем настройку компонентов Prometheus и Alertmanager, а также подключим наш Telegram-канал.
Node Exporter — это легкий демон, который собирает данные о загрузке процессора, оперативной памяти, дисков, сетевых интерфейсов и других параметрах системы и отдает их по HTTP (по умолчанию порт 9100).
Подключаемся к серверу с которого будем собирать метрики. Все команды, перечисленные ниже, необходимо выполнять от имени пользователя root или от имени обычного пользователя с правами sudo.
- Скачиваем нужную версию программы (на момент написания актуальна 1.10.2):
wget https://github.com/prometheus/node_exporter/releases/download/v1.10.2/node_exporter-1.10.2.linux-amd64.tar.gz- Распаковываем полученный архив:
tar -xvf node_exporter-1.10.2.linux-amd64.tar.gz- Заходим в появившуюся папку и копируем бинарный файл в общесистемную директорию:
cd node_exporter-1.10.2.linux-amd64/ && mv node_exporter /usr/local/bin/- Создаем отдельного системного пользователя, от имени которого будет работать экспортер:
useradd --no-create-home --shell /sbin/nologin node_exporter- Назначаем правильные права на исполняемый файл:
chown root:root /usr/local/bin/node_exporter- Создаем systemd-юнит. Открываем файл:
nano /etc/systemd/system/node_exporter.serviceВставляем следующее содержимое:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter- Применяем изменения и запускаем службу:
systemctl daemon-reload && systemctl start node_exporter- Проверяем статус (должен быть
active (running)):
systemctl status node_exporterNode Exporter успешно установлен и работает.
Настройка и запуск Prometheus и Alertmanager
Подключаемся к серверу, на котором мы будем запускать Prometheus и Alertmanager.
- Создаем новую директорию для проекта, где будут храниться файлы Prometheus и Alertmanager, и переходим в нее:
mkdir monitoring && cd monitoring- Создаем конфигурацию для Alertmanager:
Пример рабочей конфигурации с отправкой уведомлений в Telegram:
global:
resolve_timeout: 20s
templates:
- '/etc/alertmanager/templates/*.tmpl'
route:
receiver: telegram
group_by: ['alertname']
group_wait: 10s
receivers:
- name: telegram
telegram_configs:
- api_url: 'https://api.telegram.org'
bot_token: <API_ТОКЕН_БОТА>
chat_id: <ID_КАНАЛА>
message: '{{ template "telegram.message" . }}'В параметрах bot_token и chat_id необходимо указать свои значения:
- bot_token — API-токен бота, который можно получить в настройках бота.
- chat_id — уникальный идентификатор канала (ID). Получить ID можно, переслав сообщение из канала сторонним ботам, например, LeadСonverter, FIND_MY_ID_BOT и т.д. Также ID можно получить из web-версии Telegram. Для этого необходимо открыть канал и в строке поиска скопировать значение:
Обратите внимание, что ID канала содержит знак минус, который должен обязательно присутствовать в параметре chat_id.
- Конфигурация Prometheus:
Используем следующее содержимое:
global:
scrape_interval: 5s
evaluation_interval: 5s
rule_files:
- '/etc/prometheus/alerts.yml'
scrape_configs:
- job_name: 'node-exporter'
static_configs:
- targets: ['103.88.242.50:9100']
labels:
instance_name: 'second-server'
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']Вместо 103.88.242.50 необходимо указать IP-адрес сервера, на который мы ранее установили Node Exporter. Вместо second-server можно указать любое другое значение, которое будет обозначать ваш сервер.
- Далее создадим правило для оповещений с именем
vm-availability, которое будет проверять, доступна ли виртуальная машина или она выключена. Если ответ не будет получен, то придет алерт о недоступности:
groups:
- name: vm-availability
rules:
- alert: VMDown
expr: up{job="node-exporter"} == 0
for: 0s
labels:
severity: 'critical'
annotations:
summary: "Виртуальная машина {{ $labels.hostname }} ({{ $labels.instаncе }}) недоступна!"
description: "Виртуальная машина {{ $labels.hostname }} недоступна или выключена!"
value: "{{ $value }}"- Следующим шагом создадим шаблон для сообщений, которые мы будем получать в Telegram-канале. Создаем новую директорию
templatesи переходим в нее:
mkdir templates && cd templates
{{ define "telegram.message" }}
<b>{{ if eq .Status "firing" }}⚠️ Возникла проблема⚠️{{ else }}✅ Проблема решена ✅{{ end }}</b>
<b>Событие:</b> {{ .CommonLabels.alertname }}
<b>Описание:</b> {{ (index .Alerts 0).Annotations.description }}
<b>Статус:</b> {{ .Status }}
<b>Критичность:</b> {{ .CommonLabels.severity }}
<b>Виртуальная машина:</b> {{ .CommonLabels.instance_name }}
<b>Время начала:</b> {{ (index .Alerts 0).StartsAt.Local.Format "02-01-2006 15:04:05 MST" }}
{{ end }}В шаблоне будет имя события, которое возникло, а также, описание, статус и время возникновения проблемы.
- Docker Compose файл для запуска:
cd /root/monitoring && nano docker-compose.yml
services:
prometheus:
image: prom/prometheus:v3.7.3
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
- ./alerts.yml:/etc/prometheus/alerts.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
- '--web.enable-lifecycle'
ports:
- "9090:9090"
networks:
- monitoring
alertmanager:
image: prom/alertmanager:v0.29.0
container_name: alertmanager
restart: unless-stopped
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- ./templates/:/etc/alertmanager/templates
ports:
- "9093:9093"
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
networks:
- monitoring
networks:
monitoring:
driver: bridge- Проверим статус алерта и второго сервера. Открываем веб-интерфейс Prometheus, используя внешний IP-адрес сервера и порт 9090. Перейдем в раздел Alerts. Как можно увидеть на скриншоте ниже, ранее созданный алерт отображается в системе и на данный момент он не активен, так как условие его срабатывания еще не наступило:
Проверка работоспособности Alertmanager
systemctl stop node_exporter.serviceСпустя 10 секунд будет отправлено уведомление в Telegram-канал:
Если проблема не будет решена, то повторное напоминание будет приходить раз в час.
- «Устраняем» проблему. Для этого запускаем Node Exporter:
systemctl start node_exporter.serviceСпустя 20 секунд будет получено уведомление о решении проблемы:
Мы прошли полный путь от создания Telegram-бота и канала до запуска полноценной системы алертинга на базе Prometheus и Alertmanager с оперативной отправкой уведомлений прямо в Telegram.
Мы получили надежную, полностью открытую и бесплатную систему мониторинга (за исключением стоимости инфраструктуры), которая обладает рядом важных преимуществ:
-
Мгновенное оповещение — уведомления попадают прямо в мессенджер, которым вы и ваша команда пользуетесь каждый день. Никаких пропущенных писем и проверок дашбордов.
-
Гибкая настройка — включая уровни критичности и описание возникших проблем.
-
Масштабируемость — для добавления новых серверов или сервисов требуется лишь добавить их в конфигурационный файл и, при необходимости, создать новые правила.
-
Доступность — не требует дополнительных затрат, не считая затрат на свою инфраструктуру.
Мгновенное оповещение — уведомления попадают прямо в мессенджер, которым вы и ваша команда пользуетесь каждый день. Никаких пропущенных писем и проверок дашбордов.
Гибкая настройка — включая уровни критичности и описание возникших проблем.
Масштабируемость — для добавления новых серверов или сервисов требуется лишь добавить их в конфигурационный файл и, при необходимости, создать новые правила.
Доступность — не требует дополнительных затрат, не считая затрат на свою инфраструктуру.
Теперь ваша система не просто собирает метрики, а активно помогает поддерживать стабильность сервисов, своевременно информируя вас о возникающих проблемах.**
**
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.