registry.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package metrics
  2. import "sync"
  3. type Registry interface{
  4. EachCounter(func(string, Counter))
  5. EachGauge(func(string, Gauge))
  6. EachHealthcheck(func(string, Healthcheck))
  7. EachHistogram(func(string, Histogram))
  8. EachMeter(func(string, Meter))
  9. EachTimer(func(string, Timer))
  10. GetCounter(string) Counter
  11. GetGauge(string) Gauge
  12. GetHealthcheck(string) Healthcheck
  13. GetHistogram(string) Histogram
  14. GetMeter(string) Meter
  15. GetTimer(string) Timer
  16. RegisterCounter(string, Counter)
  17. RegisterGauge(string, Gauge)
  18. RegisterHealthcheck(string, Healthcheck)
  19. RegisterHistogram(string, Histogram)
  20. RegisterMeter(string, Meter)
  21. RegisterTimer(string, Timer)
  22. RunHealthchecks()
  23. UnregisterCounter(string)
  24. UnregisterGauge(string)
  25. UnregisterHealthcheck(string)
  26. UnregisterHistogram(string)
  27. UnregisterMeter(string)
  28. UnregisterTimer(string)
  29. }
  30. type registry struct {
  31. mutex *sync.Mutex
  32. counters map[string]Counter
  33. gauges map[string]Gauge
  34. healthchecks map[string]Healthcheck
  35. histograms map[string]Histogram
  36. meters map[string]Meter
  37. timers map[string]Timer
  38. }
  39. func NewRegistry() Registry {
  40. return &registry {
  41. &sync.Mutex{},
  42. make(map[string]Counter),
  43. make(map[string]Gauge),
  44. make(map[string]Healthcheck),
  45. make(map[string]Histogram),
  46. make(map[string]Meter),
  47. make(map[string]Timer),
  48. }
  49. }
  50. func (r *registry) EachCounter(f func(string, Counter)) {
  51. r.mutex.Lock()
  52. for name, c := range r.counters { f(name, c) }
  53. r.mutex.Unlock()
  54. }
  55. func (r *registry) EachGauge(f func(string, Gauge)) {
  56. r.mutex.Lock()
  57. for name, g := range r.gauges { f(name, g) }
  58. r.mutex.Unlock()
  59. }
  60. func (r *registry) EachHealthcheck(f func(string, Healthcheck)) {
  61. r.mutex.Lock()
  62. for name, h := range r.healthchecks { f(name, h) }
  63. r.mutex.Unlock()
  64. }
  65. func (r *registry) EachHistogram(f func(string, Histogram)) {
  66. r.mutex.Lock()
  67. for name, h := range r.histograms { f(name, h) }
  68. r.mutex.Unlock()
  69. }
  70. func (r *registry) EachMeter(f func(string, Meter)) {
  71. r.mutex.Lock()
  72. for name, m := range r.meters { f(name, m) }
  73. r.mutex.Unlock()
  74. }
  75. func (r *registry) EachTimer(f func(string, Timer)) {
  76. r.mutex.Lock()
  77. for name, t := range r.timers { f(name, t) }
  78. r.mutex.Unlock()
  79. }
  80. func (r *registry) RunHealthchecks() {
  81. r.mutex.Lock()
  82. for _, h := range r.healthchecks { h.Check() }
  83. r.mutex.Unlock()
  84. }
  85. func (r *registry) GetCounter(name string) Counter {
  86. r.mutex.Lock()
  87. c := r.counters[name]
  88. r.mutex.Unlock()
  89. return c
  90. }
  91. func (r *registry) GetGauge(name string) Gauge {
  92. r.mutex.Lock()
  93. g := r.gauges[name]
  94. r.mutex.Unlock()
  95. return g
  96. }
  97. func (r *registry) GetHealthcheck(name string) Healthcheck {
  98. r.mutex.Lock()
  99. h := r.healthchecks[name]
  100. r.mutex.Unlock()
  101. return h
  102. }
  103. func (r *registry) GetHistogram(name string) Histogram {
  104. r.mutex.Lock()
  105. h := r.histograms[name]
  106. r.mutex.Unlock()
  107. return h
  108. }
  109. func (r *registry) GetMeter(name string) Meter {
  110. r.mutex.Lock()
  111. m := r.meters[name]
  112. r.mutex.Unlock()
  113. return m
  114. }
  115. func (r *registry) GetTimer(name string) Timer {
  116. r.mutex.Lock()
  117. t := r.timers[name]
  118. r.mutex.Unlock()
  119. return t
  120. }
  121. func (r *registry) RegisterCounter(name string, c Counter) {
  122. r.mutex.Lock()
  123. r.counters[name] = c
  124. r.mutex.Unlock()
  125. }
  126. func (r *registry) RegisterGauge(name string, g Gauge) {
  127. r.mutex.Lock()
  128. r.gauges[name] = g
  129. r.mutex.Unlock()
  130. }
  131. func (r *registry) RegisterHealthcheck(name string, h Healthcheck) {
  132. r.mutex.Lock()
  133. r.healthchecks[name] = h
  134. r.mutex.Unlock()
  135. }
  136. func (r *registry) RegisterHistogram(name string, h Histogram) {
  137. r.mutex.Lock()
  138. r.histograms[name] = h
  139. r.mutex.Unlock()
  140. }
  141. func (r *registry) RegisterMeter(name string, m Meter) {
  142. r.mutex.Lock()
  143. r.meters[name] = m
  144. r.mutex.Unlock()
  145. }
  146. func (r *registry) RegisterTimer(name string, t Timer) {
  147. r.mutex.Lock()
  148. r.timers[name] = t
  149. r.mutex.Unlock()
  150. }
  151. func (r *registry) UnregisterCounter(name string) {
  152. r.mutex.Lock()
  153. r.counters[name] = nil, false
  154. r.mutex.Unlock()
  155. }
  156. func (r *registry) UnregisterGauge(name string) {
  157. r.mutex.Lock()
  158. r.gauges[name] = nil, false
  159. r.mutex.Unlock()
  160. }
  161. func (r *registry) UnregisterHealthcheck(name string) {
  162. r.mutex.Lock()
  163. r.healthchecks[name] = nil, false
  164. r.mutex.Unlock()
  165. }
  166. func (r *registry) UnregisterHistogram(name string) {
  167. r.mutex.Lock()
  168. r.histograms[name] = nil, false
  169. r.mutex.Unlock()
  170. }
  171. func (r *registry) UnregisterMeter(name string) {
  172. r.mutex.Lock()
  173. r.meters[name] = nil, false
  174. r.mutex.Unlock()
  175. }
  176. func (r *registry) UnregisterTimer(name string) {
  177. r.mutex.Lock()
  178. r.timers[name] = nil, false
  179. r.mutex.Unlock()
  180. }