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

Ответ

Для сбора и мониторинга метрик я использую стек, ставший стандартом в cloud-native разработке: Prometheus + Grafana.

1. Prometheus

Prometheus — это система мониторинга и база данных временных рядов. Она работает по модели pull: сервер Prometheus периодически опрашивает (scrapes) эндпоинт /metrics вашего приложения, чтобы собрать свежие данные.

В Go-приложении это реализуется с помощью библиотеки client_golang.

Основные типы метрик:

  • Counter: Монотонно растущий счетчик (например, общее число HTTP-запросов).
  • Gauge: Значение, которое может увеличиваться и уменьшаться (например, количество активных горутин).
  • Histogram: Распределение значений по корзинам (бакетам) (например, время ответа на запрос).
  • Summary: Похож на гистограмму, но предоставляет квантили на стороне клиента.

Пример кода:

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promauto"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    // Создаем счетчик для общего числа HTTP-запросов
    httpRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{
        Name: "myapp_http_requests_total",
        Help: "Total number of HTTP requests.",
    })
)

func myHandler(w http.ResponseWriter, r *http.Request) {
    // Увеличиваем счетчик при каждом вызове
    httpRequestsTotal.Inc()
    w.Write([]byte("Hello, World!"))
}

func main() {
    http.HandleFunc("/", myHandler)
    // Отдаем метрики по эндпоинту /metrics
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}

2. Grafana

Grafana — это инструмент для визуализации данных из Prometheus (и многих других источников). Она позволяет:

  • Строить красивые и информативные дашборды.
  • Настраивать алертинг при выходе метрик за пороговые значения.

3. OpenTelemetry (OTel)

Это более современный и комплексный подход, который стремится унифицировать сбор метрик, логов и трейсов (signals). OTel может экспортировать данные в Prometheus, Jaeger и другие системы, что делает его гибким решением для построения полной системы observability.