go - Go GRPC opentracing中的子范围

标签 go grpc jaeger opentracing distributed-tracing

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

相关文章:

spring-boot - 如何使用 Spring Boot 的应用程序日志(由 slf4j 生成)丰富 Jaeger opentracing 数据?

go - 为什么 go-jaeger-client 需要度量和日志的包装器?

windows - 在 Go 中执行一个 vbscript

go - GRPC-GO:生成的 pb.go 文件中未显示客户端 stub

go - 如何将值从一个 handlerFunc 传递到另一个 go-gin

java - 如何在 Java 中捕获所有传入的 gRPC 消息?

java - 为什么我应该使用 gRPC 而不是 IPC/Simple websocket?

java - 如何在java中更改Jaeger API的主机和端口

testing - 在 Go 中模拟单个方法

string - uint16到xx.x float —最快的算法?