Browse Source

Register runtime.MemStats metrics.

Richard Crowley 14 years ago
parent
commit
2e75e03390
3 changed files with 123 additions and 0 deletions
  1. 1 0
      Makefile
  2. 6 0
      cmd/metrics-example/metrics-example.go
  3. 116 0
      runtime.go

+ 1 - 0
Makefile

@@ -11,6 +11,7 @@ GOFILES=\
 	meter.go\
 	meter.go\
 	metrics.go\
 	metrics.go\
 	registry.go\
 	registry.go\
+	runtime.go\
 	sample.go\
 	sample.go\
 	syslog.go\
 	syslog.go\
 	timer.go\
 	timer.go\

+ 6 - 0
cmd/metrics-example/metrics-example.go

@@ -109,6 +109,12 @@ func main() {
 		}()
 		}()
 	}
 	}
 
 
+	metrics.RegisterRuntimeMemStats(r)
+	go func() {
+		t := time.NewTicker(5e9)
+		for 0 < <-t.C { metrics.CaptureRuntimeMemStats(r, true) }
+	}()
+
 	metrics.Log(r, 60, log.New(os.Stderr, "metrics: ", log.Lmicroseconds))
 	metrics.Log(r, 60, log.New(os.Stderr, "metrics: ", log.Lmicroseconds))
 
 
 /*
 /*

+ 116 - 0
runtime.go

@@ -0,0 +1,116 @@
+package metrics
+
+import "runtime"
+
+// Register metrics for the Go runtime statistics exported in
+// runtime.MemStats.  The metrics are named by their fully-qualified
+// Go symbols, i.e. runtime.MemStatsAlloc.  In addition to
+// runtime.MemStats, register the return value of runtime.Goroutines()
+// as runtime.Goroutines.
+func RegisterRuntimeMemStats(r Registry) {
+
+	r.RegisterGauge("runtime.Goroutines", NewGauge())
+
+	r.RegisterGauge("runtime.MemStats.Alloc", NewGauge())
+	r.RegisterGauge("runtime.MemStats.TotalAlloc", NewGauge())
+	r.RegisterGauge("runtime.MemStats.Sys", NewGauge())
+	r.RegisterGauge("runtime.MemStats.Lookups", NewGauge())
+	r.RegisterGauge("runtime.MemStats.Mallocs", NewGauge())
+	r.RegisterGauge("runtime.MemStats.Frees", NewGauge())
+
+	r.RegisterGauge("runtime.MemStats.HeapAlloc", NewGauge())
+	r.RegisterGauge("runtime.MemStats.HeapSys", NewGauge())
+	r.RegisterGauge("runtime.MemStats.HeapIdle", NewGauge())
+	r.RegisterGauge("runtime.MemStats.HeapInuse", NewGauge())
+	r.RegisterGauge("runtime.MemStats.HeapObjects", NewGauge())
+
+	r.RegisterGauge("runtime.MemStats.StackInuse", NewGauge())
+	r.RegisterGauge("runtime.MemStats.StackSys", NewGauge())
+	r.RegisterGauge("runtime.MemStats.MSpanInuse", NewGauge())
+	r.RegisterGauge("runtime.MemStats.MSpanSys", NewGauge())
+	r.RegisterGauge("runtime.MemStats.MCacheInuse", NewGauge())
+	r.RegisterGauge("runtime.MemStats.MCacheSys", NewGauge())
+	r.RegisterGauge("runtime.MemStats.BuckHashSys", NewGauge())
+
+	r.RegisterGauge("runtime.MemStats.NextGC", NewGauge())
+	r.RegisterGauge("runtime.MemStats.PauseTotalNs", NewGauge())
+	r.RegisterHistogram("runtime.MemStats.PauseNs",
+		NewHistogram(NewExpDecaySample(1028, 0.015)))
+	r.RegisterGauge("runtime.MemStats.NumGC", NewGauge())
+	r.RegisterGauge("runtime.MemStats.EnableGC", NewGauge())
+	r.RegisterGauge("runtime.MemStats.DebugGC", NewGauge())
+
+}
+
+// Capture new values for the Go runtime statistics exported in
+// runtime.MemStats.  This is designed to be called in a background
+// goroutine.  Giving a registry which has not been given to
+// RegisterRuntimeMemStats will panic.  If the second parameter is
+// false, the counters will be left to the lazy updates provided by
+// the runtime.
+func CaptureRuntimeMemStats(r Registry, updateMemStats bool) {
+	if updateMemStats {
+		runtime.UpdateMemStats()
+	}
+
+	r.GetGauge("runtime.Goroutines").Update(int64(runtime.Goroutines()))
+
+	r.GetGauge("runtime.MemStats.Alloc").Update(
+		int64(runtime.MemStats.Alloc))
+	r.GetGauge("runtime.MemStats.TotalAlloc").Update(
+		int64(runtime.MemStats.TotalAlloc))
+	r.GetGauge("runtime.MemStats.Sys").Update(
+		int64(runtime.MemStats.Sys))
+	r.GetGauge("runtime.MemStats.Lookups").Update(
+		int64(runtime.MemStats.Lookups))
+	r.GetGauge("runtime.MemStats.Mallocs").Update(
+		int64(runtime.MemStats.Mallocs))
+	r.GetGauge("runtime.MemStats.Frees").Update(
+		int64(runtime.MemStats.Frees))
+
+	r.GetGauge("runtime.MemStats.HeapAlloc").Update(
+		int64(runtime.MemStats.HeapAlloc))
+	r.GetGauge("runtime.MemStats.HeapSys").Update(
+		int64(runtime.MemStats.HeapSys))
+	r.GetGauge("runtime.MemStats.HeapIdle").Update(
+		int64(runtime.MemStats.HeapIdle))
+	r.GetGauge("runtime.MemStats.HeapInuse").Update(
+		int64(runtime.MemStats.HeapInuse))
+	r.GetGauge("runtime.MemStats.HeapObjects").Update(
+		int64(runtime.MemStats.HeapObjects))
+
+	r.GetGauge("runtime.MemStats.StackInuse").Update(
+		int64(runtime.MemStats.StackInuse))
+	r.GetGauge("runtime.MemStats.StackSys").Update(
+		int64(runtime.MemStats.StackSys))
+	r.GetGauge("runtime.MemStats.MSpanInuse").Update(
+		int64(runtime.MemStats.MSpanInuse))
+	r.GetGauge("runtime.MemStats.MSpanSys").Update(
+		int64(runtime.MemStats.MSpanSys))
+	r.GetGauge("runtime.MemStats.MCacheInuse").Update(
+		int64(runtime.MemStats.MCacheInuse))
+	r.GetGauge("runtime.MemStats.MCacheSys").Update(
+		int64(runtime.MemStats.MCacheSys))
+	r.GetGauge("runtime.MemStats.BuckHashSys").Update(
+		int64(runtime.MemStats.BuckHashSys))
+
+	r.GetGauge("runtime.MemStats.NextGC").Update(
+		int64(runtime.MemStats.NextGC))
+	r.GetGauge("runtime.MemStats.PauseTotalNs").Update(
+		int64(runtime.MemStats.PauseTotalNs))
+	r.GetHistogram("runtime.MemStats.PauseNs").Update(
+		int64(runtime.MemStats.PauseNs[0]))
+	r.GetGauge("runtime.MemStats.NumGC").Update(
+		int64(runtime.MemStats.NumGC))
+	if runtime.MemStats.EnableGC {
+		r.GetGauge("runtime.MemStats.EnableGC").Update(1)
+	} else {
+		r.GetGauge("runtime.MemStats.EnableGC").Update(0)
+	}
+	if runtime.MemStats.EnableGC {
+		r.GetGauge("runtime.MemStats.DebugGC").Update(1)
+	} else {
+		r.GetGauge("runtime.MemStats.DebugGC").Update(0)
+	}
+
+}