From 5a8287a06b5f3b6914d11a228558efaad0705f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferdinand=20M=C3=BCtsch?= Date: Thu, 29 Apr 2021 21:19:43 +0200 Subject: [PATCH] chore: exclude static endpoints from sentry tracing chore: include user info to sentry tracing again --- config/sentry.go | 13 +++++++++++-- main.go | 3 +-- middlewares/sentry.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 middlewares/sentry.go diff --git a/config/sentry.go b/config/sentry.go index 8340f3b..943abae 100644 --- a/config/sentry.go +++ b/config/sentry.go @@ -100,6 +100,13 @@ func (l *SentryWrapperLogger) log(msg string, level sentry.Level) { sentry.CaptureEvent(event) } +var excludedRoutes = []string{ + "GET /assets", + "GET /api/health", + "GET /swagger-ui", + "GET /docs", +} + func initSentry(config sentryConfig, debug bool) { if err := sentry.Init(sentry.ClientOptions{ Dsn: config.Dsn, @@ -112,8 +119,10 @@ func initSentry(config sentryConfig, debug bool) { hub := sentry.GetHubFromContext(ctx.Span.Context()) txName := hub.Scope().Transaction() - if strings.HasPrefix(txName, "GET /assets") || strings.HasPrefix(txName, "GET /api/health") { - return sentry.SampledFalse + for _, ex := range excludedRoutes { + if strings.HasPrefix(txName, ex) { + return sentry.SampledFalse + } } if txName == "POST /api/heartbeat" { return sentry.UniformTracesSampler(config.SampleRateHeartbeats).Sample(ctx) diff --git a/main.go b/main.go index f710f88..16f15ce 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ package main import ( "embed" - sentryhttp "github.com/getsentry/sentry-go/http" "io/fs" "log" "net/http" @@ -184,7 +183,7 @@ func main() { router.Use(middlewares.NewLoggingMiddleware(logbuch.Info, []string{"/assets"})) router.Use(handlers.RecoveryHandler()) if config.Sentry.Dsn != "" { - router.Use(sentryhttp.New(sentryhttp.Options{Repanic: true}).Handle) + router.Use(middlewares.NewSentryMiddleware()) } rootRouter.Use(middlewares.NewSecurityMiddleware()) diff --git a/middlewares/sentry.go b/middlewares/sentry.go new file mode 100644 index 0000000..4be2438 --- /dev/null +++ b/middlewares/sentry.go @@ -0,0 +1,31 @@ +package middlewares + +import ( + "context" + "github.com/getsentry/sentry-go" + sentryhttp "github.com/getsentry/sentry-go/http" + "net/http" +) + +// SentryMiddleware is a wrapper around sentryhttp to include user information to traces +type SentryMiddleware struct { + handler http.Handler +} + +func NewSentryMiddleware() func(http.Handler) http.Handler { + return func(h http.Handler) http.Handler { + return sentryhttp.New(sentryhttp.Options{ + Repanic: true, + }).Handle(&SentryMiddleware{handler: h}) + } +} + +func (h *SentryMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), "-", "-") + h.handler.ServeHTTP(w, r.WithContext(ctx)) + if hub := sentry.GetHubFromContext(ctx); hub != nil { + if user := GetPrincipal(r); user != nil { + hub.Scope().SetUser(sentry.User{ID: user.ID}) + } + } +}