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