跳到主要内容
版本:websocket_v1.x.x

Fibersentry

Release Discord Test

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

配置

属性类型描述默认值
RepanicboolRepanic 配置 Sentry 在恢复后是否应该重新恐慌 (repanic)。如果使用了 Recover 中间件,请将其设置为 true。false
WaitForDeliveryboolWaitForDelivery 配置是否在处理响应之前阻塞请求。如果使用了 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.CaptureMessagesentry.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
},
})