<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Истории успеха наших клиентов — лучшие проекты
Вход / Регистрация

Как настроить алерты в Alertmanager с доставкой в Telegram

17
10 минут чтения
Средний рейтинг статьи: 5

В современном мире IT-инфраструктура редко состоит из одного-двух серверов. Даже небольшой проект сегодня может включать в себя десятки виртуальных машин, контейнеров, баз данных, балансировщиков нагрузки и микросервисов. Чем сложнее система — тем выше вероятность сбоев, причем они могут происходить в самый неподходящий момент: ночью, в выходные или во время важного релиза.

Мониторинг IT-инфраструктуры и приложений играет важную роль при возникновении сбоев. Простого сбора метрик и красивых графиков уже недостаточно. Необходимо также оперативно получать уведомления при их возникновении. Для таких целей существует Alertmanager — отдельный компонент экосистемы Prometheus, который берет на себя всю логику работы с уведомлениями:

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

Сегодня мы рассмотрим настройку алертов при помощи Alertmanager и их отправку в Telegram-канал.

В результате вы получите готовое, проверенное и легко масштабируемое решение, которое можно сразу использовать в боевой среде — будь то несколько виртуальных машин в облаке или целая Kubernetes-среда из сотен нод.

Предварительные требования

Для работы нам понадобятся:

  • Два облачных сервера с дистрибутивом Linux Ubuntu 24.04.

  • Установленные Docker и Docker Compose на одном из серверов. 

  • Telegram-бот и канал — ниже расскажем, как их создать.

Для серверов выберите конфигурацию с одноядерным процессором, 1 ГБ оперативной памяти, 15 ГБ места на NVMe-диске и публичным IPv4-адресом, который можно заказать при создании сервера или в разделе «Сеть».

Серверы будет установлены в течение пары минут. IPv4-адрес, логин и пароль для подключения по протоколу SSH будут доступны в разделе «Дашборд» для каждого из серверов.

Описание Alertmanager

Alertmanager — это компонент с открытым исходным кодом, который работает с уведомлениями, созданными клиентами, например, Prometheus. Его основная цель — принимать, обрабатывать и отправлять уведомления об алертах (оповещениях) конечным получателям.

По умолчанию Alertmanager умеет отправлять уведомления на адрес электронной почты, а также в Slack, PagerDuty, OpsGenie и множество других систем. Однако один из самых популярных и удобных методов для получения уведомлений — это Telegram. Получать уведомления можно прямо в чат или группу; дополнительно поддерживаются языки разметки Markdown и HTML.

Создание бота в Telegram

Прежде чем приступать к настройке Alertmanager, создадим бота и канал в Telegram.

1) Открываем бота BotFather.

2) Отправляем команду /newbot для создания нового бота:

Image6

3) Необходимо задать название для бота. Назовем его Server_alerts_bot:

Image8

4) Далее необходимо придумать юзернейм для бота, который должен заканчиваться на _bot, например: vm_alert_bot:

Image14

Сохраняем API-токен, он нам понадобится для дальнейшей настройки.

Создание канала в Telegram

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

1) Чтобы создать новый канал в Telegram, нажимаем на кнопку «New Channel»:

Image2

2) Придумаем название, например, Alerts_From_VM:

Image7

3) Далее выбираем тип канала — приватный (Private Channel):

Image17

4) После того как канал был создан, переходим в его настройки и нажимаем на кнопку с администраторами канала:

Image11

5) Нам нужно добавить нашего бота с правами администратора. Для этого нажимаем на кнопку «Add Administrator»:

Image4

6) При помощи поиска находим нашего бота:

Image12

7) Для добавления бота необходимо сначала нажать на кнопку «OK»:

Image13

Далее нажимаем на кнопку «Save»:

Image10

Мы успешно создали бота и канал. Далее мы произведем настройку компонентов Prometheus и Alertmanager, а также подключим наш Telegram-канал.

Установка Node Exporter

Node Exporter — это легкий демон, который собирает данные о загрузке процессора, оперативной памяти, дисков, сетевых интерфейсов и других параметрах системы и отдает их по HTTP (по умолчанию порт 9100).

Подключаемся к серверу с которого будем собирать метрики. Все команды, перечисленные ниже, необходимо выполнять от имени пользователя root или от имени обычного пользователя с правами sudo.

1) Скачиваем нужную версию программы (на момент написания актуальна 1.10.2):

