diff --git a/CHANGELOG.md b/CHANGELOG.md
index e3a084b15..df584c281 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@
- Accept `interface{}` for span data values ([#784](https://github.com/getsentry/sentry-go/pull/784))
- Automatic transactions for Echo integration ([#722](https://github.com/getsentry/sentry-go/pull/722))
- Automatic transactions for Fasthttp integration ([#732](https://github.com/getsentry/sentry-go/pull/723))
+- Add `Fiber` integration ([#795](https://github.com/getsentry/sentry-go/pull/795))
## 0.27.0
diff --git a/_examples/fiber/main.go b/_examples/fiber/main.go
new file mode 100644
index 000000000..c2a3664f2
--- /dev/null
+++ b/_examples/fiber/main.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/getsentry/sentry-go"
+ sentryfiber "github.com/getsentry/sentry-go/fiber"
+ "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 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()))
+ }
+ }
+ fmt.Println(event)
+ return event
+ },
+ Debug: true,
+ AttachStacktrace: true,
+ })
+
+ // 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)
+ }
+}
diff --git a/fiber/README.md b/fiber/README.md
new file mode 100644
index 000000000..a070c2398
--- /dev/null
+++ b/fiber/README.md
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+# Official Sentry fiber Handler for Sentry-go SDK
+
+**Godoc:** https://godoc.org/github.com/getsentry/sentry-go/fiber
+
+**Example:** https://github.com/getsentry/sentry-go/tree/master/example/fiber
+
+## Installation
+
+```sh
+go get github.com/getsentry/sentry-go/fiber
+```
+
+```go
+import (
+ "fmt"
+ "github.com/gofiber/fiber/v2"
+ "github.com/getsentry/sentry-go"
+ sentryfiber "github.com/getsentry/sentry-go/fiber"
+ "github.com/gofiber/fiber/v2/utils"
+)
+```
+
+To initialize Sentry's handler, you need to initialize Sentry itself beforehand
+
+```go
+if err := sentry.Init(sentry.ClientOptions{
+ Dsn: "your-public-dsn",
+}); err != nil {
+ fmt.Printf("Sentry initialization failed: %v\n", err)
+}
+
+// Create an instance of sentryfiber
+sentryHandler := sentryfiber.New(sentryfiber.Options{})
+
+// Once it's done, you can attach the handler as one of your middlewares
+app := fiber.New()
+
+app.Use(sentryHandler)
+
+// And run it
+app.Listen(":3000")
+```
+
+## Configuration
+
+`sentryfiber` accepts a struct of `Options` that allows you to configure how the handler will behave.
+
+Currently it respects 3 options:
+
+```go
+// Repanic configures whether Sentry should repanic after recovery, in most cases it should be set to false,
+// as fasthttp doesn't include it's own Recovery handler.
+Repanic bool
+// WaitForDelivery configures whether you want to block the request before moving forward with the response.
+// Because fasthttp doesn't include it's own `Recovery` handler, it will restart the application,
+// and event won't be delivered otherwise.
+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 to `sentryfiber`!**
+
+```go
+// Later in the code
+sentryHandler := sentryfiber.New(sentryfiber.Options{
+ Repanic: true,
+ WaitForDelivery: true,
+})
+
+enhanceSentryEvent := func(ctx *fiber.Ctx) {
+ if hub := sentryfiber.GetHubFromContext(ctx); hub != nil {
+ hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
+ }
+ ctx.Next()
+}
+
+app := fiber.New()
+
+app.Use(sentryHandler)
+
+app.All("/foo", enhanceSentryEvent, func(ctx *fiber.Ctx) {
+ panic("y tho")
+})
+
+app.All("/", func(ctx *fiber.Ctx) {
+ 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")
+ })
+ }
+ ctx.Status(fiber.StatusOK)
+})
+
+app.Listen(":3000")
+```
+
+### Accessing Context in `BeforeSend` callback
+
+```go
+sentry.Init(sentry.ClientOptions{
+ Dsn: "your-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(ctx.Hostname())
+ }
+ }
+ return event
+ },
+})
+```
diff --git a/fiber/sentryfiber.go b/fiber/sentryfiber.go
new file mode 100644
index 000000000..cb59f280a
--- /dev/null
+++ b/fiber/sentryfiber.go
@@ -0,0 +1,115 @@
+package sentryfiber
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "io"
+ "net/http"
+ "net/url"
+ "time"
+
+ "github.com/gofiber/fiber/v2"
+ "github.com/gofiber/fiber/v2/utils"
+
+ "github.com/getsentry/sentry-go"
+)
+
+const valuesKey = "sentry"
+
+type handler struct {
+ repanic bool
+ waitForDelivery bool
+ timeout time.Duration
+}
+
+type Options struct {
+ // Repanic configures whether Sentry should repanic after recovery, in most cases it should be set to false,
+ // as fasthttp doesn't include it's own Recovery handler.
+ Repanic bool
+ // WaitForDelivery configures whether you want to block the request before moving forward with the response.
+ // Because fasthttp doesn't include it's own Recovery handler, it will restart the application,
+ // and event won't be delivered otherwise.
+ WaitForDelivery bool
+ // Timeout for the event delivery requests.
+ Timeout time.Duration
+}
+
+func New(options Options) fiber.Handler {
+ handler := handler{
+ repanic: options.Repanic,
+ timeout: time.Second * 2,
+ waitForDelivery: options.WaitForDelivery,
+ }
+
+ if options.Timeout != 0 {
+ handler.timeout = options.Timeout
+ }
+
+ return handler.handle
+}
+
+func (h *handler) handle(ctx *fiber.Ctx) error {
+ hub := sentry.CurrentHub().Clone()
+ scope := hub.Scope()
+
+ scope.SetRequest(convert(ctx))
+ scope.SetRequestBody(ctx.Request().Body())
+ ctx.Locals(valuesKey, hub)
+ defer h.recoverWithSentry(hub, ctx)
+ return ctx.Next()
+}
+
+func (h *handler) recoverWithSentry(hub *sentry.Hub, ctx *fiber.Ctx) {
+ if err := recover(); err != nil {
+ eventID := hub.RecoverWithContext(
+ context.WithValue(context.Background(), sentry.RequestContextKey, ctx),
+ err,
+ )
+ if eventID != nil && h.waitForDelivery {
+ hub.Flush(h.timeout)
+ }
+ if h.repanic {
+ panic(err)
+ }
+ }
+}
+
+func GetHubFromContext(ctx *fiber.Ctx) *sentry.Hub {
+ if hub, ok := ctx.Locals(valuesKey).(*sentry.Hub); ok {
+ return hub
+ }
+ return nil
+}
+
+func convert(ctx *fiber.Ctx) *http.Request {
+ defer func() {
+ if err := recover(); err != nil {
+ sentry.Logger.Printf("%v", err)
+ }
+ }()
+
+ r := new(http.Request)
+
+ r.Method = utils.CopyString(ctx.Method())
+ uri := ctx.Request().URI()
+ r.URL, _ = url.Parse(fmt.Sprintf("%s://%s%s", uri.Scheme(), uri.Host(), uri.Path()))
+
+ // Headers
+ r.Header = make(http.Header)
+ ctx.Request().Header.VisitAll(func(key, value []byte) {
+ r.Header.Add(string(key), string(value))
+ })
+ r.Host = utils.CopyString(ctx.Hostname())
+
+ // Env
+ r.RemoteAddr = ctx.Context().RemoteAddr().String()
+
+ // QueryString
+ r.URL.RawQuery = string(ctx.Request().URI().QueryString())
+
+ // Body
+ r.Body = io.NopCloser(bytes.NewReader(ctx.Request().Body()))
+
+ return r
+}
diff --git a/fiber/sentryfiber_test.go b/fiber/sentryfiber_test.go
new file mode 100644
index 000000000..05bcfe984
--- /dev/null
+++ b/fiber/sentryfiber_test.go
@@ -0,0 +1,244 @@
+package sentryfiber_test
+
+import (
+ "errors"
+ "fmt"
+ "net/http"
+ "reflect"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/gofiber/fiber/v2"
+
+ "github.com/getsentry/sentry-go"
+ sentryfiber "github.com/getsentry/sentry-go/fiber"
+ "github.com/google/go-cmp/cmp"
+ "github.com/google/go-cmp/cmp/cmpopts"
+)
+
+func TestIntegration(t *testing.T) {
+ largePayload := strings.Repeat("Large", 3*1024) // 15 KB
+ sentryHandler := sentryfiber.New(sentryfiber.Options{Timeout: 3 * time.Second, WaitForDelivery: true})
+ exception := errors.New("unknown error")
+
+ app := fiber.New(fiber.Config{
+ ErrorHandler: func(c *fiber.Ctx, e error) error {
+ hub := sentryfiber.GetHubFromContext(c)
+ hub.CaptureException(e)
+ return nil
+ },
+ })
+
+ app.Use(sentryHandler)
+
+ app.Get("/panic", func(c *fiber.Ctx) error {
+ panic("test")
+ })
+ app.Post("/post", func(c *fiber.Ctx) error {
+ hub := sentryfiber.GetHubFromContext(c)
+ hub.CaptureMessage("post: " + string(c.Body()))
+ return nil
+ })
+ app.Get("/get", func(c *fiber.Ctx) error {
+ hub := sentryfiber.GetHubFromContext(c)
+ hub.CaptureMessage("get")
+ return nil
+ })
+ app.Post("/post/large", func(c *fiber.Ctx) error {
+ hub := sentryfiber.GetHubFromContext(c)
+ hub.CaptureMessage(fmt.Sprintf("post: %d KB", len(c.Body())/1024))
+ return nil
+ })
+ app.Post("/post/body-ignored", func(c *fiber.Ctx) error {
+ hub := sentryfiber.GetHubFromContext(c)
+ hub.CaptureMessage("body ignored")
+ return nil
+ })
+ app.Post("/post/error-handler", func(c *fiber.Ctx) error {
+ return exception
+ })
+
+ tests := []struct {
+ Path string
+ Method string
+ Body string
+
+ WantEvent *sentry.Event
+ }{
+ {
+ Path: "/panic",
+ Method: "GET",
+
+ WantEvent: &sentry.Event{
+ Level: sentry.LevelFatal,
+ Message: "test",
+ Request: &sentry.Request{
+ URL: "http://example.com/panic",
+ Method: "GET",
+ Headers: map[string]string{
+ "Host": "example.com",
+ "User-Agent": "fiber",
+ },
+ },
+ },
+ },
+ {
+ Path: "/post",
+ Method: "POST",
+ Body: "payload",
+
+ WantEvent: &sentry.Event{
+ Level: sentry.LevelInfo,
+ Message: "post: payload",
+ Request: &sentry.Request{
+ URL: "http://example.com/post",
+ Method: "POST",
+ Data: "payload",
+ Headers: map[string]string{
+ "Content-Length": "7",
+ "Host": "example.com",
+ "User-Agent": "fiber",
+ },
+ },
+ },
+ },
+ {
+ Path: "/get",
+ Method: "GET",
+
+ WantEvent: &sentry.Event{
+ Level: sentry.LevelInfo,
+ Message: "get",
+ Request: &sentry.Request{
+ URL: "http://example.com/get",
+ Method: "GET",
+ Headers: map[string]string{
+ "Host": "example.com",
+ "User-Agent": "fiber",
+ },
+ },
+ },
+ },
+ {
+ Path: "/post/large",
+ Method: "POST",
+ Body: largePayload,
+
+ WantEvent: &sentry.Event{
+ Level: sentry.LevelInfo,
+ Message: "post: 15 KB",
+ Request: &sentry.Request{
+ URL: "http://example.com/post/large",
+ Method: "POST",
+ // Actual request body omitted because too large.
+ Data: "",
+ Headers: map[string]string{
+ "Content-Length": "15360",
+ "Host": "example.com",
+ "User-Agent": "fiber",
+ },
+ },
+ },
+ },
+ {
+ Path: "/post/body-ignored",
+ Method: "POST",
+ Body: "client sends, fasthttp always reads, SDK reports",
+
+ WantEvent: &sentry.Event{
+ Level: sentry.LevelInfo,
+ Message: "body ignored",
+ Request: &sentry.Request{
+ URL: "http://example.com/post/body-ignored",
+ Method: "POST",
+ // Actual request body included because fasthttp always
+ // reads full request body.
+ Data: "client sends, fasthttp always reads, SDK reports",
+ Headers: map[string]string{
+ "Content-Length": "48",
+ "Host": "example.com",
+ "User-Agent": "fiber",
+ },
+ },
+ },
+ },
+ {
+ Path: "/post/error-handler",
+ Method: "POST",
+
+ WantEvent: &sentry.Event{
+ Level: sentry.LevelError,
+ Exception: []sentry.Exception{
+ {
+ Value: exception.Error(),
+ Type: reflect.TypeOf(exception).String(),
+ },
+ },
+ Request: &sentry.Request{
+ URL: "http://example.com/post/error-handler",
+ Method: "POST",
+ Headers: map[string]string{
+ "Content-Length": "0",
+ "Host": "example.com",
+ "User-Agent": "fiber",
+ },
+ },
+ },
+ },
+ }
+
+ eventsCh := make(chan *sentry.Event, len(tests))
+ err := sentry.Init(sentry.ClientOptions{
+ BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
+ eventsCh <- event
+ return event
+ },
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ var want []*sentry.Event
+ for _, tt := range tests {
+ want = append(want, tt.WantEvent)
+ req, err := http.NewRequest(tt.Method, "http://example.com"+tt.Path, strings.NewReader(tt.Body))
+ if err != nil {
+ t.Fatal(err)
+ }
+ req.Header.Set("User-Agent", "fiber")
+ resp, err := app.Test(req)
+ resp.Body.Close()
+ if err != nil {
+ t.Fatalf("Request %q failed: %s", tt.Path, err)
+ }
+ if resp.StatusCode != http.StatusOK {
+ t.Errorf("Status code = %d", resp.StatusCode)
+ }
+ }
+
+ close(eventsCh)
+ var got []*sentry.Event
+ for e := range eventsCh {
+ got = append(got, e)
+ }
+ opt := cmp.Options{
+ cmpopts.IgnoreFields(
+ sentry.Event{},
+ "Contexts", "EventID", "Extra", "Platform", "Modules",
+ "Release", "Sdk", "ServerName", "Tags", "Timestamp",
+ "sdkMetaData",
+ ),
+ cmpopts.IgnoreFields(
+ sentry.Request{},
+ "Env",
+ ),
+ cmpopts.IgnoreFields(
+ sentry.Exception{},
+ "Stacktrace",
+ ),
+ }
+ if diff := cmp.Diff(want, got, opt); diff != "" {
+ t.Fatalf("Events mismatch (-want +got):\n%s", diff)
+ }
+}
diff --git a/go.mod b/go.mod
index ba844a7e5..755ae646c 100644
--- a/go.mod
+++ b/go.mod
@@ -6,6 +6,7 @@ require (
github.com/gin-gonic/gin v1.8.1
github.com/go-errors/errors v1.4.2
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab
+ github.com/gofiber/fiber/v2 v2.52.2
github.com/google/go-cmp v0.5.9
github.com/kataras/iris/v12 v12.2.0
github.com/labstack/echo/v4 v4.10.0
@@ -14,9 +15,9 @@ require (
github.com/sirupsen/logrus v1.9.0
github.com/stretchr/testify v1.8.2
github.com/urfave/negroni v1.0.0
- github.com/valyala/fasthttp v1.40.0
- golang.org/x/sys v0.6.0
- golang.org/x/text v0.8.0
+ github.com/valyala/fasthttp v1.52.0
+ golang.org/x/sys v0.18.0
+ golang.org/x/text v0.14.0
)
require (
@@ -25,7 +26,7 @@ require (
github.com/CloudyKit/jet/v6 v6.2.0 // indirect
github.com/Joker/jade v1.1.3 // indirect
github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 // indirect
- github.com/andybalholm/brotli v1.0.5 // indirect
+ github.com/andybalholm/brotli v1.1.0 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
@@ -38,7 +39,7 @@ require (
github.com/go-playground/validator/v10 v10.11.1 // indirect
github.com/goccy/go-json v0.9.11 // indirect
github.com/golang/snappy v0.0.4 // indirect
- github.com/google/uuid v1.3.0 // indirect
+ github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/css v1.0.0 // indirect
github.com/iris-contrib/schema v0.0.6 // indirect
github.com/josharian/intern v1.0.0 // indirect
@@ -48,18 +49,20 @@ require (
github.com/kataras/pio v0.0.11 // indirect
github.com/kataras/sitemap v0.0.6 // indirect
github.com/kataras/tunnel v0.0.4 // indirect
- github.com/klauspost/compress v1.16.0 // indirect
+ github.com/klauspost/compress v1.17.7 // indirect
github.com/labstack/gommon v0.4.0 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/mailgun/raymond/v2 v2.0.48 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
- github.com/mattn/go-isatty v0.0.17 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
+ github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/microcosm-cc/bluemonday v1.0.23 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.5 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
+ github.com/rivo/uniseg v0.2.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/schollz/closestmatch v2.1.0+incompatible // indirect
github.com/tdewolff/minify/v2 v2.12.4 // indirect
@@ -67,11 +70,12 @@ require (
github.com/ugorji/go/codec v1.2.7 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
+ github.com/valyala/tcplisten v1.0.0 // indirect
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
github.com/yosssi/ace v0.0.5 // indirect
- golang.org/x/crypto v0.7.0 // indirect
- golang.org/x/net v0.8.0 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
+ golang.org/x/net v0.21.0 // indirect
golang.org/x/time v0.3.0 // indirect
google.golang.org/protobuf v1.29.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
diff --git a/go.sum b/go.sum
index 1fe948eb6..1d8a69baf 100644
--- a/go.sum
+++ b/go.sum
@@ -11,9 +11,8 @@ github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKd
github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0=
github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM=
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
-github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
-github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
-github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
+github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
+github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U=
@@ -50,6 +49,8 @@ github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJ
github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/gofiber/fiber/v2 v2.52.2 h1:b0rYH6b06Df+4NyrbdptQL8ifuxw/Tf2DgfkZkDaxEo=
+github.com/gofiber/fiber/v2 v2.52.2/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -58,8 +59,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
-github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
@@ -83,9 +84,8 @@ github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY
github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4=
github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA=
github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw=
-github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4=
-github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
+github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
@@ -110,8 +110,10 @@ github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxec
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
-github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
+github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY=
github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4=
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
@@ -130,6 +132,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
@@ -167,11 +171,12 @@ github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc=
github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc=
-github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I=
+github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0=
+github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
+github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
@@ -189,18 +194,16 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
-golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
-golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -214,20 +217,18 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
-golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/otel/go.mod b/otel/go.mod
index f27cd069b..d02d99898 100644
--- a/otel/go.mod
+++ b/otel/go.mod
@@ -15,6 +15,6 @@ replace github.com/getsentry/sentry-go => ../
require (
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- golang.org/x/sys v0.6.0 // indirect
- golang.org/x/text v0.8.0 // indirect
+ golang.org/x/sys v0.18.0 // indirect
+ golang.org/x/text v0.14.0 // indirect
)
diff --git a/otel/go.sum b/otel/go.sum
index b14f8eea0..2f17982d0 100644
--- a/otel/go.sum
+++ b/otel/go.sum
@@ -17,8 +17,8 @@ go.opentelemetry.io/otel/sdk v1.11.0 h1:ZnKIL9V9Ztaq+ME43IUi/eo22mNsb6a7tGfzaOWB
go.opentelemetry.io/otel/sdk v1.11.0/go.mod h1:REusa8RsyKaq0OlyangWXaw97t2VogoO4SSEeKkSTAk=
go.opentelemetry.io/otel/trace v1.11.0 h1:20U/Vj42SX+mASlXLmSGBg6jpI1jQtv682lZtTAOVFI=
go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U=
-golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
-golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
-golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=