Fibersentry
Sentry 对 Fiber 的支持。
注意:需要 Go 1.18 及以上版本
安装
此中间件支持 Fiber v2。
go get -u github.com/gofiber/fiber/v2
go get -u github.com/gofiber/contrib/fibersentry
go get -u github.com/getsentry/sentry-go
签名
fibersentry.New(config ...fibersentry.Config) fiber.Handler
配置
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
Repanic | bool | Repanic 配置 Sentry 在恢复后是否应该重新恐慌 (repanic)。如果使用了 Recover 中间件,请将其设置为 true。 | false |
WaitForDelivery | bool | WaitForDelivery 配置是否在处理响应之前阻塞请求。如果使用了 Recover 中间件,可以安全地跳过此选项或将其设置为 false。 | false |
超时 | time.Duration | 事件发送请求的超时时间。 | time.Second * 2 |
用法
fibersentry
将一个 *sentry.Hub
实例 (https://godoc.org/github.com/getsentry/sentry-go#Hub) 附加到请求的上下文中,使其在请求的其余生命周期内可用。您可以在后续的任何中间件和路由中通过在上下文本身上使用 fibersentry.GetHubFromContext()
或 fibersentry.MustGetHubFromContext()
方法来访问它。请记住,应该使用 *sentry.Hub
而不是全局的 sentry.CaptureMessage
、sentry.CaptureException
或任何其他调用,因为它可以保持请求之间的数据隔离。
- 请注意,在附加到
fibersentry
*之前* 的中间件中,*sentry.Hub
不可用。在这种情况下,GetHubFromContext()
将返回 nil,而MustGetHubFromContext()
将会发生 panic。
package main
import (
"fmt"
"log"
"github.com/getsentry/sentry-go"
"github.com/gofiber/contrib/fibersentry"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/utils"
)
func main() {
_ = sentry.Init(sentry.ClientOptions{
Dsn: "",
BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
if hint.Context != nil {
if c, ok := hint.Context.Value(sentry.RequestContextKey).(*fiber.Ctx); ok {
// You have access to the original Context if it panicked
fmt.Println(utils.ImmutableString(c.Hostname()))
}
}
fmt.Println(event)
return event
},
Debug: true,
AttachStacktrace: true,
})
app := fiber.New()
app.Use(fibersentry.New(fibersentry.Config{
Repanic: true,
WaitForDelivery: true,
}))
enhanceSentryEvent := func(c *fiber.Ctx) error {
if hub := fibersentry.GetHubFromContext(c); hub != nil {
hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
}
return c.Next()
}
app.All("/foo", enhanceSentryEvent, func(c *fiber.Ctx) error {
panic("y tho")
})
app.All("/", func(c *fiber.Ctx) error {
if hub := fibersentry.GetHubFromContext(c); hub != nil {
hub.WithScope(func(scope *sentry.Scope) {
scope.SetExtra("unwantedQuery", "someQueryDataMaybe")
hub.CaptureMessage("User provided unwanted query string, but we recovered just fine")
})
}
return c.SendStatus(fiber.StatusOK)
})
log.Fatal(app.Listen(":3000"))
}
在 BeforeSend
回调中访问上下文
sentry.Init(sentry.ClientOptions{
Dsn: "your-public-dsn",
BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
if hint.Context != nil {
if c, ok := hint.Context.Value(sentry.RequestContextKey).(*fiber.Ctx); ok {
// You have access to the original Context if it panicked
fmt.Println(c.Hostname())
}
}
return event
},
})