Skip to content

Commit 12452ab

Browse files
committed
Squashed changes from getsentry#137
1 parent 5c07ee4 commit 12452ab

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ func (client *Client) CaptureError(err error, tags map[string]string, interfaces
617617
return ""
618618
}
619619

620-
packet := NewPacket(err.Error(), append(append(interfaces, client.context.interfaces()...), NewException(err, NewStacktrace(1, 3, client.includePaths)))...)
620+
packet := NewPacket(err.Error(), append(append(interfaces, client.context.interfaces()...), NewException(err, GetOrNewStacktrace(err, 1, 3, client.includePaths)))...)
621621
eventID, _ := client.Capture(packet, tags)
622622

623623
return eventID

http.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func RecoveryHandler(handler func(http.ResponseWriter, *http.Request)) func(http
7373
if rval := recover(); rval != nil {
7474
debug.PrintStack()
7575
rvalStr := fmt.Sprint(rval)
76-
packet := NewPacket(rvalStr, NewException(errors.New(rvalStr), NewStacktrace(2, 3, nil)), NewHttp(r))
76+
packet := NewPacket(rvalStr, NewException(errors.New(rvalStr), GetOrNewStacktrace(rval.(error), 2, 3, nil)), NewHttp(r))
7777
Capture(packet, nil)
7878
w.WriteHeader(http.StatusInternalServerError)
7979
}

stacktrace.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"runtime"
1414
"strings"
1515
"sync"
16+
17+
"github.com/pkg/errors"
1618
)
1719

1820
// https://docs.getsentry.com/hosted/clientdev/interfaces/#failure-interfaces
@@ -49,6 +51,35 @@ type StacktraceFrame struct {
4951
InApp bool `json:"in_app"`
5052
}
5153

54+
// Try to get stacktrace from err as an interface of github.com/pkg/errors, or else NewStacktrace()
55+
func GetOrNewStacktrace(err error, skip int, context int, appPackagePrefixes []string) *Stacktrace {
56+
stacktracer, errHasStacktrace := err.(interface {
57+
StackTrace() errors.StackTrace
58+
})
59+
if errHasStacktrace {
60+
var frames []*StacktraceFrame
61+
for _, f := range stacktracer.StackTrace() {
62+
pc := uintptr(f) - 1
63+
fn := runtime.FuncForPC(pc)
64+
var file string
65+
var line int
66+
if fn != nil {
67+
file, line = fn.FileLine(pc)
68+
} else {
69+
file = "unknown"
70+
}
71+
frame := NewStacktraceFrame(pc, file, line, context, appPackagePrefixes)
72+
if frame != nil {
73+
frames = append([]*StacktraceFrame{frame}, frames...)
74+
}
75+
}
76+
return &Stacktrace{Frames: frames}
77+
} else {
78+
return NewStacktrace(skip + 1, context, appPackagePrefixes)
79+
}
80+
}
81+
82+
5283
// Intialize and populate a new stacktrace, skipping skip frames.
5384
//
5485
// context is the number of surrounding lines that should be included for context.

0 commit comments

Comments
 (0)