Какие инструменты для мониторинга, логирования и трассировки вы использовали в Go-микросервисах? Расскажите о своем опыте настройки и применения.

Ответ

Да, я активно использовал стек инструментов для обеспечения наблюдаемости (observability) микросервисов, который строится на трех основных столпах: метрики, логи и трассировки.

1. Метрики (Monitoring)

Для сбора и анализа метрик я использовал связку Prometheus + Grafana.

  • Prometheus: Это система для сбора и хранения временных рядов (time-series). В Go-приложение легко интегрируется клиентская библиотека prometheus/client_golang. Я экспортировал стандартные метрики (CPU, память, Go runtime) и кастомные бизнес-метрики (например, количество обработанных запросов, время выполнения операций, количество ошибок — так называемый RED-метод: Rate, Errors, Duration).
  • Grafana: Инструмент для визуализации данных из Prometheus в виде дашбордов.

Пример экспорта кастомной метрики:

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

var httpRequestsTotal = promauto.NewCounterVec(
    prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests",
    },
    []string{"method", "path"}, // Метка для разделения по методу и пути
)

func myHandler(w http.ResponseWriter, r *http.Request) {
    httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path).Inc()
    w.Write([]byte("Hello, World!"))
}

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

2. Логирование (Logging)

Для логирования я предпочитаю использовать структурированные логи в формате JSON. Это позволяет легко парсить, индексировать и искать логи в системах вроде ELK Stack (Elasticsearch, Logstash, Kibana) или Loki.

  • Библиотеки в Go: zerolog или zap. Они очень производительные и удобные для создания структурированных логов.
  • Системы сбора: Loki от Grafana Labs — легковесная альтернатива ELK, хорошо интегрируется с Prometheus и Grafana.

3. Трассировка (Tracing)

Для отслеживания запросов в распределенной системе я использовал OpenTelemetry как стандарт для инструментирования кода и Jaeger в качестве бэкенда для хранения и визуализации трейсов.

  • OpenTelemetry (OTel): Позволяет добавлять в код информацию о span-ах (этапах выполнения запроса) и передавать контекст трассировки между сервисами через HTTP-заголовки или метаданные сообщений.
  • Jaeger: Помогает визуализировать полный путь запроса через все микросервисы, находить узкие места и анализировать ошибки в сложных взаимодействиях.

4. Профилирование (Profiling)

Для глубокого анализа производительности я использовал встроенный в Go инструмент pprof. Он позволяет собирать профили CPU, памяти (heap), горутин и блокировок, чтобы находить и устранять проблемы производительности непосредственно в коде.