Мониторинг — это систематическое наблюдение за состоянием серверов, приложений и сетевых ресурсов. Он позволяет собирать метрики, визуализировать их, настраивать оповещения и анализировать тренды. Без мониторинга вы работаете вслепую. С мониторингом вы видите всё: загрузку 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, а могут только отправлять их.
Принцип работы:
- Prometheus периодически (по расписанию) опрашивает указанные цели (IP:порт/metrics).
- Цели отдают метрики в текстовом формате (plaintext).
- Prometheus сохраняет метрики с временными метками.
- Пользователь может выполнять запросы на языке 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
# Создание пользователя и группы для 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/prometheus3.2 Базовый конфигурационный файл prometheus.yml
Создайте файл /etc/prometheus/prometheus.yml:
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:
[Unit]
Description=Prometheus
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/
Restart=always
[Install]
WantedBy=multi-user.target
Запустите и включите сервис:
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, память, диски, сеть.
# Скачивание и установка
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:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
Запустите:
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:
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
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
- Войдите в Grafana (логин
admin, новый пароль). - Перейдите в Configuration → Data Sources → Add data source.
- Выберите Prometheus.
- В поле URL укажите
http://localhost:9090(если Prometheus на том же сервере). - Нажмите Save & Test.
- При успешном подключении увидите зелёную галочку.
5. Создание дашбордов и визуализация метрик
5.1 Импорт готового дашборда для Node Exporter
Grafana имеет библиотеку готовых дашбордов. Один из самых популярных — Node Exporter Full Dashboard.
- Перейдите в Dashboards → Import.
- Введите ID дашборда
1860(или11074для более новой версии) и нажмите Load. - Выберите источник данных Prometheus.
- Нажмите Import.
Теперь у вас есть готовый дашборд с графиками: CPU, память, диски, сеть, нагрузка и многое другое.
5.2 Создание собственного дашборда вручную
- В левом меню выберите Create → Dashboard.
- Нажмите Add visualization.
- Выберите источник данных Prometheus.
- В поле Query введите PromQL-запрос, например:
node_cpu_seconds_total{mode="user"}
- Настройте отображение (график, таблица, статистика).
- Нажмите Apply → Save и дайте название дашборду.
5.3 Популярные PromQL-запросы
# Загрузка CPU (процент)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Использование памяти (процент)
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# Свободное место на диске
(node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100
# Количество запросов в секунду к Nginx
rate(nginx_http_requests_total[5m])
# Количество ошибок 5xx в логах Nginx
sum(rate(nginx_http_requests_total{status=~"5.."}[5m]))
6. Настройка алертов (Alertmanager)
Алерты позволяют получать уведомления о проблемах: например, если загрузка CPU превысила 90% или сайт перестал отвечать.
6.1 Настройка правил алертов в Prometheus
Создайте файл /etc/prometheus/alert.rules.yml:
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:
rule_files:
- "alert.rules.yml"Перезапустите Prometheus:
sudo systemctl restart prometheusПеред рестартом Prometheus полезно проверить конфиг на валидность, чтобы не уронить сервис:
/opt/prometheus/promtool check config /etc/prometheus/prometheus.yml
/opt/prometheus/promtool check rules /etc/prometheus/alert.rules.yml6.2 Настройка Alertmanager
Установка Alertmanager:
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:
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:
[Unit]
Description=Alertmanager
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/alertmanager/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager
Restart=always
[Install]
WantedBy=multi-user.target
Запустите:
sudo systemctl daemon-reload
sudo systemctl start alertmanager
sudo systemctl enable alertmanager6.3 Подключение Alertmanager к Prometheus
В prometheus.yml добавьте:
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']Перезапустите Prometheus. Теперь алерты будут отправляться на email (или в другие каналы, если настроить).
7. Мониторинг конкретных сервисов
7.1 Мониторинг Nginx
Установка экспортёра для Nginx:
Скачайте и установите nginx-prometheus-exporter (или используйте модуль ngx_http_stub_status_module).
# Убедитесь, что в 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:
[Unit]
Description=Nginx Prometheus Exporter
After=network.target
[Service]
User=www-data
Type=simple
ExecStart=/usr/local/bin/nginx-prometheus-exporter -nginx.scrape-uri http://127.0.0.1/nginx_status
Restart=always
[Install]
WantedBy=multi-user.target
Запустите:
sudo systemctl daemon-reload
sudo systemctl start nginx-exporter
sudo systemctl enable nginx-exporterДобавьте цель в prometheus.yml:
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113']7.2 Мониторинг MySQL
Установка экспортёра для MySQL (mysqld_exporter):
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:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'secure_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;Создайте файл /etc/.my.cnf:
[client]
user=exporter
password=secure_password
Создайте сервис /etc/systemd/system/mysqld_exporter.service:
[Unit]
Description=MySQL Exporter
After=network.target
[Service]
User=prometheus
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/.my.cnf
Restart=always
[Install]
WantedBy=multi-user.target
Запустите:
sudo systemctl daemon-reload
sudo systemctl start mysqld_exporter
sudo systemctl enable mysqld_exporterДобавьте цель в prometheus.yml:
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']7.3 Мониторинг PHP-FPM
Для PHP-FPM есть встроенная страница статуса.
Включите статус в конфигурации PHP-FPM:
В файле пула (например, www.conf):
pm.status_path = /status
В Nginx добавьте location:
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:
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:
[Unit]
Description=PHP-FPM Exporter
After=network.target
[Service]
User=www-data
Type=simple
ExecStart=/usr/local/bin/php-fpm_exporter --phpfpm.scrape-uri http://127.0.0.1/status
Restart=always
[Install]
WantedBy=multi-user.target
Запустите:
sudo systemctl daemon-reload
sudo systemctl start php-fpm-exporter
sudo systemctl enable php-fpm-exporterДобавьте цель в prometheus.yml:
- job_name: 'php-fpm'
static_configs:
- targets: ['localhost:9253']7.4 Мониторинг Docker
Docker имеет встроенный экспортёр метрик.
Включение метрик в Docker daemon:
В файле /etc/docker/daemon.json:
{
"metrics-addr": "0.0.0.0:9323"
}Перезапустите Docker:
sudo systemctl restart dockerДобавьте цель в prometheus.yml:
- job_name: 'docker'
static_configs:
- targets: ['localhost:9323']Теперь вы можете видеть метрики контейнеров: использование CPU, память, сетевой трафик и т.д.
7.5 Мониторинг HTTP-эндпоинтов (Blackbox Exporter)
Blackbox Exporter проверяет доступность сайтов или API по HTTP, HTTPS, ICMP (ping) и другим протоколам.
Установка:
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:
modules:
http_2xx:
prober: http
http:
preferred_ip_protocol: "ip4"
icmp:
prober: icmpСоздайте сервис и добавьте цель в Prometheus:
- 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:91158. Практические примеры
8.1 Пример: Мониторинг загрузки сервера за последний час
Запрос в PromQL:
promql
avg by (instance) (rate(node_cpu_seconds_total{mode="user"}[1h]))
В Grafana можно построить график, который показывает тренд загрузки.
8.2 Пример: Оповещение о недоступности сайта
В alert.rules.yml:
- 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:
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 дней).
# В сервисе Prometheus укажите:
ExecStart=/opt/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/ --storage.tsdb.retention.time=30d10. Частые ошибки и как их избежать
| Ошибка | Проявление | Решение |
|---|---|---|
| Цель не отображается в 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.
- Настраивать алерты и отправлять оповещения.
- Использовать экспортёры для различных сервисов.
Мониторинг — это не просто набор графиков, это глаза и уши вашей инфраструктуры. Он помогает видеть проблемы до того, как они начнут влиять на пользователей, и принимать взвешенные решения о развитии проекта.
