Руководство по мониторингу серверов и приложений: Prometheus + Grafana

Мониторинг — это систематическое наблюдение за состоянием серверов, приложений и сетевых ресурсов. Он позволяет собирать метрики, визуализировать их, настраивать оповещения и анализировать тренды. Без мониторинга вы работаете вслепую. С мониторингом вы видите всё: загрузку CPU, использование памяти, количество запросов, ошибки, время ответа и многое другое.

В этой статье мы подробно разберём:

  • Что такое мониторинг и зачем он нужен.
  • Что такое Prometheus, его архитектура и основные концепции.
  • Установку и настройку Prometheus.
  • Установку и настройку Grafana.
  • Подключение Prometheus как источника данных в Grafana.
  • Создание дашбордов и визуализация метрик.
  • Настройку алертов в Prometheus и Alertmanager.
  • Мониторинг конкретных сервисов: Nginx, MySQL, PHP-FPM, Docker.
  • Экспортёры: что это и как их использовать.
  • Практические примеры и частые ошибки.

1. Что такое мониторинг и зачем он нужен

Мониторинг — это процесс сбора, анализа и визуализации данных о состоянии системы. Он решает несколько ключевых задач:

  • Обнаружение проблем — вы узнаёте о сбоях раньше пользователей.
  • Диагностика — понимаете, почему сайт тормозит или упал.
  • Планирование ресурсов — видите тренды и понимаете, когда нужно увеличивать мощности.
  • Отчётность — можете показать заказчику или руководству графики стабильности и производительности.

Современный стандарт мониторинга — это стек Prometheus + Grafana. Prometheus собирает метрики и хранит их в виде временных рядов. Grafana визуализирует эти данные в красивых дашбордах и позволяет настраивать оповещения.

2. Что такое Prometheus

Prometheus — это открытая система мониторинга с собственным языком запросов (PromQL). Она была разработана в SoundCloud и стала стандартом в мире DevOps.

2.1 Архитектура Prometheus

Основные компоненты:

  • Prometheus server — основной процесс, который собирает метрики с целей (targets) по протоколу HTTP, хранит их в базе временных рядов и обрабатывает запросы.
  • Экспортёры (exporters) — небольшие программы, которые собирают метрики с различных систем (сервер, БД, веб-сервер) и отдают их в формате, понятном Prometheus.
  • Alertmanager — компонент для управления оповещениями. Он группирует, дедуплицирует и маршрутизирует алерты в различные каналы (email, Slack, Telegram).
  • Pushgateway — прокси для приложений, которые не могут отдавать метрики по HTTP, а могут только отправлять их.

Принцип работы:

  1. Prometheus периодически (по расписанию) опрашивает указанные цели (IP:порт/metrics).
  2. Цели отдают метрики в текстовом формате (plaintext).
  3. Prometheus сохраняет метрики с временными метками.
  4. Пользователь может выполнять запросы на языке PromQL через веб-интерфейс или через Grafana.

2.2 Основные понятия Prometheus

  • Метрика — числовой показатель с именем и набором меток (labels). Например: http_requests_total{method="GET", status="200"}.
  • Метка (label) — ключ-значение для идентификации и группировки (например, instance="server1"job="nginx").
  • Временной ряд — последовательность значений метрики с временными метками.
  • Цель (target) — эндпоинт, откуда Prometheus забирает метрики.
  • Интервал сбора (scrape_interval) — частота опроса целей (по умолчанию 15 секунд).

3. Установка и настройка Prometheus

3.1 Установка Prometheus на Ubuntu/Debian

Bash
# Создание пользователя и группы для Prometheus
sudo useradd --no-create-home --shell /bin/false prometheus

# Скачивание последней версии (замените URL на актуальный с сайта)
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar -xzf prometheus-2.45.0.linux-amd64.tar.gz
sudo mv prometheus-2.45.0.linux-amd64 /opt/prometheus

# Создание папок для конфигурации и данных
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

3.2 Базовый конфигурационный файл prometheus.yml

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

YAML
global:
  scrape_interval: 15s      # Интервал сбора метрик
  evaluation_interval: 15s   # Интервал проверки правил алертов

# Правила для алертов (файл с правилами)
rule_files:
  - "alert.rules.yml"

# Цели для сбора метрик
scrape_configs:
  # Сам Prometheus (сбор собственных метрик)
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # Мониторинг самого сервера (Node Exporter — установим позже)
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

3.3 Запуск Prometheus как сервиса

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

Запустите и включите сервис:

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

После запуска Prometheus будет доступен на порту 9090: http://ваш_сервер:9090. Откройте его в браузере — вы увидите веб-интерфейс.

