Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 20 additions & 12 deletions sentry.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"sync"
"time"

"github.com/ansel1/merry"
raven "github.com/getsentry/raven-go"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
Expand Down Expand Up @@ -305,36 +306,43 @@ func (hook *SentryHook) Flush() {

func (hook *SentryHook) findStacktrace(err error) *raven.Stacktrace {
var stacktrace *raven.Stacktrace
var stackErr errors.StackTrace
var stack []uintptr
for err != nil {
// Find the earliest *raven.Stacktrace, or error.StackTrace
// Find the earliest *raven.Stacktrace, error.StackTrace or merry.Stack
if tracer, ok := err.(Stacktracer); ok {
stacktrace = tracer.GetStacktrace()
stackErr = nil
stack = nil
} else if tracer, ok := err.(pkgErrorStackTracer); ok {
stacktrace = nil
stackErr = tracer.StackTrace()
stackErr := tracer.StackTrace()
stackFrames := []errors.Frame(stackErr)
stack = make([]uintptr, len(stackFrames))
for i := 0; i < len(stack); i++ {
stack[i] = uintptr(stackFrames[i])
}
} else {
stacktrace = nil
stack = merry.Stack(err)
}
if cause, ok := err.(causer); ok {
err = cause.Cause()
} else {
break
}
}
if stackErr != nil {
stacktrace = hook.convertStackTrace(stackErr)
if stack != nil {
stacktrace = hook.convertStack(stack)
}
return stacktrace
}

// convertStackTrace converts an errors.StackTrace into a natively consumable
// convertStack converts an []uintptr into a natively consumable
// *raven.Stacktrace
func (hook *SentryHook) convertStackTrace(st errors.StackTrace) *raven.Stacktrace {
func (hook *SentryHook) convertStack(stack []uintptr) *raven.Stacktrace {
stConfig := &hook.StacktraceConfiguration
stFrames := []errors.Frame(st)
frames := make([]*raven.StacktraceFrame, 0, len(stFrames))
for i := range stFrames {
pc := uintptr(stFrames[i])
frames := make([]*raven.StacktraceFrame, 0, len(stack))
for i := range stack {
pc := stack[i]
fn := runtime.FuncForPC(pc)
file, line := fn.FileLine(pc)
frame := raven.NewStacktraceFrame(pc, fn.Name(), file, line, stConfig.Context, stConfig.InAppPrefixes)
Expand Down
9 changes: 7 additions & 2 deletions sentry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -400,11 +400,16 @@ func (myStacktracerError) GetStacktrace() *raven.Stacktrace {
}
}

func TestConvertStackTrace(t *testing.T) {
func TestConvertStack(t *testing.T) {
hook := SentryHook{}
expected := raven.NewStacktrace(0, 0, nil)
st := pkgerrors.New("-").(pkgErrorStackTracer).StackTrace()
ravenSt := hook.convertStackTrace(st)
stackFrames := []pkgerrors.Frame(st)
stack := make([]uintptr, len(stackFrames))
for i := 0; i < len(stack); i++ {
stack[i] = uintptr(stackFrames[i])
}
ravenSt := hook.convertStack(stack)

// Obscure the line numbes, so DeepEqual doesn't fail erroneously
for _, frame := range append(expected.Frames, ravenSt.Frames...) {
Expand Down