Skip to content
This repository was archived by the owner on Aug 30, 2023. It is now read-only.

Commit 87c3105

Browse files
committed
use the stacktrace of cause, if that doesn't have one, use the one from err
1 parent 3033899 commit 87c3105

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ func (client *Client) CaptureError(err error, tags map[string]string, interfaces
709709
extra := extractExtra(err)
710710
cause := pkgErrors.Cause(err)
711711

712-
packet := NewPacketWithExtra(err.Error(), extra, append(append(interfaces, client.context.interfaces()...), NewException(cause, GetOrNewStacktrace(cause, 1, 3, client.includePaths)))...)
712+
packet := NewPacketWithExtra(err.Error(), extra, append(append(interfaces, client.context.interfaces()...), NewException(cause, GetOrNewStacktrace(err, cause, 1, 3, client.includePaths)))...)
713713
eventID, _ := client.Capture(packet, tags)
714714

715715
return eventID
@@ -734,7 +734,7 @@ func (client *Client) CaptureErrorAndWait(err error, tags map[string]string, int
734734
extra := extractExtra(err)
735735
cause := pkgErrors.Cause(err)
736736

737-
packet := NewPacketWithExtra(err.Error(), extra, append(append(interfaces, client.context.interfaces()...), NewException(cause, GetOrNewStacktrace(cause, 1, 3, client.includePaths)))...)
737+
packet := NewPacketWithExtra(err.Error(), extra, append(append(interfaces, client.context.interfaces()...), NewException(cause, GetOrNewStacktrace(err, cause, 1, 3, client.includePaths)))...)
738738
eventID, ch := client.Capture(packet, tags)
739739
if eventID != "" {
740740
<-ch

stacktrace.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,24 @@ type StacktraceFrame struct {
5252
InApp bool `json:"in_app"`
5353
}
5454

55+
type StackTracer interface {
56+
StackTrace() errors.StackTrace
57+
}
58+
5559
// Try to get stacktrace from err as an interface of github.com/pkg/errors, or else NewStacktrace()
56-
func GetOrNewStacktrace(err error, skip int, context int, appPackagePrefixes []string) *Stacktrace {
57-
stacktracer, errHasStacktrace := err.(interface {
58-
StackTrace() errors.StackTrace
59-
})
60-
if errHasStacktrace {
60+
func GetOrNewStacktrace(err, cause error, skip int, context int, appPackagePrefixes []string) *Stacktrace {
61+
// use the stacktrace of cause
62+
var stacktracer StackTracer
63+
var causeHasStacktrace, errHasStacktrace bool
64+
stacktracer, causeHasStacktrace = cause.(StackTracer)
65+
66+
// if cause doesn't have a stacktrace, use the one of err
67+
if !causeHasStacktrace {
68+
stacktracer, errHasStacktrace = err.(StackTracer)
69+
}
70+
71+
// if either has a trace, we can generate from it
72+
if causeHasStacktrace || errHasStacktrace {
6173
var frames []*StacktraceFrame
6274
for _, f := range stacktracer.StackTrace() {
6375
pc := uintptr(f) - 1

0 commit comments

Comments
 (0)