metrics_test.go 2.1 KB

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