Расскажите о вашем опыте работы с Prometheus и экосистемой мониторинга.

Ответ

Я активно использовал Prometheus для мониторинга и алертинга в микросервисной архитектуре. Мой опыт включает:

  • Инструментация приложений: Добавлял кастомные метрики в Go-сервисы с помощью библиотеки prometheus/client_golang. Основные типы метрик, с которыми я работал:

    • Counter: для подсчета событий (например, общее число HTTP-запросов).
    • Gauge: для измерения текущего значения (например, количество активных горутин).
    • Histogram: для отслеживания распределения значений (например, время ответа на запрос).
    • Summary: похож на гистограмму, но вычисляет квантили на стороне клиента.
    // Пример метрики для отслеживания количества HTTP-запросов с метками (labels)
    httpRequestsTotal := prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests.",
        },
        []string{"method", "path", "status_code"},
    )
  • Настройка Exporter'ов: Конфигурировал и запускал стандартные экспортеры для сбора метрик с инфраструктурных компонентов, таких как node_exporter (для хостов), postgres_exporter и redis_exporter.

  • Написание PromQL-запросов: Создавал сложные запросы в PromQL для построения дашбордов в Grafana и для правил алертинга. Например, расчет 99-го перцентиля времени ответа или вычисление процента ошибок.

  • Конфигурация Alertmanager: Настраивал правила алертинга в Prometheus и управлял их маршрутизацией, группировкой и отправкой через Alertmanager в Slack, PagerDuty и другие системы.

  • Работа с экосистемой: В проектах с высокими требованиями к хранению данных использовал Thanos для долгосрочного хранения метрик и создания глобального представления данных с нескольких кластеров Prometheus. Для сбора метрик с короткоживущих batch-задач применял Pushgateway.

Ответ 18+ 🔞

А, ну, вот это да, про Prometheus! Ну, это ж моя родная стихия, блядь, как родная хата. Сидел, сука, в микросервисах, как сыч, и мониторил всё, что шевелится. Опыт, блядь, богатый, сейчас тебе разложу по полочкам, как я с этим добром управлялся.

Сначала, конечно, инструментация приложений. Это когда ты в каждый сервис на Go лезешь с библиотекой prometheus/client_golang и начинаешь везде счётчики втыкать. Типа, вот тут запрос пришёл — щёлк! Тут ошибка — щёлк! Как будто учётную книжку ведёшь, только для железяк, блядь.

Основные штуки, с которыми возился, это:

  • Counter — чтобы просто посчитать, сколько раз что-то случилось. Запросы там, ошибки. Тупо плюсует.
  • Gauge — это типа стрелка на приборе. Сейчас вот столько горутин, а через секунду — уже другое. Пляшет, сука.
  • Histogram и Summary — а вот это уже серьёзные ребята. Чтобы замерять, не сколько, а как долго. Время ответа, блядь. Гистограмма бакеты нарезает, а Summary сразу квантили считает. Разница, конечно, есть, но если вкратце — оба про «ой, как медленно всё работает, ёпта».

Вот, смотри, как это в коде выглядит, простыня наша священная:

// Создаём счётчик, который будет считать запросы, и к нему метки цепляем — метод, путь, код ответа.
httpRequestsTotal := prometheus.NewCounterVec(
    prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests.",
    },
    []string{"method", "path", "status_code"},
)

Потом, блядь, экспортеры. Это такие шпионы, которые на саму инфраструктуру цепляются. node_exporter — на сервер, чтобы знать, сколько памяти жрёт, postgres_exporter — в базу, redis_exporter — в кэш. Ставишь эту мартышку, и она тебе сама всё вытаскивает. Красота, в рот меня чих-пых!

Дальше — самое интересное, PromQL-запросы писать. Это когда ты уже не просто метрики собираешь, а начинаешь с ними шаманить. Строишь в Grafana графики, которые показывают не просто «запросов 1000», а «99-й перцентиль времени ответа вырос на 200 миллисекунд, потому что кто-то, блядь, кривую миграцию накатил». Или высчитываешь процент ошибок: «ой, а у нас тут каждая десятая ручка 500-ю ошибку плюёт, пора бить тревогу, ёперный театр!»

Ну и куда же без алертинга. Настроишь в Prometheus правила — мол, если процент ошибок выше 5 больше минуты — стреляй. А Alertmanager этот сигнал ловит, и начинается цирк: он его группирует (чтобы не заспамить, если всё падает разом), подавляет (если алерт уже есть, новый не слать) и раскидывает — кому в Slack, кому в PagerDuty. Чувствуешь себя диспетчером на пульте управления, только вместо самолётов — твои же сервисы, которые постоянно норовят накрыться медным тазом.

А в особо навороченных проектах, где метрик — овердохуища, и хранить их надо годами, подключал Thanos. Эта штука из нескольких разрозненных Prometheus'ов делает одну большую, глобальную картинку, да ещё и в объектное хранилище всё скидывает. А для всяких короткоживущих задач, которые сами про себя ничего не скажут, использовал Pushgateway — задача отработала и пнула в него свои метрики перед смертью, типа «я всё, ребята, вот статистика».

Вот так вот, блядь. Кажется, просто цифры собираешь, а на деле — целое государство из графиков, алертов и дашбордов строишь. Волнение ебать, когда всё зелёное, и терпения ноль ебать, когда всё вдруг красное.