From 88339c37597b748c69e137706a6f58231000578c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 11 Apr 2019 12:31:08 +0300 Subject: [PATCH] metrics/prometheus: minor typo cleanups, sorted report --- metrics/prometheus/collector.go | 22 +++++++++++----------- metrics/prometheus/prometheus.go | 19 ++++++++++++++----- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/metrics/prometheus/collector.go b/metrics/prometheus/collector.go index 73907e2e57..8350fa2aaf 100644 --- a/metrics/prometheus/collector.go +++ b/metrics/prometheus/collector.go @@ -26,11 +26,11 @@ import ( ) var ( - typeGuageTpl = "# TYPE %s gauge\n" + typeGaugeTpl = "# TYPE %s gauge\n" typeCounterTpl = "# TYPE %s counter\n" typeSummaryTpl = "# TYPE %s summary\n" - keyValueTpl = "%s %v\n" - keyQuantileTagValueTpl = "%s {quantile=\"%s\"} %v\n" + keyValueTpl = "%s %v\n\n" + keyQuantileTagValueTpl = "%s {quantile=\"%s\"} %v\n\n" ) // collector is a collection of byte buffers that aggregate Prometheus reports @@ -47,15 +47,15 @@ func newCollector() *collector { } func (c *collector) addCounter(name string, m metrics.Counter) { - c.writeGuageCounter(name, m.Count()) + c.writeGaugeCounter(name, m.Count()) } -func (c *collector) addGuage(name string, m metrics.Gauge) { - c.writeGuageCounter(name, m.Value()) +func (c *collector) addGauge(name string, m metrics.Gauge) { + c.writeGaugeCounter(name, m.Value()) } -func (c *collector) addGuageFloat64(name string, m metrics.GaugeFloat64) { - c.writeGuageCounter(name, m.Value()) +func (c *collector) addGaugeFloat64(name string, m metrics.GaugeFloat64) { + c.writeGaugeCounter(name, m.Value()) } func (c *collector) addHistogram(name string, m metrics.Histogram) { @@ -68,7 +68,7 @@ func (c *collector) addHistogram(name string, m metrics.Histogram) { } func (c *collector) addMeter(name string, m metrics.Meter) { - c.writeGuageCounter(name, m.Count()) + c.writeGaugeCounter(name, m.Count()) } func (c *collector) addTimer(name string, m metrics.Timer) { @@ -92,9 +92,9 @@ func (c *collector) addResettingTimer(name string, m metrics.ResettingTimer) { c.writeSummaryPercentile(name, "0.99", ps[2]) } -func (c *collector) writeGuageCounter(name string, value interface{}) { +func (c *collector) writeGaugeCounter(name string, value interface{}) { name = mutateKey(name) - c.buff.WriteString(fmt.Sprintf(typeGuageTpl, name)) + c.buff.WriteString(fmt.Sprintf(typeGaugeTpl, name)) c.buff.WriteString(fmt.Sprintf(keyValueTpl, name, value)) } diff --git a/metrics/prometheus/prometheus.go b/metrics/prometheus/prometheus.go index 0ee7511a18..9ad5ec7e99 100644 --- a/metrics/prometheus/prometheus.go +++ b/metrics/prometheus/prometheus.go @@ -20,6 +20,7 @@ package prometheus import ( "fmt" "net/http" + "sort" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" @@ -28,17 +29,26 @@ import ( // Handler returns an HTTP handler which dump metrics in Prometheus format. func Handler(reg metrics.Registry) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Gather and pre-sort the metrics to avoid random listings + var names []string + reg.Each(func(name string, i interface{}) { + names = append(names, name) + }) + sort.Strings(names) + // Aggregate all the metris into a Prometheus collector c := newCollector() - reg.Each(func(name string, i interface{}) { + for _, name := range names { + i := reg.Get(name) + switch m := i.(type) { case metrics.Counter: c.addCounter(name, m.Snapshot()) case metrics.Gauge: - c.addGuage(name, m.Snapshot()) + c.addGauge(name, m.Snapshot()) case metrics.GaugeFloat64: - c.addGuageFloat64(name, m.Snapshot()) + c.addGaugeFloat64(name, m.Snapshot()) case metrics.Histogram: c.addHistogram(name, m.Snapshot()) case metrics.Meter: @@ -50,8 +60,7 @@ func Handler(reg metrics.Registry) http.Handler { default: log.Warn("Unknown Prometheus metric type", "type", fmt.Sprintf("%T", i)) } - }) - + } w.Header().Add("Content-Type", "text/plain") w.Header().Add("Content-Length", fmt.Sprint(c.buff.Len())) w.Write(c.buff.Bytes())