wget https://github.com/prometheus/node_exporter/releases/download/v1.10.2/node_exporter-1.10.2.linux-amd64.tar.gz

2) Распаковываем полученный архив:

tar -xvf node_exporter-1.10.2.linux-amd64.tar.gz

3) Заходим в появившуюся папку и копируем бинарный файл в общесистемную директорию:

cd node_exporter-1.10.2.linux-amd64/ && mv node_exporter /usr/local/bin/

4) Создаем отдельного системного пользователя, от имени которого будет работать экспортер:

useradd --no-create-home --shell /sbin/nologin node_exporter

5) Назначаем правильные права на исполняемый файл:

chown root:root /usr/local/bin/node_exporter

6) Создаем 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

7) Применяем изменения и запускаем службу:

systemctl daemon-reload && systemctl start node_exporter

8) Проверяем статус (должен быть active (running)):

systemctl status node_exporter

Node Exporter успешно установлен и работает.

Настройка и запуск Prometheus и Alertmanager

Подключаемся к серверу, на котором мы будем запускать Prometheus и Alertmanager.

1) Создаем новую директорию для проекта, где будут храниться файлы Prometheus и Alertmanager, и переходим в нее:

mkdir monitoring && cd monitoring

2) Создаем конфигурацию для Alertmanager:

nano alertmanager.yml

Пример рабочей конфигурации с отправкой уведомлений в 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. Для этого необходимо открыть канал и в строке поиска скопировать значение:

Image9

Обратите внимание, что ID канала содержит знак минус, который должен обязательно присутствовать в параметре chat_id.

3) Конфигурация Prometheus:

nano prometheus.yml

Используем следующее содержимое:

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 можно указать любое другое значение, которое будет обозначать ваш сервер.

4) Далее создадим правило для оповещений с именем vm-availability, которое будет проверять, доступна ли виртуальная машина или она выключена. Если ответ не будет получен, то придет алерт о недоступности:

nano alerts.yml
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 }}"

5) Следующим шагом создадим шаблон для сообщений, которые мы будем получать в Telegram-канале. Создаем новую директорию templates и переходим в нее:

mkdir templates && cd templates

6) Создаем файл шаблона:

nano telegram.tmpl

Со следующим содержимым:

{{ 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 }}

В шаблоне будет имя события, которое возникло, а также, описание, статус и время возникновения проблемы.

7) 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

8) Запускаем контейнеры:

docker compose up -d

9) Проверим статус алерта и второго сервера. Открываем веб-интерфейс Prometheus, используя внешний IP-адрес сервера и порт 9090. Перейдем в раздел Alerts. Как можно увидеть на скриншоте ниже, ранее созданный алерт отображается в системе и на данный момент он не активен, так как условие его срабатывания еще не наступило:

Image3

Проверка работоспособности Alertmanager

1) Сымитируем ситуацию:

systemctl stop node_exporter.service

Спустя 10 секунд будет отправлено уведомление в Telegram-канал:

Image1

Если проблема не будет решена, то повторное напоминание будет приходить раз в час.

2) «Устраняем» проблему. Для этого запускаем Node Exporter:

systemctl start node_exporter.service

Спустя 20 секунд будет получено уведомление о решении проблемы:

Image5

Заключение

Мы прошли полный путь от создания Telegram-бота и канала до запуска полноценной системы алертинга на базе Prometheus и Alertmanager с оперативной отправкой уведомлений прямо в Telegram.

Мы получили надежную, полностью открытую и бесплатную систему мониторинга (за исключением стоимости инфраструктуры), которая обладает рядом важных преимуществ:

  • Мгновенное оповещение — уведомления попадают прямо в мессенджер, которым вы и ваша команда пользуетесь каждый день. Никаких пропущенных писем и проверок дашбордов.

  • Гибкая настройка — включая уровни критичности и описание возникших проблем.

  • Масштабируемость — для добавления новых серверов или сервисов требуется лишь добавить их в конфигурационный файл и, при необходимости, создать новые правила.

  • Доступность — не требует дополнительных затрат, не считая затрат на свою инфраструктуру.

Теперь ваша система не просто собирает метрики, а активно помогает поддерживать стабильность сервисов, своевременно информируя вас о возникающих проблемах.

17
10 минут чтения
Средний рейтинг статьи: 5
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
Пока нет комментариев