You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:55:21