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, управляющий уведомлениями.
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:
- 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 представляет собой список путей к файлам или директориям, которые содержат правила.
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.