diff --git a/docs/platforms/go/guides/fiber/index.mdx b/docs/platforms/go/guides/fiber/index.mdx new file mode 100644 index 0000000000000..90f93027ddc9f --- /dev/null +++ b/docs/platforms/go/guides/fiber/index.mdx @@ -0,0 +1,165 @@ +--- +title: Fiber +description: "Learn how to add Sentry instrumentation to programs using the Fiber package." +--- + +This page shows how to add Sentry instrumentation to programs using the Fiber +package. + +For a quick reference, there is a [complete +example](https://github.com/getsentry/sentry-go/tree/master/_examples/fiber) +available directly at the Go SDK source code repository. + +[GoDoc-style API +documentation](https://godoc.org/github.com/getsentry/sentry-go/fiber) is also +available. + +## Install + +```shell +go get github.com/getsentry/sentry-go/fiber +``` + + + + + +```go +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: "___PUBLIC_DSN___", + 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) + } +``` + +## Configure + +`sentryfiber` accepts a struct of `Options` that allows you to configure how the handler will behave. + +Currently, it respects three options: + +```go +// 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 +``` + +## Usage + +`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. +And it should be used instead of the global `sentry.CaptureMessage`, `sentry.CaptureException`, or any other calls, as it keeps the separation of data between the requests. + +**Keep in mind that `*sentry.Hub` won't be available in middleware attached before `sentryfiber`!** + +```go +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") +``` + +### Accessing Context in `BeforeSend` callback + + + +```go +sentry.Init(sentry.ClientOptions{ + Dsn: "___PUBLIC_DSN___", + 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 + }, +}) +``` diff --git a/docs/product/performance/getting-started.mdx b/docs/product/performance/getting-started.mdx index f8216e72ef05b..0db54698f7c0d 100644 --- a/docs/product/performance/getting-started.mdx +++ b/docs/product/performance/getting-started.mdx @@ -17,6 +17,7 @@ If you don't already have performance monitoring enabled, use the links for supp - [Echo](/platforms/go/guides/echo/performance/) - [FastHTTP](/platforms/go/guides/fasthttp/performance/) + - [Fiber](/platforms/go/guides/fiber/performance/) - [Gin](/platforms/go/guides/gin/performance/) - [Iris](/platforms/go/guides/iris/performance/) - [Martini](/platforms/go/guides/martini/performance/) diff --git a/src/components/platformIcon.tsx b/src/components/platformIcon.tsx index ad313a1d2e000..21638ae3f246b 100644 --- a/src/components/platformIcon.tsx +++ b/src/components/platformIcon.tsx @@ -49,6 +49,7 @@ import FalconSVG from 'platformicons/svg/falcon.svg'; import FastapiSVG from 'platformicons/svg/fastapi.svg'; import FasthttpSVG from 'platformicons/svg/fasthttp.svg'; import FastifySVG from 'platformicons/svg/fastify.svg'; +import FiberSVG from 'platformicons/svg/fiber.svg'; import FlaskSVG from 'platformicons/svg/flask.svg'; import FlutterSVG from 'platformicons/svg/flutter.svg'; import FontSVG from 'platformicons/svg/font.svg'; @@ -181,6 +182,7 @@ import FalconSVGLarge from 'platformicons/svg_80x80/falcon.svg'; import FastapiSVGLarge from 'platformicons/svg_80x80/fastapi.svg'; import FasthttpSVGLarge from 'platformicons/svg_80x80/fasthttp.svg'; import FastifySVGLarge from 'platformicons/svg_80x80/fastify.svg'; +import FiberSVGLarge from 'platformicons/svg_80x80/fiber.svg'; import FlaskSVGLarge from 'platformicons/svg_80x80/flask.svg'; import FlutterSVGLarge from 'platformicons/svg_80x80/flutter.svg'; import FontSVGLarge from 'platformicons/svg_80x80/font.svg'; @@ -465,6 +467,10 @@ const formatToSVG = { sm: FasthttpSVG, lg: FasthttpSVGLarge, }, + fiber: { + sm: FiberSVG, + lg: FiberSVGLarge, + }, flask: { sm: FlaskSVG, lg: FlaskSVGLarge, @@ -836,6 +842,7 @@ export const PLATFORM_TO_ICON = { go: 'go', 'go-echo': 'echo', 'go-fasthttp': 'fasthttp', + 'go-fiber': 'fiber', 'go-gin': 'gin', 'go-iris': 'iris', 'go-martini': 'martini', diff --git a/src/middleware.ts b/src/middleware.ts index a7fc77c0dc0b7..8658ffdcc8061 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -181,6 +181,10 @@ const REDIRECTS: Redirect[] = [ from: '/platforms/go/fasthttp/', to: '/platforms/go/guides/fasthttp/', }, + { + from: '/platforms/go/fiber/', + to: '/platforms/go/guides/fiber/', + }, { from: '/platforms/go/echo/', to: '/platforms/go/guides/echo/',