Microservices gRPC业务间通信中TraceID的传播
我正在研究一些gRPC微服务,并使用上下文传递任何头和元数据。我使用opentracing进行跟踪,我的一个gRPC服务调用另一个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
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调用传播跟踪信息的策略?是的,这是正确的