Skip to content

Commit

Permalink
Add docs for Fiber
Browse files Browse the repository at this point in the history
  • Loading branch information
cleptric committed May 10, 2024
1 parent a3837a5 commit ab1f24c
Show file tree
Hide file tree
Showing 4 changed files with 177 additions and 0 deletions.
165 changes: 165 additions & 0 deletions docs/platforms/go/guides/fiber/index.mdx
Original file line number Diff line number Diff line change
@@ -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
```

<Break />

<SignInNote />

```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

<SignInNote />

```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
},
})
```
1 change: 1 addition & 0 deletions docs/product/performance/getting-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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/)
Expand Down
7 changes: 7 additions & 0 deletions src/components/platformIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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';
Expand Down Expand Up @@ -465,6 +467,10 @@ const formatToSVG = {
sm: FasthttpSVG,
lg: FasthttpSVGLarge,
},
fiber: {
sm: FiberSVG,
lg: FiberSVGLarge,
},
flask: {
sm: FlaskSVG,
lg: FlaskSVGLarge,
Expand Down Expand Up @@ -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',
Expand Down
4 changes: 4 additions & 0 deletions src/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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/',
Expand Down

0 comments on commit ab1f24c

Please sign in to comment.