Мониторинг с Prometheus: полная настройка и лучшие практики
Настройте надежный мониторинг инфраструктуры с Prometheus
Prometheus стал де-факто стандартом для мониторинга облачных приложений и инфраструктуры, предлагая сбор метрик, запросы и интеграцию с инструментами визуализации.

Что такое Prometheus?
Prometheus — это открытое решение для мониторинга и оповещений, первоначально разработанное в SoundCloud в 2012 году и сейчас являющееся проектом Cloud Native Computing Foundation (CNCF). Оно специально разработано для надежности и масштабируемости в динамических облачных средах, что делает его идеальным решением для мониторинга микросервисов, контейнеров и кластеров Kubernetes.
Ключевые особенности
База данных временных рядов: Prometheus хранит все данные как временные ряды, идентифицируемые именами метрик и парами ключ-значение (метки), что обеспечивает гибкие и мощные возможности запросов.
Модель pull: В отличие от традиционных push-систем, Prometheus активно собирает метрики с настроенных целей по заданным интервалам, что делает его более надежным и простым в настройке.
Язык запросов PromQL: Мощный функциональный язык запросов позволяет в реальном времени анализировать метрические данные, выполнять агрегации, преобразования и сложные вычисления.
Обнаружение сервисов: Автоматическое обнаружение целей мониторинга через различные механизмы, включая Kubernetes, Consul, EC2 и статические конфигурации.
Отсутствие внешних зависимостей: Prometheus работает как единый бинарный файл без необходимых внешних зависимостей, упрощая развертывание и снижая операционную сложность.
Встроенные оповещения: AlertManager обрабатывает оповещения от Prometheus, обеспечивая дублирование, группировку и маршрутизацию уведомлений в каналы, такие как email, PagerDuty или Slack.
Обзор архитектуры
Понимание архитектуры Prometheus критически важно для эффективного развертывания. Основные компоненты включают:
- Сервер Prometheus: Собирает и хранит метрики, оценивает правила и обрабатывает запросы
- Клиентские библиотеки: Инструментируют код приложений для экспорта метрик
- Экспортеры: Обеспечивают мост между сторонними системами и форматом Prometheus
- AlertManager: Обрабатывает оповещения и уведомления
- Pushgateway: Принимает метрики от кратковременных задач, которые нельзя собирать
Типичный поток данных: Приложения экспортируют метрики → Prometheus собирает эти метрики → Данные хранятся в базе данных временных рядов → Запросы PromQL извлекают и анализируют данные → Создаются оповещения на основе правил → AlertManager обрабатывает и маршрутизирует уведомления.
При развертывании инфраструктуры на Ubuntu 24.04, Prometheus предоставляет отличную основу для комплексного мониторинга.
Установка Prometheus на Ubuntu
Давайте разберем установку Prometheus на Linux-систему. Мы будем использовать Ubuntu в качестве примера, но процесс аналогичен для других дистрибутивов.
Скачивание и установка
Сначала создадим отдельного пользователя для Prometheus:
sudo useradd --no-create-home --shell /bin/false prometheus
Скачаем последнюю версию Prometheus:
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar xvf prometheus-2.48.0.linux-amd64.tar.gz
cd prometheus-2.48.0.linux-amd64
Копируем бинарные файлы и создаем директории:
sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
sudo cp -r consoles /etc/prometheus
sudo cp -r console_libraries /etc/prometheus
sudo cp prometheus.yml /etc/prometheus/prometheus.yml
sudo chown -R prometheus:prometheus /etc/prometheus
Для управления пакетами на Ubuntu обратитесь к нашему подробному руководству по управлению пакетами Ubuntu.
Настройка Prometheus
Редактируем /etc/prometheus/prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
rule_files:
- 'alert_rules.yml'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost: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 \
--storage.tsdb.retention.time=30d
[Install]
WantedBy=multi-user.target
Запускаем и включаем Prometheus:
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus
Доступ к веб-интерфейсу Prometheus по адресу http://localhost:9090.
Настройка Node Exporter
Node Exporter экспортирует метрики оборудования и операционной системы для Linux. Установите его для мониторинга ваших серверов:
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-1.7.0.linux-amd64.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/node_exporter
Создаем сервис systemd /etc/systemd/system/node_exporter.service:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
Запускаем Node Exporter:
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
Node Exporter теперь экспортирует метрики на порту 9100.
Понимание PromQL
PromQL (язык запросов Prometheus) — это сердце запросов к данным Prometheus. Вот основные шаблоны запросов:
Базовые запросы
Выбрать все временные ряды для метрики:
node_cpu_seconds_total
Фильтрация по метке:
node_cpu_seconds_total{mode="idle"}
Несколько фильтров по меткам:
node_cpu_seconds_total{mode="idle",cpu="0"}
Векторные диапазоны и агрегации
Рассчитать скорость за время:
rate(node_cpu_seconds_total{mode="idle"}[5m])
Суммировать по всем CPU:
sum(rate(node_cpu_seconds_total{mode="idle"}[5m]))
Группировка по метке:
sum by (mode) (rate(node_cpu_seconds_total[5m]))
Практические примеры
Процент использования CPU:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
Использование памяти:
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
Использование диска:
(node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100
Скорость сетевого трафика:
rate(node_network_receive_bytes_total[5m])
Развертывание в Docker
Запуск Prometheus в контейнерах Docker предлагает гибкость и более простое управление:
Создаем docker-compose.yml:
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
ports:
- "9090:9090"
restart: unless-stopped
node_exporter:
image: prom/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
volumes:
- '/:/host:ro,rslave'
ports:
- "9100:9100"
restart: unless-stopped
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- alertmanager_data:/alertmanager
ports:
- "9093:9093"
restart: unless-stopped
volumes:
prometheus_data:
alertmanager_data:
Запускаем стек:
docker-compose up -d
Мониторинг Kubernetes
Prometheus отлично подходит для мониторинга кластеров Kubernetes. Helm-чарт kube-prometheus-stack предоставляет полное решение для мониторинга.
Установка с помощью Helm:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack
Это устанавливает:
- Оператор Prometheus
- Экземпляр Prometheus
- AlertManager
- Grafana
- Node Exporter
- kube-state-metrics
- Предварительно настроенные дашборды и оповещения
Доступ к Grafana:
kubectl port-forward svc/prometheus-grafana 3000:80
Логин и пароль по умолчанию: admin/prom-operator
Для различных дистрибутивов Kubernetes, процесс развертывания аналогичен с небольшими изменениями для специфических особенностей платформы.
Настройка оповещений
AlertManager обрабатывает оповещения, отправленные Prometheus. Настройте правила оповещений и каналы уведомлений.
Правила оповещений
Создайте файл /etc/prometheus/alert_rules.yml:
groups:
- name: system_alerts
interval: 30s
rules:
- alert: HighCPUUsage
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Высокое использование CPU на {{ $labels.instance }}"
description: "Использование CPU превышает 80% (текущее значение: {{ $value }}%)"
- alert: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Высокое использование памяти на {{ $labels.instance }}"
description: "Использование памяти превышает 85% (текущее значение: {{ $value }}%)"
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 < 15
for: 10m
labels:
severity: critical
annotations:
summary: "Низкое свободное место на диске на {{ $labels.instance }}"
description: "Доступное место на диске ниже 15% на {{ $labels.mountpoint }}"
- alert: InstanceDown
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Экземпляр {{ $labels.instance }} не доступен"
description: "{{ $labels.job }} экземпляр {{ $labels.instance }} не доступен более 2 минут"
Конфигурация AlertManager
Создайте файл /etc/prometheus/alertmanager.yml:
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.gmail.com:587'
smtp_from: 'alerts@example.com'
smtp_auth_username: 'alerts@example.com'
smtp_auth_password: 'your-password'
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: 'team-email'
routes:
- match:
severity: critical
receiver: 'team-pagerduty'
- match:
severity: warning
receiver: 'team-slack'
receivers:
- name: 'team-email'
email_configs:
- to: 'team@example.com'
headers:
Subject: '{{ .GroupLabels.alertname }}: {{ .Status | toUpper }}'
- name: 'team-slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
channel: '#alerts'
title: 'Оповещение: {{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
- name: 'team-pagerduty'
pagerduty_configs:
- service_key: 'your-pagerduty-key'
Интеграция с Grafana
Хотя у Prometheus есть базовый веб-интерфейс, Grafana предоставляет более мощные возможности визуализации.
Добавление Prometheus как источника данных
- Откройте Grafana и перейдите в Configuration → Data Sources
- Нажмите “Add data source”
- Выберите “Prometheus”
- Установите URL
http://localhost:9090(или ваш сервер Prometheus) - Нажмите “Save & Test”
Популярные идентификаторы дашбордов
Импортируйте готовые дашборды с grafana.com:
- Node Exporter Full (ID: 1860): Полные метрики Linux
- Kubernetes Cluster Monitoring (ID: 7249): Обзор K8s
- Docker Container Monitoring (ID: 193): Метрики контейнеров
- Prometheus Stats (ID: 2): Внутренние метрики Prometheus
Создание пользовательских дашбордов
Создавайте панели с помощью запросов PromQL:
{
"title": "Использование CPU",
"targets": [{
"expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)"
}]
}
Популярные экспортеры
Расширяйте мониторинг Prometheus с помощью специализированных экспортеров:
Blackbox Exporter
Проверяет конечные точки по HTTP, HTTPS, DNS, TCP и ICMP:
scrape_configs:
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://example.com
- https://api.example.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
Экспортеры баз данных
- mysqld_exporter: Метрики MySQL/MariaDB
- postgres_exporter: Метрики PostgreSQL
- mongodb_exporter: Метрики MongoDB
- redis_exporter: Метрики Redis
Экспортеры приложений
- nginx_exporter: Метрики веб-сервера NGINX
- apache_exporter: Метрики сервера Apache HTTP
- haproxy_exporter: Метрики балансировщика нагрузки HAProxy
Экспортеры облачных сервисов
- cloudwatch_exporter: Метрики AWS CloudWatch
- stackdriver_exporter: Метрики Google Cloud
- azure_exporter: Метрики Azure Monitor
Лучшие практики
Сохранение данных
Настройте подходящий период хранения в зависимости от ваших потребностей:
--storage.tsdb.retention.time=30d
--storage.tsdb.retention.size=50GB
Правила записи
Заранее вычисляйте часто запрашиваемые выражения:
groups:
- name: example_rules
interval: 30s
rules:
- record: job:node_cpu_utilization:avg
expr: 100 - (avg by (job) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
Управление метками
- Сохраняйте низкую кардинальность меток
- Используйте согласованные соглашения об именовании
- Избегайте меток с высокой кардинальностью (ID пользователей, временные метки)
Безопасность
- Включите аутентификацию и HTTPS
- Ограничьте доступ к API Prometheus
- Используйте политики сети в Kubernetes
- Реализуйте RBAC для чувствительных метрик
Высокая доступность
- Запускайте несколько экземпляров Prometheus
- Используйте Thanos или Cortex для долгосрочного хранения
- Реализуйте федерацию для иерархических настроек
Решение распространенных проблем
Высокое использование памяти
- Уменьшите частоту сбора метрик
- Сократите период хранения
- Оптимизируйте запросы PromQL
- Реализуйте правила записи
Отсутствующие метрики
- Проверьте статус целей в
/targets - Убедитесь в наличии сетевого подключения
- Проверьте конфигурацию сбора
- Проверьте логи экспортера
Медленные запросы
- Используйте правила записи для сложных агрегаций
- Оптимизируйте фильтры меток
- Уменьшите временной диапазон
- Добавьте индексы при использовании удаленного хранилища
Оптимизация производительности
Оптимизация запросов
# Плохо: Высокая кардинальность
sum(rate(http_requests_total[5m]))
# Хорошо: Группировка по релевантным меткам
sum by (status, method) (rate(http_requests_total[5m]))
Ограничения ресурсов
Для развертываний в Kubernetes:
resources:
requests:
memory: "2Gi"
cpu: "1000m"
limits:
memory: "4Gi"
cpu: "2000m"
Заключение
Prometheus предоставляет надежное, масштабируемое решение для мониторинга современной инфраструктуры. Его архитектура с подтягиванием данных, мощный язык запросов и обширная экосистема экспортеров делают его идеальным для мониторинга всего - от серверов с “голым” железом до сложных кластеров Kubernetes.
Комбинируя Prometheus с Grafana для визуализации и AlertManager для уведомлений, вы создаете комплексную платформу наблюдения, способную удовлетворить требования мониторинга корпоративного уровня. Активное сообщество и поддержка CNCF обеспечивают непрерывное развитие и поддержку.
Начните с базового сбора метрик, постепенно добавляйте экспортеры для ваших конкретных сервисов и уточняйте правила оповещений на основе реального опыта. Prometheus масштабируется вместе с вашей инфраструктурой, от развертываний на одном сервере до архитектур мониторинга в нескольких дата-центрах.
Связанные ресурсы
- Как установить Ubuntu 24.04 и полезные инструменты
- Управление пакетами в Ubuntu: шпаргалка APT и dpkg
- Установка и использование Grafana на Ubuntu: полное руководство
- Шпаргалка Kubernetes
- Дистрибутивы Kubernetes - краткий обзор kubeadm, k3s, MicroK8s, Minikube, Talos Linux и RKE2
- Шпаргалка Docker