Microservices gRPC业务间通信中TraceID的传播

Microservices gRPC业务间通信中TraceID的传播,microservices,grpc,trace,opentracing,grpc-go,Microservices,Grpc,Trace,Opentracing,Grpc Go,我正在研究一些gRPC微服务,并使用上下文传递任何头和元数据。我使用opentracing进行跟踪,我的一个gRPC服务调用另一个gRPC服务,此时我在传播上下文时遇到问题,因为它没有保留元数据和traceID。 我的代码如下 func A(ctx context.Context) { metadata:=extractMetadata(ctx) conn := &grpc.ClientConn{} zipkinCtx := opentracing.SpanFro

我正在研究一些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
,我必须使用元数据重新创建一个新的上下文,对此我很满意,但我不确定如何将TracID传播到服务
D
,因为我不知道您的框架,我认为在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”中。

我不能绝对确定,但似乎
traceID
必须是GRPC元数据中的自定义字段。还可以看看GRPC拦截器,它们支持服务器端和客户端的Opentracing:。也许您不必编写自己的。

如果您记录
元数据。新建(元数据)
(在调用
LookupProperty
之前)它是否包含跟踪id?@dm03514 my traceid不在ctx的元数据中,我在尝试记录和验证时拥有所有元数据,但在传输到我调用的其他服务时出现问题。我想我看到了。所以对于函数A,您正在go的上下文中传播跟踪信息,但是现在您需要一种通过GRPC调用传播跟踪信息的策略?是的,这是正确的