github.com/neatlab/neatio@v1.7.3-0.20220425043230-d903e92fcc75/utilities/metrics/debug.go (about) 1 package metrics 2 3 import ( 4 "runtime/debug" 5 "time" 6 ) 7 8 var ( 9 debugMetrics struct { 10 GCStats struct { 11 LastGC Gauge 12 NumGC Gauge 13 Pause Histogram 14 15 PauseTotal Gauge 16 } 17 ReadGCStats Timer 18 } 19 gcStats debug.GCStats 20 ) 21 22 func CaptureDebugGCStats(r Registry, d time.Duration) { 23 for range time.Tick(d) { 24 CaptureDebugGCStatsOnce(r) 25 } 26 } 27 28 func CaptureDebugGCStatsOnce(r Registry) { 29 lastGC := gcStats.LastGC 30 t := time.Now() 31 debug.ReadGCStats(&gcStats) 32 debugMetrics.ReadGCStats.UpdateSince(t) 33 34 debugMetrics.GCStats.LastGC.Update(gcStats.LastGC.UnixNano()) 35 debugMetrics.GCStats.NumGC.Update(gcStats.NumGC) 36 if lastGC != gcStats.LastGC && 0 < len(gcStats.Pause) { 37 debugMetrics.GCStats.Pause.Update(int64(gcStats.Pause[0])) 38 } 39 40 debugMetrics.GCStats.PauseTotal.Update(int64(gcStats.PauseTotal)) 41 } 42 43 func RegisterDebugGCStats(r Registry) { 44 debugMetrics.GCStats.LastGC = NewGauge() 45 debugMetrics.GCStats.NumGC = NewGauge() 46 debugMetrics.GCStats.Pause = NewHistogram(NewExpDecaySample(1028, 0.015)) 47 48 debugMetrics.GCStats.PauseTotal = NewGauge() 49 debugMetrics.ReadGCStats = NewTimer() 50 51 r.Register("debug.GCStats.LastGC", debugMetrics.GCStats.LastGC) 52 r.Register("debug.GCStats.NumGC", debugMetrics.GCStats.NumGC) 53 r.Register("debug.GCStats.Pause", debugMetrics.GCStats.Pause) 54 55 r.Register("debug.GCStats.PauseTotal", debugMetrics.GCStats.PauseTotal) 56 r.Register("debug.ReadGCStats", debugMetrics.ReadGCStats) 57 } 58 59 func init() { 60 gcStats.Pause = make([]time.Duration, 11) 61 }