* go-metrics: fork library and introduce ResettingTimer and InfluxDB reporter. * vendor: change nonsense/go-metrics to ethersphere/go-metrics * go-metrics: add tests. move ResettingTimer logic from reporter to type. * all, metrics: pull in metrics package in go-ethereum * metrics/test: make sure metrics are enabled for tests * metrics: apply gosimple rules * metrics/exp, internal/debug: init expvar endpoint when starting pprof server * internal/debug: tiny comment formatting fix
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package metrics
 | |
| 
 | |
| import (
 | |
| 	"runtime/debug"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	debugMetrics struct {
 | |
| 		GCStats struct {
 | |
| 			LastGC Gauge
 | |
| 			NumGC  Gauge
 | |
| 			Pause  Histogram
 | |
| 			//PauseQuantiles Histogram
 | |
| 			PauseTotal Gauge
 | |
| 		}
 | |
| 		ReadGCStats Timer
 | |
| 	}
 | |
| 	gcStats debug.GCStats
 | |
| )
 | |
| 
 | |
| // Capture new values for the Go garbage collector statistics exported in
 | |
| // debug.GCStats.  This is designed to be called as a goroutine.
 | |
| func CaptureDebugGCStats(r Registry, d time.Duration) {
 | |
| 	for range time.Tick(d) {
 | |
| 		CaptureDebugGCStatsOnce(r)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Capture new values for the Go garbage collector statistics exported in
 | |
| // debug.GCStats.  This is designed to be called in a background goroutine.
 | |
| // Giving a registry which has not been given to RegisterDebugGCStats will
 | |
| // panic.
 | |
| //
 | |
| // Be careful (but much less so) with this because debug.ReadGCStats calls
 | |
| // the C function runtime·lock(runtime·mheap) which, while not a stop-the-world
 | |
| // operation, isn't something you want to be doing all the time.
 | |
| func CaptureDebugGCStatsOnce(r Registry) {
 | |
| 	lastGC := gcStats.LastGC
 | |
| 	t := time.Now()
 | |
| 	debug.ReadGCStats(&gcStats)
 | |
| 	debugMetrics.ReadGCStats.UpdateSince(t)
 | |
| 
 | |
| 	debugMetrics.GCStats.LastGC.Update(gcStats.LastGC.UnixNano())
 | |
| 	debugMetrics.GCStats.NumGC.Update(gcStats.NumGC)
 | |
| 	if lastGC != gcStats.LastGC && 0 < len(gcStats.Pause) {
 | |
| 		debugMetrics.GCStats.Pause.Update(int64(gcStats.Pause[0]))
 | |
| 	}
 | |
| 	//debugMetrics.GCStats.PauseQuantiles.Update(gcStats.PauseQuantiles)
 | |
| 	debugMetrics.GCStats.PauseTotal.Update(int64(gcStats.PauseTotal))
 | |
| }
 | |
| 
 | |
| // Register metrics for the Go garbage collector statistics exported in
 | |
| // debug.GCStats.  The metrics are named by their fully-qualified Go symbols,
 | |
| // i.e. debug.GCStats.PauseTotal.
 | |
| func RegisterDebugGCStats(r Registry) {
 | |
| 	debugMetrics.GCStats.LastGC = NewGauge()
 | |
| 	debugMetrics.GCStats.NumGC = NewGauge()
 | |
| 	debugMetrics.GCStats.Pause = NewHistogram(NewExpDecaySample(1028, 0.015))
 | |
| 	//debugMetrics.GCStats.PauseQuantiles = NewHistogram(NewExpDecaySample(1028, 0.015))
 | |
| 	debugMetrics.GCStats.PauseTotal = NewGauge()
 | |
| 	debugMetrics.ReadGCStats = NewTimer()
 | |
| 
 | |
| 	r.Register("debug.GCStats.LastGC", debugMetrics.GCStats.LastGC)
 | |
| 	r.Register("debug.GCStats.NumGC", debugMetrics.GCStats.NumGC)
 | |
| 	r.Register("debug.GCStats.Pause", debugMetrics.GCStats.Pause)
 | |
| 	//r.Register("debug.GCStats.PauseQuantiles", debugMetrics.GCStats.PauseQuantiles)
 | |
| 	r.Register("debug.GCStats.PauseTotal", debugMetrics.GCStats.PauseTotal)
 | |
| 	r.Register("debug.ReadGCStats", debugMetrics.ReadGCStats)
 | |
| }
 | |
| 
 | |
| // Allocate an initial slice for gcStats.Pause to avoid allocations during
 | |
| // normal operation.
 | |
| func init() {
 | |
| 	gcStats.Pause = make([]time.Duration, 11)
 | |
| }
 |