Observability
Тема дорожной карты · Golang
Наблюдаемость в Go — дисциплина инструментирования Golang-сервисов так, чтобы их внутреннее состояние можно было вывести из трёх столпов телеметрии — метрик, логов и распределённых трассировок — без необходимости в ad-hoc отладочных сессиях в продакшене. Стандартный стек наблюдаемости в Go сочетает метрики Prometheus (публикуемые через promhttp.Handler()), структурированное логирование с Zap, Logrus или slog и распределённую трассировку через OpenTelemetry с экспортом спанов в Jaeger, Tempo или любой OTLP-совместимый бэкенд. context.Context — связующая ткань наблюдаемости в Go: трейс-спаны прикрепляются к ctx и распространяются через goroutines, gRPC-вызовы и HTTP-middleware, чтобы единственный запрос можно было отследить сквозь весь mesh микросервисов Kubernetes. Эндпоинты проверки здоровья — /healthz для liveness и /readyz для readiness — базовая, но критически важная часть наблюдаемости в Go для Kubernetes-развёртываний, сигнализирующая о готовности pod'а принимать трафик. Инвестиции в наблюдаемость Go с первого дня сокращают среднее время восстановления, делая сбои видимыми через Grafana-дашборды и запросы к структурированным логам.
Как это работает
Observability строится на log/slog (структурированное логирование, 1.21+), Prometheus-клиенте (github.com/prometheus/client_golang), OpenTelemetry Go SDK для traces + metrics. net/http/pprof экспонирует профили на отдельном порту. expvar — лёгкая альтернатива Prometheus для простых счётчиков. Cross-cutting concern: пробрасывайте context.Context везде — trace ID распространяются автоматически.
Когда применять
slog — для всего нового логирования: встроен, JSON из коробки, level-aware. Prometheus /metrics — на каждый сервис с первого дня. OpenTelemetry tracing — когда сервисов больше одного. /debug/pprof/* — на admin-порт, IP-restricted, за load balancer.
Типичные ошибки
Ловушки Observability: логирование через fmt.Println вместо slog (неструктурированно, дорого запрашивать); экспозиция /debug/pprof в публичный интернет (огромная утечка инфы + DoS-вектор); high-cardinality Prometheus-labels (request-id, user-id — Prometheus давится); нет sampling traces — backend перегружен.