Как проводить мониторинг и измерять нагрузку на Go-приложение?

Ответ

Мониторинг нагрузки на Go-приложение — это процесс сбора, анализа и визуализации ключевых метрик производительности. Это позволяет выявлять узкие места и обеспечивать стабильность работы сервиса.

1. Ключевые метрики для отслеживания

  • CPU Usage: Загрузка процессора. Высокое значение может указывать на "тяжелые" вычисления.
  • Memory Usage: Потребление оперативной памяти. Важно следить за утечками (runtime.MemStats).
  • Goroutine Count: Количество активных горутин (runtime.NumGoroutine()). Резкий рост может сигнализировать о зависших горутинах.
  • Latency: Время ответа на запрос. Одна из важнейших бизнес-метрик.
  • RPS (Requests Per Second): Количество запросов в секунду. Показывает текущую нагрузку.

2. Встроенные инструменты Go

Go предоставляет мощные встроенные пакеты для профилирования и мониторинга:

  • net/http/pprof: Самый важный инструмент. Позволяет получить детальный профиль приложения (CPU, heap, goroutines) через HTTP-эндпоинты. Достаточно добавить одну строку в код:
    import _ "net/http/pprof"
  • expvar: Позволяет публиковать произвольные метрики (например, кастомные счетчики) в формате JSON по эндпоинту /debug/vars.
  • runtime.MemStats: Позволяет программно получить детальную статистику по использованию памяти.
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    // m.Alloc - байт выделено и не освобождено
    // m.Sys - всего байт получено от ОС
    fmt.Printf("Alloc = %v MiB", m.Alloc / 1024 / 1024)

3. Внешние системы мониторинга (Промышленный стандарт)

Для долгосрочного мониторинга и алертинга используется связка Prometheus + Grafana:

  1. Инструментация приложения: Вы добавляете в свое Go-приложение клиентскую библиотеку Prometheus (например, prometheus/client_golang).
  2. Экспорт метрик: Ваше приложение начинает отдавать метрики в специальном формате по HTTP-эндпоинту (обычно /metrics).
  3. Сбор данных: Сервер Prometheus периодически опрашивает (scrape) этот эндпоинт и сохраняет метрики в свою базу данных временных рядов.
  4. Визуализация: Grafana подключается к Prometheus как к источнику данных и позволяет строить наглядные дашборды и настраивать алерты.

Ответ 18+ 🔞

А, мониторинг, говоришь? Ну это, блядь, святое! Чтобы твоё Go-приложение не накрылось медным тазом в три часа ночи, пока ты сосалку сосёшь, за ним надо глаз да глаз. Это как за мартышкой в зоопарке — отвернулся, а она уже хуй с горы тебе в код засунула.

1. На что смотреть, чтобы не охуеть

  • CPU Usage: Процессор грузится как проклятый? Значит, где-то твой код хуярит вычисления без передышки. Ищи, где мозги ебёт.
  • Memory Usage: Память растёт как на дрожжах? Это, ёпта, классика — утечка. Забыл что-то закрыть, почистить, и всё, пиши пропало.
  • Goroutine Count: Горутины размножаются как тараканы? (runtime.NumGoroutine()). Резкий скачок — верный признак, что какая-то сука-горутина зависла и не закрывается. Пиздец на подходе.
  • Latency: Время ответа. Самая важная метрика, если не хочешь, чтобы пользователи послали тебя нахуй из-за тормозов.
  • RPS: Сколько запросов в секунду лопает твой сервис. Показывает, не положил ли его кто-нибудь уже.

2. Что нам дал добрый дядя Гоша из коробки

В Go, слава богу, уже встроено пол-хуя из того, что нужно. Не надо изобретать велосипед.

  • net/http/pprof: Это, блядь, волшебная таблетка! Прям святая вода от всех бесов в коде. Добавил одну строку — и у тебя уже есть целый арсенал для вскрытия.
    import _ "net/http/pprof"

    Теперь можно смотреть профили CPU, памяти, горутин — красота, ёперный театр!

  • expvar: Хочешь свои, кастомные счётчики выставить? Например, сколько раз пользователь нахуй послан? Пожалуйста, этот пакет выплюнет всё в JSON по /debug/vars.
  • runtime.MemStats: Хочешь знать про память ВСЁ? Вот тебе детальная статистика, прямо из нутрянки рантайма.
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    // m.Alloc - сколько байт выделил и ещё не выкинул
    // m.Sys - сколько всего байт у ОС выклянчил
    fmt.Printf("Alloc = %v MiB", m.Alloc / 1024 / 1024)

3. Серьёзные игрушки для взрослых дяденек (Prometheus + Grafana)

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

  1. Колёсики в код: Цепляешь к своему приложению библиотеку prometheus/client_golang. Это как вшить жучок.
  2. Стриптиз метрик: Приложение начинает стыдливо показывать все свои цифры по адресу /metrics.
  3. Сборщик-зануда: Prometheus, этот дотошный засранец, будет каждые N секунд приходить и считывать эти метрики, аккуратно складывая в свою базу.
  4. Красивые картинки: Grafana подключается к Прометею и рисует такие дашборды, что дух захватывает. А ещё может настройть алерты, чтобы слать тебе сообщение в три часа ночи, когда всё ебнулось. Красота же!