微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 gRPC 服务器存根中的 ctx 创建 OpenTelemetry span

如何解决如何从 gRPC 服务器存根中的 ctx 创建 OpenTelemetry span

我的 Go gRPC 服务器配备了

  1. Google Tracing span 导出器:

    import texporter "github.com/GoogleCloudplatform/opentelemetry-operations-go/exporter/trace"
    ...
    gcp,err := texporter.NewExporter()
    ...
    tracer := trace.NewTracerProvider(trace.WithSyncer(traceExporter),trace.WithSampler(trace.AlwaysSample()))
    otel.SetTracerProvider(tracer)
    
  2. 在 gRPC 服务器上注册的 otelgrpc 拦截器。

    unaryInterceptors := grpc_middleware.WithUnaryServerChain(
        otelgrpc.UnaryServerInterceptor(),)
    streamInterceptors := grpc_middleware.WithStreamServerChain(
        otelgrpc.StreamServerInterceptor(),)
    

现在我尝试在 RPC 实现中创建一个跟踪跨度,以便我可以为该方法创建一个子跨度,例如:

func (s *srv) Test(ctx context.Context,req *pb.Request) (*pb.TestResponse,error) {
    // create a span here
    span1 := [??????].Start()
    doWork1()
    span1.End()

    span2 := [??????].Start()
    doWork2()
    span2.End()
    ...
}

然而,目前还不清楚from the OpenTelemetry docs如何做到这一点。

我得到的最近的是 otel.GetTracerProvider().Tracer("some string here???") 提供了一个 Start(ctx)(ctx,Span)。但我不清楚在这里提供什么字符串(我的导出器没有文档所示的 url),这似乎很不方便。

我在想在某处有一个类似于 otelgrpc.SpanFromCtx(ctx)方法可以拉动跟踪器+创建一个带有我没有找到的 rpc ctx 的跨度。遗憾的是,关于 OT+gRPC+Go 的文档相当缺乏。

解决方法

由于您使用的是 github.com/GoogleCloudPlatform/opentelemetry-operations-go,因此您应该使用它自己来创建跨度而不是 opentelemetry。

您可以像这样创建一个新的跨度:

    // Create custom span.
    tracer := otel.TraceProvider().Tracer("example.com/trace")
    err = func(ctx context.Context) error {
        ctx,span := tracer.Start(ctx,"foo")
        defer span.End()

        // Do some work.

        return nil
    }(ctx)

更多详情,可以参考OpenTelemetry Google Cloud Trace Exporter

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。