json.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package metrics
  2. import (
  3. "encoding/json"
  4. "io"
  5. )
  6. // MarshalJSON returns a byte slice containing a JSON representation of all
  7. // the metrics in the Registry.
  8. func (r StandardRegistry) MarshalJSON() ([]byte, error) {
  9. data := make(map[string]map[string]interface{})
  10. r.Each(func(name string, i interface{}) {
  11. values := make(map[string]interface{})
  12. switch metric := i.(type) {
  13. case Counter:
  14. values["count"] = metric.Count()
  15. case Gauge:
  16. values["value"] = metric.Value()
  17. case GaugeFloat64:
  18. values["value"] = metric.Value()
  19. case Healthcheck:
  20. values["error"] = nil
  21. metric.Check()
  22. if err := metric.Error(); nil != err {
  23. values["error"] = metric.Error().Error()
  24. }
  25. case Histogram:
  26. h := metric.Snapshot()
  27. ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  28. values["count"] = h.Count()
  29. values["min"] = h.Min()
  30. values["max"] = h.Max()
  31. values["mean"] = h.Mean()
  32. values["stddev"] = h.StdDev()
  33. values["median"] = ps[0]
  34. values["75%"] = ps[1]
  35. values["95%"] = ps[2]
  36. values["99%"] = ps[3]
  37. values["99.9%"] = ps[4]
  38. case Meter:
  39. m := metric.Snapshot()
  40. values["count"] = m.Count()
  41. values["1m.rate"] = m.Rate1()
  42. values["5m.rate"] = m.Rate5()
  43. values["15m.rate"] = m.Rate15()
  44. values["mean.rate"] = m.RateMean()
  45. case Timer:
  46. t := metric.Snapshot()
  47. ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  48. values["count"] = t.Count()
  49. values["min"] = t.Min()
  50. values["max"] = t.Max()
  51. values["mean"] = t.Mean()
  52. values["stddev"] = t.StdDev()
  53. values["median"] = ps[0]
  54. values["75%"] = ps[1]
  55. values["95%"] = ps[2]
  56. values["99%"] = ps[3]
  57. values["99.9%"] = ps[4]
  58. values["1m.rate"] = t.Rate1()
  59. values["5m.rate"] = t.Rate5()
  60. values["15m.rate"] = t.Rate15()
  61. values["mean.rate"] = t.RateMean()
  62. }
  63. data[name] = values
  64. })
  65. return json.Marshal(data)
  66. }
  67. // WriteJSONOnce outputs metrics from the given registry to the specified writer in JSON format
  68. func WriteJSONOnce(r Registry, w io.Writer) {
  69. data := make(map[string]map[string]interface{})
  70. r.Each(func(name string, i interface{}) {
  71. values := make(map[string]interface{})
  72. switch metric := i.(type) {
  73. case Counter:
  74. values["count"] = metric.Count()
  75. case Gauge:
  76. values["value"] = metric.Value()
  77. case GaugeFloat64:
  78. values["value"] = metric.Value()
  79. case Healthcheck:
  80. values["error"] = nil
  81. metric.Check()
  82. if err := metric.Error(); nil != err {
  83. values["error"] = metric.Error().Error()
  84. }
  85. case Histogram:
  86. h := metric.Snapshot()
  87. ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  88. values["count"] = h.Count()
  89. values["min"] = h.Min()
  90. values["max"] = h.Max()
  91. values["mean"] = h.Mean()
  92. values["stddev"] = h.StdDev()
  93. values["median"] = ps[0]
  94. values["75%"] = ps[1]
  95. values["95%"] = ps[2]
  96. values["99%"] = ps[3]
  97. values["99.9%"] = ps[4]
  98. case Meter:
  99. m := metric.Snapshot()
  100. values["count"] = m.Count()
  101. values["1m.rate"] = m.Rate1()
  102. values["5m.rate"] = m.Rate5()
  103. values["15m.rate"] = m.Rate15()
  104. values["mean.rate"] = m.RateMean()
  105. case Timer:
  106. t := metric.Snapshot()
  107. ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
  108. values["count"] = t.Count()
  109. values["min"] = t.Min()
  110. values["max"] = t.Max()
  111. values["mean"] = t.Mean()
  112. values["stddev"] = t.StdDev()
  113. values["median"] = ps[0]
  114. values["75%"] = ps[1]
  115. values["95%"] = ps[2]
  116. values["99%"] = ps[3]
  117. values["99.9%"] = ps[4]
  118. values["1m.rate"] = t.Rate1()
  119. values["5m.rate"] = t.Rate5()
  120. values["15m.rate"] = t.Rate15()
  121. values["mean.rate"] = t.RateMean()
  122. }
  123. data[name] = values
  124. })
  125. enc := json.NewEncoder(w)
  126. enc.Encode(data)
  127. }