1

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

在此处输入图像描述

GRPC 服务器和所有 rest-grpc 请求都在一个父跨度下跟踪,默认的 opentracing 非常好。使用 Java GRPC,我可以添加自定义子跨度,并且它以完美的层次结构出现在 Jaeger UI 中。但是当我尝试在 Go Lang 中添加相同的自定义子时,它不会添加到调用 GRPC 服务的父 Rest Service 跨度中。下面是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 标头提取,因为 GRPC 库已经处理好了。即使使用 java GRPC,我也不进行任何提取。我在 opentracing 中使用的范围管理器不适用于 go lang opentracing。

提前致谢!!!

干杯。

4

1 回答 1

1

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

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

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

正如文档otgrpc.OpenTracingServerInterceptor所说:

[...] 服务器 Span 将嵌入到 context.Context 中,供特定于应用程序的 gRPC 处理程序访问。

如果我们看一下函数实现:

// 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()
于 2020-06-24T19:52:11.450 回答