3.4 Установка Node Exporter (мониторинг сервера)

Node Exporter собирает метрики с самого сервера: CPU, память, диски, сеть.

Bash
# Скачивание и установка
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.6.0.linux-amd64.tar.gz
sudo mv node_exporter-1.6.0.linux-amd64/node_exporter /usr/local/bin/

# Создание пользователя (если ещё нет)
sudo useradd --no-create-home --shell /bin/false node_exporter

Создайте сервис /etc/systemd/system/node_exporter.service:

Запустите:

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

Теперь Node Exporter доступен на порту 9100: http://ваш_сервер:9100/metrics. Проверьте, что Prometheus видит цель: в веб-интерфейсе Prometheus перейдите в Status → Targets.

ВАЖНО! Сейчас все экспортёры слушают на всех интерфейсах по умолчанию. На боевом сервере любой может открыть http://сервер:9100/metrics и увидеть данные о системе. Пример для Node Exporter:

Bash
ExecStart=/usr/local/bin/node_exporter --web.listen-address=127.0.0.1:9100

Аналогично для других экспортёров. Если Prometheus на том же сервере — бинд на 127.0.0.1 закрывает порты снаружи. Если Prometheus на отдельном сервере — тогда фаервол.

4. Установка и настройка Grafana

Grafana — это платформа для визуализации данных, которая подключается к различным источникам (Prometheus, InfluxDB, Elasticsearch и др.) и строит графики, таблицы, дашборды.

4.1 Установка Grafana на Ubuntu/Debian

Bash
sudo apt-get install -y software-properties-common wget
wget -q -O /usr/share/keyrings/grafana.key https://packages.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana

Grafana будет доступна на порту 3000: http://ваш_сервер:3000.
Логин/пароль по умолчанию: admin / admin (при первом входе попросят сменить пароль).

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

  1. Войдите в Grafana (логин admin, новый пароль).
  2. Перейдите в Configuration → Data Sources → Add data source.
  3. Выберите Prometheus.
  4. В поле URL укажите http://localhost:9090 (если Prometheus на том же сервере).
  5. Нажмите Save & Test.
  6. При успешном подключении увидите зелёную галочку.

5. Создание дашбордов и визуализация метрик

5.1 Импорт готового дашборда для Node Exporter

Grafana имеет библиотеку готовых дашбордов. Один из самых популярных — Node Exporter Full Dashboard.

  1. Перейдите в Dashboards → Import.
  2. Введите ID дашборда 1860 (или 11074 для более новой версии) и нажмите Load.
  3. Выберите источник данных Prometheus.
  4. Нажмите Import.

Теперь у вас есть готовый дашборд с графиками: CPU, память, диски, сеть, нагрузка и многое другое.

5.2 Создание собственного дашборда вручную

  1. В левом меню выберите Create → Dashboard.
  2. Нажмите Add visualization.
  3. Выберите источник данных Prometheus.
  4. В поле Query введите PromQL-запрос, например:
  1. Настройте отображение (график, таблица, статистика).
  2. Нажмите Apply → Save и дайте название дашборду.

5.3 Популярные PromQL-запросы

6. Настройка алертов (Alertmanager)

Алерты позволяют получать уведомления о проблемах: например, если загрузка CPU превысила 90% или сайт перестал отвечать.

6.1 Настройка правил алертов в Prometheus

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

YAML
groups:
  - name: server_alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
          description: "CPU usage is {{ $value }}% for more than 5 minutes"

      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High memory usage on {{ $labels.instance }}"
          description: "Memory usage is {{ $value }}%"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 10
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Low disk space on {{ $labels.instance }}"
          description: "Only {{ $value }}% free on root partition"

Добавьте этот файл в prometheus.yml:

YAML
rule_files:
  - "alert.rules.yml"

Перезапустите Prometheus:

Bash
sudo systemctl restart prometheus

Перед рестартом Prometheus полезно проверить конфиг на валидность, чтобы не уронить сервис:

Bash
/opt/prometheus/promtool check config /etc/prometheus/prometheus.yml
/opt/prometheus/promtool check rules /etc/prometheus/alert.rules.yml

6.2 Настройка Alertmanager

Установка Alertmanager:

Bash
cd /tmp
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
tar -xzf alertmanager-0.26.0.linux-amd64.tar.gz
sudo mv alertmanager-0.26.0.linux-amd64 /opt/alertmanager

Создайте конфигурационный файл /etc/alertmanager/alertmanager.yml:

YAML
route:
  group_by: ['alertname', 'cluster']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'email-notifications'

