Go语言Proto反序列化后trace_id显示异常问题咨询
Proto解码后trace_id显示异常问题解决
你的解码逻辑没有问题,trace_id显示成带转义字符的形式(比如\xb5\x81\x91\x8b\x02\x9a/\xf1\x08\x06\xaf~\xea\x9fQ\xc0),是因为trace_id在OpenTelemetry的Proto定义中是bytes类型,对应Go语言的[]byte。当你用log.Printf("%v", data)打印时,Go会自动把[]byte中的非可打印ASCII字符转义为十六进制形式,这是语言默认的格式化行为,不是解码错误。
解决方案:将trace_id转为标准十六进制字符串
如果要得到OpenTelemetry标准的十六进制格式trace_id,可以使用Go标准库的encoding/hex包,把二进制的[]byte转成字符串。修改你的打印逻辑如下:
import ( "encoding/hex" // 保留其他原有导入包 ) // 原解码代码保持不变 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) } // 遍历Span,格式化二进制ID字段 for _, resourceSpan := range data.ResourceSpans { for _, scopeSpan := range resourceSpan.ScopeSpans { for _, span := range scopeSpan.Spans { // 转换为十六进制字符串 traceID := hex.EncodeToString(span.TraceId) spanID := hex.EncodeToString(span.SpanId) parentSpanID := hex.EncodeToString(span.ParentSpanId) log.Printf("Span: name=%s, trace_id=%s, span_id=%s, parent_span_id=%s", span.Name, traceID, spanID, parentSpanID) // 若需要打印完整Span信息,可同时保留原打印并补充格式化后的ID // log.Printf("Full span details: %v | Formatted trace_id: %s", span, traceID) } } }
效果说明
运行修改后的代码,trace_id会显示为类似b581918b029a2ff10806af7eea9f51c0的标准十六进制字符串,这也是OpenTelemetry系统中trace_id的常规展示形式。
内容的提问来源于stack exchange,提问作者LW67
相关产品推荐
相关产品推荐

