问题描述
我的 Go gRPC 服务器配备了
-
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)
-
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)