Self-hosted Apps

Prometheus

Open-source система мониторинга с собственной базой временных рядов: сама собирает метрики с сервисов и позволяет запрашивать их языком PromQL.

Что такое Prometheus

Prometheus (по-русски пишут «прометеус») — система мониторинга с открытым кодом и собственной базой временных рядов. Сервисы отдают свои метрики простым текстом по HTTP, Prometheus периодически забирает их себе, хранит и позволяет запрашивать языком PromQL — строить графики и правила алертов.

Появился в SoundCloud, стал вторым проектом CNCF после Kubernetes и де-факто стандартом мониторинга в контейнерных средах. Написан на Go, ставится одним бинарником без внешней базы.

Модель pull: главное отличие

Prometheus сам ходит за метриками, а не ждёт, пока их пришлют. Каждый наблюдаемый сервис поднимает HTTP-endpoint /metrics, отдающий обычный текст:

# HELP http_requests_total Total HTTP requests
# TYPE http_requests_total counter
http_requests_total{method="GET",status="200"} 15234
http_requests_total{method="GET",status="500"} 12

Отсюда следует всё остальное. Экспортер можно открыть в браузере и глазами увидеть, что отдаёт сервис. Prometheus знает, жив ли объект наблюдения — не пришёл scrape, значит цель недоступна (метрика up). А для задач, которые живут секунды и не переживут опроса (cron-джобы), есть Pushgateway — исключение, подтверждающее правило.

Метки — вторая ключевая идея

Метрика — это не одно число, а имя плюс набор меток. http_requests_total{method="GET",status="500"} и http_requests_total{method="POST",status="200"} — разные временные ряды одной метрики. Так данные становятся многомерными: можно резать по любому измерению без заведения новых метрик.

Типы метрик: counter (только растёт — запросы, ошибки), gauge (может падать — память, температура), histogram и summary (распределения — latency по перцентилям). Обратная сторона меток — кардинальность: метка со случайным значением (user_id, URL с параметрами, trace id) порождает отдельный ряд на каждое значение и убивает Prometheus по памяти. Это ошибка номер один при внедрении.

PromQL

# запросов в секунду за 5 минут, по эндпоинтам
rate(http_requests_total[5m])

# доля 5xx от всех запросов
sum(rate(http_requests_total{status=~"5.."}[5m]))
  / sum(rate(http_requests_total[5m]))

# 95-й перцентиль времени ответа
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))

Функция rate() — то, ради чего всё затевалось: counter хранит нарастающий итог, а rate превращает его в скорость и сам корректно обрабатывает перезапуск сервиса, когда счётчик сбрасывается в ноль.

Экосистема

Prometheus сознательно делает одну вещь и не делает остальные — их закрывают соседние компоненты:

  • Exporters — переводчики для того, что не умеет отдавать метрики само: node_exporter (метрики ОС), cAdvisor (контейнеры), postgres_exporter, blackbox_exporter (проверка доступности снаружи). Отдельно стоит DCGM Exporter от NVIDIA — он отдаёт в Prometheus GPU utilization, температуру и потребление VRAM, и это стандартный способ мониторить GPU-парк.
  • Alertmanager — отдельный сервис: группирует алерты, глушит дубли, маршрутизирует по получателям, умеет тихие часы. Prometheus только вычисляет правила, отправкой занимается он.
  • Grafana — рисование дашбордов; своё UI у Prometheus есть, но им пользуются только для отладки запросов. Service discovery — Prometheus сам находит цели в Kubernetes, Consul или облаке, список хостов не нужно вести руками.

Prometheus vs Zabbix

Prometheus Zabbix
Сбор данных pull по HTTP агент, SNMP, IPMI
Конфигурация YAML в Git веб-интерфейс
Данные метрики с метками хосты и items
Хранилище своя TSDB, локально реляционная СУБД
Динамика сам находит новые поды хост надо завести
Сетевое железо слабое место родная задача

Prometheus — про сервисы и приложения в динамичной среде. Zabbix — про парк серверов и железа. В инфраструктуре среднего размера часто стоят оба.

Запуск и хранение

По умолчанию: Prometheus — 9090, Alertmanager — 9093, node_exporter — 9100. Минимальный prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: node
    static_configs:
      - targets: ["10.0.0.11:9100", "10.0.0.12:9100"]

Разворачивают Docker Compose-стеком: Prometheus + Alertmanager + Grafana + экспортеры. Ресурсов нужно немного — своей СУБД у Prometheus нет, а память растёт от числа временных рядов, то есть от кардинальности меток, а не от числа серверов. Диск — NVMe, --storage.tsdb.retention.time задавайте осознанно.

Встроенная TSDB локальна и не кластеризуется: она рассчитана на оперативные данные, а не на архив за годы. Для длинной истории и отказоустойчивого хранилища используют remote write в VictoriaMetrics, Thanos или Mimir — это штатный путь, а не костыль.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер