zdebug.go 947 Bytes
Newer Older
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
1
2
3
4
package zdebug

import (
	"fmt"
Vladimir Barsukov's avatar
Vladimir Barsukov committed
5
	"git.barsukov.pro/barsukov/zgo/zutils"
Vladimir Barsukov's avatar
lint    
Vladimir Barsukov committed
6
	"log"
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
7
	"runtime"
Vladimir Barsukov's avatar
Vladimir Barsukov committed
8
	"strings"
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
9
10
11
12
13
14
	"time"
)

func NewMonitor(secs int) {
	go func() {
		var rtm runtime.MemStats
Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
15
16
		var memMax uint64

Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
17
		for {
Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
18
			time.Sleep(time.Duration(secs) * time.Second)
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
19
20
21

			runtime.ReadMemStats(&rtm)

Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
22
23
			mem := ((rtm.HeapIdle - rtm.HeapReleased) + (rtm.Alloc + rtm.HeapInuse)) / 1e6
			memMax = max(memMax, mem)
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
24

Vladimir Barsukov's avatar
lint    
Vladimir Barsukov committed
25
			log.Printf("ZDEBUG: MEM: %v; MEM_MAX: %v; OBJ: %v, GO: %v, GC: %v",
Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
26
27
28
29
30
31
				mem,
				memMax,
				(rtm.Mallocs-rtm.Frees)/1e3,
				runtime.NumGoroutine(),
				rtm.NumGC,
			)
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
32
33
34
		}
	}()
}
Vladimir Barsukov's avatar
Vladimir Barsukov committed
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

func Trace() []string {
	var out []string

	pc := make([]uintptr, 10)
	runtime.Callers(2, pc)

	for i := range pc {
		if f := runtime.FuncForPC(pc[i]); f != nil {
			file, line := f.FileLine(pc[i])

			if strings.Contains(file, "go/pkg") {
				continue
			}

			out = append(out, fmt.Sprintf("%s:%d", f.Name(), line))
		}
	}

	return zutils.ArrayUnique(out)
}