Зачем нужен Prometheus, если есть Grafana
Что проверяют
Понимаете ли вы, из каких частей состоит стек мониторинга и где на самом деле лежат данные. Вопрос ловит частое заблуждение, что Grafana и есть мониторинг. Разработчику на Go следом задают практический вопрос: как вы отдаёте метрики из сервиса и какие метки ставите.
Как отвечать
Главная мысль: Grafana не собирает и не хранит метрики, она строит графики по данным из внешних источников. Prometheus и есть такой источник.
- Prometheus: база временных рядов и сборщик. По модели pull сам опрашивает
/metricsкаждого сервиса с интерваломscrape_interval, хранит данные локально (по умолчанию 15 дней), отвечает на запросы PromQL, вычисляет recording rules и alerting rules; - Alertmanager: получает сработавшие алерты от Prometheus, группирует их, глушит на время работ и рассылает в Telegram, почту, PagerDuty;
- Grafana: дашборды поверх Prometheus, Loki, Tempo, PostgreSQL и других источников. Умеет свои алерты, но данные для них всё равно запрашивает у источника.
В Go-сервисе метрики отдают через github.com/prometheus/client_golang: регистрируете CounterVec, HistogramVec, Gauge и вешаете promhttp.Handler() на /metrics. Стандартный реестр сразу отдаёт go_goroutines, метрики GC и памяти, process_*. Для задержек HTTP берут гистограмму, потому что по ней histogram_quantile считает перцентиль сразу по всем инстансам.
Для долгого хранения и нескольких кластеров Prometheus дополняют Thanos, Mimir или VictoriaMetrics, а для короткоживущих джобов, которые не доживут до опроса, есть Pushgateway.
Где спотыкаются
Говорят, что метрики хранятся в Grafana. На вопросе «что будет, если Grafana упадёт» ответ разваливается: перестанут открываться дашборды, а сбор метрик и алерты Prometheus продолжат работать.
Кладут в метки user_id, URL с идентификаторами или текст ошибки. Каждое новое значение метки это новый временной ряд, и память Prometheus растёт вплоть до OOM.
Путают Summary и Histogram. Квантили Summary считаются внутри сервиса, и сложить их по десяти подам нельзя: среднее перцентилей не даёт перцентиль.