Как и куда собирают метрики в Go-приложениях?

Ответ

Метрики в Go-приложениях обычно собирают с помощью специализированных библиотек и отправляют в системы мониторинга. Основные подходы:

  1. Prometheus

    • Описание: Самый популярный стандарт в индустрии для сбора метрик. Работает по pull-модели: приложение предоставляет метрики по HTTP-эндпоинту (/metrics), а сервер Prometheus периодически их опрашивает.
    • Библиотека: github.com/prometheus/client_golang.
    • Пример:
      
      import (
      "github.com/prometheus/client_golang/prometheus"
      "github.com/prometheus/client_golang/prometheus/promhttp"
      "net/http"
      )

    var ( // Определяем метрику типа Counter requestsTotal = prometheus.NewCounter(prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of http requests.", }) )

    func init() { // Регистрируем метрику в глобальном реестре prometheus.MustRegister(requestsTotal) }

    func main() { // Увеличиваем счетчик при каждом запросе requestsTotal.Inc()

    // Создаем хендлер для отдачи метрик
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)

    }

  2. OpenTelemetry (OTel)

    • Описание: Современный, вендор-независимый стандарт для сбора телеметрии (метрики, трейсы, логи). Позволяет гибко настраивать экспорт данных в различные бэкенды (Prometheus, Jaeger, Grafana и др.), не меняя код приложения. Считается предпочтительным подходом для новых систем.
  3. StatsD / Graphite

    • Описание: Легковесная система, работающая по push-модели. Приложение отправляет метрики по UDP-протоколу агенту StatsD, который их агрегирует и пересылает в систему хранения, например, Graphite. Плюсы: минимальное влияние на производительность приложения.
  4. InfluxDB

    • Описание: Специализированная база данных временных рядов (Time Series Database), оптимизированная для хранения и обработки метрик и событий. Приложения могут отправлять метрики напрямую в InfluxDB по HTTP API.