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

使用ddtrace在Fiber框架中新建Trace异常问题求助

解决ddtrace + Fiber框架下StartSpanFromContext生成新Trace ID的问题

问题核心

fibertrace中间件并未将trace上下文注入到c.Context()中,而是存储在Fiber的Locals里,直接调用tracer.StartSpanFromContext(c.Context())会因为找不到父Span信息,生成全新的Trace ID。

解决方案

1. 从Fiber Locals中获取正确的Trace上下文

修改UserLoginHandler中的Span创建逻辑,先从Fiber的Locals中提取由fibertrace中间件存储的trace上下文:

func UserLoginHandler(readDB *gorm.DB, config *core.Config) fiber.Handler {
    return func(c *fiber.Ctx) error {
        // 从Fiber Locals中取出trace上下文
        traceCtx := c.Locals(fibertrace.ContextKey).(context.Context)
        // 基于已有trace上下文创建子Span
        span, ctx := tracer.StartSpanFromContext(traceCtx, "UserLoginHandler")
        defer span.Finish()

        req := new(models.UserLoginRequest)
        if err := c.BodyParser(req); err != nil {
            return err
        }
        var user models.User
        // 将带trace信息的ctx传入gorm,确保DB操作被追踪
        result := readDB.WithContext(ctx).Table("user").Where("email = ?", req.Email).Find(&user)
        // ... 后续业务逻辑
    }
}

2. 确保GORM的DDTrace集成生效

要让DB操作生成追踪日志,必须先注册GORM的DDTrace插件:

import "gopkg.in/DataDog/dd-trace-go.v1/contrib/gorm.io/gorm.v1"

// 初始化DB时注册插件
func initDB() *gorm.DB {
    db, err := gorm.Open(mysql.Open("dsn"), &gorm.Config{})
    if err != nil {
        panic(err)
    }
    // 注册DDTrace插件,指定服务名
    db.Use(gorm.NewPlugin(gorm.WithServiceName("deco-my-tree-db")))
    return db
}

验证

开启DDTrace调试模式后,再次请求接口,日志中应显示UserLoginHandler的Span与请求入口的Span拥有相同的Trace ID,且GORM的DB操作Span会作为UserLoginHandler的子Span出现。

内容的提问来源于stack exchange,提问作者신영재

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:53:14