Prometheus
Свой сбор метрик на своих серверах: pull-модель, экспортеры для хостов и контейнеров, язык запросов PromQL и алерты через Alertmanager. Стандарт метрик в облаке и Kubernetes, ядро под Apache-2.0. Стенд подняли на Fatmetal Cloud Server в связке с Grafana и сняли замеры с живого сервера.
Вердикт
- нужен гибкий стандарт метрик для докера, Kubernetes и парка серверов, а не игрушка на один хост
- хочется собирать метрики хостов, контейнеров и своих сервисов в своем периметре, без Datadog и New Relic
- нужны алерты по порогам (диск, память, недоступность) с маршрутизацией в один канал - в связке с Alertmanager и ntfy
- нужен мониторинг из коробки с готовым UI и минимумом настройки - тогда проще Beszel или Uptime Kuma
- нужны красивые дашборды сразу - Prometheus рисует только служебные графики, витрина это Grafana рядом
- нужна многолетняя история метрик из коробки - локальная TSDB под это не заточена, потребуется remote-write
Что это и какую задачу решает
Когда сервисов больше одного, вопрос «что сейчас с инфраструктурой» превращается в десяток вкладок и ssh-сессий. Prometheus закрывает это одним стандартным способом: он централизованно собирает метрики со всего парка - загрузку CPU и памяти хостов, состояние контейнеров, задержки и ошибки ваших приложений - и хранит их как временные ряды, по которым можно строить графики и правила алертов.
Работает по pull-модели: Prometheus сам по расписанию ходит по HTTP на эндпоинты /metrics ваших целей и забирает цифры. Эти эндпоинты отдают «экспортеры»: node_exporter для метрик хоста, cAdvisor для контейнеров, blackbox_exporter для проверки доступности, плюс сотни готовых экспортеров под Postgres, nginx, Redis и прочее. Свои сервисы отдают метрики через клиентские библиотеки.
Это ядро наблюдаемости в облачном мире: Prometheus - второй проект-выпускник CNCF после Kubernetes, и де-факто стандарт метрик там, где есть докер и оркестрация.
Чем отличается от Zabbix, InfluxDB и облачных APM
Zabbix - классика инфра-мониторинга, «все в одном» с агентами, которые push-ат данные на сервер. Prometheus, наоборот, pull-ит метрики и берет силу в экосистеме экспортеров и в интеграции с докером и Kubernetes - это выбор, когда инфраструктура контейнерная и динамичная.
InfluxDB - тоже time-series БД, но push-модель и свой язык. Prometheus выигрывает языком PromQL и стандартом де-факто в cloud-native: под него написана большая часть экспортеров и дашбордов.
Datadog, New Relic, Grafana Cloud - облачные APM: удобно, но метрики и деньги уходят наружу. Prometheus поднимается у себя, данные остаются в вашем периметре (для РФ - под 152-ФЗ), а платите вы только за сервер.
Наш Beszel - это «Prometheus-лайт»: метрики хоста и контейнеров с UI из коробки, ставится в один клик, идеален для малого. Prometheus - тяжелее и требует настройки, но безгранично расширяем и рассчитан на рост. Ниже в разделе про стек мы показываем, как из них двоих сложить два тира одного направления.
| Инструмент | Модель | Где данные | Профиль |
|---|---|---|---|
| Prometheus | Pull, Apache-2.0 | ваш сервер | стандарт метрик для докера и k8s, экосистема экспортеров |
| Zabbix | Push-агенты, GPL | ваш сервер | классика, но менее удобен в контейнерном мире |
| InfluxDB | Push, MIT/коммерц | ваш сервер | своя TSDB и язык, не доминирует в k8s |
| Datadog / New Relic | SaaS, per-host | чужое облако | удобно, но данные и деньги наружу |
| Beszel (наш разбор) | легкий, UI из коробки | ваш сервер | «Prometheus-лайт» для малого, без PromQL |
Тех-стек и как это работает
Prometheus - один Go-бинарь с встроенной time-series БД (TSDB). Чтобы получилась полезная наблюдаемость, рядом ставят экспортеры и Grafana для дашбордов. На стенде мы подняли типовой набор:
Цикл простой: экспортеры отдают /metrics, Prometheus по scrape_interval их опрашивает и складывает ряды, а вы запрашиваете их языком PromQL - для дашбордов в Grafana и для правил алертов. Найденные условия (диск заполнен, цель недоступна) уходят в Alertmanager, а тот маршрутизирует их в почту, Telegram или наш ntfy.
Минимальная конфигурация
Весь Prometheus настраивается одним YAML-файлом. Минимум - интервал опроса и список целей (для статики; в динамике подключается service discovery по DNS, Kubernetes или Consul):
global:
scrape_interval: 15s
scrape_configs:
- job_name: node
static_configs:
- targets: ['node-exporter:9100']
- job_name: cadvisor
static_configs:
- targets: ['cadvisor:8080']
Если публикуете UI под поддиректорией (у нас Caddy отдает Prometheus на /prom), задайте флаг --web.route-prefix и пропишите тот же префикс в пути метрик само-скрейпа и в URL источника данных Grafana - иначе часть запросов упрется в 404.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не настраивать сбор метрик вручную. Заказываете сервер, за пару минут получаете рабочий домен, валидный TLS и готовый Prometheus - остается подключить экспортеры.
Рекомендуемая конфигурация: CPU2-RAM4-DISK50
Развертывание на Fatmetal
Стенд подняли на тарифе Fatmetal Cloud Server CPU2-RAM4-DISK50 с Ubuntu 24.04 и Docker.
-
Сервер и Docker
Создаем Fatmetal Cloud Server на Ubuntu 24.04 с преднастроенным Docker. Домен вида
45-15-159-158.fatmetal.netрезолвится сам. -
Стек через Docker Compose
Поднимаем prometheus + node_exporter + cAdvisor + Grafana + Caddy одним
docker compose up -d. Prometheus сразу начинает скрейпить цели. -
TLS на Caddy
Caddy берет сертификат Let's Encrypt на magic-DNS-домен, отдает Grafana в корне и Prometheus на
/prom. Наружу только 80 и 443. -
Дашборды и алерты
В Grafana преднастраиваем источник данных Prometheus и импортируем дашборд Node Exporter Full. Правила алертов и Alertmanager - следующий слой.
Стенд для разбора развернут не руками: агент Fatmetal заказал сервер через MCP, поднял стек и снял метрики и скриншоты живого инстанса. Цифры и экраны ниже - с этого стенда.
Что измерили после запуска
Замеры с живого стенда, docker stats в простое. Весь набор - Prometheus, два экспортера, Grafana и Caddy - помещается в тариф CPU2-RAM4-DISK50 с большим запасом.
| Версия Prometheus | v3.13.1 |
| RAM в простое, весь стек | ~274 MiB |
| prometheus / grafana / cadvisor / node-exp / caddy | 45 / 147 / 63 / 8 / 11 MiB |
| Образы на диске | ~2.17 GB |
| Целей опрашивается | 3 (node, cadvisor, prometheus) - все UP |
| Внешний ответ | HTTP 200, TLS Let's Encrypt, valid |
| Тариф стенда | CPU2-RAM4-DISK50 |
Сам Prometheus в простое ест около 45 MiB - основную память забирает Grafana. Реальное потребление растет с числом целей и рядов (кардинальностью метрик): на большом парке смотрите за памятью и при необходимости берите старший тариф или выносите долгую историю в remote-write.
PromQL и экспортеры
Сила Prometheus - в языке запросов. PromQL умеет не только выбирать ряды, но и считать по ним производные величины: скорость роста счетчиков через rate(), агрегации по меткам, перцентили латентности через histogram_quantile(). Один и тот же запрос ложится и в дашборд Grafana, и в правило алерта.
За данными стоит экосистема экспортеров: node_exporter (CPU, память, диск, сеть хоста), cAdvisor (контейнеры), blackbox_exporter (доступность сайтов, портов, TLS - альтернатива Uptime Kuma внутри стека метрик), плюс готовые экспортеры почти под любую БД и сервис. Ниже - PromQL-график с нашего стенда: разложение загрузки CPU по режимам.
sum by (mode) (rate(node_cpu_seconds_total[5m])) графиком за час, с разбивкой по режимам CPU (idle, system, user и т.д.). Полноценные дашборды рисует Grafana поверх тех же данных.Где может сломаться
Что происходит: при публикации UI под поддиректорией с --web.route-prefix=/prom эндпоинт метрик уезжает на /prom/metrics, а само-скрейп по умолчанию ходит на /metrics и ловит 404.
Решение: задайте в задании само-скрейпа metrics_path: /prom/metrics и перечитайте конфиг. Тот же префикс нужен в URL источника Prometheus в Grafana.
Взрыв кардинальности
Метки с высокой изменчивостью (id пользователя, url с параметрами) плодят миллионы рядов и съедают память. Держите метки под контролем - это главная причина, почему Prometheus начинает есть RAM.
Пустой Prometheus без экспортеров
Сам по себе Prometheus ничего не показывает. Пока не подключены экспортеры и не написан хотя бы один PromQL-запрос, это просто база. Это и есть его порог входа против Beszel.
Безопасность и обновления
У Prometheus нет своей аутентификации - его веб и API закрывают реверс-прокси (у нас Caddy с TLS и, при необходимости, basic-auth). Наружу торчат только 80 и 443, сами Prometheus, экспортеры и Grafana слушают внутри docker-сети. node_exporter и cAdvisor тоже не стоит выставлять в интернет напрямую.
Обновление - смена тега образа и docker compose up -d; TSDB лежит в docker-томе и переживает перезапуск. Для боевого стенда добавьте бэкап тома данных и правила алертов, а на большом парке - remote-write в долговременное хранилище (Mimir, Thanos, VictoriaMetrics).
Когда это НЕ ваш выбор
Нужен мониторинг «из коробки»
Если хочется поставить и сразу видеть графики без экспортеров и PromQL - берите Beszel или Uptime Kuma. Prometheus раскрывается на масштабе и в контейнерной среде, а для одного хоста это перебор.
Нужны дашборды без отдельного инструмента
Prometheus рисует только служебные графики. Красивые витрины - это Grafana рядом. Если не готовы держать связку из двух сервисов, оцените более цельные решения.
Нужна многолетняя история
Локальная TSDB рассчитана на оперативное окно, а не на годы. Для долгого хранения нужен remote-write в Mimir/Thanos/VictoriaMetrics - это отдельный слой инфраструктуры.
Частые вопросы
Prometheus - это замена Grafana?
Нет, они работают в паре: Prometheus собирает и хранит метрики, Grafana рисует по ним дашборды. Prometheus умеет только служебные графики.
Что такое pull-модель?
Prometheus сам ходит по HTTP на эндпоинты /metrics целей и забирает метрики, а не цели шлют их ему. Это упрощает обнаружение и контроль состояния целей.
Как получить метрики моего приложения?
Через клиентскую библиотеку (Go, Python, Java и др.) приложение отдает свой /metrics, а вы добавляете его целью в конфиг. Для готового софта берите соответствующий экспортер.
Как настроить алерты?
Пишете правила на PromQL, Prometheus вычисляет их и отправляет сработавшие в Alertmanager, а тот маршрутизирует в почту, Telegram или ntfy.
Чем отличается от нашего Beszel?
Beszel - легкий мониторинг с UI из коробки для малого. Prometheus - гибкий стандарт под рост и контейнеры, но требует экспортеров, PromQL и Grafana рядом.
Какая лицензия?
Apache-2.0 - полностью открытое ядро, включая коммерческое использование, без open-core-ограничений.
Итог
Prometheus - индустриальный стандарт сбора метрик на своих серверах: pull-модель, экосистема экспортеров, PromQL и алертинг через Alertmanager. Стек легкий (сам Prometheus ~45 MiB, весь набор с Grafana ~274 MiB), TLS через Caddy в комплекте, данные остаются в вашем периметре под 152-ФЗ. Против облачных APM - без выноса метрик наружу; против нашего Beszel - безгранично расширяем и рассчитан на рост, ценой более высокого порога входа. Если инфраструктура выросла из «одного хоста с готовым UI» - это фундамент, на который ложатся Grafana для витрины и ntfy для алертов.
Этот стек у нас запущен на тарифе CPU2-RAM4-DISK50. Нашли баг в гайде - напишите, поправим в течение дня.