Расскажи про опыт работы с Prometheus

Ответ

В моей практике Prometheus был основным инструментом для мониторинга микросервисной архитектуры на Kubernetes. Я настраивал его для сбора метрик с приложений, написанных на Go и Java, используя клиентские библиотеки (client_golang, Micrometer) и экспортеры для сторонних систем (Node Exporter для хостов, cAdvisor для контейнеров).

Конкретные задачи, которые я решал:

  • Настройка сбора метрик: Создание и документирование эндпоинтов /metrics для сервисов. Инструментация бизнес-логики (счетчики запросов, гистограммы длительности).
  • Конфигурация в Kubernetes: Использование ServiceMonitor CRD от 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 для каждого сервиса индивидуально.

В общем, инструмент мощный, но чтобы он не превратился в хитрую жопу, которая сама себя ест, нужно с ним очень аккуратно. Почти как с женой после ссоры.