首页 > 解决方案 > 在 gRPC 服务间通信中传播 traceID

问题描述

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

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)))
}

在上面的代码中,我正在调用服务D,我必须使用我可以接受的元数据重新创建一个新的上下文,但我不确定如何将 tracIds 传播到服务D

标签: microservicesgrpctraceopentracinggrpc-go

解决方案


不知道你的框架,我认为在 GRPC 元数据上传播它需要你的服务器在接收调用时显式解析元数据。GRPC文档显示了一个示例:

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

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


推荐阅读