You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.3 KiB
87 lines
2.3 KiB
package metrics |
|
|
|
import ( |
|
"encoding/json" |
|
"io" |
|
"time" |
|
) |
|
|
|
// MarshalJSON returns a byte slice containing a JSON representation of all |
|
// the metrics in the Registry. |
|
func (r *StandardRegistry) MarshalJSON() ([]byte, error) { |
|
data := make(map[string]map[string]interface{}) |
|
r.Each(func(name string, i interface{}) { |
|
values := make(map[string]interface{}) |
|
switch metric := i.(type) { |
|
case Counter: |
|
values["count"] = metric.Count() |
|
case Gauge: |
|
values["value"] = metric.Value() |
|
case GaugeFloat64: |
|
values["value"] = metric.Value() |
|
case Healthcheck: |
|
values["error"] = nil |
|
metric.Check() |
|
if err := metric.Error(); nil != err { |
|
values["error"] = metric.Error().Error() |
|
} |
|
case Histogram: |
|
h := metric.Snapshot() |
|
ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) |
|
values["count"] = h.Count() |
|
values["min"] = h.Min() |
|
values["max"] = h.Max() |
|
values["mean"] = h.Mean() |
|
values["stddev"] = h.StdDev() |
|
values["median"] = ps[0] |
|
values["75%"] = ps[1] |
|
values["95%"] = ps[2] |
|
values["99%"] = ps[3] |
|
values["99.9%"] = ps[4] |
|
case Meter: |
|
m := metric.Snapshot() |
|
values["count"] = m.Count() |
|
values["1m.rate"] = m.Rate1() |
|
values["5m.rate"] = m.Rate5() |
|
values["15m.rate"] = m.Rate15() |
|
values["mean.rate"] = m.RateMean() |
|
case Timer: |
|
t := metric.Snapshot() |
|
ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) |
|
values["count"] = t.Count() |
|
values["min"] = t.Min() |
|
values["max"] = t.Max() |
|
values["mean"] = t.Mean() |
|
values["stddev"] = t.StdDev() |
|
values["median"] = ps[0] |
|
values["75%"] = ps[1] |
|
values["95%"] = ps[2] |
|
values["99%"] = ps[3] |
|
values["99.9%"] = ps[4] |
|
values["1m.rate"] = t.Rate1() |
|
values["5m.rate"] = t.Rate5() |
|
values["15m.rate"] = t.Rate15() |
|
values["mean.rate"] = t.RateMean() |
|
} |
|
data[name] = values |
|
}) |
|
return json.Marshal(data) |
|
} |
|
|
|
// WriteJSON writes metrics from the given registry periodically to the |
|
// specified io.Writer as JSON. |
|
func WriteJSON(r Registry, d time.Duration, w io.Writer) { |
|
for _ = range time.Tick(d) { |
|
WriteJSONOnce(r, w) |
|
} |
|
} |
|
|
|
// WriteJSONOnce writes metrics from the given registry to the specified |
|
// io.Writer as JSON. |
|
func WriteJSONOnce(r Registry, w io.Writer) { |
|
json.NewEncoder(w).Encode(r) |
|
} |
|
|
|
func (p *PrefixedRegistry) MarshalJSON() ([]byte, error) { |
|
return json.Marshal(p.underlying) |
|
}
|
|
|