Блог / Статьи

Полезная информация для вашего хостинга

Мониторинг серверов с Prometheus и Alertmanager

Мониторинг серверов с Prometheus и Alertmanager: построение системы проактивного наблюдения

Содержание

Раньше системные администраторы узнавали о проблемах на серверах от клиентов: «Сайт не работает!» — такой звонок был сигналом к началу аврала. Сегодня профессионалы используют проактивный мониторинг: система сама обнаруживает аномалии, предсказывает сбои и уведомляет до того, как пользователь заметит проблему.

В основе современного open-source мониторинга лежит стек Prometheus + Alertmanager + Grafana. Это не просто инструменты — это философия наблюдаемости (observability), которая позволяет превратить хаос метрик в понятную картину состояния инфраструктуры.

В этой статье подробно разбирается процесс внедрения полноценной системы мониторинга на базе Prometheus и Alertmanager. Рассмотрены все этапы: от выбора архитектуры до настройки умных алертов и интеграции с Telegram. Всё — с примерами конфигураций, командами и пояснением каждого шага.

От реактивного к проактивному: почему классический подход к мониторингу устарел

Традиционные системы мониторинга (например, Nagios) работают по принципу «проверь и доложи»: каждые 5 минут скрипт пингует сервер и отправляет уведомление, если ответа нет. Такой подход имеет фатальные недостатки:

  • Высокая задержка обнаружения — проблема может длиться 4–5 минут до первого сигнала;
  • Ложные срабатывания — кратковременный сетевой сбой вызывает тревогу;
  • Отсутствие контекста — вы знаете, что «сервер недоступен», но не знаете почему;
  • Нет исторических данных — невозможно анализировать тренды и прогнозировать проблемы.

Prometheus решает эти проблемы за счёт:

  • Постоянного сбора метрик — каждые 15–30 секунд;
  • Мощного языка запросов PromQL — для анализа и построения сложных правил;
  • Многомерной модели данных — каждая метрика содержит теги (labels): instance, job, service и т.д.;
  • Встроенной системы алертинга — с группировкой, подавлением и маршрутизацией через Alertmanager.

Результат — администратор видит не просто «сервер упал», а «на сервере mail.example.com заполнен диск /var на 92%, и это происходит впервые за 30 дней».

Архитектура системы мониторинга: как устроен стек Prometheus

Современная система мониторинга состоит из нескольких компонентов, каждый из которых выполняет свою роль:

Prometheus Server

Центральный компонент, который:

  • Опрашивает экспортеры по расписанию;
  • Хранит временные ряды (time series) в своей базе данных;
  • Выполняет правила записи и алертинга;
  • Предоставляет API для запросов через PromQL.

Экспортеры (Exporters)

Лёгкие агенты, которые собирают метрики с целевых систем и предоставляют их в формате, понятном Prometheus. Примеры:

  • Node Exporter — метрики CPU, RAM, диска, сети;
  • MySQL Exporter — состояние базы данных;
  • Nginx Exporter — статистика веб-сервера;
  • Blackbox Exporter — проверка доступности извне (HTTP, TCP, DNS).

Alertmanager

Специализированный сервис для обработки алертов от Prometheus:

  • Группирует похожие алерты;
  • Подавляет дубли;
  • Маршрутизирует уведомления в разные каналы (email, Slack, Telegram);
  • Позволяет временно отключать алерты (silence).

Grafana

Визуализация данных. Хотя Prometheus имеет свой веб-интерфейс, Grafana предоставляет:

  • Интерактивные дашборды;
  • Поддержку множества источников данных;
  • Шаблоны и переменные для гибкости;
  • Экспорт и совместное использование отчётов.

Pushgateway (опционально)

Для сбора метрик от кратковременных задач (cron-скрипты, batch-процессы), которые не могут быть опрошены напрямую.

002

Установка и базовая настройка Prometheus Server

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

Рекомендуется выделенный VPS с минимальными характеристиками:

  • CPU: 2 ядра;
  • RAM: 2 ГБ (минимум), 4 ГБ (рекомендуется);
  • Диск: 50 ГБ SSD (для хранения метрик за 15–30 дней);
  • ОС: Ubuntu Server 22.04 LTS или Debian 12.

Создание пользователя и директорий

sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

Загрузка и установка Prometheus

cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.47.1/prometheus-2.47.1.linux-amd64.tar.gz
tar xvf prometheus-*.tar.gz
sudo cp prometheus-2.47.1.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.47.1.linux-amd64/promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
sudo cp -r prometheus-2.47.1.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.47.1.linux-amd64/console_libraries /etc/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus

Базовая конфигурация Prometheus

Создайте файл /etc/prometheus/prometheus.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - "rules/*.yml"

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - localhost:9093

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node"
    static_configs:
      - targets: ["192.168.1.10:9100", "192.168.1.11:9100"]

Создание systemd-юнита

Создайте файл /etc/systemd/system/prometheus.service:

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries \
    --web.listen-address=0.0.0.0:9090 \
    --web.enable-lifecycle

Restart=always

[Install]
WantedBy=multi-user.target

Запуск службы

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus

