Child Go GRPC opentracing 中的跨度

Child span in Go GRPC opentracing

我正在使用 Jaeger 在我们的微服务中添加 opentracing。我有两台 GRPC 服务器和一台 REST 服务器。

GRPC 服务器和所有 rest-grpc 请求都在一个 parent 范围内跟踪的默认 opentracing 非常好。使用 Java GRPC,我可以添加自定义 child 跨度,它在 Jaeger UI 中以完美的层次结构出现。但是当我尝试在 Go Lang 中添加相同的自定义 child 时,它不会添加到调用 GRPC 服务的 parent Rest Service span 中。下面是golang代码

"github.com/opentracing/opentracing-go"

cfg := jaegerConfig.Configuration{
    ServiceName: t.Name,
}

tracer, closer, err := cfg.NewTracer(
    jaegerConfig.Logger(jLogger),
    jaegerConfig.Metrics(jMetricsFactory),
)

gRPCServer := grpc.NewServer(
        grpc.UnaryInterceptor(
            otgrpc.OpenTracingServerInterceptor(tracer)),
        grpc.StreamInterceptor(
            otgrpc.OpenTracingStreamServerInterceptor(tracer)))

var span = tracer.StartSpan("Test Span")
span.SetTag("one", "value")
span.Finish()

我不想进行整个 http headers 提取,因为 GRPC 库已经处理好了。即使使用 java GRPC,我也不进行任何提取。我在 opentracing 中使用的范围管理器在 go lang opentracing 中不可用。

提前致谢!!!

干杯。

您可以尝试在 gRPC 处理程序中使用 StartSpanFromContext

    // import "github.com/opentracing/opentracing-go"
    
    span, _ := opentracing.StartSpanFromContext(ctx, "some_child_span")
    defer span.Finish()

    span.SetTag("foo", "bar")

正如 otgrpc.OpenTracingServerInterceptor 的文档所说:

[...] the server Span will be embedded in the context.Context for the application-specific gRPC handler(s) to access.

如果我们查看函数实现:

// import "github.com/opentracing/opentracing-go"

func OpenTracingServerInterceptor(tracer opentracing.Tracer, optFuncs ...Option) grpc.UnaryServerInterceptor {
        // ... a lot omitted
        ctx = opentracing.ContextWithSpan(ctx, serverSpan)
        // ...
        resp, err = handler(ctx, req) // your gRPC handler
        // ...   
}



编辑:鉴于以上情况,您可能可以省略此代码:

var span = tracer.StartSpan("Test Span")
span.SetTag("one", "value")
span.Finish()