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=