Мониторинг с Prometheus: полная настройка и лучшие практики

Настройте надежный мониторинг инфраструктуры с Prometheus

Содержимое страницы

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

technical-diagram

Что такое 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 как источника данных

  1. Откройте Grafana и перейдите в Configuration → Data Sources
  2. Нажмите “Add data source”
  3. Выберите “Prometheus”
  4. Установите URL http://localhost:9090 (или ваш сервер Prometheus)
  5. Нажмите “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 масштабируется вместе с вашей инфраструктурой, от развертываний на одном сервере до архитектур мониторинга в нескольких дата-центрах.

Связанные ресурсы

Внешние ссылки