Ответ
В моей практике Prometheus был основным инструментом для мониторинга микросервисной архитектуры на Kubernetes. Я настраивал его для сбора метрик с приложений, написанных на Go и Java, используя клиентские библиотеки (client_golang, Micrometer) и экспортеры для сторонних систем (Node Exporter для хостов, cAdvisor для контейнеров).
Конкретные задачи, которые я решал:
- Настройка сбора метрик: Создание и документирование эндпоинтов
/metricsдля сервисов. Инструментация бизнес-логики (счетчики запросов, гистограммы длительности). - Конфигурация в Kubernetes: Использование
ServiceMonitorCRD от Prometheus Operator для автоматического обнаружения подов. - Создание правил алертинга: Писал правила на PromQL для отслеживания SLA. Например, алерт на высокую задержку 95-го перцентиля или увеличение количества 5xx ошибок.
# Пример правила из моего опыта (alertmanager.yml)
groups:
- name: backend-services
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
for: 2m
labels:
severity: warning
team: backend
annotations:
description: "Error rate for {{ $labels.service }} is {{ $value }}. Instance: {{ $labels.instance }}"
runbook: "https://wiki.internal/runbooks/high-error-rate"
- Интеграция с Grafana: Создание дашбордов для команд разработки, отображающих ключевые метрики приложений (RPS, latency, error rate) и потребление ресурсов.
- Масштабирование: Для долговременного хранения и высокой доступности настраивал связку Prometheus + Thanos (Sidecar, Querier, Store Gateway).
Основные сложности и решения:
- Кардинальность метрик: Следил за высоким уровнем кардинальности из-за лейблов типа
user_id, использовал агрегацию в правилах записи (recording rules). - Потребление ресурсов: Настраивал интервалы скрейпинга (
scrape_interval) в зависимости от критичности сервиса и объема метрик.
Ответ 18+ 🔞
А, ну это ж моя тема, про Prometheus! Сидел я с ним, как с хорошей, но слегка ебнутой книгой — вроде всё понятно, а потом бац, и ты уже неделю гуглишь, почему какой-нибудь serviceMonitor нихуя не видит твои поды.
В общем, да, был у меня такой период — строил мониторинг для этой вашей микросервисной хуеты на кубере. Всё на Go и Java болталось. Задача, казалось бы, простая: чтобы сервисы не просто работали, а ещё и рассказывали, как они работают. А на деле — ёперный театр!
Чем конкретно мозг выносил:
- Настройка сбора метрик: Это ж надо было каждому сервису впендюрить эндпоинт
/metrics, да не просто так, а чтобы там были не только стандартные метрики, но и по бизнесу. Типа «сколько раз пользователь на кнопку «купить» нажал, а потом отменил, пидарас». Волнение ебать — вдруг из-за моих счетчиков всё начнёт тормозить. - Конфигурация в Kubernetes: Тут, вроде, красота — Prometheus Operator,
ServiceMonitor. Написал манифест, применил, а он тебе: «А я нихуя не нашел». И сидишь, бздишь, проверяешь лейблы, селекторы, неймспейсы. Оказывается, забыл вserviceAccountправа добавить. Сам от себя охуел. - Создание правил алертинга: Вот это самое интересное. Сидишь и думаешь: «А что такое «нормально» для этого сервиса?». Начинаешь писать на PromQL. Сначала простые правила: если сервис упал — это понятно. А потом начинается: «Если 95-й перцентиль задержки больше 500мс дольше 2 минут, но только если количество запросов больше 10 в секунду, и если это не ночь по МСК». Чёрта в душу, в сердцу мать! Писал такие алерты, что потом сам в них путался.
# Вот один из моих шедевров, до сих пор помню
groups:
- name: backend-services
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
for: 2m
labels:
severity: warning
team: backend
annotations:
description: "Error rate for {{ $labels.service }} is {{ $value }}. Instance: {{ $labels.instance }}"
runbook: "https://wiki.internal/runbooks/high-error-rate" # который, конечно, никто не читал
- Интеграция с Grafana: Тут уже поприкольнее. Сделаешь дашборд красивый, разработчикам покажешь — они такие: «О, а это круто!». А через месяц спрашиваешь: «Пользуетесь?». А они: «А, там графики какие-то были...». Доверия ебать ноль.
- Масштабирование: Когда метрик стало овердохуища, родной Prometheus начал хрипеть. Пришлось подключать Thanos. Это отдельная история про Sidecar, Querier и Store Gateway. Настраивал это всё, чувствовал себя архитектором, который строит замок из спагетти. Один неверный шаг — и будет вам хиросима и нигерсраки.
Основные грабли, на которые наступал:
- Кардинальность метрик: Это главный враг. Какой-нибудь умник решит в лейбл
user_idпихнуть, и всё — твой Prometheus схавает всю память и накроется медным тазом. Приходилось бегать и объяснять, что метрики — это не лог, и хуй с горы ты туда высококардинальные данные сунешь. Спасался recording rules, которые всё агрегировали заранее. - Потребление ресурсов: Тут баланс тонкий. Настроишь слишком частое снятие метрик (скрейпинг) — жрёт ресурсы как не в себя. Сделаешь редко — в кризисной ситуации будешь как слепой, данных не хватит. Терпения ноль ебать, пока подбираешь этот
scrape_intervalдля каждого сервиса индивидуально.
В общем, инструмент мощный, но чтобы он не превратился в хитрую жопу, которая сама себя ест, нужно с ним очень аккуратно. Почти как с женой после ссоры.