Распространение идентификационных данных в межсервисной связи 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. Возможно, вам не придется писать свои собственные.

Другие вопросы по тегам