From 9723a22d3007b456ebb68083a63a7024ba14ce9f Mon Sep 17 00:00:00 2001 From: bayge Date: Tue, 25 Jun 2024 18:15:53 +0930 Subject: [PATCH] Reduce the amount of info being sent to Sentry --- lib/setup/setup.go | 57 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/lib/setup/setup.go b/lib/setup/setup.go index c8da5894..44c65652 100644 --- a/lib/setup/setup.go +++ b/lib/setup/setup.go @@ -4,12 +4,13 @@ package setup import ( + "fmt" "log" "log/slog" "os" + "context" "runtime/debug" "strings" - "fmt" "time" "github.com/getsentry/sentry-go" @@ -24,6 +25,43 @@ const ( EnvSentryDsn = "SPN_SENTRY_DSN" ) +type Multihandler struct { + sentry, json slog.Handler +} + +func (h Multihandler) Enabled(ctx context.Context, record slog.Level) bool { + // The JSON handler should be the furthest we're going. + return h.sentry.Enabled(ctx, record) +} +func (h Multihandler) WithAttrs(attrs []slog.Attr) slog.Handler { + var s slog.Handler + if h.sentry != nil { + s = h.sentry.WithAttrs(attrs) + } + return Multihandler{ + sentry: s, + json: h.json.WithAttrs(attrs), + } +} +func (h Multihandler) WithGroup(name string) slog.Handler { + var s slog.Handler + if h.sentry != nil { + s = h.sentry.WithGroup(name) + } + return Multihandler{ + sentry: s, + json: h.json.WithGroup(name), + } +} +func (h Multihandler) Handle(ctx context.Context, record slog.Record) error { + if s := h.sentry; s != nil { + if err := s.Handle(ctx, record); err != nil { + return err + } + } + return h.json.Handle(ctx, record) +} + func init() { // Set up the logging to print JSON blobs. logLevel := slog.LevelInfo @@ -41,15 +79,18 @@ func init() { panic(fmt.Sprintf("failed to set up sentry: %v", err)) } } - var logger *slog.Logger + var multihandler Multihandler if dsn != "" { // DSN being set means we're using Sentry. - slogSentryOpts := slogsentry.Option{Level: logLevel}.NewSentryHandler() - logger = slog.New(slogSentryOpts) - } else { - logger = slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ - Level: logLevel, - })) + // We want to only track errors with Sentry. + multihandler.sentry = slogsentry.Option{ + Level: slog.LevelError, + }. + NewSentryHandler() } + multihandler.json = slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ + Level: logLevel, + }) + logger := slog.New(multihandler) // Find the commit hash (taken straight from // https:icinga.com/blog/2022/05/25/embedding-git-commit-information-in-go-binaries/) var revision string