Распространение идентификационных данных в межсервисной связи gRPC
Я работаю над несколькими микро-сервисами 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
2 ответа
Не зная ваших фреймворков, я думаю, что для распространения этого в метаданных 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 как на стороне сервера, так и на стороне клиента: https://github.com/grpc-ecosystem/go-grpc-middleware/tree/master/tracing/opentracing. Возможно, вам не придется писать свои собственные.