Неверный демаршалинг прото

Я пытаюсь расшифровать протоданные. Но прото не декодируется должным образом.

Вот как я делаю:

decodedStr, err := base64.StdEncoding.DecodeString(request.Body)
if err != nil {
    panic("malformed input")
}

data := &tracepb.ExportTraceServiceRequest{}
if err := proto.Unmarshal(decodedStr, data); err != nil {
        log.Fatalln("Failed to parse:", err)
}

log.Printf("Response - %v", data)

Вывод такой:

Response - resource_spans:{resource:{attributes:{key:"service.name"  value:{string_value:"node_app"}}  attributes:{key:"telemetry.sdk.language"  value:{string_value:"nodejs"}}  attributes:{key:"telemetry.sdk.name"  value:{string_value:"opentelemetry"}}  attributes:{key:"telemetry.sdk.version"  value:{string_value:"1.8.0"}}  attributes:{key:"process.pid"  value:{int_value:1}}  attributes:{key:"process.executable.name"  value:{string_value:"node"}}  attributes:{key:"process.command"  value:{string_value:"/usr/app/index.js"}}  attributes:{key:"process.command_line"  value:{string_value:"/usr/local/bin/node /usr/app/index.js"}}  attributes:{key:"process.runtime.version"  value:{string_value:"18.13.0"}}  attributes:{key:"process.runtime.name"  value:{string_value:"nodejs"}}  attributes:{key:"process.runtime.description"  value:{string_value:"Node.js"}}}  scope_spans:{scope:{name:"@opentelemetry/instrumentation-express"  version:"0.32.0"}  spans:{trace_id:"\xb5\x81\x91\x8b\x02\x9a/\xf1\x08\x06\xaf~\xea\x9fQ\xc0"  span_id:"T\x06\x89m\x1ex\xf9A"  parent_span_id:"?\xbc\x18`O\xa5\xb8\xe1"  name:"middleware - query"  kind:SPAN_KIND_INTERNAL  start_time_unix_nano:1673434036590614272  end_time_unix_nano:1673434036590671104  attributes:{key:"http.route"  value:{string_value:"/"}}  attributes:{key:"express.name"  value:{string_value:"query"}}  attributes:{key:"express.type"  value:{string_value:"middleware"}}  status:{}}  spans:{trace_id:"\xb5\x81\x91\x8b\x02\x9a/\xf1\x08\x06\xaf~\xea\x9fQ\xc0"  span_id:"\xd5c\xf7>\xf6Cxz"  parent_span_id:"?\xbc\x18`O\xa5\xb8\xe1"  name:"middleware - expressInit"  kind:SPAN_KIND_INTERNAL  start_time_unix_nano:1673434036590760704

Не уверен, почему traceId отображается так:

spans:{trace_id:"\xb5\x81\x91\x8b\x02\x9a/\xf1\x08\x06\xaf~\xea\x9fQ\xc0"

Я новичок в GoLang. Любая помощь будет принята с благодарностью

каков ваш ожидаемый traceid

ABDULLOKH MUKHAMMADJONOV 11.01.2023 12:54

@ABDULLOKHMUKHAMMADJONOV Это должно выглядеть примерно так "traceId": "77afc3496fce3f419cf45309a732bca8"

LW67 11.01.2023 12:56
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
2
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поле trace_id содержит идентификатор в виде двоичных данных, а не шестнадцатеричных. Сгенерированный метод proto String будет отображать двоичные данные в виде строки. Следовательно, непечатаемые символы отображаются как управляющие последовательности ASCII.

Если вы хотите отображать данные в другом формате (например, в шестнадцатеричном), вам нужно будет реализовать собственную функцию для рендеринга прототипа.

Ответ принят как подходящий

Использована функция encoding/hex модуля hex.EncodeToString() для преобразования bytes в hex

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