gozero框架异步任务logx trace id

import (

"go.opentelemetry.io/otel/trace"

// "github.com/zeromicro/go-zero/core/limit"

"github.com/zeromicro/go-zero/core/logx"

...

)

func New Logic(ctx context.Context, svcCtx *svc.ServiceContext) *StockOrderLogic {

// 为每条消息生成独立的 trace ID

// UUID 格式: "550e8400-e29b-41d4-a716-446655440000"

// OpenTelemetry TraceID 需要 32 个十六进制字符(去掉连字符)

// OpenTelemetry SpanID 需要 16 个十六进制字符

traceUUID := uuid.New()

spanUUID := uuid.New()

// 将 UUID 转换为十六进制字符串(去掉连字符)

traceIDHex := strings.ReplaceAll(traceUUID.String(), "-", "")

spanIDHex := strings.ReplaceAll(spanUUID.String(), "-", "")

// SpanID 只需要前 16 个字符

if len(spanIDHex) > 16 {

spanIDHex = spanIDHex[:16]

} else if len(spanIDHex) < 16 {

// 如果不足 16 个字符,用 0 补齐

spanIDHex = spanIDHex + strings.Repeat("0", 16-len(spanIDHex))

}

// 创建 OpenTelemetry trace ID 和 span ID

traceIDBytes, err := trace.TraceIDFromHex(traceIDHex)

if err != nil {

// 如果解析失败,使用空值(但这种情况不应该发生)

traceIDBytes = trace.TraceID{}

}

spanIDBytes, err := trace.SpanIDFromHex(spanIDHex)

if err != nil {

// 如果解析失败,使用空值

spanIDBytes = trace.SpanID{}

}

// 创建 span context

spanCtx := trace.NewSpanContext(trace.SpanContextConfig{

TraceID: traceIDBytes,

SpanID: spanIDBytes,

Remote: false,

})

// 将 span context 注入到 context 中

ctx = trace.ContextWithSpanContext(ctx, spanCtx)

// 同时设置自定义 key(备用,确保兼容性)

ctx = context.WithValue(ctx, traceIDKey, traceIDHex)

ctx = context.WithValue(ctx, spanIDKey, spanIDHex)

return &BussLogic{

Logger: logx.WithContext(ctx),

ctx: ctx,

svcCtx: svcCtx,

}

}

相关推荐
lars_lhuan16 小时前
Go Once
开发语言·golang
hongtianzai16 小时前
Go vs Java:终极性能对决
java·开发语言·golang
贺小涛16 小时前
Golang Gin框架核心原理与架构解析
架构·golang·gin
古城小栈2 天前
Go 底层代码的完整分类
开发语言·后端·golang
耳冉鹅2 天前
Go无锁共享内存环形缓冲区设计
开发语言·golang
fy121632 天前
GO 快速升级Go版本
开发语言·redis·golang
童话ing3 天前
【Golang】Golang Map数据结构底层原理
数据结构·golang·哈希算法
GDAL3 天前
go.mod 文件讲解
golang·go.mod
Java面试题总结3 天前
Go图像处理基础: image包深度指南
图像处理·算法·golang
robch3 天前
golang container/heap 是一个为任意类型实现堆(优先队列)接口的包
数据结构·算法·golang