Golang: otel.SetTracerProvider() — глобальный провайдер трассировки
otel.SetTracerProvider()
устанавливает глобальный провайдер трассировки, который становится доступным во всей программе. Это означает, что после вызова этой функции любой пакет или часть кода, использующая OpenTelemetry SDK, сможет получить доступ к этому провайдеру и создавать трейсы и спаны, не создавая отдельный провайдер в каждом пакете.
Как это работает?
OpenTelemetry SDK для Go использует глобальный провайдер трассировки для управления созданием трейсов и спанов. Функция otel.SetTracerProvider()
устанавливает провайдер, который используется по умолчанию. После этого можно создавать трассировки и спаны с помощью функции otel.Tracer()
.
Пример использования в разных пакетах
Рассмотрим пример, где otel.SetTracerProvider()
вызывается в главной функции (main
) программы, а затем используется в разных пакетах:
main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package main import ( "context" "log" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlpgrpc" "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/attribute" "myproject/mypackage" // Пакет, где используется трассировка ) func main() { ctx := context.Background() exporter, err := otlpgrpc.New(ctx, otlpgrpc.WithInsecure(), otlpgrpc.WithEndpoint("localhost:4317")) if err != nil { log.Fatalf("failed to create OTLP exporter: %v", err) } tracerProvider := trace.NewTracerProvider( trace.WithSyncer(exporter), trace.WithResource( attribute.String("service.name", "example-service"), ), ) otel.SetTracerProvider(tracerProvider) mypackage.DoWork() // Вызов функции из другого пакета, которая использует трассировку // Завершение работы if err := tracerProvider.Shutdown(ctx); err != nil { log.Fatalf("failed to shut down tracer provider: %v", err) } } |
mypackage/mypackage.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package mypackage import ( "context" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" ) func DoWork() { tracer := otel.Tracer("mypackage-tracer") ctx, span := tracer.Start(context.Background(), "work-span") defer span.End() // Здесь выполняется какая-то работа, которая будет отслеживаться span.AddEvent("Doing some work") } |
Почему это полезно?
- Глобальный доступ: Поскольку провайдер трассировки установлен глобально, любой пакет или часть программы может использовать его без необходимости повторного создания или передачи провайдера.
- Единая точка конфигурации: Можно легко настроить провайдер один раз в основной программе и использовать его во всей кодовой базе.
- Упрощение кода: Вам не нужно передавать экземпляр провайдера между функциями или пакетами.
Потенциальные проблемы
- Глобальные эффекты: Использование глобального состояния может привести к проблемам при тестировании и модульном тестировании. Если вы пишете тесты, вам нужно будет учитывать, что глобальный провайдер может изменяться.
- Множественные провайдеры: Если в программе используются разные провайдеры, это может привести к путанице, так как глобальный провайдер будет переопределять любой локальный.
Как управлять глобальными провайдерами в тестах?
Для модульных тестов рекомендуется сбросить глобальный провайдер перед каждым тестом, чтобы избежать побочных эффектов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/sdk/trace" ) func TestSomething(t *testing.T) { // Устанавливаем новый провайдер только для этого теста tracerProvider := trace.NewTracerProvider() otel.SetTracerProvider(tracerProvider) defer otel.SetTracerProvider(nil) // Возвращаем состояние до теста // Ваши тесты здесь } |
Вывод
otel.SetTracerProvider()
устанавливает глобальный провайдер трассировки, который может быть использован в любом пакете программы. Это упрощает создание и использование трассировок, но требует осторожности при тестировании и модульном тестировании, чтобы избежать непредсказуемых глобальных состояний.
Recommended Posts
Golang Sarama: настройка Partitioner
20.03.2024