Fibersentry
Fiber용 Sentry 지원 라이브러리입니다.
참고: Go 1.18 이상이 필요합니다
Installation
이 미들웨어는 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
Signatures
fibersentry.New(config ...fibersentry.Config) fiber.Handler
Config
Examples
fibersentry
는 *sentry.Hub
인스턴스(https://godoc.org/github.com/getsentry/sentry-go#Hub)를 요청의 컨텍스트에 연결하여 요청의 나머지 수명 동안 사용할 수 있도록 합니다. fibersentry.GetHubFromContext()
메서드를 사용하여 이어지는 모든 미들웨어 및 경로에서 컨텍스트 자체에 액세스할 수 있습니다. 그리고 전역 sentry.CaptureMessage
, sentry.CaptureException
또는 기타 호출 대신 사용해야 합니다. 요청 간의 데이터 분리를 유지하기 때문입니다.
fibersentry
이전에 연결된 미들웨어에서는 *sentry.Hub
를 사용할 수 없습니다!
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 {
// 패닉이 발생했을 때 원래의 컨텍스트에 액세스할 수 있습니다
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("왜 그럴까")
})
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("사용자가 원치 않는 쿼리 문자열을 제공했지만 정상적으로 복구되었습니다")
})
}
return c.SendStatus(fiber.StatusOK)
})
log.Fatal(app.Listen(":3000"))
}
BeforeSend
콜백에서 컨텍스트 액세스하기
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 {
// 패닉이 발생했을 때 원래의 컨텍스트에 액세스할 수 있습니다
fmt.Println(c.Hostname())
}
}
return event
},
})
Last updated