metrics.go 1017 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package server
  2. import (
  3. "runtime"
  4. "time"
  5. metrics "github.com/rcrowley/go-metrics"
  6. )
  7. // todo: make this not have global variables ...
  8. type ServerMetrics struct {
  9. qCounter metrics.Meter
  10. lastQueryCount int64
  11. queriesHistogram metrics.Histogram
  12. goroutines metrics.Gauge
  13. }
  14. func NewMetrics() *ServerMetrics {
  15. m := new(ServerMetrics)
  16. m.qCounter = metrics.GetOrRegisterMeter("queries", nil)
  17. m.lastQueryCount = m.qCounter.Count()
  18. m.queriesHistogram = metrics.GetOrRegisterHistogram(
  19. "queries-histogram", nil,
  20. metrics.NewExpDecaySample(600, 0.015),
  21. )
  22. m.goroutines = metrics.GetOrRegisterGauge("goroutines", nil)
  23. return m
  24. }
  25. func (m *ServerMetrics) Updater() {
  26. for {
  27. time.Sleep(1 * time.Second)
  28. // Make sure go-metrics get some input to update the rate
  29. m.qCounter.Mark(0)
  30. current := m.qCounter.Count()
  31. newQueries := current - m.lastQueryCount
  32. m.lastQueryCount = current
  33. m.queriesHistogram.Update(newQueries)
  34. m.goroutines.Update(int64(runtime.NumGoroutine()))
  35. }
  36. }