@@ -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