|
7 | 7 | "sync" |
8 | 8 | "time" |
9 | 9 |
|
| 10 | + "github.com/ansel1/merry" |
10 | 11 | raven "github.com/getsentry/raven-go" |
11 | 12 | "github.com/pkg/errors" |
12 | 13 | "github.com/sirupsen/logrus" |
@@ -305,36 +306,43 @@ func (hook *SentryHook) Flush() { |
305 | 306 |
|
306 | 307 | func (hook *SentryHook) findStacktrace(err error) *raven.Stacktrace { |
307 | 308 | var stacktrace *raven.Stacktrace |
308 | | - var stackErr errors.StackTrace |
| 309 | + var stack []uintptr |
309 | 310 | for err != nil { |
310 | | - // Find the earliest *raven.Stacktrace, or error.StackTrace |
| 311 | + // Find the earliest *raven.Stacktrace, error.StackTrace or merry.Stack |
311 | 312 | if tracer, ok := err.(Stacktracer); ok { |
312 | 313 | stacktrace = tracer.GetStacktrace() |
313 | | - stackErr = nil |
| 314 | + stack = nil |
314 | 315 | } else if tracer, ok := err.(pkgErrorStackTracer); ok { |
315 | 316 | stacktrace = nil |
316 | | - stackErr = tracer.StackTrace() |
| 317 | + stackErr := tracer.StackTrace() |
| 318 | + stackFrames := []errors.Frame(stackErr) |
| 319 | + stack = make([]uintptr, len(stackFrames)) |
| 320 | + for i := 0; i < len(stack); i++ { |
| 321 | + stack[i] = uintptr(stackFrames[i]) |
| 322 | + } |
| 323 | + } else { |
| 324 | + stacktrace = nil |
| 325 | + stack = merry.Stack(err) |
317 | 326 | } |
318 | 327 | if cause, ok := err.(causer); ok { |
319 | 328 | err = cause.Cause() |
320 | 329 | } else { |
321 | 330 | break |
322 | 331 | } |
323 | 332 | } |
324 | | - if stackErr != nil { |
325 | | - stacktrace = hook.convertStackTrace(stackErr) |
| 333 | + if stack != nil { |
| 334 | + stacktrace = hook.convertStack(stack) |
326 | 335 | } |
327 | 336 | return stacktrace |
328 | 337 | } |
329 | 338 |
|
330 | | -// convertStackTrace converts an errors.StackTrace into a natively consumable |
| 339 | +// convertStack converts an []uintptr into a natively consumable |
331 | 340 | // *raven.Stacktrace |
332 | | -func (hook *SentryHook) convertStackTrace(st errors.StackTrace) *raven.Stacktrace { |
| 341 | +func (hook *SentryHook) convertStack(stack []uintptr) *raven.Stacktrace { |
333 | 342 | stConfig := &hook.StacktraceConfiguration |
334 | | - stFrames := []errors.Frame(st) |
335 | | - frames := make([]*raven.StacktraceFrame, 0, len(stFrames)) |
336 | | - for i := range stFrames { |
337 | | - pc := uintptr(stFrames[i]) |
| 343 | + frames := make([]*raven.StacktraceFrame, 0, len(stack)) |
| 344 | + for i := range stack { |
| 345 | + pc := stack[i] |
338 | 346 | fn := runtime.FuncForPC(pc) |
339 | 347 | file, line := fn.FileLine(pc) |
340 | 348 | frame := raven.NewStacktraceFrame(pc, fn.Name(), file, line, stConfig.Context, stConfig.InAppPrefixes) |
|
0 commit comments