1. Архитектура Prometheus и модель pull
Архитектура систем мониторинга определяет, насколько надежно и масштабируемо вы сможете наблюдать за состоянием вашей инфраструктуры. В мире cloud-native приложений стандартом де-факто стал Prometheus — система мониторинга и база данных временных рядов (Time-Series Database, TSDB). Понимание его внутреннего устройства и философии сбора данных критически важно для проектирования отказоустойчивых систем и успешного прохождения технических собеседований на позиции уровня middle и senior.
Глобальная архитектура Prometheus
Экосистема Prometheus состоит из нескольких взаимосвязанных компонентов. В отличие от монолитных систем прошлого поколения, Prometheus исповедует философию Unix: каждый инструмент делает одну вещь, но делает ее хорошо.
Центральным элементом является Prometheus Server, который выполняет три основные функции:
Помимо самого сервера, в архитектуру входят:
* Targets (Цели) — ваши микросервисы, базы данных или серверы, которые отдают метрики. Service Discovery (Обнаружение сервисов) — механизм динамического поиска целей. В облачных средах IP-адреса меняются постоянно, поэтому Prometheus интегрируется с Kubernetes, Consul, AWS EC2* и другими провайдерами, чтобы автоматически узнавать, кого нужно мониторить. * Alertmanager — отдельный сервис для маршрутизации, группировки и дедупликации оповещений (алертов), отправляемых сервером Prometheus. * Pushgateway — промежуточный кэш для метрик от кратковременных задач (batch jobs).
Фундаментальный выбор: Модель Pull
Главная архитектурная особенность Prometheus, вызывающая больше всего дискуссий на собеседованиях — это использование Pull-модели (модели вытягивания) для сбора метрик.
В традиционных системах мониторинга (например, StatsD или InfluxDB с агентом Telegraf) чаще используется Push-модель (модель проталкивания). При Push-модели само приложение знает адрес сервера мониторинга и активно отправляет ему свои метрики по сети.
Prometheus работает иначе. Ваше приложение не знает о существовании Prometheus. Оно лишь открывает HTTP-эндпоинт (по умолчанию /metrics), при обращении к которому отдает текущее состояние своих метрик в виде простого текста. Prometheus сам инициирует HTTP GET-запросы к этому эндпоинту с заданной периодичностью. Этот процесс называется скрейпингом (scraping).
Почему Prometheus выбрал Pull-модель?
На технических интервью часто просят аргументировать выбор между Pull и Push. Для архитектора важно понимать неочевидные преимущества подхода Prometheus:
/metrics (таймаут, отказ в соединении, HTTP 500), он автоматически генерирует синтетическую метрику up == 0 для этой цели. В Push-модели отсутствие данных неоднозначно: сервис упал, сеть порвалась или сервису просто нечего отправлять (например, нет входящих запросов)? Pull-модель дает четкий ответ на вопрос, жив ли процесс.curl http://localhost:8080/metrics, чтобы посмотреть, какие метрики генерирует его приложение прямо сейчас. Для отладки Push-модели пришлось бы поднимать локальный сервер-приемник.> Pull-модель предоставляет прямую обратную связь, когда цель не отвечает. Вместо того чтобы полагаться на отсутствие отправленных метрик, что может занять время для осознания проблемы, вы получаете немедленное уведомление о том, что цель не смогла предоставить свои данные. > > O11y Blog
Сравнение моделей сбора данных
Для систематизации знаний рассмотрим сравнительную таблицу, которая поможет структурировать ответ на собеседовании:
| Характеристика | Pull-модель (Prometheus) | Push-модель (InfluxDB, StatsD) |
| :--- | :--- | :--- |
| Инициатор соединения | Сервер мониторинга | Приложение (клиент) |
| Обнаружение падений | Мгновенно (метрика up = 0) | Требуется анализ отсутствия данных (gap analysis) |
| Конфигурация | Централизованная (на сервере) | Децентрализованная (в каждом приложении) |
| Сложность клиента | Низкая (только хранение состояния) | Высокая (буферы, ретраи, сетевая логика) |
| Обход NAT/Firewall | Сложен (серверу нужен доступ к клиенту) | Прост (клиенту нужен доступ к серверу) |
| Краткосрочные задачи | Требует костылей (Pushgateway) | Идеально подходит |
Математика скрейпинга: расчет нагрузки
Как senior-специалист, вы должны уметь оценивать требования к ресурсам (Capacity Planning). Нагрузка на Prometheus напрямую зависит от количества целей, количества метрик на каждой цели и частоты опроса.
Для расчета скорости поступления данных (Ingestion Rate) используется следующая формула:
Где: * — скорость поступления данных (samples per second, сэмплов в секунду). * — количество целей (targets), которые опрашивает Prometheus. * — среднее количество метрик, отдаваемых одной целью за один скрейп. * — интервал опроса (scrape interval) в секундах.
Пример из практики: У вас есть кластер Kubernetes с 500 подами (). Каждый под отдает в среднем 2000 метрик (). Вы настроили стандартный интервал опроса в 15 секунд ().
сэмплов в секунду.
Зная эту цифру, вы можете планировать размер диска и требования к CPU для TSDB. Один сэмпл в Prometheus в среднем занимает 1-2 байта на диске благодаря эффективным алгоритмам сжатия (Gorilla compression). Таким образом, 66 666 сэмплов/сек будут генерировать примерно 115 МБ данных в час.
Жизненный цикл скрейпинга (Scrape Lifecycle)
На глубоких технических интервью вас могут попросить описать путь метрики от приложения до базы данных Prometheus. Этот процесс состоит из нескольких строгих этапов:
relabel_configs. На этом этапе можно отфильтровать цели (например, опрашивать только поды с аннотацией prometheus.io/scrape: "true"), изменить порт или подменить IP-адрес.metric_relabel_configs. Это критически важный этап для оптимизации: здесь можно удалить тяжелые метрики (drop), которые вам не нужны, чтобы сэкономить память и диск.Исключения из правил: зачем нужен Pushgateway?
Несмотря на то, что Prometheus построен вокруг Pull-модели, существуют сценарии, где она физически не может работать. Классический пример — эпохальные (кратковременные) задачи (ephemeral batch jobs).
Представьте скрипт резервного копирования базы данных, который запускается по cron раз в сутки, отрабатывает за 3 секунды и завершается. Если интервал опроса Prometheus составляет 15 секунд, он с вероятностью 80% просто не успеет опросить этот скрипт, пока тот жив.
Для решения этой проблемы был создан Pushgateway. Это отдельный сервис, который работает как кэш метрик.
Антипаттерны использования Pushgateway
Типичная ошибка новичков (и частый вопрос на собеседованиях) — попытка использовать Pushgateway для обхода сетевых ограничений (NAT, Firewall) для обычных, долгоживущих сервисов.
Почему это плохая идея:
* Потеря метрики up. Prometheus будет опрашивать Pushgateway. Метрика up будет показывать статус самого Pushgateway, а не ваших микросервисов. Если микросервис умрет, Prometheus об этом не узнает — он продолжит получать старые, закэшированные метрики из Pushgateway.
* Единая точка отказа (SPOF). Pushgateway становится узким местом. Если он упадет, вы потеряете метрики от всех сервисов, которые в него пишут.
* Проблемы с очисткой (Staleness). Pushgateway хранит метрики вечно, пока их явно не удалят через API. Если микросервис изменил свой IP или был удален, его старые метрики останутся висеть в Pushgateway, засоряя TSDB.
Для обхода сетевых ограничений в долгоживущих сервисах правильнее использовать механизм Prometheus Federation или Remote Write (о которых мы поговорим в следующих статьях), но не Pushgateway.
Высокая доступность (High Availability) в Prometheus
Как обеспечить отказоустойчивость самого мониторинга? Архитектура HA в Prometheus элегантна в своей простоте. В ней нет кластеризации в традиционном понимании.
Чтобы получить HA, вы просто запускаете два (или более) абсолютно независимых сервера Prometheus с идентичной конфигурацией. Оба сервера независимо друг от друга опрашивают одни и те же цели (Targets) и хранят данные на своих локальных дисках.
Плюсы такого подхода: * Shared-nothing архитектура. Падение одного сервера никак не влияет на другой. Нет сложных алгоритмов консенсуса (как Raft) или проблем с разделением сети (split-brain) между серверами мониторинга. * Простота эксплуатации. Не нужно настраивать сложные кластерные связи.
Минусы: * Двойная нагрузка на цели. Ваши микросервисы будут опрашиваться в два раза чаще. * Дублирование алертов. Оба сервера вычислят, что сервис упал, и оба отправят алерт. Эта проблема решается на уровне Alertmanager, который умеет принимать дублирующиеся алерты от разных серверов Prometheus, дедуплицировать их и отправлять пользователю только одно уведомление.
Понимание этих архитектурных компромиссов отличает инженера, который просто умеет писать конфиги, от архитектора, способного спроектировать надежную систему наблюдения за инфраструктурой.