OpenTelemetry Golang: как задать родительский идентификатор трассировщика?
В OpenTelemetry Go, когда вы создаете новый спан, его родительский идентификатор указывается автоматически через контекст (context.Context
). Таким образом, если вы хотите задать родительский идентификатор для нового спана, вам нужно передать контекст, содержащий уже существующий спан, в качестве родителя.
Как работает контекст в OpenTelemetry?
OpenTelemetry использует контекст Go (context.Context
) для передачи информации о родительских спанах. Спан, который вы создаете, будет автоматически привязан к родительскому спану, если вы передадите контекст, в котором уже есть родительский спан.
Пример создания спана с родительским идентификатором
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 |
package main import ( "context" "fmt" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" ) func main() { // Создание глобального трассировщика tracer := otel.Tracer("example-tracer") // Создание корневого спана ctx, rootSpan := tracer.Start(context.Background(), "root-span") fmt.Println("Root span created") // Создание дочернего спана с использованием корневого спана как родителя ctx, childSpan := tracer.Start(ctx, "child-span") fmt.Println("Child span created") // Завершение дочернего спана childSpan.End() // Завершение корневого спана rootSpan.End() } |
Объяснение кода
otel.Tracer("example-tracer")
: Создает экземпляр трассировщика с именем"example-tracer"
.tracer.Start(context.Background(), "root-span")
: Создает корневой спан. Это первый спан, который не имеет родителя.tracer.Start(ctx, "child-span")
: Создает дочерний спан, используя контекстctx
, который уже содержит корневой спан. В результате дочерний спан будет связан с корневым.
Задание родительского идентификатора вручную
Если вам нужно вручную задать родительский идентификатор (например, при создании нового контекста), вы можете использовать функцию trace.ContextWithSpan()
:
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 |
package main import ( "context" "fmt" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" ) func main() { // Создание глобального трассировщика tracer := otel.Tracer("example-tracer") // Создание корневого спана ctx, rootSpan := tracer.Start(context.Background(), "root-span") fmt.Println("Root span created") // Создание дочернего контекста с корневым спаном как родителем ctxWithParent := trace.ContextWithSpan(ctx, rootSpan) // Создание дочернего спана ctx, childSpan := tracer.Start(ctxWithParent, "child-span") fmt.Println("Child span created") // Завершение дочернего спана childSpan.End() // Завершение корневого спана rootSpan.End() } |
Объяснение использования trace.ContextWithSpan
trace.ContextWithSpan(ctx, span)
: Создает новый контекст с заданным спаном как родителем. Это полезно, когда вы хотите передать контекст с уже существующим спаном в другую функцию или горутину.
Почему это важно?
Задание родительского идентификатора необходимо для создания цепочки спанов, которая отражает структуру выполнения вашего приложения. Это помогает построить полную трассировку, показывающую, как различные части приложения взаимодействуют друг с другом.
Вывод
В OpenTelemetry Go родительский идентификатор спана задается через контекст. Вы можете создать дочерний спан, передав контекст с уже существующим спаном. Это позволяет строить иерархическую структуру спанов для отслеживания выполнения вашего приложения.
Recommended Posts
Golang Sarama: настройка Partitioner
20.03.2024