json.go 1.6 KB

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