必须在main()开头调用sentry.Init(),早于Gin初始化和goroutine启动;panic用sentry.Recover()兜底,业务error须用sentry.CaptureException()主动上报,并配置AttachStacktrace、HTTPIntegration及Scope信息。

必须在 main() 开头调用 sentry.Init(),否则 panic 和中间件内错误大概率静默丢失;sentry.Recover() 只兜底未捕获的 panic,业务 error 要用 sentry.CaptureException() 主动上报。
初始化 Sentry 必须早于 Gin 启动
常见错误是把 sentry.Init() 放在路由注册之后、r.Run() 之前,甚至塞进 init() 函数。结果是:HTTP handler 里 panic 了,Sentry 没收到;goroutine 崩溃了,日志里只有一行 panic: xxx,没堆栈也没上报。
-
sentry.Init()要放在main()最开头,早于gin.Default()和任何 goroutine 启动 - DNS 必须是完整格式,例如
https://xxx@o123.ingest.sentry.io/456,不能只填 public key 或域名 - 务必检查返回 error:
if err != nil { log.Fatal(err) },SDK 默认失败不报错 - 加上
Environment和Release字段,否则所有环境的错误都堆在production下无法筛选
Gin 中间件里正确捕获 panic
sentry.Recover() 本身只是个 recover 包装器,不带上下文、不还原原始堆栈。直接在中间件里写 defer sentry.Recover(),上报的堆栈会从中间件函数开始,而不是 panic 发生的那一行。
- 必须启用
AttachStacktrace: true,否则 HTTP 错误只显示panic: runtime error,没有文件和行号 - 中间件要配合
sentry.HTTPIntegration,否则 URL、Method、Status 都为空,所有错误都显示为GET / - 别忘了在中间件里调用
sentry.ConfigureScope()补充请求级信息,比如scope.SetTag("path", c.Request.URL.Path) - 如果用了 JWT 或 session,可加
scope.SetUser(sentry.User{ID: userID}),但别传 token 或密码
主动上报 error 别用 CaptureMessage
看到 if err != nil 就随手写 sentry.CaptureMessage(err.Error()),这是最常踩的坑。Sentry 会把它当普通字符串处理,无法聚类、没有堆栈、看不出是哪个 error 类型。
- 一律改用
sentry.CaptureException(err),它能提取 error 类型、完整堆栈、cause 链(比如fmt.Errorf("failed to fetch: %w", err)) -
CaptureException()不终止执行流,你仍需自己return或log - 数据库超时、第三方 API 返回非 2xx、JSON 解析失败——这些都不是 panic,必须手动
CaptureException() - 不要在 defer 里对已知 error 调用
sentry.Recover(),那是给未预期 panic 用的
gRPC 服务也要单独加中间件
Gin 的中间件对 gRPC 请求完全无效。如果你的服务同时暴露 HTTP 和 gRPC 接口,gRPC 的 panic 会彻底漏报,除非显式注册 gRPC 中间件。
- 用
github.com/grpc-ecosystem/go-grpc-middleware注册UnaryServerInterceptor和StreamServerInterceptor - interceptor 里写
defer func() { if r := recover(); r != nil { sentry.CaptureException(errors.New(fmt.Sprint(r))) } }() - 记得调用
sentry.Flush(time.Second * 5),否则进程退出前可能来不及发出去 - gRPC 的 context 不带 HTTP header,没法自动提取 TraceID 或用户 ID,得靠自定义 metadata 手动塞进 scope
最难的不是写几行初始化代码,而是确保每个 goroutine、每条请求路径、每个 error 分支都进了 Sentry 视野——这要求你在启动顺序、中间件位置、panic/recover 分工、以及 error 上报方式上全部做对,漏掉一环,错误就沉底了。


















