在gRPC服务间通信中传播traceID

时间:2019-04-15 15:41:34

标签: microservices grpc tracing opentracing grpc-go

我正在研究一些gRPC微服务,并使用上下文传递任何标头和元数据。我正在使用opentracing进行跟踪,并且我的一个gRPC服务调用了另一个gRPC服务,这时我在传播上下文时遇到了问题,因为它没有保留元数据和traceID。  我的代码如下

YourModelClass

在上面的代码中,我正在调用服务func A(ctx context.Context) { metadata:=extractMetadata(ctx) conn := &grpc.ClientConn{} zipkinCtx := opentracing.SpanFromContext(ctx).Context().(gozipkin.SpanContext) client := pb.NewDClient(conn) reply, err := client.LookupProperty(metadata.NewOutgoingContext(context.Background(), metadata.New(metadata))) } ,为此我必须使用可以接受的元数据重新创建新上下文,但是我不确定如何将tracIds传播到服务{{ 1}}

2 个答案:

答案 0 :(得分:1)

不知道您的框架,我认为要在GRPC元数据上进行传播,就需要您的服务器在接收调用时显式解析metadata。 GRPC documentation显示了以下示例:

func (s *server) LookupProperty(ctx context.Context, in *pb.SomeRequest) (*pb.SomeResponse, err) {
    md, ok := metadata.FromIncomingContext(ctx)
    // do something with metadata
}

使用此服务器现在应该可以访问Traceid;包含在“ md”中。

答案 1 :(得分:0)

我不确定,但是traceID似乎必须是GRPC元数据中的自定义字段。还可以查看GRPC拦截器,该拦截器为服务器端和客户端都启用了Opentracing支持:https://github.com/grpc-ecosystem/go-grpc-middleware/tree/master/tracing/opentracing。也许您不必自己编写。