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 — это штатный путь, а не костыль.
Связанные термины
- Zabbix — альтернатива с противоположной идеологией
- Уведомления и алерты — что делает Alertmanager
- Kubernetes — среда, где Prometheus стал стандартом
- GPU utilization — метрика GPU-парка через DCGM Exporter
- health check — соседний механизм проверки живости
- APM и трейсинг — что метрики не заменяют
Готовы запустить GPU-задачу?
Запустить GPU-сервер