Skip to content

Prometheus

Prometheus был создан на SoundCloud в 2012 году и с тех пор стал стандартом для мониторинга систем. У него полностью открытый исходный код, он предоставляет десятки разных экспортеров, с помощью которых можно за считанные минуты настроить мониторинг всей инфраструктуры.

Prometheus - это система мониторинга, основанная на базе данных временных рядов.

TSDB

База данных временных рядов (Time Series Database, TSDB) - это специализированное хранилище данных, предназначенное для хранения, организации и анализа временных рядов. Временной ряд - это набор данных, упорядоченных во времени, где каждая запись связана с определенным моментом времени или временным интервалом.

TSDB предназначены для эффективного хранения больших объемов временных данных. Эти данные могут включать в себя метрики, события, логи и другие параметры, которые изменяются с течением времени.

Основная особенность TSDB - это возможность эффективно индексировать данные по времени. Это позволяет быстро находить и анализировать данные, основываясь на времени и временных интервалах.

Prometheus — не просто база данных временных рядов. К нему можно присоединить целую экосистему инструментов, чтобы расширить функционал. Prometheus мониторит самые разные системы: серверы, базы данных, отдельные виртуальные машины, да почти что угодно. Для этого Prometheus периодически скрейпит свои целевые объекты.

scraping

Скрейпинг (англ. "scraping") - это процесс автоматического извлечения данных с веб-сайтов или других источников в интернете. Термин "скрейпинг" происходит от английского глагола "scrape", что означает "соскабливать" или "собирать". Основная цель скрейпинга - получить структурированные данные из неструктурированных источников в вебе, таких как HTML-страницы. Эти данные могут включать в себя текст, изображения, таблицы, ссылки и другие элементы веб-содержимого.

Prometheus извлекает метрики через HTTP-вызовы к определенным конечным точкам, указанным в конфигурации Prometheus.

Возьмем, например, веб-приложение, расположенное по адресу http://localhost:3000. Приложение передает метрики в текстовом формате на некоторый URL. Допустим, http://localhost:3000/metrics. По этому адресу Prometheus с определенными интервалами извлекает данные из целевого объекта.

exporters

Prometheus взаимодействует с экспортерами (exporters) с помощью принципа "сбора данных через HTTP". Экспортеры - это компоненты, которые предоставляют метрики и информацию о состоянии различных систем и приложений, которые нужно мониторить с использованием Prometheus. Экспортеры получают информацию о состоянии и производительности из источников, которые они мониторят, и предоставляют эту информацию в формате, который может быть понятным Prometheus.

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

Архитектура Prometheus включает в себя следующие ключевые компоненты:

  • Prometheus Server - Центральное звено системы, ответственное за сбор, хранение и обработку метрик. Хранит собранные метрики в виде данных временных рядов (TSDB). Предоставляет базовый веб-интерфейс для просмотра метрик и управления.

  • Exporters (Таргеты) - Приложения или сервисы, устанавливаемые на целевые машины, которые собирают метрики. Предоставляют метрики в формате, понятном Prometheus. Примеры: node_exporter (данные о сервере), cAdvisor (данные о контейнерах), экспортеры для баз данных и веб-серверов.

  • Alertmanager - Сервис, который обрабатывает оповещения и отправляет их пользователям. Уведомляет о проблемах по электронной почте, в мессенджерах (Slack, Telegram) и других системах.

  • Service Discovery - Механизм для автоматического обнаружения и добавления новых сервисов и таргетов для мониторинга.

  • PromQL — (Prometheus Query Language) - Мощный язык запросов, используемый для фильтрации, агрегации и анализа данных временных рядов.

Prometheus работает по модели "pull", регулярно опрашивая источники метрик, храня их в базе данных временных рядов (TSDB) и позволяя пользователям анализировать их с помощью PromQL

Как работает Prometheus

  • Сбор метрик (Pull-модель). Сервер Prometheus с помощью retrieval worker регулярно опрашивает (по HTTP) конечные точки (targets) и собирает метрики.

  • Хранение. Собранные метрики с временными метками сохраняются в локальную базу данных временных рядов (TSDB).

  • Запросы и визуализация. Пользователи используют PromQL для запроса данных из TSDB, а затем визуализируют их в веб-интерфейсе Prometheus или с помощью сторонних инструментов, таких как Grafana.

  • Оповещения. При возникновении аномалий или нарушении порогов оповещения, сервер отправляет информацию в Alertmanager для дальнейшей рассылки уведомлений.

