-
Notifications
You must be signed in to change notification settings - Fork 42
/
memstats.go
92 lines (75 loc) · 2.92 KB
/
memstats.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package tfbridge
import (
"context"
"runtime"
"sync"
"github.com/opentracing/opentracing-go"
)
type memStatCollector struct {
maxStats runtime.MemStats
mu sync.Mutex
}
// Samples memory stats in the background at 1s intervals, and creates
// spans for the data. This is currently opt-in via
// `PULUMI_TRACING_MEMSTATS_POLL_INTERVAL=1s` or similar. Consider
// collecting this by default later whenever tracing is enabled as we
// calibrate that the overhead is low enough.
func (c *memStatCollector) collectMemStats(ctx context.Context, span opentracing.Span) {
memStats := runtime.MemStats{}
runtime.ReadMemStats(&memStats)
c.mu.Lock()
defer c.mu.Unlock()
// report cumulative metrics as is
span.SetTag("runtime.NumCgoCall", runtime.NumCgoCall())
span.SetTag("MemStats.TotalAlloc", memStats.TotalAlloc)
span.SetTag("MemStats.Mallocs", memStats.Mallocs)
span.SetTag("MemStats.Frees", memStats.Frees)
span.SetTag("MemStats.PauseTotalNs", memStats.PauseTotalNs)
span.SetTag("MemStats.NumGC", memStats.NumGC)
// for other metrics report the max alongside current
if memStats.Sys > c.maxStats.Sys {
c.maxStats.Sys = memStats.Sys
span.SetTag("MemStats.Sys", memStats.Sys)
span.SetTag("MemStats.Sys.Max", c.maxStats.Sys)
}
if memStats.HeapAlloc > c.maxStats.HeapAlloc {
c.maxStats.HeapAlloc = memStats.HeapAlloc
span.SetTag("MemStats.HeapAlloc", memStats.HeapAlloc)
span.SetTag("MemStats.HeapAlloc.Max", c.maxStats.HeapAlloc)
}
if memStats.HeapSys > c.maxStats.HeapSys {
c.maxStats.HeapSys = memStats.HeapSys
span.SetTag("MemStats.HeapSys", memStats.HeapSys)
span.SetTag("MemStats.HeapSys.Max", c.maxStats.HeapSys)
}
if memStats.HeapIdle > c.maxStats.HeapIdle {
c.maxStats.HeapIdle = memStats.HeapIdle
span.SetTag("MemStats.HeapIdle", memStats.HeapIdle)
span.SetTag("MemStats.HeapIdle.Max", c.maxStats.HeapIdle)
}
if memStats.HeapInuse > c.maxStats.HeapInuse {
c.maxStats.HeapInuse = memStats.HeapInuse
span.SetTag("MemStats.HeapInuse", memStats.HeapInuse)
span.SetTag("MemStats.HeapInuse.Max", c.maxStats.HeapInuse)
}
if memStats.HeapReleased > c.maxStats.HeapReleased {
c.maxStats.HeapReleased = memStats.HeapReleased
span.SetTag("MemStats.HeapReleased", memStats.HeapReleased)
span.SetTag("MemStats.HeapReleased.Max", c.maxStats.HeapReleased)
}
if memStats.HeapObjects > c.maxStats.HeapObjects {
c.maxStats.HeapObjects = memStats.HeapObjects
span.SetTag("MemStats.HeapObjects", memStats.HeapObjects)
span.SetTag("MemStats.HeapObjects.Max", c.maxStats.HeapObjects)
}
if memStats.StackInuse > c.maxStats.StackInuse {
c.maxStats.StackInuse = memStats.StackInuse
span.SetTag("MemStats.StackInuse", memStats.StackInuse)
span.SetTag("MemStats.StackInuse.Max", c.maxStats.StackInuse)
}
if memStats.StackSys > c.maxStats.StackSys {
c.maxStats.StackSys = memStats.StackSys
span.SetTag("MemStats.StackSys", memStats.StackSys)
span.SetTag("MemStats.StackSys.Max", c.maxStats.StackSys)
}
}