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()
我正在使用 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()