receivers:
  - name: 'email-notifications'
    email_configs:
      - to: 'admin@example.com'
        from: 'alertmanager@example.com'
        smarthost: 'smtp.gmail.com:587'
        auth_username: 'your-email@gmail.com'
        auth_password: 'your-app-password'
        require_tls: true

# Если нужно отключить оповещения в нерабочее время (опционально)
inhibit_rules:
  - source_matchers:
      - severity = 'critical'
    target_matchers:
      - severity = 'warning'
    equal: ['alertname', 'dev', 'instance']

Создайте сервис /etc/systemd/system/alertmanager.service:

Запустите:

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

6.3 Подключение Alertmanager к Prometheus

В prometheus.yml добавьте:

YAML
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

Перезапустите Prometheus. Теперь алерты будут отправляться на email (или в другие каналы, если настроить).

7. Мониторинг конкретных сервисов

7.1 Мониторинг Nginx

Установка экспортёра для Nginx:

Скачайте и установите nginx-prometheus-exporter (или используйте модуль ngx_http_stub_status_module).

Bash
# Убедитесь, что в Nginx включён stub_status
# В конфиге Nginx:
location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    deny all;
}

# Установка экспортёра
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 -xzf nginx-prometheus-exporter_0.11.0_linux_amd64.tar.gz
sudo mv nginx-prometheus-exporter /usr/local/bin/

Создайте сервис /etc/systemd/system/nginx-exporter.service:

Запустите:

Bash
sudo systemctl daemon-reload
sudo systemctl start nginx-exporter
sudo systemctl enable nginx-exporter

Добавьте цель в prometheus.yml:

YAML
- job_name: 'nginx'
  static_configs:
    - targets: ['localhost:9113']

7.2 Мониторинг MySQL

Установка экспортёра для MySQL (mysqld_exporter):

Bash
cd /tmp
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz
tar -xzf mysqld_exporter-0.15.0.linux-amd64.tar.gz
sudo mv mysqld_exporter-0.15.0.linux-amd64/mysqld_exporter /usr/local/bin/

Создайте пользователя в MySQL:

SQL
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'secure_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;

Создайте файл /etc/.my.cnf:

Создайте сервис /etc/systemd/system/mysqld_exporter.service:

Запустите:

Bash
sudo systemctl daemon-reload
sudo systemctl start mysqld_exporter
sudo systemctl enable mysqld_exporter

Добавьте цель в prometheus.yml:

YAML
- job_name: 'mysql'
  static_configs:
    - targets: ['localhost:9104']

7.3 Мониторинг PHP-FPM

Для PHP-FPM есть встроенная страница статуса.

Включите статус в конфигурации PHP-FPM:

В файле пула (например, www.conf):

В Nginx добавьте location:

