Fiber
Learn how to add Sentry instrumentation to programs using the Fiber package.
The Sentry Go SDK repository has a complete example of how to set up Sentry for a Fiber app.
For additional reference, see the sentryfiber
API documentation.
go get github.com/getsentry/sentry-go/fiber
import (
"fmt"
"net/http"
"github.com/getsentry/sentry-go"
sentryfiber "github.com/getsentry/sentry-go/fiber"
)
// To initialize Sentry's handler, you need to initialize Sentry itself beforehand
if err := sentry.Init(sentry.ClientOptions{
Dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
EnableTracing: true,
// Set TracesSampleRate to 1.0 to capture 100%
// of transactions for performance monitoring.
// We recommend adjusting this value in production,
TracesSampleRate: 1.0,
}); err != nil {
fmt.Printf("Sentry initialization failed: %v\n", err)
}
// Later in the code
sentryHandler := sentryfiber.New(sentryfiber.Options{
Repanic: true,
WaitForDelivery: true,
})
enhanceSentryEvent := func(ctx *fiber.Ctx) error {
if hub := sentryfiber.GetHubFromContext(ctx); hub != nil {
hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
}
return ctx.Next()
}
app := fiber.New()
app.Use(sentryHandler)
app.All("/foo", enhanceSentryEvent, func(c *fiber.Ctx) error {
panic("y tho")
})
app.All("/", func(ctx *fiber.Ctx) error {
if hub := sentryfiber.GetHubFromContext(ctx); 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 ctx.SendStatus(fiber.StatusOK)
})
if err := app.Listen(":3000"); err != nil {
panic(err)
}
sentryfiber
accepts a struct of Options
that allows you to configure how the handler will behave.
Currently, it respects three options:
// Repanic configures whether Sentry should repanic after recovery, in most cases it should be set to true,
// as fiber includes its own Recover middleware that handles http responses.
Repanic bool
// WaitForDelivery configures whether you want to block the request before moving forward with the response.
// Because Fiber's `Recover` handler doesn't restart the application,
// it's safe to either skip this option or set it to `false`.
WaitForDelivery bool
// Timeout for the event delivery requests.
Timeout time.Duration
sentryfiber
attaches an instance of *sentry.Hub
(https://godoc.org/github.com/getsentry/sentry-go#Hub) to the request's context, which makes it available throughout the rest of the request's lifetime. You can access it by using the sentryfiber.GetHubFromContext()
method on the context itself in any of your proceeding middleware and routes. This method should be used instead of the global sentry.CaptureMessage
, sentry.CaptureException
, or any other calls, as it maintains the separation of data between the requests.
Keep in mind that *sentry.Hub
won't be available in middleware attached before sentryfiber
!
func enhanceSentryEvent := func(ctx *fiber.Ctx) error {
if hub := sentryfiber.GetHubFromContext(ctx); hub != nil {
hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
}
return ctx.Next()
}
// Later in the code
sentryHandler := sentryfiber.New(sentryfiber.Options{
Repanic: true,
WaitForDelivery: true,
})
defaultHandler := func(ctx *fiber.Ctx) error {
if hub := sentryfiber.GetHubFromContext(ctx); 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 ctx.SendStatus(fiber.StatusOK)
}
fooHandler := enhanceSentryEvent(func(ctx *fiber.Ctx) {
panic("y tho")
})
app.All("/foo", fooHandler)
app.All("/", defaultHandler)
if err := app.Listen(":3000"); err != nil {
panic(err)
}
fmt.Println("Listening and serving HTTP on :3000")
sentry.Init(sentry.ClientOptions{
Dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
if hint.Context != nil {
if ctx, ok := hint.Context.Value(sentry.RequestContextKey).(*fiber.Ctx); ok {
// You have access to the original Context if it panicked
fmt.Println(utils.CopyString(ctx.Hostname()))
}
}
return event
},
})
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").