github.com/kaituanwang/hyperledger@v2.0.1+incompatible/common/metrics/statsd/goruntime/collector.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package goruntime 8 9 import ( 10 "runtime" 11 "time" 12 13 "github.com/hyperledger/fabric/common/metrics" 14 ) 15 16 type Collector struct { 17 CgoCalls metrics.Gauge 18 GoRoutines metrics.Gauge 19 ThreadsCreated metrics.Gauge 20 HeapAlloc metrics.Gauge 21 TotalAlloc metrics.Gauge 22 Mallocs metrics.Gauge 23 Frees metrics.Gauge 24 HeapSys metrics.Gauge 25 HeapIdle metrics.Gauge 26 HeapInuse metrics.Gauge 27 HeapReleased metrics.Gauge 28 HeapObjects metrics.Gauge 29 StackInuse metrics.Gauge 30 StackSys metrics.Gauge 31 MSpanInuse metrics.Gauge 32 MSpanSys metrics.Gauge 33 MCacheInuse metrics.Gauge 34 MCacheSys metrics.Gauge 35 BuckHashSys metrics.Gauge 36 GCSys metrics.Gauge 37 OtherSys metrics.Gauge 38 NextGC metrics.Gauge 39 LastGC metrics.Gauge 40 PauseTotalNs metrics.Gauge 41 PauseNs metrics.Gauge 42 NumGC metrics.Gauge 43 NumForcedGC metrics.Gauge 44 } 45 46 func NewCollector(p metrics.Provider) *Collector { 47 return &Collector{ 48 CgoCalls: p.NewGauge(cgoCallsGaugeOpts), 49 GoRoutines: p.NewGauge(goRoutinesGaugeOpts), 50 ThreadsCreated: p.NewGauge(threadsCreatedGaugeOpts), 51 HeapAlloc: p.NewGauge(heapAllocGaugeOpts), 52 TotalAlloc: p.NewGauge(totalAllocGaugeOpts), 53 Mallocs: p.NewGauge(mallocsGaugeOpts), 54 Frees: p.NewGauge(freesGaugeOpts), 55 HeapSys: p.NewGauge(heapSysGaugeOpts), 56 HeapIdle: p.NewGauge(heapIdleGaugeOpts), 57 HeapInuse: p.NewGauge(heapInuseGaugeOpts), 58 HeapReleased: p.NewGauge(heapReleasedGaugeOpts), 59 HeapObjects: p.NewGauge(heapObjectsGaugeOpts), 60 StackInuse: p.NewGauge(stackInuseGaugeOpts), 61 StackSys: p.NewGauge(stackSysGaugeOpts), 62 MSpanInuse: p.NewGauge(mSpanInuseGaugeOpts), 63 MSpanSys: p.NewGauge(mSpanSysGaugeOpts), 64 MCacheInuse: p.NewGauge(mCacheInuseGaugeOpts), 65 MCacheSys: p.NewGauge(mCacheSysGaugeOpts), 66 BuckHashSys: p.NewGauge(buckHashSysGaugeOpts), 67 GCSys: p.NewGauge(gCSysGaugeOpts), 68 OtherSys: p.NewGauge(otherSysGaugeOpts), 69 NextGC: p.NewGauge(nextGCGaugeOpts), 70 LastGC: p.NewGauge(lastGCGaugeOpts), 71 PauseTotalNs: p.NewGauge(pauseTotalNsGaugeOpts), 72 PauseNs: p.NewGauge(pauseNsGaugeOpts), 73 NumGC: p.NewGauge(numGCGaugeOpts), 74 NumForcedGC: p.NewGauge(numForcedGCGaugeOpts), 75 } 76 } 77 78 func (c *Collector) CollectAndPublish(ticks <-chan time.Time) { 79 for range ticks { 80 stats := CollectStats() 81 c.Publish(stats) 82 } 83 } 84 85 func (c *Collector) Publish(stats Stats) { 86 c.CgoCalls.Set(float64(stats.CgoCalls)) 87 c.GoRoutines.Set(float64(stats.GoRoutines)) 88 c.ThreadsCreated.Set(float64(stats.ThreadsCreated)) 89 c.HeapAlloc.Set(float64(stats.MemStats.HeapAlloc)) 90 c.TotalAlloc.Set(float64(stats.MemStats.TotalAlloc)) 91 c.Mallocs.Set(float64(stats.MemStats.Mallocs)) 92 c.Frees.Set(float64(stats.MemStats.Frees)) 93 c.HeapSys.Set(float64(stats.MemStats.HeapSys)) 94 c.HeapIdle.Set(float64(stats.MemStats.HeapIdle)) 95 c.HeapInuse.Set(float64(stats.MemStats.HeapInuse)) 96 c.HeapReleased.Set(float64(stats.MemStats.HeapReleased)) 97 c.HeapObjects.Set(float64(stats.MemStats.HeapObjects)) 98 c.StackInuse.Set(float64(stats.MemStats.StackInuse)) 99 c.StackSys.Set(float64(stats.MemStats.StackSys)) 100 c.MSpanInuse.Set(float64(stats.MemStats.MSpanInuse)) 101 c.MSpanSys.Set(float64(stats.MemStats.MSpanSys)) 102 c.MCacheInuse.Set(float64(stats.MemStats.MCacheInuse)) 103 c.MCacheSys.Set(float64(stats.MemStats.MCacheSys)) 104 c.BuckHashSys.Set(float64(stats.MemStats.BuckHashSys)) 105 c.GCSys.Set(float64(stats.MemStats.GCSys)) 106 c.OtherSys.Set(float64(stats.MemStats.OtherSys)) 107 c.NextGC.Set(float64(stats.MemStats.NextGC)) 108 c.LastGC.Set(float64(stats.MemStats.LastGC)) 109 c.PauseTotalNs.Set(float64(stats.MemStats.PauseTotalNs)) 110 c.PauseNs.Set(float64(stats.MemStats.PauseNs[(stats.MemStats.NumGC+255)%256])) 111 c.NumGC.Set(float64(stats.MemStats.NumGC)) 112 c.NumForcedGC.Set(float64(stats.MemStats.NumForcedGC)) 113 } 114 115 type Stats struct { 116 CgoCalls int64 117 GoRoutines int 118 ThreadsCreated int 119 MemStats runtime.MemStats 120 } 121 122 func CollectStats() Stats { 123 stats := Stats{ 124 CgoCalls: runtime.NumCgoCall(), 125 GoRoutines: runtime.NumGoroutine(), 126 } 127 stats.ThreadsCreated, _ = runtime.ThreadCreateProfile(nil) 128 runtime.ReadMemStats(&stats.MemStats) 129 return stats 130 }