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  }