gpt4 book ai didi

go - Go GRPC opentracing中的子范围

转载 作者:行者123 更新时间:2023-12-01 21:09:50 24 4
gpt4 key购买 nike

我正在使用Jaeger在我们的微服务中添加opentracing。我有两台GRPC服务器和一台REST服务器。
enter image description here
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 header ,因为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 theapplication-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()

关于go - Go GRPC opentracing中的子范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62560345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com