metrics_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package metrics
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "sync"
  7. "testing"
  8. )
  9. const FANOUT = 128
  10. // Stop the compiler from complaining during debugging.
  11. var (
  12. _ = ioutil.Discard
  13. _ = log.LstdFlags
  14. )
  15. func BenchmarkMetrics(b *testing.B) {
  16. r := NewRegistry()
  17. c := NewRegisteredCounter("counter", r)
  18. g := NewRegisteredGauge("gauge", r)
  19. gf := NewRegisteredGaugeFloat64("gaugefloat64", r)
  20. h := NewRegisteredHistogram("histogram", r, NewUniformSample(100))
  21. m := NewRegisteredMeter("meter", r)
  22. t := NewRegisteredTimer("timer", r)
  23. RegisterDebugGCStats(r)
  24. RegisterRuntimeMemStats(r)
  25. b.ResetTimer()
  26. ch := make(chan bool)
  27. wgD := &sync.WaitGroup{}
  28. /*
  29. wgD.Add(1)
  30. go func() {
  31. defer wgD.Done()
  32. //log.Println("go CaptureDebugGCStats")
  33. for {
  34. select {
  35. case <-ch:
  36. //log.Println("done CaptureDebugGCStats")
  37. return
  38. default:
  39. CaptureDebugGCStatsOnce(r)
  40. }
  41. }
  42. }()
  43. //*/
  44. wgR := &sync.WaitGroup{}
  45. //*
  46. wgR.Add(1)
  47. go func() {
  48. defer wgR.Done()
  49. //log.Println("go CaptureRuntimeMemStats")
  50. for {
  51. select {
  52. case <-ch:
  53. //log.Println("done CaptureRuntimeMemStats")
  54. return
  55. default:
  56. CaptureRuntimeMemStatsOnce(r)
  57. }
  58. }
  59. }()
  60. //*/
  61. wgW := &sync.WaitGroup{}
  62. /*
  63. wgW.Add(1)
  64. go func() {
  65. defer wgW.Done()
  66. //log.Println("go Write")
  67. for {
  68. select {
  69. case <-ch:
  70. //log.Println("done Write")
  71. return
  72. default:
  73. WriteOnce(r, ioutil.Discard)
  74. }
  75. }
  76. }()
  77. //*/
  78. wg := &sync.WaitGroup{}
  79. wg.Add(FANOUT)
  80. for i := 0; i < FANOUT; i++ {
  81. go func(i int) {
  82. defer wg.Done()
  83. //log.Println("go", i)
  84. for i := 0; i < b.N; i++ {
  85. c.Inc(1)
  86. g.Update(int64(i))
  87. gf.Update(float64(i))
  88. h.Update(int64(i))
  89. m.Mark(1)
  90. t.Update(1)
  91. }
  92. //log.Println("done", i)
  93. }(i)
  94. }
  95. wg.Wait()
  96. close(ch)
  97. wgD.Wait()
  98. wgR.Wait()
  99. wgW.Wait()
  100. }
  101. func Example() {
  102. c := NewCounter()
  103. Register("money", c)
  104. c.Inc(17)
  105. // Threadsafe registration
  106. t := GetOrRegisterTimer("db.get.latency", nil)
  107. t.Time(func() {})
  108. t.Update(1)
  109. fmt.Println(c.Count())
  110. fmt.Println(t.Min())
  111. // Output: 17
  112. // 1
  113. }