Теперь веб-интерфейс доступен по адресу http://ваш_сервер:9090.

Настройка Node Exporter для сбора системных метрик

Установка Node Exporter на целевые серверы

Выполните на каждом сервере, который нужно мониторить:

sudo useradd --no-create-home --shell /bin/false node_exporter
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

Создание systemd-юнита для Node Exporter

Создайте файл /etc/systemd/system/node_exporter.service:

[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

Restart=always

[Install]
WantedBy=multi-user.target

Запуск Node Exporter

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

Метрики будут доступны по адресу http://ip_сервера:9100/metrics.

Проверка в Prometheus

В веб-интерфейсе Prometheus перейдите в раздел **Status → Targets**. Вы должны увидеть все серверы в состоянии **UP**.

005

Мониторинг веб-сервера Nginx: сбор метрик через Lua-модуль

Установка модуля ngx_http_stub_status_module

Большинство дистрибутивов включают этот модуль по умолчанию. Проверьте:

nginx -V 2>&1 | grep -o with-http_stub_status_module

Настройка статусной страницы в Nginx

Добавьте в конфигурацию сайта:

server {
    listen 80;
    server_name example.com;

    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        allow YOUR_MONITORING_SERVER_IP;
        deny all;
    }

    # остальные настройки...
}

Перезагрузите Nginx:

sudo nginx -t && sudo systemctl reload nginx

Установка Nginx Exporter

Скачайте и установите экспортёр:

cd /tmp
wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v0.11.0/nginx-prometheus-exporter_0.11.0_linux_amd64.tar.gz
tar xvf nginx-prometheus-exporter_*.tar.gz
sudo cp nginx-prometheus-exporter /usr/local/bin/
sudo chown root:root /usr/local/bin/nginx-prometheus-exporter

Создание systemd-юнита для Nginx Exporter

Создайте файл /etc/systemd/system/nginx_exporter.service:

[Unit]
Description=Nginx Exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-prometheus-exporter -nginx.scrape-uri http://localhost/nginx_status
Restart=always

[Install]
WantedBy=multi-user.target

Запуск службы

sudo systemctl daemon-reload
sudo systemctl start nginx_exporter
sudo systemctl enable nginx_exporter

Добавление в конфигурацию Prometheus

Обновите /etc/prometheus/prometheus.yml:

  - job_name: "nginx"
    static_configs:
      - targets: ["192.168.1.10:9113", "192.168.1.11:9113"]

Перезагрузите конфигурацию Prometheus:

curl -X POST http://localhost:9090/-/reload

Создание кастомных правил алертинга: как обнаруживать реальные проблемы

Структура правил алертинга

Правила хранятся в директории /etc/prometheus/rules/. Создайте её:

sudo mkdir /etc/prometheus/rules
sudo chown prometheus:prometheus /etc/prometheus/rules

Пример правила: высокая загрузка CPU

Создайте файл /etc/prometheus/rules/cpu_alerts.yml:

groups:
- name: cpu_alerts
  rules:
  - alert: HighCpuLoad
    expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU load on {{ $labels.instance }}"
      description: "CPU load is above 80% for more than 5 minutes."

Пример правила: заполнение диска

Создайте файл /etc/prometheus/rules/disk_alerts.yml:

groups:
- name: disk_alerts
  rules:
  - alert: DiskSpaceLow
    expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 10
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "Low disk space on {{ $labels.instance }}"
      description: "Available disk space is less than 10% on root partition."

Пример правила: ошибки веб-сервера

Создайте файл /etc/prometheus/rules/nginx_alerts.yml:

groups:
- name: nginx_alerts
  rules:
  - alert: NginxHighErrorRate
    expr: rate(nginx_http_requests_total{status=~"5.."}[5m]) / rate(nginx_http_requests_total[5m]) > 0.05
    for: 3m
    labels:
      severity: critical
    annotations:
      summary: "High error rate on {{ $labels.instance }}"
      description: "More than 5% of requests are returning 5xx errors."

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

