#c #grpc #open-telemetry
Вопрос:
Я пытаюсь выяснить ошибку в своем приложении, но я немного в неведении.
При вызове службы мой клиент выдает ошибку при получении ответа с ошибкой утверждения «недопустимое значение заголовка».
Я использую открытую телеметрию и добавляю контекст span в контекст моего клиента, как показано в их примерах.
// inject current context to grpc metadata
auto current_ctx = opentelemetry::context::RuntimeContext::GetCurrent();
GrpcClientCarrier carrier(context);
auto prop = opentelemetry::context::propagation::GlobalTextMapPropagator::GetGlobalPropagator();
prop->Inject(carrier, current_ctx);
Контекст span добавляется ко всем моим службам, но только одна из них завершается с этой ошибкой.
Там я ничего не делаю по-другому.
И похоже, что идентификатор span (00-8703a0beea6ff515a32967c40dfb41fb-49b3c2fe1ac932a9-01) находится внутри массива байтов метаданных.
Если я удалю контекст span, это сработает.
raise 0x00007ffff67b918b
abort 0x00007ffff6798859
grpc::CoreCodegen::assert_fail(char const*, char const*, int) 0x0000555555769737
grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, grpc::internal::CallOpSendMessage, grpc::internal::CallOpRecvInitialMetadata, grpc::internal::CallOpRecvMessage<google::protobuf::MessageLite>, grpc::internal::CallOpClientSendClose, grpc::internal::CallOpClientRecvStatus>::ContinueFillOpsAfterInterception() 0x0000555555dd5c3b
grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, grpc::internal::CallOpSendMessage, grpc::internal::CallOpRecvInitialMetadata, grpc::internal::CallOpRecvMessage<google::protobuf::MessageLite>, grpc::internal::CallOpClientSendClose, grpc::internal::CallOpClientRecvStatus>::FillOps(grpc::internal::Call*) 0x0000555555dd5971
grpc::Channel::PerformOpsOnCall(grpc::internal::CallOpSetInterface*, grpc::internal::Call*) 0x00005555557a2482
grpc::internal::Call::PerformOps(grpc::internal::CallOpSetInterface*) 0x00005555557847e7
grpc::internal::BlockingUnaryCallImpl<google::protobuf::MessageLite, google::protobuf::MessageLite>::BlockingUnaryCallImpl(grpc::ChannelInterface*, grpc::internal::RpcMethod constamp;, grpc::ClientContext*, google::protobuf::MessageLite constamp;, google::protobuf::MessageLite*) 0x0000555555dd124b
grpc::internal::BlockingUnaryCall<grpc::station::StationId, grpc::station::DefaultResponse, google::protobuf::MessageLite, google::protobuf::MessageLite> client_unary_call.h:45
E1014 11:47:58.117958972 2120287 call.cc:926] validate_metadata: {"created":"@1634204878.117940102","description":"Illegal header value","file":"/builds/grpc/src/core/lib/surface/validate_metadata.cc","file_line":51,"offset":55,"raw_bytes":"30 30 2d 38 37 30 33 61 30 62 65 65 61 36 66 66 35 31 35 61 33 32 39 36 37 63 34 30 64 66 62 34 31 66 62 2d 34 39 62 33 63 32 66 65 31 61 63 39 33 32 61 39 2d 30 31 7f '00-8703a0beea6ff515a32967c40dfb41fb-49b3c2fe1ac932a9-01.'u0000"}
E1014 11:47:58.117989343 2120287 call_op_set.h:980] assertion failed: false
Комментарии:
1. Почему «raw_bytes» имеет смешанный контекст трассировки байтов и строк?
2. Вот в чем вопрос. Я делаю это, как в примере с открытой телеметрией.