runtime.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package metrics
  2. import (
  3. "runtime"
  4. "time"
  5. )
  6. var (
  7. memStats runtime.MemStats
  8. runtimeMetrics struct {
  9. MemStats struct {
  10. Alloc Gauge
  11. BuckHashSys Gauge
  12. DebugGC Gauge
  13. EnableGC Gauge
  14. Frees Gauge
  15. HeapAlloc Gauge
  16. HeapIdle Gauge
  17. HeapInuse Gauge
  18. HeapObjects Gauge
  19. HeapReleased Gauge
  20. HeapSys Gauge
  21. LastGC Gauge
  22. Lookups Gauge
  23. Mallocs Gauge
  24. MCacheInuse Gauge
  25. MCacheSys Gauge
  26. MSpanInuse Gauge
  27. MSpanSys Gauge
  28. NextGC Gauge
  29. NumGC Gauge
  30. PauseNs Histogram
  31. PauseTotalNs Gauge
  32. StackInuse Gauge
  33. StackSys Gauge
  34. Sys Gauge
  35. TotalAlloc Gauge
  36. }
  37. NumCgoCall Gauge
  38. NumGoroutine Gauge
  39. ReadMemStats Timer
  40. }
  41. numGC uint32
  42. )
  43. // Capture new values for the Go runtime statistics exported in
  44. // runtime.MemStats. This is designed to be called as a goroutine.
  45. func CaptureRuntimeMemStats(r Registry, d time.Duration) {
  46. for {
  47. CaptureRuntimeMemStatsOnce(r)
  48. time.Sleep(d)
  49. }
  50. }
  51. // Capture new values for the Go runtime statistics exported in
  52. // runtime.MemStats. This is designed to be called in a background
  53. // goroutine. Giving a registry which has not been given to
  54. // RegisterRuntimeMemStats will panic.
  55. func CaptureRuntimeMemStatsOnce(r Registry) {
  56. t := time.Now()
  57. runtime.ReadMemStats(&memStats) // This takes 50-200us.
  58. runtimeMetrics.ReadMemStats.UpdateSince(t)
  59. runtimeMetrics.MemStats.Alloc.Update(int64(memStats.Alloc))
  60. runtimeMetrics.MemStats.BuckHashSys.Update(int64(memStats.BuckHashSys))
  61. if memStats.DebugGC {
  62. runtimeMetrics.MemStats.DebugGC.Update(1)
  63. } else {
  64. runtimeMetrics.MemStats.DebugGC.Update(0)
  65. }
  66. if memStats.EnableGC {
  67. runtimeMetrics.MemStats.EnableGC.Update(1)
  68. } else {
  69. runtimeMetrics.MemStats.EnableGC.Update(0)
  70. }
  71. runtimeMetrics.MemStats.Frees.Update(int64(memStats.Frees))
  72. runtimeMetrics.MemStats.HeapAlloc.Update(int64(memStats.HeapAlloc))
  73. runtimeMetrics.MemStats.HeapIdle.Update(int64(memStats.HeapIdle))
  74. runtimeMetrics.MemStats.HeapInuse.Update(int64(memStats.HeapInuse))
  75. runtimeMetrics.MemStats.HeapObjects.Update(int64(memStats.HeapObjects))
  76. runtimeMetrics.MemStats.HeapReleased.Update(int64(memStats.HeapReleased))
  77. runtimeMetrics.MemStats.HeapSys.Update(int64(memStats.HeapSys))
  78. runtimeMetrics.MemStats.LastGC.Update(int64(memStats.LastGC))
  79. runtimeMetrics.MemStats.Lookups.Update(int64(memStats.Lookups))
  80. runtimeMetrics.MemStats.Mallocs.Update(int64(memStats.Mallocs))
  81. runtimeMetrics.MemStats.MCacheInuse.Update(int64(memStats.MCacheInuse))
  82. runtimeMetrics.MemStats.MCacheSys.Update(int64(memStats.MCacheSys))
  83. runtimeMetrics.MemStats.MSpanInuse.Update(int64(memStats.MSpanInuse))
  84. runtimeMetrics.MemStats.MSpanSys.Update(int64(memStats.MSpanSys))
  85. runtimeMetrics.MemStats.NextGC.Update(int64(memStats.NextGC))
  86. runtimeMetrics.MemStats.NumGC.Update(int64(memStats.NumGC))
  87. for i := uint32(1); i <= memStats.NumGC-numGC; i++ {
  88. runtimeMetrics.MemStats.PauseNs.Update(int64(memStats.PauseNs[(memStats.NumGC%256-i)%256])) // <https://code.google.com/p/go/source/browse/src/pkg/runtime/mgc0.c>
  89. }
  90. runtimeMetrics.MemStats.PauseTotalNs.Update(int64(memStats.PauseTotalNs))
  91. runtimeMetrics.MemStats.StackInuse.Update(int64(memStats.StackInuse))
  92. runtimeMetrics.MemStats.StackSys.Update(int64(memStats.StackSys))
  93. runtimeMetrics.MemStats.Sys.Update(int64(memStats.Sys))
  94. runtimeMetrics.MemStats.TotalAlloc.Update(int64(memStats.TotalAlloc))
  95. runtimeMetrics.NumCgoCall.Update(int64(runtime.NumCgoCall()))
  96. runtimeMetrics.NumGoroutine.Update(int64(runtime.NumGoroutine()))
  97. }
  98. // Register runtimeMetrics for the Go runtime statistics exported in runtime and
  99. // specifically runtime.MemStats. The runtimeMetrics are named by their
  100. // fully-qualified Go symbols, i.e. runtime.MemStats.Alloc.
  101. func RegisterRuntimeMemStats(r Registry) {
  102. runtimeMetrics.MemStats.Alloc = NewGauge()
  103. runtimeMetrics.MemStats.BuckHashSys = NewGauge()
  104. runtimeMetrics.MemStats.DebugGC = NewGauge()
  105. runtimeMetrics.MemStats.EnableGC = NewGauge()
  106. runtimeMetrics.MemStats.Frees = NewGauge()
  107. runtimeMetrics.MemStats.HeapAlloc = NewGauge()
  108. runtimeMetrics.MemStats.HeapIdle = NewGauge()
  109. runtimeMetrics.MemStats.HeapInuse = NewGauge()
  110. runtimeMetrics.MemStats.HeapObjects = NewGauge()
  111. runtimeMetrics.MemStats.HeapReleased = NewGauge()
  112. runtimeMetrics.MemStats.HeapSys = NewGauge()
  113. runtimeMetrics.MemStats.LastGC = NewGauge()
  114. runtimeMetrics.MemStats.Lookups = NewGauge()
  115. runtimeMetrics.MemStats.Mallocs = NewGauge()
  116. runtimeMetrics.MemStats.MCacheInuse = NewGauge()
  117. runtimeMetrics.MemStats.MCacheSys = NewGauge()
  118. runtimeMetrics.MemStats.MSpanInuse = NewGauge()
  119. runtimeMetrics.MemStats.MSpanSys = NewGauge()
  120. runtimeMetrics.MemStats.NextGC = NewGauge()
  121. runtimeMetrics.MemStats.NumGC = NewGauge()
  122. runtimeMetrics.MemStats.PauseNs = NewHistogram(NewExpDecaySample(1028, 0.015))
  123. runtimeMetrics.MemStats.PauseTotalNs = NewGauge()
  124. runtimeMetrics.MemStats.StackInuse = NewGauge()
  125. runtimeMetrics.MemStats.StackSys = NewGauge()
  126. runtimeMetrics.MemStats.Sys = NewGauge()
  127. runtimeMetrics.MemStats.TotalAlloc = NewGauge()
  128. runtimeMetrics.NumCgoCall = NewGauge()
  129. runtimeMetrics.NumGoroutine = NewGauge()
  130. runtimeMetrics.ReadMemStats = NewTimer()
  131. r.Register("runtime.MemStats.Alloc", runtimeMetrics.MemStats.Alloc)
  132. r.Register("runtime.MemStats.BuckHashSys", runtimeMetrics.MemStats.BuckHashSys)
  133. r.Register("runtime.MemStats.DebugGC", runtimeMetrics.MemStats.DebugGC)
  134. r.Register("runtime.MemStats.EnableGC", runtimeMetrics.MemStats.EnableGC)
  135. r.Register("runtime.MemStats.Frees", runtimeMetrics.MemStats.Frees)
  136. r.Register("runtime.MemStats.HeapAlloc", runtimeMetrics.MemStats.HeapAlloc)
  137. r.Register("runtime.MemStats.HeapIdle", runtimeMetrics.MemStats.HeapIdle)
  138. r.Register("runtime.MemStats.HeapInuse", runtimeMetrics.MemStats.HeapInuse)
  139. r.Register("runtime.MemStats.HeapObjects", runtimeMetrics.MemStats.HeapObjects)
  140. r.Register("runtime.MemStats.HeapReleased", runtimeMetrics.MemStats.HeapReleased)
  141. r.Register("runtime.MemStats.HeapSys", runtimeMetrics.MemStats.HeapSys)
  142. r.Register("runtime.MemStats.LastGC", runtimeMetrics.MemStats.LastGC)
  143. r.Register("runtime.MemStats.Lookups", runtimeMetrics.MemStats.Lookups)
  144. r.Register("runtime.MemStats.Mallocs", runtimeMetrics.MemStats.Mallocs)
  145. r.Register("runtime.MemStats.MCacheInuse", runtimeMetrics.MemStats.MCacheInuse)
  146. r.Register("runtime.MemStats.MCacheSys", runtimeMetrics.MemStats.MCacheSys)
  147. r.Register("runtime.MemStats.MSpanInuse", runtimeMetrics.MemStats.MSpanInuse)
  148. r.Register("runtime.MemStats.MSpanSys", runtimeMetrics.MemStats.MSpanSys)
  149. r.Register("runtime.MemStats.NextGC", runtimeMetrics.MemStats.NextGC)
  150. r.Register("runtime.MemStats.NumGC", runtimeMetrics.MemStats.NumGC)
  151. r.Register("runtime.MemStats.PauseNs", runtimeMetrics.MemStats.PauseNs)
  152. r.Register("runtime.MemStats.PauseTotalNs", runtimeMetrics.MemStats.PauseTotalNs)
  153. r.Register("runtime.MemStats.StackInuse", runtimeMetrics.MemStats.StackInuse)
  154. r.Register("runtime.MemStats.StackSys", runtimeMetrics.MemStats.StackSys)
  155. r.Register("runtime.MemStats.Sys", runtimeMetrics.MemStats.Sys)
  156. r.Register("runtime.MemStats.TotalAlloc", runtimeMetrics.MemStats.TotalAlloc)
  157. r.Register("runtime.NumCgoCall", runtimeMetrics.NumCgoCall)
  158. r.Register("runtime.NumGoroutine", runtimeMetrics.NumGoroutine)
  159. r.Register("runtime.ReadMemStats", runtimeMetrics.ReadMemStats)
  160. }