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

Commit fd090ae

Browse files
author
Josh Leverette
committed
add support for github.com/pingcap/errors stacktraces
1 parent d5057ce commit fd090ae

File tree

1 file changed

+56
-25
lines changed

1 file changed

+56
-25
lines changed

stacktrace.go

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"strings"
1515
"sync"
1616

17+
pingcap "github.com/pingcap/errors"
1718
"github.com/pkg/errors"
1819
)
1920

@@ -51,32 +52,62 @@ type StacktraceFrame struct {
5152
InApp bool `json:"in_app"`
5253
}
5354

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 fName string
65-
var file string
66-
var line int
67-
if fn != nil {
68-
file, line = fn.FileLine(pc)
69-
fName = fn.Name()
70-
} else {
71-
file = "unknown"
72-
fName = "unknown"
73-
}
74-
frame := NewStacktraceFrame(pc, fName, file, line, context, appPackagePrefixes)
75-
if frame != nil {
76-
frames = append([]*StacktraceFrame{frame}, frames...)
77-
}
55+
type pkgStacktracer interface {
56+
StackTrace() errors.StackTrace
57+
}
58+
59+
func pkgStacktrace(stacktracer pkgStacktracer, context int, appPackagePrefixes []string) *Stacktrace {
60+
var frames []*StacktraceFrame
61+
for f := range stacktracer.StackTrace() {
62+
pc := uintptr(f) - 1
63+
fn := runtime.FuncForPC(pc)
64+
var fName string
65+
var file string
66+
var line int
67+
if fn != nil {
68+
file, line = fn.FileLine(pc)
69+
fName = fn.Name()
70+
} else {
71+
file = "unknown"
72+
fName = "unknown"
73+
}
74+
frame := NewStacktraceFrame(pc, fName, file, line, context, appPackagePrefixes)
75+
if frame != nil {
76+
frames = append([]*StacktraceFrame{frame}, frames...)
77+
}
78+
}
79+
return &Stacktrace{Frames: frames}
80+
}
81+
82+
func pingcapStacktrace(stacktracer pingcap.StackTracer, context int, appPackagePrefixes []string) *Stacktrace {
83+
var frames []*StacktraceFrame
84+
for f := range stacktracer.StackTrace() {
85+
pc := uintptr(f) - 1
86+
fn := runtime.FuncForPC(pc)
87+
var fName string
88+
var file string
89+
var line int
90+
if fn != nil {
91+
file, line = fn.FileLine(pc)
92+
fName = fn.Name()
93+
} else {
94+
file = "unknown"
95+
fName = "unknown"
96+
}
97+
frame := NewStacktraceFrame(pc, fName, file, line, context, appPackagePrefixes)
98+
if frame != nil {
99+
frames = append([]*StacktraceFrame{frame}, frames...)
78100
}
79-
return &Stacktrace{Frames: frames}
101+
}
102+
return &Stacktrace{Frames: frames}
103+
}
104+
105+
// Try to get stacktrace from err as an interface of github.com/pkg/errors or github.com/pingcap/errors, or else NewStacktrace()
106+
func GetOrNewStacktrace(err error, skip int, context int, appPackagePrefixes []string) *Stacktrace {
107+
if stacktracer, errHasStacktrace := err.(pkgStacktracer); errHasStacktrace {
108+
return pkgStacktrace(stacktracer, context, appPackagePrefixes)
109+
} else if stacktracer, errHasStacktrace := err.(pingcap.StackTracer); errHasStacktrace {
110+
return pingcapStacktrace(stacktracer, context, appPackagePrefixes)
80111
} else {
81112
return NewStacktrace(skip+1, context, appPackagePrefixes)
82113
}

0 commit comments

Comments
 (0)