json.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package metrics
  2. import (
  3. "encoding/json"
  4. )
  5. // MarshalJSON returns a byte slice containing a JSON representation of all
  6. // the metrics in the Registry.
  7. func (r StandardRegistry) MarshalJSON() ([]byte, error) {
  8. data := make(map[string]map[string]interface{})
  9. r.Each(func(name string, i interface{}) {
  10. values := make(map[string]interface{})
  11. switch m := i.(type) {
  12. case Counter:
  13. values["count"] = m.Count()
  14. case Gauge:
  15. values["value"] = m.Value()
  16. case Healthcheck:
  17. m.Check()
  18. values["error"] = m.Error()
  19. case Histogram:
  20. s := m.Sample()
  21. ps := s.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  22. values["count"] = s.Count()
  23. values["min"] = s.Min()
  24. values["max"] = s.Max()
  25. values["mean"] = s.Mean()
  26. values["stddev"] = s.StdDev()
  27. values["median"] = ps[0]
  28. values["75%%"] = ps[1]
  29. values["95%%"] = ps[2]
  30. values["99%%"] = ps[3]
  31. values["99.9%%"] = ps[4]
  32. case Meter:
  33. values["count"] = m.Count()
  34. values["1m.rate"] = m.Rate1()
  35. values["5m.rate"] = m.Rate5()
  36. values["15m.rate"] = m.Rate15()
  37. values["mean.rate"] = m.RateMean()
  38. case Timer:
  39. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  40. values["count"] = m.Count()
  41. values["min"] = m.Min()
  42. values["max"] = m.Max()
  43. values["mean"] = m.Mean()
  44. values["stddev"] = m.StdDev()
  45. values["median"] = ps[0]
  46. values["75%%"] = ps[1]
  47. values["95%%"] = ps[2]
  48. values["99%%"] = ps[3]
  49. values["99.9%%"] = ps[4]
  50. values["1m.rate"] = m.Rate1()
  51. values["5m.rate"] = m.Rate5()
  52. values["15m.rate"] = m.Rate15()
  53. values["mean.rate"] = m.RateMean()
  54. }
  55. data[name] = values
  56. })
  57. return json.Marshal(data)
  58. }