全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 6 分钟 ✍️ juanwangdev

GORM Jaeger 链路追踪插件

Jaeger 插件为 GORM 提供分布式链路追踪能力,可记录每次 SQL 执行的完整调用链。

插件功能

追踪信息

插件自动记录以下信息到 Jaeger Span:

  • SQL 语句与参数
  • 执行耗时
  • 影响行数
  • 错误堆栈

集成步骤

安装依赖

Bash
go get gorm.io/plugin/opentelemetry/tracing

初始化 Jaeger

Go
import (
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/exporters/jaeger"
    "go.opentelemetry.io/otel/sdk/resource"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func initJaeger() (*sdktrace.TracerProvider, error) {
    exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(
        jaeger.WithEndpoint("http://localhost:14268/api/traces"),
    ))
    if err != nil {
        return nil, err
    }

    tp := sdktrace.NewTracerProvider(
        sdktrace.WithBatcher(exporter),
        sdktrace.WithResource(resource.NewWithAttributes(
            semconv.SchemaURL,
            semconv.ServiceNameKey.String("gorm-service"),
        )),
    )
    otel.SetTracerProvider(tp)
    return tp, nil
}

注册插件

Go
import "gorm.io/plugin/opentelemetry"

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    panic(err)
}

// 注册 OpenTelemetry/Jaeger 插件
db.Use(opentelemetry.New(opentelemetry.Config{
    ExcludeTables: []string{"logs"}, // 排除不需要追踪的表
}))

追踪上下文传递

在业务代码中使用

Go
func GetUser(ctx context.Context, id uint) (*User, error) {
    var user User
    // GORM 会自动从 ctx 中提取 trace context
    err := db.WithContext(ctx).First(&user, id).Error
    return &user, err
}

HTTP 中间件集成

Go
func tracingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        ctx, span := tracer.Start(r.Context(), r.URL.Path)
        defer span.End()

        r = r.WithContext(ctx)
        next.ServeHTTP(w, r)
    })
}

Jaeger UI 查看

访问界面

打开 http://localhost:16686,选择服务 gorm-service 即可查看追踪记录。

查询示例

在 Jaeger UI 中可看到:

  • 每个 SQL 语句作为独立 Span
  • SQL 参数以 Tag 形式记录
  • 执行耗时以 Duration 展示
  • 错误信息以 Logs 形式附加

注意事项

生产环境建议采样率不超过 10%,避免追踪数据量过大影响性能。

敏感参数(如密码)不会自动脱敏,需确认脱敏规则。

Jaeger Collector 地址需根据实际部署配置调整。

要点总结

  • Jaeger 插件基于 OpenTelemetry 标准实现链路追踪
  • 自动记录 SQL 语句、参数、耗时与错误
  • 通过 WithContext 传递 trace context 实现调用链串联
  • 配合 Jaeger UI 可可视化查询完整调用链
  • 生产环境需控制采样率,避免性能损耗

存放路径:D:\git2\jwdev\articles\GORM\进阶\插件系统\Jaeger 链路追踪.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 错误类型识别
下一篇 → GORM Prometheus 监控插件
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库