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/',