json.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  21. values["count"] = m.Count()
  22. values["min"] = m.Min()
  23. values["max"] = m.Max()
  24. values["mean"] = m.Mean()
  25. values["stddev"] = m.StdDev()
  26. values["median"] = ps[0]
  27. values["75%%"] = ps[1]
  28. values["95%%"] = ps[2]
  29. values["99%%"] = ps[3]
  30. values["99.9%%"] = ps[4]
  31. case Meter:
  32. values["count"] = m.Count()
  33. values["1m.rate"] = m.Rate1()
  34. values["5m.rate"] = m.Rate5()
  35. values["15m.rate"] = m.Rate15()
  36. values["mean.rate"] = m.RateMean()
  37. case Timer:
  38. ps := m.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  39. values["count"] = m.Count()
  40. values["min"] = m.Min()
  41. values["max"] = m.Max()
  42. values["mean"] = m.Mean()
  43. values["stddev"] = m.StdDev()
  44. values["median"] = ps[0]
  45. values["75%%"] = ps[1]
  46. values["95%%"] = ps[2]
  47. values["99%%"] = ps[3]
  48. values["99.9%%"] = ps[4]
  49. values["1m.rate"] = m.Rate1()
  50. values["5m.rate"] = m.Rate5()
  51. values["15m.rate"] = m.Rate15()
  52. values["mean.rate"] = m.RateMean()
  53. }
  54. data[name] = values
  55. })
  56. return json.Marshal(data)
  57. }