Ответ
Jaeger — это open-source система для распределенной трассировки (distributed tracing). Её основная задача — мониторинг и отладка транзакций в сложных микросервисных архитектурах.
Когда один запрос проходит через несколько сервисов, Jaeger позволяет отследить весь его путь, визуализировать зависимости между сервисами и находить узкие места (bottlenecks) или ошибки.
Интеграция с Go-приложениями
Современный стандарт для интеграции — это OpenTelemetry (OTel), который предоставляет API и SDK для инструментирования кода. Jaeger выступает в роли бэкенда (хранилища) для собранных трейсов.
Основные шаги интеграции:
-
Инициализация Трейсера: Настройка экспортера, который будет отправлять данные (трейсы) в Jaeger.
import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/jaeger" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" ) func initTracer(serviceName, jaegerEndpoint string) (*sdktrace.TracerProvider, error) { exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(jaegerEndpoint))) if err != nil { return nil, err } tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), sdktrace.WithResource(resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceNameKey.String(serviceName), )), ) otel.SetTracerProvider(tp) return tp, nil }
-
Инструментирование кода: Создание "спанов" (spans), которые представляют собой отдельные операции (например, HTTP-запрос, вызов БД). Это часто делается автоматически с помощью middleware для веб-серверов (http, gRPC).
-
Контекстная Пропагация: Передача контекста трассировки (
trace id
,span id
) между сервисами. В Go это делается через стандартныйcontext.Context
, который OTel обогащает нужными данными.
Мой опыт включает:
- Настройку сэмплинга для контроля объема отправляемых данных (например,
TraceIDRatioBased
). - Использование middleware для автоматической трассировки входящих и исходящих HTTP/gRPC запросов.
- Анализ производительности и поиск причин задержек (latency) с помощью UI Jaeger.
- Отладку распределенных транзакций для понимания, на каком этапе и в каком сервисе произошла ошибка.