如何在 OpenTelemetry otelgin 中间件中获取 traceid 或完整上下文以将

Atm,我在 go 中处理了一堆我想跟踪的分布式微服务。我有一个通过 REST 工作的“api-gateway”,然后通过 gRPC 调用所需的微服务。


我通过 OpenTelemetry 进行的跟踪适用于 grpc 路径,但不知何故,otelgin 中间件似乎没有提供任何上下文,我可以进一步使用 grpc 服务中的相同 traceid 进行跟踪。


我默认使用 gin,然后像这样注入 otelgin 中间件。


r := gin.Default()

r.Use(middleware.Middleware(

    "Service-Name-XYZ",

))

据我看了一下中间件代码,应该有一个可跟踪的上下文,我可以给 grpc 客户端将他的跨度添加到跟踪中,但不知何故,似乎完全错过了,所以 grpctraceparent客户tracestate端gin context不能采取 opentelemetry 上下文传播的操作。


据我所知,中间件使用默认集TracerProvider和TextMapPropagator我在我的InitTracer函数中设置的,它在main.go.


func InitTracer() func(context.Context) error {


headers := map[string]string{

    "signoz-access-token": signozToken,

}


secureOption := otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))

if len(insecure) > 0 {

    secureOption = otlptracegrpc.WithInsecure()

}


exporter, err := otlptrace.New(

    context.Background(),

    otlptracegrpc.NewClient(

        secureOption,

        otlptracegrpc.WithEndpoint(collectorURL),

        otlptracegrpc.WithHeaders(headers),

    ),

)


if err != nil {

    log.Fatal(err)

}

resources, err := resource.New(

    context.Background(),

    resource.WithAttributes(

        attribute.String("service.name", serviceName),

        attribute.String("library.language", "go"),

    ),

)

if err != nil {

    log.Printf("Could not set resources: ", err)

}


otel.SetTracerProvider(

    sdktrace.NewTracerProvider(

        sdktrace.WithSampler(sdktrace.AlwaysSample()),

        sdktrace.WithSpanProcessor(sdktrace.NewBatchSpanProcessor(exporter)),

        sdktrace.WithSyncer(exporter),

        sdktrace.WithResource(resources),

    ),

)


otel.SetTextMapPropagator(

    propagation.NewCompositeTextMapPropagator(

        propagation.TraceContext{},

        propagation.Baggage{},

    ),

)

return exporter.Shutdown

}

所以我的问题是:


我是否遗漏了什么或者 otelgin 没有提供任何我可以提供给 grpc 客户端使用的可跟踪上下文?


繁星淼淼
浏览 412回答 1
1回答

慕标5832272

如果您使用的是otelgin 中间件,则可跟踪上下文将通过 传播ginContext.Request.Context()。因此,您可以将此请求上下文而不是 ginContext 传递给您的 gRPC 客户端以传播跟踪。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go