Конфигурация Prometheus

Конфигурация Prometheus осуществляется через файл prometheus.yaml, где описываются задачи по сбору метрик (scrape_configs), правила записи (record rules), правила оповещений (alerting rules) и настройки Alertmanager. Основные компоненты, требующие настройки, включают: Prometheus Server, который собирает данные; Exporters, предоставляющие метрики; и Alertmanager, управляющий уведомлениями.

/etc/prometheus/prometheus.yml
global:
  scrape_interval: 20s
  scrape_timeout: 10s
  evaluation_interval: 1m

rule_files:
  - /etc/prometheus/rule_files/*.yml

scrape_configs:
  - job_name: "node-exporter"
    static_configs:
      - targets:
          ["node-exporter:9100"]
    metrics_path: /metrics

Основные разделы конфигурации prometheus.yaml

  • global. Устанавливает глобальные настройки, такие как интервал сбора метрик (scrape_interval).
  • scrape_configs. Описывает, какие цели (targets) и с какого пути (metrics_path) собирать метрики.

    • job_name: Имя задачи мониторинга.
    • static_configs: Список целей для сбора метрик.
  • rule_files. Путь к файлам с правилами записи (record rules) и оповещений (alerting rules).

    • Правила записи (Record Rules): Вычисляют новые метрики на основе существующих.
    • Правила оповещений (Alerting Rules): Определяют условия, при выполнении которых генерируются оповещения, например, о высокой задержке запросов.
  • alerting: Настраивает взаимодействие с Alertmanager.

    • alertmanagers: Адреса экземпляров Alertmanager.

Как работает конфигурация

  • Сбор метрик. Prometheus Server периодически запрашивает метрики у экспортеров по указанным в scrape_configs адресам.
  • Хранение. Собранные метрики сохраняются в виде временных рядов в локальной базе данных.
  • Обработка правил. В процессе сбора метрик или в отдельном цикле, Prometheus выполняет правила записи и оповещений из rule_files.
  • Оповещения. Если условие правила оповещения выполняется, Prometheus отправляет оповещение в Alertmanager, который затем обрабатывает и отправляет уведомления получателям.

scrape_configs

Секция scrape_configs в конфигурационном файле Prometheus (prometheus.yaml) определяет цели для мониторинга, то есть список приложений и сервисов, с которых Prometheus будет собирать метрики. Она описывает, как и где искать эти цели (целевые службы) и как их опрашивать (собирать метрики) с определенной периодичностью, используя механизм pull.

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

  • job_name. Уникальное имя для группы целевых служб, которые будут собираться вместе.
  • scrape_interval. Интервал времени, с которым Prometheus будет собирать метрики с указанных целевых служб.
  • scrape_timeout. Время, в течение которого Prometheus ожидает ответа от целевой службы перед тем, как считать запрос неудавшимся.
  • scheme. Протокол (HTTP или HTTPS), который будет использоваться для запросов к целевым службам.
  • metrics_path. Путь на целевой службе, где расположены метрики (по умолчанию /metrics).
  • static_configs. Список статических адресов (endpoints), с которых будет собираться информация.
Пример конфигурации scrape_configs
scrape_configs:
  - job_name: 'node_exporter' # Имя задачи мониторинга
    scrape_interval: 15s # Интервал сбора метрик
    metrics_path: '/metrics' # Стандартный путь для метрик
    static_configs:
      - targets: ['localhost:9100'] # Целевая служба, с которой собираются метрики

rule_files

Секция rule_files в конфигурационном файле Prometheus (prometheus.yml) указывает пути к файлам с правилами (rule files), которые должны быть загружены и выполнены сервером Prometheus. Эти файлы, написанные в формате YAML, содержат определения правил записи (recording rules) и правил оповещения (alerting rules). Чтобы применить изменения, можно отправить сигнал SIGHUP процессу Prometheus, перезагрузив правила без остановки сервера.

Секция rule_files представляет собой список путей к файлам или директориям, которые содержат правила.

Пример конфигурации в prometheus.yml:
rule_files:
  - "/etc/prometheus/rules/*.yml" # Загрузка всех YAML файлов из директории rules
  - "/etc/prometheus/alert-rules.yml" # Загрузка конкретного файла с правилами

Файлы правил

Файл должен содержать данные в формате yaml. Все правила разбиты на группы. У каждой группы есть имя (name) и список правил (rules).

общий синтаксис правила
- alert: название_правила
    expr: выражение_при_истинности_которого_отправится_алерт
    for: алерт_будет_отправлен_если_выражение_держится_указанное_время
    labels:
      severity: уровень_важности
    annotations:
      summary: заголовок_алерта
      description: "Подробное описание алерта {{ $переменная }}"
пример файла правил
#  /etc/prometheus/rule_files/main.yml

groups:
  - name: target
    rules:
      - alert: target_down
        expr: up == 0
        for: 1m
        labels:
          service: target
          severity: critical
        annotations:
          summary: "Target down! Failed to scrape {{ $labels.job }} on {{ $labels.instance }}"

  - name: probe
    rules:
      - alert: probe_down
        expr: probe_success == 0
        for: 1m
        labels:
          service: probe
          severity: error
        annotations:
          summary: "Probe {{ $labels.instance }} down"

  - name: hardware
    rules:
      - alert: hardware_cpu
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 75
        for: 3m
        labels:
          service: hardware
          severity: warning
        annotations:
          summary: 'High CPU load on {{ $labels.instance }} - {{ $value | printf "%.2f" }}%'
          description: "CPU на инстансе {{ $labels.instance }} превышает 75% за последние 3 минут."

      - alert: hardware_memory
        expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 85
        for: 3m
        labels:
          service: hardware
          severity: warning
        annotations:
          summary: 'High memory utilization on {{ $labels.instance }} - {{ $value | printf "%.2f" }}%'

      - alert: hardware_disk
        expr: (node_filesystem_free_bytes / node_filesystem_size_bytes * 100) < 25
        for: 3m
        labels:
          service: hardware
          severity: error
        annotations:
          summary: 'Low free space on {{ $labels.instance }} device {{ $labels.device }} mounted on {{ $labels.mountpoint }} - {{ $value | printf "%.2f" }}%'

  - name: container
    rules:
      - alert: container_down
        expr: (time() - container_last_seen) > 60
        for: 1m
        labels:
          service: container
          severity: error
        annotations:
          summary: 'Container down! Last seen {{ $labels.name }} on {{ $labels.instance }} - {{ $value | printf "%.2f" }}s ago'

  - name: common_recording_rules
    rules:
    - record: node_cpu_usage_percentage
      expr: 100 - avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m]))

Объяснение структуры файла:

  • groups: Контейнер для групп правил. Prometheus обрабатывает эти группы последовательно.
  • name: Уникальное имя группы правил.
  • rules: Список правил внутри группы.
  • alert: Имя правила оповещения.
  • expr: Запрос в формате PromQL, который должен быть выполнен. В данном примере:
    • node_cpu_seconds_total{mode="idle"}: Собирает метрики CPU в режиме простоя.
    • irate(...)[5m]: Вычисляет мгновенную скорость изменения метрики за последние 5 минут, что позволяет получить текущую активность CPU.
    • avg by (instance): Агрегирует метрику по каждому экземпляру.
    • 100 - ...: Получает процент использования CPU.
    • > 80: Условие, при котором срабатывает оповещение.
  • for: Период времени, в течение которого условие expr должно быть истинным, прежде чем сработает оповещение.
  • labels: Дополнительные метки, которые будут добавлены к сработавшему оповещению.
  • annotations: Дополнительная информация для оповещения, такая как краткое описание (summary) и подробное описание (description).
  • record: Имя метрики, которая будет сохранена в результате выполнения правила записи.
  • expr (в правиле записи): Запрос PromQL, результат которого будет сохранен под именем record.

Полезные правила для Prometheus и Alertmanager