diff --git a/client.go b/client.go index 1cc33690..3b06de7a 100644 --- a/client.go +++ b/client.go @@ -338,6 +338,10 @@ func (client *Client) setupIntegrations() { integration.SetupOnce(client) Logger.Printf("Integration installed: %s\n", integration.Name()) } + + sort.Slice(client.integrations, func(i, j int) bool { + return client.integrations[i].Name() < client.integrations[j].Name() + }) } // AddEventProcessor adds an event processor to the client. It must not be @@ -582,22 +586,22 @@ func (client *Client) prepareEvent(event *Event, hint *EventHint, scope EventMod } if event.ServerName == "" { - if client.Options().ServerName != "" { - event.ServerName = client.Options().ServerName - } else { + event.ServerName = client.Options().ServerName + + if event.ServerName == "" { event.ServerName = hostname } } - if event.Release == "" && client.Options().Release != "" { + if event.Release == "" { event.Release = client.Options().Release } - if event.Dist == "" && client.Options().Dist != "" { + if event.Dist == "" { event.Dist = client.Options().Dist } - if event.Environment == "" && client.Options().Environment != "" { + if event.Environment == "" { event.Environment = client.Options().Environment } @@ -641,11 +645,10 @@ func (client *Client) prepareEvent(event *Event, hint *EventHint, scope EventMod } func (client Client) listIntegrations() []string { - integrations := make([]string, 0, len(client.integrations)) - for _, integration := range client.integrations { - integrations = append(integrations, integration.Name()) + integrations := make([]string, len(client.integrations)) + for i, integration := range client.integrations { + integrations[i] = integration.Name() } - sort.Strings(integrations) return integrations } diff --git a/scope.go b/scope.go index f53d39d7..5c00e3da 100644 --- a/scope.go +++ b/scope.go @@ -4,7 +4,6 @@ import ( "bytes" "io" "net/http" - "reflect" "sync" "time" ) @@ -339,10 +338,6 @@ func (scope *Scope) ApplyToEvent(event *Event, hint *EventHint) *Event { defer scope.mu.RUnlock() if len(scope.breadcrumbs) > 0 { - if event.Breadcrumbs == nil { - event.Breadcrumbs = []*Breadcrumb{} - } - event.Breadcrumbs = append(event.Breadcrumbs, scope.breadcrumbs...) } @@ -384,14 +379,13 @@ func (scope *Scope) ApplyToEvent(event *Event, hint *EventHint) *Event { } } - if (reflect.DeepEqual(event.User, User{})) { + var emptyUser User + if event.User == emptyUser { event.User = scope.user } - if (event.Fingerprint == nil || len(event.Fingerprint) == 0) && - len(scope.fingerprint) > 0 { - event.Fingerprint = make([]string, len(scope.fingerprint)) - copy(event.Fingerprint, scope.fingerprint) + if len(event.Fingerprint) == 0 { + event.Fingerprint = append(event.Fingerprint, scope.fingerprint...) } if scope.level != "" { diff --git a/stacktrace.go b/stacktrace.go index 67a6ab7b..03b78307 100644 --- a/stacktrace.go +++ b/stacktrace.go @@ -245,21 +245,24 @@ func splitQualifiedFunctionName(name string) (pkg string, fun string) { } func extractFrames(pcs []uintptr) []Frame { - var frames []Frame + var frames = make([]Frame, 0, len(pcs)) callersFrames := runtime.CallersFrames(pcs) for { callerFrame, more := callersFrames.Next() - frames = append([]Frame{ - NewFrame(callerFrame), - }, frames...) + frames = append(frames, NewFrame(callerFrame)) if !more { break } } + // reverse + for i, j := 0, len(frames)-1; i < j; i, j = i+1, j-1 { + frames[i], frames[j] = frames[j], frames[i] + } + return frames } @@ -270,7 +273,8 @@ func filterFrames(frames []Frame) []Frame { return nil } - filteredFrames := make([]Frame, 0, len(frames)) + // reuse + filteredFrames := frames[:0] for _, frame := range frames { // Skip Go internal frames. diff --git a/transport.go b/transport.go index 6a474179..df18454e 100644 --- a/transport.go +++ b/transport.go @@ -556,14 +556,16 @@ func (t *HTTPSyncTransport) disabled(c ratelimit.Category) bool { // Only used internally when an empty DSN is provided, which effectively disables the SDK. type noopTransport struct{} -func (t *noopTransport) Configure(options ClientOptions) { +var _ Transport = noopTransport{} + +func (noopTransport) Configure(ClientOptions) { Logger.Println("Sentry client initialized with an empty DSN. Using noopTransport. No events will be delivered.") } -func (t *noopTransport) SendEvent(event *Event) { +func (noopTransport) SendEvent(*Event) { Logger.Println("Event dropped due to noopTransport usage.") } -func (t *noopTransport) Flush(_ time.Duration) bool { +func (noopTransport) Flush(time.Duration) bool { return true }