Как проводить мониторинг и измерять нагрузку на 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 как к источнику данных и позволяет строить наглядные дашборды и настраивать алерты.