diff --git a/.golangci.yml b/.golangci.yml index 433f6f77..77857119 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -38,13 +38,6 @@ linters: - third_party$ - builtin$ - examples$ - settings: - forbidigo: - analyze-types: true - forbid: - - pkg: github.com/getsentry/sentry-go - pattern: '^sentry\.(AddBreadcrumb|CaptureCheckIn|CaptureEvent|CaptureException|CaptureMessage|ConfigureScope|CurrentHub|Flush|FlushWithContext|LastEventID|PopScope|PushScope|Recover|RecoverWithContext|WithMonitor|WithScope)$' - msg: "Do not use the global Hub. Always use the local Hub from context." formatters: enable: - gofmt diff --git a/cmd/vroom/chunk.go b/cmd/vroom/chunk.go index 1d780873..09e43348 100644 --- a/cmd/vroom/chunk.go +++ b/cmd/vroom/chunk.go @@ -13,6 +13,7 @@ import ( "google.golang.org/api/googleapi" "github.com/getsentry/vroom/internal/chunk" + "github.com/getsentry/vroom/internal/sentryutil" "github.com/getsentry/vroom/internal/storageutil" ) @@ -41,27 +42,26 @@ type postProfileFromChunkIDsResponse struct { // This is more of a GET method, but since we're receiving a list of chunk IDs as part of a // body request, we use a POST method instead (similarly to the flamegraph endpoint). func (env *environment) postProfileFromChunkIDs(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - hub := sentry.GetHubFromContext(ctx) + ctx, scope := sentryutil.EnsureScope(r.Context()) + ps := httprouter.ParamsFromContext(ctx) rawOrganizationID := ps.ByName("organization_id") organizationID, err := strconv.ParseUint(rawOrganizationID, 10, 64) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - - hub.Scope().SetTag("organization_id", rawOrganizationID) + scope.SetTag("organization_id", rawOrganizationID) rawProjectID := ps.ByName("project_id") projectID, err := strconv.ParseUint(rawProjectID, 10, 64) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("project_id", rawProjectID) + scope.SetTag("project_id", rawProjectID) var requestBody postProfileFromChunkIDsRequest s := sentry.StartSpan(ctx, "processing") @@ -69,13 +69,13 @@ func (env *environment) postProfileFromChunkIDs(w http.ResponseWriter, r *http.R err = json.NewDecoder(r.Body).Decode(&requestBody) s.Finish() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } r.Body.Close() - hub.Scope().SetTag("num_chunks", fmt.Sprintf("%d", len(requestBody.ChunkIDs))) + scope.SetTag("num_chunks", fmt.Sprintf("%d", len(requestBody.ChunkIDs))) s = sentry.StartSpan(ctx, "chunks.read") s.Description = "Read profile chunks from GCS" @@ -128,14 +128,14 @@ func (env *environment) postProfileFromChunkIDs(w http.ResponseWriter, r *http.R } var e *googleapi.Error if ok := errors.As(err, &e); ok { - hub.Scope().SetContext("Google Cloud Storage Error", map[string]interface{}{ + scope.SetContext("Google Cloud Storage Error", map[string]interface{}{ "body": e.Body, "code": e.Code, "details": e.Details, "message": e.Message, }) } - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -174,7 +174,7 @@ func (env *environment) postProfileFromChunkIDs(w http.ResponseWriter, r *http.R mergedChunk, err := chunk.MergeSampleChunks(sampleChunks, requestBody.Start, requestBody.End) s.Finish() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -185,7 +185,7 @@ func (env *environment) postProfileFromChunkIDs(w http.ResponseWriter, r *http.R }) s.Finish() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -205,7 +205,7 @@ func (env *environment) postProfileFromChunkIDs(w http.ResponseWriter, r *http.R sp, err := chunk.SpeedscopeFromAndroidChunks(androidChunks, requestBody.Start, requestBody.End) s.Finish() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -216,7 +216,7 @@ func (env *environment) postProfileFromChunkIDs(w http.ResponseWriter, r *http.R }) s.Finish() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -232,50 +232,48 @@ func (env *environment) postProfileFromChunkIDs(w http.ResponseWriter, r *http.R } func (env *environment) getRawChunk(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - hub := sentry.GetHubFromContext(ctx) + ctx, scope := sentryutil.EnsureScope(r.Context()) + ps := httprouter.ParamsFromContext(ctx) rawOrganizationID := ps.ByName("organization_id") organizationID, err := strconv.ParseUint(rawOrganizationID, 10, 64) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("organization_id", rawOrganizationID) + scope.SetTag("organization_id", rawOrganizationID) rawProjectID := ps.ByName("project_id") projectID, err := strconv.ParseUint(rawProjectID, 10, 64) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("project_id", rawProjectID) + scope.SetTag("project_id", rawProjectID) profilerID := ps.ByName("profiler_id") _, err = uuid.Parse(profilerID) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("profiler_id", profilerID) - - hub.Scope().SetTag("project_id", rawProjectID) + scope.SetTag("profiler_id", profilerID) chunkID := ps.ByName("chunk_id") _, err = uuid.Parse(chunkID) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("chunk_id", chunkID) + scope.SetTag("chunk_id", chunkID) s := sentry.StartSpan(ctx, "chunk.read") s.Description = "Read chunk from GCS" @@ -295,14 +293,14 @@ func (env *environment) getRawChunk(w http.ResponseWriter, r *http.Request) { } var e *googleapi.Error if ok := errors.As(err, &e); ok { - hub.Scope().SetContext("Google Cloud Storage Error", map[string]interface{}{ + scope.SetContext("Google Cloud Storage Error", map[string]interface{}{ "body": e.Body, "code": e.Code, "details": e.Details, "message": e.Message, }) } - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -311,7 +309,7 @@ func (env *environment) getRawChunk(w http.ResponseWriter, r *http.Request) { defer s.Finish() b, err := json.Marshal(c) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } diff --git a/cmd/vroom/flamegraph.go b/cmd/vroom/flamegraph.go index 2e439279..7293064c 100644 --- a/cmd/vroom/flamegraph.go +++ b/cmd/vroom/flamegraph.go @@ -13,6 +13,7 @@ import ( "github.com/getsentry/vroom/internal/examples" "github.com/getsentry/vroom/internal/flamegraph" "github.com/getsentry/vroom/internal/metrics" + "github.com/getsentry/vroom/internal/sentryutil" ) type ( @@ -24,22 +25,20 @@ type ( ) func (env *environment) postFlamegraph(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() + ctx, scope := sentryutil.EnsureScope(r.Context()) downloadContext, cancel := context.WithTimeout(ctx, time.Second*10) defer cancel() - hub := sentry.GetHubFromContext(ctx) + ps := httprouter.ParamsFromContext(ctx) rawOrganizationID := ps.ByName("organization_id") organizationID, err := strconv.ParseUint(rawOrganizationID, 10, 64) if err != nil { - if hub != nil { - hub.CaptureException(err) - } + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("organization_id", rawOrganizationID) + scope.SetTag("organization_id", rawOrganizationID) var body postFlamegraphBody s := sentry.StartSpan(ctx, "processing") @@ -47,9 +46,7 @@ func (env *environment) postFlamegraph(w http.ResponseWriter, r *http.Request) { err = json.NewDecoder(r.Body).Decode(&body) s.Finish() if err != nil { - if hub != nil { - hub.CaptureException(err) - } + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } @@ -71,9 +68,7 @@ func (env *environment) postFlamegraph(w http.ResponseWriter, r *http.Request) { ) s.Finish() if err != nil { - if hub != nil { - hub.CaptureException(err) - } + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -82,9 +77,7 @@ func (env *environment) postFlamegraph(w http.ResponseWriter, r *http.Request) { defer s.Finish() b, err := json.Marshal(speedscope) if err != nil { - if hub != nil { - hub.CaptureException(err) - } + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } diff --git a/cmd/vroom/main.go b/cmd/vroom/main.go index f54339c6..b58e6184 100644 --- a/cmd/vroom/main.go +++ b/cmd/vroom/main.go @@ -68,16 +68,15 @@ func newEnvironment(ctx context.Context) (*environment, error) { } func (e *environment) shutdown(ctx context.Context) { - hub := sentry.GetHubFromContext(ctx) err := e.storage.Close() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) } err = e.occurrencesWriter.Close() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) } - hub.Flush(5 * time.Second) + sentry.Flush(5 * time.Second) } func (e *environment) newRouter() (*httprouter.Router, error) { @@ -177,15 +176,9 @@ func main() { log.Fatal("can't initialize sentry", err) } - // This should be the only place we use the SDK's global Hub. - // Every goroutine should get its own clone instead. - // See: https://docs.sentry.io/platforms/go/usage/concurrency/ - rootHub := sentry.CurrentHub() //nolint:forbidigo - rootCtx := sentry.SetHubOnContext(context.Background(), rootHub.Clone()) - router, err := env.newRouter() if err != nil { - rootHub.CaptureException(err) + sentry.CaptureException(context.Background(), err) log.Fatal("error setting up the router", err) } @@ -196,7 +189,7 @@ func main() { } waitForShutdown := make(chan os.Signal) - go func(hub *sentry.Hub) { + go func() { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) <-c @@ -205,12 +198,12 @@ func main() { defer cancel() if err := server.Shutdown(cctx); err != nil { - hub.CaptureException(err) + sentry.CaptureException(context.Background(), err) slog.Error("error shutting down server", "err", err) } close(waitForShutdown) - }(rootHub.Clone()) + }() slog.Info("vroom started") @@ -221,7 +214,7 @@ func main() { err = server.ListenAndServe() if err != nil && err != http.ErrServerClosed { - rootHub.CaptureException(err) + sentry.CaptureException(context.Background(), err) slog.Error("server failed", "err", err) } @@ -229,7 +222,7 @@ func main() { // Shutdown the rest of the environment after the HTTP connections are closed close(readJobs) - env.shutdown(rootCtx) + env.shutdown(context.Background()) slog.Info("vroom graceful shutdown") } diff --git a/cmd/vroom/profile.go b/cmd/vroom/profile.go index f046cec9..24c7f4a5 100644 --- a/cmd/vroom/profile.go +++ b/cmd/vroom/profile.go @@ -12,6 +12,7 @@ import ( "google.golang.org/api/googleapi" "github.com/getsentry/vroom/internal/profile" + "github.com/getsentry/vroom/internal/sentryutil" "github.com/getsentry/vroom/internal/storageutil" ) @@ -21,38 +22,38 @@ const ( ) func (env *environment) getRawProfile(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - hub := sentry.GetHubFromContext(ctx) + ctx, scope := sentryutil.EnsureScope(r.Context()) + ps := httprouter.ParamsFromContext(ctx) rawOrganizationID := ps.ByName("organization_id") organizationID, err := strconv.ParseUint(rawOrganizationID, 10, 64) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("organization_id", rawOrganizationID) + scope.SetTag("organization_id", rawOrganizationID) rawProjectID := ps.ByName("project_id") projectID, err := strconv.ParseUint(rawProjectID, 10, 64) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("project_id", rawProjectID) + scope.SetTag("project_id", rawProjectID) profileID := ps.ByName("profile_id") _, err = uuid.Parse(profileID) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("profile_id", profileID) + scope.SetTag("profile_id", profileID) s := sentry.StartSpan(ctx, "profile.read") s.Description = "Read profile from GCS" @@ -71,14 +72,14 @@ func (env *environment) getRawProfile(w http.ResponseWriter, r *http.Request) { } var e *googleapi.Error if ok := errors.As(err, &e); ok { - hub.Scope().SetContext("Google Cloud Storage Error", map[string]interface{}{ + scope.SetContext("Google Cloud Storage Error", map[string]interface{}{ "body": e.Body, "code": e.Code, "details": e.Details, "message": e.Message, }) } - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -87,7 +88,7 @@ func (env *environment) getRawProfile(w http.ResponseWriter, r *http.Request) { defer s.Finish() b, err := json.Marshal(p) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -99,39 +100,39 @@ func (env *environment) getRawProfile(w http.ResponseWriter, r *http.Request) { } func (env *environment) getProfile(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() + ctx, scope := sentryutil.EnsureScope(r.Context()) + qs := r.URL.Query() - hub := sentry.GetHubFromContext(ctx) ps := httprouter.ParamsFromContext(ctx) rawOrganizationID := ps.ByName("organization_id") organizationID, err := strconv.ParseUint(rawOrganizationID, 10, 64) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("organization_id", rawOrganizationID) + scope.SetTag("organization_id", rawOrganizationID) rawProjectID := ps.ByName("project_id") projectID, err := strconv.ParseUint(rawProjectID, 10, 64) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("project_id", rawProjectID) + scope.SetTag("project_id", rawProjectID) profileID := ps.ByName("profile_id") _, err = uuid.Parse(profileID) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } - hub.Scope().SetTag("profile_id", profileID) + scope.SetTag("profile_id", profileID) s := sentry.StartSpan(ctx, "profile.read") s.Description = "Read profile from GCS" @@ -150,19 +151,19 @@ func (env *environment) getProfile(w http.ResponseWriter, r *http.Request) { } var e *googleapi.Error if ok := errors.As(err, &e); ok { - hub.Scope().SetContext("Google Cloud Storage Error", map[string]interface{}{ + scope.SetContext("Google Cloud Storage Error", map[string]interface{}{ "body": e.Body, "code": e.Code, "details": e.Details, "message": e.Message, }) } - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } - hub.Scope().SetTag("platform", string(p.Platform())) + scope.SetTag("platform", string(p.Platform())) s = sentry.StartSpan(ctx, "json.marshal") defer s.Finish() @@ -170,13 +171,13 @@ func (env *environment) getProfile(w http.ResponseWriter, r *http.Request) { var i interface{} if format := qs.Get("format"); format == "sample" && p.IsSampleFormat() { - hub.Scope().SetTag("format", "sample") + scope.SetTag("format", "sample") i = p } else { - hub.Scope().SetTag("format", "speedscope") + scope.SetTag("format", "speedscope") o, err := p.Speedscope() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -185,7 +186,7 @@ func (env *environment) getProfile(w http.ResponseWriter, r *http.Request) { b, err := json.Marshal(i) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } diff --git a/cmd/vroom/regressed.go b/cmd/vroom/regressed.go index 8f648fbb..6abfde77 100644 --- a/cmd/vroom/regressed.go +++ b/cmd/vroom/regressed.go @@ -11,11 +11,10 @@ import ( func (env *environment) postRegressed(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - hub := sentry.GetHubFromContext(ctx) regressedFunctions, err := decodeRegressedFunctionPayload(ctx, r) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusBadRequest) return } @@ -28,7 +27,7 @@ func (env *environment) postRegressed(w http.ResponseWriter, r *http.Request) { occurrence, err := occurrence.ProcessRegressedFunction(ctx, env.storage, regressedFunction, readJobs) s.Finish() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) continue } else if occurrence == nil { continue @@ -45,14 +44,14 @@ func (env *environment) postRegressed(w http.ResponseWriter, r *http.Request) { b, err := json.Marshal(data) s.Finish() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } occurrenceMessages, err := occurrence.GenerateKafkaMessageBatch(occurrences) if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } @@ -62,7 +61,7 @@ func (env *environment) postRegressed(w http.ResponseWriter, r *http.Request) { err = env.occurrencesWriter.WriteMessages(ctx, occurrenceMessages...) s.Finish() if err != nil { - hub.CaptureException(err) + sentry.CaptureException(ctx, err) w.WriteHeader(http.StatusInternalServerError) return } diff --git a/go.mod b/go.mod index afce06fe..e8ae28ac 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/CAFxX/httpcompression v0.0.8 github.com/andybalholm/brotli v1.1.0 github.com/fsouza/fake-gcs-server v1.44.0 - github.com/getsentry/sentry-go v0.49.0 + github.com/getsentry/sentry-go v1.0.0-alpha.1 github.com/goccy/go-json v0.10.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 @@ -102,9 +102,9 @@ require ( golang.org/x/crypto v0.55.0 // indirect golang.org/x/net v0.58.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.22.0 // indirect - golang.org/x/sys v0.47.0 // indirect - golang.org/x/text v0.41.0 // indirect + golang.org/x/sync v0.23.0 // indirect + golang.org/x/sys v0.48.0 // indirect + golang.org/x/text v0.42.0 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 // indirect diff --git a/go.sum b/go.sum index 1075e0ad..c55e7db3 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,8 @@ github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0X github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsouza/fake-gcs-server v1.44.0 h1:Lw/mrvs45AfCUPVpry6qFkZnZPqe9thpLQHW+ZwHRLs= github.com/fsouza/fake-gcs-server v1.44.0/go.mod h1:M02aKoTv9Tnlf+gmWnTok1PWVCUHDntVbHxpd0krTfo= -github.com/getsentry/sentry-go v0.49.0 h1:Ehejknu1l023Ub7QoRBVLAI7g3Jnhqku4oWx4B4Sh5s= -github.com/getsentry/sentry-go v0.49.0/go.mod h1:nuMJAoCfe1u0Bts2ocyNI+TW8HT84vRMqwA5Qq/SKUI= +github.com/getsentry/sentry-go v1.0.0-alpha.1 h1:ZxMblX8orHwWvzkRZtzDTd98IsY1vnnOrzMcFnM3LvE= +github.com/getsentry/sentry-go v1.0.0-alpha.1/go.mod h1:2v8sse8z+We+lVdchGIL0TG/4q/nwsud0EWpvikO5LA= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= @@ -323,8 +323,8 @@ golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= -golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -336,16 +336,16 @@ golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= -golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= +golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= 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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= -golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= +golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= +golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/internal/flamegraph/flamegraph.go b/internal/flamegraph/flamegraph.go index bc789a9f..a17098dc 100644 --- a/internal/flamegraph/flamegraph.go +++ b/internal/flamegraph/flamegraph.go @@ -368,8 +368,6 @@ func GetFlamegraphFromCandidates( jobs chan storageutil.ReadJob, ma *metrics.Aggregator, ) (speedscope.Output, error) { - hub := sentry.GetHubFromContext(ctx) - results := make(chan storageutil.ReadJobResult) dispatchDone := make(chan struct{}) @@ -438,9 +436,7 @@ func GetFlamegraphFromCandidates( // and return it. continue } - if hub != nil { - hub.CaptureException(err) - } + sentry.CaptureException(ctx, err) continue } diff --git a/internal/sentryutil/sentryutil.go b/internal/sentryutil/sentryutil.go new file mode 100644 index 00000000..fa1fd214 --- /dev/null +++ b/internal/sentryutil/sentryutil.go @@ -0,0 +1,16 @@ +package sentryutil + +import ( + "context" + + "github.com/getsentry/sentry-go" +) + +// EnsureScope returns the [*sentry.Scope] on ctx if present, or a new scope via +// [sentry.WithScope] if not. +func EnsureScope(ctx context.Context) (context.Context, *sentry.Scope) { + if s := sentry.ScopeFromContext(ctx); s != nil { + return ctx, s + } + return sentry.WithScope(ctx) +}