metrics.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package main
  2. import (
  3. metrics "github.com/abh/go-metrics"
  4. "log"
  5. "os"
  6. "runtime"
  7. "time"
  8. )
  9. var qCounter = metrics.NewMeter()
  10. type ServerMetrics struct {
  11. lastQueryCount int64
  12. queriesHistogram *metrics.StandardHistogram
  13. queriesHistogramRecent *metrics.StandardHistogram
  14. goroutines *metrics.StandardGauge
  15. }
  16. func NewMetrics() *ServerMetrics {
  17. m := new(ServerMetrics)
  18. m.lastQueryCount = qCounter.Count()
  19. metrics.Register("queries", qCounter)
  20. m.queriesHistogram = metrics.NewHistogram(metrics.NewUniformSample(1800))
  21. metrics.Register("queries-histogram", m.queriesHistogram)
  22. m.queriesHistogramRecent = metrics.NewHistogram(metrics.NewExpDecaySample(600, 0.015))
  23. metrics.Register("queries-histogram-recent", m.queriesHistogramRecent)
  24. m.goroutines = metrics.NewGauge()
  25. metrics.Register("goroutines", m.goroutines)
  26. return m
  27. }
  28. func (m *ServerMetrics) Updater() {
  29. go func() {
  30. time.Sleep(2 * time.Second)
  31. metrics.Log(metrics.DefaultRegistry, 30, log.New(os.Stderr, "metrics: ", log.Lmicroseconds))
  32. }()
  33. for {
  34. time.Sleep(1 * time.Second)
  35. // Make sure go-metrics get some input to update the rate
  36. qCounter.Mark(0)
  37. current := qCounter.Count()
  38. newQueries := current - m.lastQueryCount
  39. m.lastQueryCount = current
  40. m.queriesHistogram.Update(newQueries)
  41. m.queriesHistogramRecent.Update(newQueries)
  42. m.goroutines.Update(int64(runtime.NumGoroutine()))
  43. }
  44. }