json.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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 metric := i.(type) {
  10. case Counter:
  11. values["count"] = metric.Count()
  12. case Gauge:
  13. values["value"] = metric.Value()
  14. case Healthcheck:
  15. metric.Check()
  16. values["error"] = metric.Error().Error()
  17. case Histogram:
  18. h := metric.Snapshot()
  19. ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  20. values["count"] = h.Count()
  21. values["min"] = h.Min()
  22. values["max"] = h.Max()
  23. values["mean"] = h.Mean()
  24. values["stddev"] = h.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. m := metric.Snapshot()
  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. t := metric.Snapshot()
  39. ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  40. values["count"] = t.Count()
  41. values["min"] = t.Min()
  42. values["max"] = t.Max()
  43. values["mean"] = t.Mean()
  44. values["stddev"] = t.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"] = t.Rate1()
  51. values["5m.rate"] = t.Rate5()
  52. values["15m.rate"] = t.Rate15()
  53. values["mean.rate"] = t.RateMean()
  54. }
  55. data[name] = values
  56. })
  57. return json.Marshal(data)
  58. }