metrics.go 1.1 KB

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