为了账号安全,请及时绑定邮箱和手机立即绑定

Go GRPC opentracing 中的子跨度

Go GRPC opentracing 中的子跨度

Go
饮歌长啸 2022-06-13 15:26:07
我正在使用 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。
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您可以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()


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号