Содержание
Раньше системные администраторы узнавали о проблемах на серверах от клиентов: «Сайт не работает!» — такой звонок был сигналом к началу аврала. Сегодня профессионалы используют проактивный мониторинг: система сама обнаруживает аномалии, предсказывает сбои и уведомляет до того, как пользователь заметит проблему.
В основе современного 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-процессы), которые не могут быть опрошены напрямую.

Установка и базовая настройка 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**.

Мониторинг веб-сервера 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-бота
- Откройте Telegram и найдите @BotFather;
- Отправьте команду
/newbot; - Следуйте инструкциям для создания бота;
- Скопируйте токен вида
123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw.
Получение Chat ID
- Напишите своему боту любое сообщение;
- Откройте URL:
https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates; - Найдите поле
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
Настройка 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 как источника данных
- Откройте веб-интерфейс Grafana:
http://ваш_сервер:3000; - Войдите с логином
adminи паролемadmin; - Перейдите в **Configuration → Data Sources**;
- Нажмите **Add data source** и выберите **Prometheus**;
- Укажите URL:
http://localhost:9090; - Нажмите **Save & Test**.
Импорт готовых дашбордов
Grafana Labs предоставляет готовые шаблоны:
- Node Exporter Full (ID: 1860) — полный мониторинг сервера;
- Nginx (ID: 12130) — статистика веб-сервера;
- Prometheus Stats (ID: 3662) — мониторинг самого Prometheus.
Чтобы импортировать дашборд:
- Перейдите в **Create → Import**;
- Введите ID шаблона;
- Выберите источник данных Prometheus;
- Нажмите **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."
Сценарий события
- В 02:17 ночью один из дисков вышел из строя;
- Через 1 минуту сработало правило
RaidDegraded; - Alertmanager отправил уведомление в Telegram;
- Администратор получил оповещение и заменил диск до начала рабочего дня;
- Данные были сохранены, простоев не произошло.
Без мониторинга проблема могла остаться незамеченной до полного отказа второго диска — и тогда восстановление данных стало бы невозможным.
Оптимизация и масштабирование: советы для роста инфраструктуры
Управление хранилищем 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 — идеальный выбор для компаний, ценящих стабильность и экономию времени.
