OpenTelemetry

Тема дорожной карты · Golang

OpenTelemetry в Go — это стандартный SDK Cloud Native Computing Foundation (CNCF), который позволяет производить и экспортировать трассировки, метрики и логи из Golang-сервисов вендорно-нейтральным способом. Инструмент доступен через пакет go.opentelemetry.io/otel. Трейсер инициализируется с помощью otel.SetTracerProvider(tp), а спаны создаются с помощью tracer.Start(ctx, "operation-name"). W3C TraceContext-заголовки автоматически распространяются через HTTP- и gRPC-вызовы при использовании пакетов инструментации otelhttp и otelgrpc. OpenTelemetry в Go также интегрируется с Prometheus для метрик через экспортёр go.opentelemetry.io/otel/exporters/prometheus и со структурированным логированием через bridge-пакеты, которые прикрепляют идентификаторы трассировки к записям Zap и slog. Это объединяет все три столпа наблюдаемости: трассировки, метрики и логи.

Экспортёр OTLP (go.opentelemetry.io/otel/exporters/otlp/otlptrace) отправляет спаны в любой OpenTelemetry Collector, Jaeger или Grafana Tempo, что делает код инструментации независимым от бэкенда наблюдаемости. Раннее внедрение OpenTelemetry в Go предотвращает vendor lock-in и обеспечивает сквозную трассировку через Docker-контейнеры и Kubernetes-pod'ы со смешанными Go-, Python- и Java-сервисами.

Как это работает

OpenTelemetry строится на log/slog (структурированное логирование, начиная с версии 1.21), Prometheus-клиенте (github.com/prometheus/client_golang) и OpenTelemetry Go SDK для трассировок и метрик. net/http/pprof экспонирует профили на отдельном порту, а expvar — это лёгкая альтернатива Prometheus для простых счётчиков. Важным аспектом является пробрасывание context.Context везде, что позволяет автоматически распространять trace ID.

Когда применять

slog рекомендуется использовать для всего нового логирования, так как он встроен, выдаёт JSON из коробки и оснащен уровнем логирования. Prometheus /metrics должен быть доступен на каждом сервисе с первого дня. OpenTelemetry tracing следует применять, когда количество сервисов превышает один. /debug/pprof/* следует размещать на admin-порту, который ограничен по IP-адресу и находится за load balancer.

Типичные ошибки

Типичные ошибки при использовании OpenTelemetry включают логирование через fmt.Println вместо slog, что приводит к неструктурированному логированию и высоким затратам на запросы. Экспозиция /debug/pprof в публичный интернет может привести к огромной утечке информации и DoS-вектору. Использование high-cardinality Prometheus-labels, таких как request-id и user-id, может привести к перегрузке Prometheus. Наконец, отсутствие sampling traces может привести к перегрузке бэкенда наблюдаемости.

Связанные понятия

Полезные ресурсы