1

我的 Go gRPC 服务器配备了

  1. 谷歌追踪跨度导出器:

    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. otelgrpc 拦截器在 gRPC 服务器上注册。

    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()
    ...
}

然而,从 OpenTelemetry 文档中却非常不清楚如何做到这一点。

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

我在想otelgrpc.SpanFromCtx(ctx)某处有某种方法可以拉动示踪剂+用我没有找到的 rpc ctx 创建一个跨度。遗憾的是,OT+gRPC+Go 上的文档非常缺乏。

4

1 回答 1

0

由于您使用的是github.com/GoogleCloudPlatform/opentelemetry-operations-go,因此您应该使用它自己来创建 span 而不是 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

于 2021-05-16T08:11:53.333 回答