9 log "github.com/sirupsen/logrus"
18 // Start trigger record of stack trace run time record as a graph view
20 routineID, stacks, err := traceStacks()
22 log.WithFields(log.Fields{"module": logModule, "err": err}).Error("fail on measure get stacks")
26 data, ok := store.Load(routineID)
28 store.Store(routineID, NewTimer(stacks[0]))
32 if err := data.(*Timer).StartTimer(stacks); err != nil {
33 log.WithFields(log.Fields{"module": logModule, "err": err, "routine": routineID, "stack": stacks}).Error("fail on start timer")
37 // End end the stack trace run time
39 routineID, stacks, err := traceStacks()
41 log.WithFields(log.Fields{"module": logModule, "err": err}).Error("fail on measure get stacks")
45 data, ok := store.Load(routineID)
47 log.WithFields(log.Fields{"module": logModule, "err": err}).Error("fail on measure timer by routine ID")
51 rootTimer := data.(*Timer)
52 if err := rootTimer.EndTimer(stacks); err != nil {
53 log.WithFields(log.Fields{"module": logModule, "err": err, "routine": routineID, "stack": stacks}).Error("fail on end timer")
56 if rootTimer.IsEnd() {
57 log.WithField("module", logModule).Info(rootTimer.String())
58 store.Delete(routineID)
62 func traceStacks() (string, []string, error) {
64 for _, stack := range strings.Split(string(debug.Stack()), "\n") {
65 // skip the file path stack
66 if strings.HasPrefix(stack, " ") {
70 // delete the func memory address stuff
71 if subPos := strings.LastIndexAny(stack, "("); subPos > 0 {
72 stacks = append(stacks, stack[:subPos])
74 stacks = append(stacks, stack)
79 return "", nil, fmt.Errorf("fail to decode stack")
82 return stacks[0], stacks[4:], nil