我正在使用Jaeger在我们的微服务中添加opentracing。我有两台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 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 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()
关于go - Go GRPC opentracing中的子范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62560345/