1

我正在开发一些 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

4

2 回答 2

1

不知道你的框架,我认为在 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”中。

于 2019-04-15T16:50:01.837 回答
0

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

于 2019-04-17T15:55:38.300 回答