promtool check rules /etc/prometheus/rules/*.yml

Установка и настройка Alertmanager для умных уведомлений

Загрузка и установка Alertmanager

cd /tmp
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar xvf alertmanager-*.tar.gz
sudo cp alertmanager-0.27.0.linux-amd64/alertmanager /usr/local/bin/
sudo cp alertmanager-0.27.0.linux-amd64/amtool /usr/local/bin/
sudo chown root:root /usr/local/bin/alertmanager
sudo chown root:root /usr/local/bin/amtool

Создание конфигурации Alertmanager

Создайте файл /etc/prometheus/alertmanager.yml:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'telegram'

receivers:
- name: 'telegram'
  telegram_configs:
  - bot_token: 'YOUR_TELEGRAM_BOT_TOKEN'
    chat_id: YOUR_TELEGRAM_CHAT_ID
    send_resolved: true
    message: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ .Annotations.description }}\n\n{{ end }}"

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'instance']

Создание systemd-юнита для Alertmanager

Создайте файл /etc/systemd/system/alertmanager.service:

[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/alertmanager \
    --config.file /etc/prometheus/alertmanager.yml \
    --storage.path /var/lib/alertmanager

Restart=always

[Install]
WantedBy=multi-user.target

Запуск Alertmanager

sudo systemctl daemon-reload
sudo systemctl start alertmanager
sudo systemctl enable alertmanager

Интеграция с Telegram: получение уведомлений с графиками и кнопками

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

  1. Откройте Telegram и найдите @BotFather;
  2. Отправьте команду /newbot;
  3. Следуйте инструкциям для создания бота;
  4. Скопируйте токен вида 123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw.

Получение Chat ID

  1. Напишите своему боту любое сообщение;
  2. Откройте URL: https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates;
  3. Найдите поле chat.id — это ваш Chat ID.

Улучшенная конфигурация для отправки графиков

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

Обновите конфигурацию Alertmanager:

receivers:
- name: 'telegram'
  telegram_configs:
  - bot_token: 'YOUR_TELEGRAM_BOT_TOKEN'
    chat_id: YOUR_TELEGRAM_CHAT_ID
    send_resolved: true
    message: |
      🚨 *{{ .Status | toUpper }}*
      {{ if eq .Status "firing" }}*New Alert:*{{ else }}*Resolved:*{{ end }}
      
      *Summary:* {{ .CommonAnnotations.summary }}
      *Description:* {{ .CommonAnnotations.description }}
      *Instance:* {{ .CommonLabels.instance }}
      *Severity:* {{ .CommonLabels.severity }}
      
      Check dashboard: http://your-grafana-server/d/example

003

Настройка Grafana для визуализации метрик

Установка Grafana

sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install grafana

Запуск Grafana

sudo systemctl start grafana-server
sudo systemctl enable grafana-server

Подключение Prometheus как источника данных

  1. Откройте веб-интерфейс Grafana: http://ваш_сервер:3000;
  2. Войдите с логином admin и паролем admin;
  3. Перейдите в **Configuration → Data Sources**;
  4. Нажмите **Add data source** и выберите **Prometheus**;
  5. Укажите URL: http://localhost:9090;
  6. Нажмите **Save & Test**.

Импорт готовых дашбордов

Grafana Labs предоставляет готовые шаблоны:

  • Node Exporter Full (ID: 1860) — полный мониторинг сервера;
  • Nginx (ID: 12130) — статистика веб-сервера;
  • Prometheus Stats (ID: 3662) — мониторинг самого Prometheus.

Чтобы импортировать дашборд:

  1. Перейдите в **Create → Import**;
  2. Введите ID шаблона;
  3. Выберите источник данных Prometheus;
  4. Нажмите **Import**.

Реальный кейс: как алерт спас от потери данных при отказе RAID-массива

В одном из проектов сервер хранил критически важные данные на программном RAID 1. Через Node Exporter собирались метрики node_md_disks и node_md_disks_active.

Правило для мониторинга RAID

- alert: RaidDegraded
  expr: node_md_disks{device="md0"} - node_md_disks_active{device="md0"} > 0
  for: 1m
  labels:
    severity: critical
  annotations:
    summary: "RAID array degraded on {{ $labels.instance }}"
    description: "One or more disks failed in RAID array md0."

Сценарий события

  1. В 02:17 ночью один из дисков вышел из строя;
  2. Через 1 минуту сработало правило RaidDegraded;
  3. Alertmanager отправил уведомление в Telegram;
  4. Администратор получил оповещение и заменил диск до начала рабочего дня;
  5. Данные были сохранены, простоев не произошло.

Без мониторинга проблема могла остаться незамеченной до полного отказа второго диска — и тогда восстановление данных стало бы невозможным.

Оптимизация и масштабирование: советы для роста инфраструктуры

Управление хранилищем Prometheus

По умолчанию Prometheus хранит данные 15 дней. Чтобы увеличить срок:

--storage.tsdb.retention.time=30d

Использование удалённого хранилища

Для долгосрочного хранения подключите:

  • Thanos;
  • Cortex;
  • VictoriaMetrics.

Service Discovery вместо статических списков

При большом количестве серверов используйте:

  • Consul;
  • Eureka;
  • DNS-SD;
  • Kubernetes SD.

Шардирование Prometheus

При более чем 100 целевых системах рассмотрите разделение на несколько экземпляров Prometheus по регионам или сервисам.

Заключение: мониторинг как основа стабильной инфраструктуры

Внедрение Prometheus и Alertmanager — это не однократная настройка, а процесс построения культуры наблюдаемости. Каждый алерт должен быть значимым, каждая метрика — иметь цель, каждый дашборд — отвечать на конкретный вопрос.

Результат — команда, которая:

  • Обнаруживает проблемы до пользователей;
  • Быстро диагностирует причины сбоев;
  • Прогнозирует нагрузку и планирует масштабирование;
  • Спит спокойно, зная, что система под контролем.

Для тех, кто предпочитает сосредоточиться на основном бизнесе, а не на настройке систем мониторинга, отличным решением станет управляемый хостинг с встроенным мониторингом. Сервис хостинг-беларусь.рф предоставляет серверы с круглосуточным наблюдением, автоматическими алертами и технической поддержкой 24/7 — идеальный выбор для компаний, ценящих стабильность и экономию времени.