Nginx
location /status {
    allow 127.0.0.1;
    deny all;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Установка экспортёра для PHP-FPM:

Bash
cd /tmp
wget https://github.com/hipages/php-fpm_exporter/releases/download/v2.1.0/php-fpm_exporter_2.1.0_linux_amd64.tar.gz
tar -xzf php-fpm_exporter_2.1.0_linux_amd64.tar.gz
sudo mv php-fpm_exporter /usr/local/bin/

Создайте сервис /etc/systemd/system/php-fpm-exporter.service:

Запустите:

Bash
sudo systemctl daemon-reload
sudo systemctl start php-fpm-exporter
sudo systemctl enable php-fpm-exporter

Добавьте цель в prometheus.yml:

YAML
- job_name: 'php-fpm'
  static_configs:
    - targets: ['localhost:9253']

7.4 Мониторинг Docker

Docker имеет встроенный экспортёр метрик.

Включение метрик в Docker daemon:

В файле /etc/docker/daemon.json:

JSON
{
  "metrics-addr": "0.0.0.0:9323"
}

Перезапустите Docker:

Bash
sudo systemctl restart docker

Добавьте цель в prometheus.yml:

YAML
- job_name: 'docker'
  static_configs:
    - targets: ['localhost:9323']

Теперь вы можете видеть метрики контейнеров: использование CPU, память, сетевой трафик и т.д.

7.5 Мониторинг HTTP-эндпоинтов (Blackbox Exporter)

Blackbox Exporter проверяет доступность сайтов или API по HTTP, HTTPS, ICMP (ping) и другим протоколам.

Установка:

Bash
cd /tmp
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.24.0/blackbox_exporter-0.24.0.linux-amd64.tar.gz
tar -xzf blackbox_exporter-0.24.0.linux-amd64.tar.gz
sudo mv blackbox_exporter-0.24.0.linux-amd64/blackbox_exporter /usr/local/bin/

Настройте модули в /etc/blackbox.yml:

YAML
modules:
  http_2xx:
    prober: http
    http:
      preferred_ip_protocol: "ip4"
  icmp:
    prober: icmp

Создайте сервис и добавьте цель в Prometheus:

YAML
- job_name: 'blackbox'
  metrics_path: /probe
  params:
    module: [http_2xx]
  static_configs:
    - targets:
        - https://example.com
        - https://google.com
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: localhost:9115

8. Практические примеры

8.1 Пример: Мониторинг загрузки сервера за последний час

Запрос в PromQL:

В Grafana можно построить график, который показывает тренд загрузки.

8.2 Пример: Оповещение о недоступности сайта

В alert.rules.yml:

YAML
- alert: WebsiteDown
  expr: probe_success{job="blackbox"} == 0
  for: 1m
  labels:
    severity: critical
  annotations:
    summary: "Website {{ $labels.instance }} is down"
    description: "Site has been unreachable for more than 1 minute"

8.3 Пример: Дашборд с показателями для технической поддержки

Создайте дашборд, который включает:

  • Количество запросов в минуту (Nginx).
  • Среднее время ответа.
  • Ошибки 4xx и 5xx.
  • Загрузка CPU и память.
  • Свободное место на диске.

Эти графики помогут быстро диагностировать проблемы в реальном времени.

9. Оптимизация и масштабирование мониторинга

9.1 Правильное хранение данных

Prometheus хранит метрики локально на диске. Для долгосрочного хранения можно настроить удалённую запись (например, в Thanos, VictoriaMetrics или Cortex).

9.2 Снижение нагрузки

  • Увеличьте интервал сбора (scrape_interval) для метрик, которые не критичны.
  • Уменьшайте количество меток (labels), если они не используются в запросах.
  • Используйте recording rules для предварительной агрегации часто используемых запросов.

Пример recording rule:

YAML
groups:
  - name: recording_rules
    rules:
      - record: job:node_cpu_usage:avg
        expr: avg by (job) (rate(node_cpu_seconds_total{mode="user"}[5m]))

Этот запрос будет вычисляться раз в минуту и храниться как новая метрика, что ускорит отображение в Grafana.

9.3 Регулярная очистка данных

Prometheus автоматически удаляет старые данные в соответствии с настройкой --storage.tsdb.retention.time (по умолчанию 15 дней).

Bash
# В сервисе Prometheus укажите:
ExecStart=/opt/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/ --storage.tsdb.retention.time=30d

10. Частые ошибки и как их избежать

ОшибкаПроявлениеРешение
Цель не отображается в TargetsВ интерфейсе Prometheus цель недоступна (down)Проверьте, что экспортёр запущен и доступен по указанному порту. Проверьте фаервол.
Нет данных в GrafanaГрафики пустыеУбедитесь, что источник данных подключен, и запрос возвращает данные. Проверьте временной диапазон.
Слишком много метрикPrometheus потребляет много памятиИспользуйте recording rules, ограничьте количество меток, увеличивайте интервал сбора.
Алерты не приходятОповещения не доходятПроверьте конфигурацию Alertmanager, правильность адресов и доступность SMTP-сервера.
Нет метрик PHP-FPMСтраница статуса недоступнаПроверьте, что pm.status_path включён, и к нему есть доступ с IP экспортёра.
Ошибка соединения с MySQLЭкспортёр не может подключитьсяПроверьте пользователя, пароль и права в MySQL. Убедитесь, что MySQL слушает на 127.0.0.1.
Метрики Docker не появляютсяDocker не отдаёт метрикиУбедитесь, что в daemon.json добавлены metrics-addr и experimental. Перезапустите Docker.
Сдвиг времени на графикахМетрики на 2–3 часа раньше реальногоПроверьте timedatectl на сервере; в Grafana настройте timezone в настройках дашборда

11. Заключение

Мы построили полноценную систему мониторинга на основе Prometheus и Grafana, которая охватывает:

  • Состояние сервера (CPU, память, диски, сеть) через Node Exporter.
  • Веб-сервер (Nginx) через экспортёр stub_status.
  • Базу данных (MySQL) через mysqld_exporter.
  • Интерпретатор (PHP-FPM) через встроенную страницу статуса.
  • Контейнеризацию (Docker) через встроенные метрики.
  • Доступность сайтов через Blackbox Exporter.

Вы научились:

  • Устанавливать и настраивать Prometheus.
  • Устанавливать и подключать Grafana.
  • Создавать дашборды и запросы на PromQL.
  • Настраивать алерты и отправлять оповещения.
  • Использовать экспортёры для различных сервисов.

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

Нашли ошибку? Напишите нам!