From 338487c048109e6bf7f68c0aca4c17c525be83ac Mon Sep 17 00:00:00 2001 From: Catherine Date: Sat, 28 Mar 2026 00:29:00 +0000 Subject: [PATCH] [breaking-change] Drop Sentry support. The upstream added AGENTS.md and I have no time to review what they're doing with that. --- go.mod | 2 - gomod2nix.toml | 6 --- src/observe.go | 135 ------------------------------------------------- 3 files changed, 143 deletions(-) diff --git a/go.mod b/go.mod index 51084b0..5ea77a9 100644 --- a/go.mod +++ b/go.mod @@ -10,8 +10,6 @@ require ( github.com/creasty/defaults v1.8.0 github.com/dghubble/trie v0.1.0 github.com/fatih/color v1.19.0 - github.com/getsentry/sentry-go v0.43.0 - github.com/getsentry/sentry-go/slog v0.43.0 github.com/go-git/go-billy/v6 v6.0.0-20260226131633-45bd0956d66f github.com/go-git/go-git/v6 v6.0.0-20260320111621-ea91339c5263 github.com/jpillora/backoff v1.0.0 diff --git a/gomod2nix.toml b/gomod2nix.toml index 31e201a..4a3368b 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -49,12 +49,6 @@ schema = 3 [mod."github.com/fatih/color"] version = "v1.19.0" hash = "sha256-YgMm1nid8yigNLG6aHfuMbsvMI1UYVf/Rkg44pp/NTU=" - [mod."github.com/getsentry/sentry-go"] - version = "v0.43.0" - hash = "sha256-Wu1inIhjuAw6wKburwqIlNxC0I4akunHGh/8DOqo3xg=" - [mod."github.com/getsentry/sentry-go/slog"] - version = "v0.43.0" - hash = "sha256-FJMx2E8anKtHknn867gCkYPjitZb9Okqp2uZ+dV7JqA=" [mod."github.com/go-git/gcfg/v2"] version = "v2.0.2" hash = "sha256-icqMDeC/tEg/3979EuEN67Ml5KjdDA0R3QvR6iLLrSI=" diff --git a/src/observe.go b/src/observe.go index 98417f5..8651432 100644 --- a/src/observe.go +++ b/src/observe.go @@ -8,11 +8,9 @@ import ( "iter" "log" "log/slog" - "math/rand/v2" "net/http" "os" "runtime/debug" - "strconv" "sync" "time" @@ -22,10 +20,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - - "github.com/getsentry/sentry-go" - sentryhttp "github.com/getsentry/sentry-go/http" - sentryslog "github.com/getsentry/sentry-go/slog" ) var ( @@ -47,71 +41,15 @@ var ( var syslogHandler syslog.Handler -func hasSentry() bool { - return os.Getenv("SENTRY_DSN") != "" -} - -func chainSentryMiddleware( - middleware ...func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event, -) func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event { - return func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event { - for idx := 0; idx < len(middleware) && event != nil; idx++ { - event = middleware[idx](event, hint) - } - return event - } -} - // sensitiveHTTPHeaders extends the list of sensitive headers defined in the Sentry Go SDK with our // own application-specific header field names. var sensitiveHTTPHeaders = map[string]struct{}{ "Forge-Authorization": {}, } -// scrubSentryEvent removes sensitive HTTP header fields from the Sentry event. -func scrubSentryEvent(event *sentry.Event, hint *sentry.EventHint) *sentry.Event { - if event.Request != nil && event.Request.Headers != nil { - for key := range event.Request.Headers { - if _, ok := sensitiveHTTPHeaders[key]; ok { - delete(event.Request.Headers, key) - } - } - } - return event -} - -// sampleSentryEvent returns a function that discards a Sentry event according to the sample rate, -// unless the associated HTTP request triggers a mutation or it took too long to produce a response, -// in which case the event is never discarded. -func sampleSentryEvent(sampleRate float64) func(*sentry.Event, *sentry.EventHint) *sentry.Event { - return func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event { - newSampleRate := sampleRate - if event.Request != nil { - switch event.Request.Method { - case "PUT", "POST", "DELETE": - newSampleRate = 1 - } - } - duration := event.Timestamp.Sub(event.StartTime) - threshold := time.Duration(config.Observability.SlowResponseThreshold) - if duration >= threshold { - newSampleRate = 1 - } - if rand.Float64() < newSampleRate { - return event - } - return nil - } -} - func InitObservability() { debug.SetPanicOnFault(true) - environment := "development" - if value, ok := os.LookupEnv("ENVIRONMENT"); ok { - environment = value - } - logHandlers := []slog.Handler{} switch config.LogFormat { @@ -140,45 +78,6 @@ func InitObservability() { logHandlers = append(logHandlers, syslogHandler) } - if hasSentry() { - enableLogs := false - if value, err := strconv.ParseBool(os.Getenv("SENTRY_LOGS")); err == nil { - enableLogs = value - } - - enableTracing := false - if value, err := strconv.ParseBool(os.Getenv("SENTRY_TRACING")); err == nil { - enableTracing = value - } - - tracesSampleRate := 1.00 - switch environment { - case "development", "staging": - default: - tracesSampleRate = 0.05 - } - - options := sentry.ClientOptions{} - options.Environment = environment - options.EnableLogs = enableLogs - options.EnableTracing = enableTracing - options.TracesSampleRate = 1 // use our own custom sampling logic - options.BeforeSend = scrubSentryEvent - options.BeforeSendTransaction = chainSentryMiddleware( - sampleSentryEvent(tracesSampleRate), - scrubSentryEvent, - ) - if err := sentry.Init(options); err != nil { - log.Fatalf("sentry: %s\n", err) - } - - if enableLogs { - logHandlers = append(logHandlers, sentryslog.Option{ - AddSource: true, - }.NewSentryHandler(context.Background())) - } - } - slog.SetDefault(slog.New(slogmulti.Fanout(logHandlers...))) } @@ -188,9 +87,6 @@ func FiniObservability() { if syslogHandler != nil { wg.Go(func() { syslogHandler.Flush(timeout) }) } - if hasSentry() { - wg.Go(func() { sentry.Flush(timeout) }) - } wg.Wait() } @@ -200,10 +96,6 @@ func ObserveError(err error) { // Timeout results in a different error. return } - - if hasSentry() { - sentry.CaptureException(err) - } } type observedResponseWriter struct { @@ -236,22 +128,6 @@ func (w *observedResponseWriter) WriteHeader(statusCode int) { } func ObserveHTTPHandler(handler http.Handler) http.Handler { - if hasSentry() { - handler = func(next http.Handler) http.Handler { - next = sentryhttp.New(sentryhttp.Options{ - Repanic: true, - }).Handle(handler) - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Prevent the Sentry SDK from continuing traces as we don't use this feature. - r.Header.Del(sentry.SentryTraceHeader) - r.Header.Del(sentry.SentryBaggageHeader) - - next.ServeHTTP(w, r) - }) - }(handler) - } - handler = func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ow := newObservedResponseWriter(w) @@ -282,23 +158,12 @@ func ObserveFunction( interface{ Finish() }, context.Context, ) { switch { - case hasSentry(): - span := sentry.StartSpan(ctx, "function") - span.Description = funcName - ObserveData(span.Context(), data...) - return span, span.Context() default: return noopSpan{}, ctx } } func ObserveData(ctx context.Context, data ...any) { - if span := sentry.SpanFromContext(ctx); span != nil { - for i := 0; i < len(data); i += 2 { - name, value := data[i], data[i+1] - span.SetData(name.(string), value) - } - } } var (