我正在研究一些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}}
答案 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。也许您不必自己编写。