From 81b98e5f6075279f0eb34d74df3175a1613bb663 Mon Sep 17 00:00:00 2001 From: devopsbo3 <69951731+devopsbo3@users.noreply.github.com> Date: Fri, 10 Nov 2023 12:27:53 -0600 Subject: [PATCH] Revert "metrics, cmd/geth: informational metrics (prometheus, influxdb, opentsb) (#24877)" This reverts commit c10e9371e24f80bd3fdedd0ab7f86dd39fab2452. --- cmd/geth/config.go | 19 +-- core/blockchain.go | 5 - metrics/exp/exp.go | 20 --- metrics/gauge_info.go | 144 ------------------- metrics/gauge_info_test.go | 75 ---------- metrics/graphite.go | 2 - metrics/influxdb/influxdb.go | 7 - metrics/influxdb/influxdb_test.go | 114 --------------- metrics/influxdb/influxdbv1.go | 15 +- metrics/influxdb/influxdbv2.go | 13 +- metrics/influxdb/testdata/influxdbv1.want | 9 -- metrics/influxdb/testdata/influxdbv2.want | 9 -- metrics/internal/sampledata.go | 64 --------- metrics/librato/librato.go | 4 - metrics/log.go | 3 - metrics/meter.go | 10 -- metrics/opentsdb.go | 27 ++-- metrics/opentsdb_test.go | 30 ---- metrics/prometheus/collector.go | 46 ------ metrics/prometheus/collector_test.go | 146 +++++++++++++------- metrics/prometheus/prometheus.go | 20 ++- metrics/prometheus/testdata/prometheus.want | 48 ------- metrics/registry.go | 35 +---- metrics/syslog.go | 2 - metrics/testdata/opentsb.want | 23 --- metrics/writer.go | 3 - 26 files changed, 143 insertions(+), 750 deletions(-) delete mode 100644 metrics/gauge_info.go delete mode 100644 metrics/gauge_info_test.go delete mode 100644 metrics/influxdb/influxdb_test.go delete mode 100644 metrics/influxdb/testdata/influxdbv1.want delete mode 100644 metrics/influxdb/testdata/influxdbv2.want delete mode 100644 metrics/internal/sampledata.go delete mode 100644 metrics/prometheus/testdata/prometheus.want delete mode 100644 metrics/testdata/opentsb.want diff --git a/cmd/geth/config.go b/cmd/geth/config.go index 2761ee7453..1a3de04bd4 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -22,10 +22,10 @@ import ( "fmt" "os" "reflect" - "runtime" - "strings" "unicode" + "github.com/urfave/cli/v2" + "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/external" "github.com/ethereum/go-ethereum/accounts/keystore" @@ -43,7 +43,6 @@ import ( "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/params" "github.com/naoina/toml" - "github.com/urfave/cli/v2" ) var ( @@ -178,20 +177,6 @@ func makeFullNode(ctx *cli.Context) (*node.Node, ethapi.Backend) { } backend, eth := utils.RegisterEthService(stack, &cfg.Eth) - // Create gauge with geth system and build information - if eth != nil { // The 'eth' backend may be nil in light mode - var protos []string - for _, p := range eth.Protocols() { - protos = append(protos, fmt.Sprintf("%v/%d", p.Name, p.Version)) - } - metrics.NewRegisteredGaugeInfo("geth/info", nil).Update(metrics.GaugeInfoValue{ - "arch": runtime.GOARCH, - "os": runtime.GOOS, - "version": cfg.Node.Version, - "eth_protocols": strings.Join(protos, ","), - }) - } - // Configure log filter RPC API. filterSystem := utils.RegisterFilterAPI(stack, backend, &cfg.Eth) diff --git a/core/blockchain.go b/core/blockchain.go index 3e9440fed7..c579123c0e 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -60,8 +60,6 @@ var ( headFinalizedBlockGauge = metrics.NewRegisteredGauge("chain/head/finalized", nil) headSafeBlockGauge = metrics.NewRegisteredGauge("chain/head/safe", nil) - chainInfoGauge = metrics.NewRegisteredGaugeInfo("chain/info", nil) - accountReadTimer = metrics.NewRegisteredTimer("chain/account/reads", nil) accountHashTimer = metrics.NewRegisteredTimer("chain/account/hashes", nil) accountUpdateTimer = metrics.NewRegisteredTimer("chain/account/updates", nil) @@ -324,9 +322,6 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis *Genesis bc.currentFinalBlock.Store(nil) bc.currentSafeBlock.Store(nil) - // Update chain info data metrics - chainInfoGauge.Update(metrics.GaugeInfoValue{"chain_id": bc.chainConfig.ChainID.String()}) - // If Geth is initialized with an external ancient store, re-initialize the // missing chain indexes and chain flags. This procedure can survive crash // and can be resumed in next restart since chain flags are updated in last step. diff --git a/metrics/exp/exp.go b/metrics/exp/exp.go index 9e850f96b2..2b04eeab27 100644 --- a/metrics/exp/exp.go +++ b/metrics/exp/exp.go @@ -95,20 +95,6 @@ func (exp *exp) getFloat(name string) *expvar.Float { return v } -func (exp *exp) getInfo(name string) *expvar.String { - var v *expvar.String - exp.expvarLock.Lock() - p := expvar.Get(name) - if p != nil { - v = p.(*expvar.String) - } else { - v = new(expvar.String) - expvar.Publish(name, v) - } - exp.expvarLock.Unlock() - return v -} - func (exp *exp) publishCounter(name string, metric metrics.Counter) { v := exp.getInt(name) v.Set(metric.Count()) @@ -127,10 +113,6 @@ func (exp *exp) publishGaugeFloat64(name string, metric metrics.GaugeFloat64) { exp.getFloat(name).Set(metric.Value()) } -func (exp *exp) publishGaugeInfo(name string, metric metrics.GaugeInfo) { - exp.getInfo(name).Set(metric.Value().String()) -} - func (exp *exp) publishHistogram(name string, metric metrics.Histogram) { h := metric.Snapshot() ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) @@ -196,8 +178,6 @@ func (exp *exp) syncToExpvar() { exp.publishGauge(name, i) case metrics.GaugeFloat64: exp.publishGaugeFloat64(name, i) - case metrics.GaugeInfo: - exp.publishGaugeInfo(name, i) case metrics.Histogram: exp.publishHistogram(name, i) case metrics.Meter: diff --git a/metrics/gauge_info.go b/metrics/gauge_info.go deleted file mode 100644 index f1b2075939..0000000000 --- a/metrics/gauge_info.go +++ /dev/null @@ -1,144 +0,0 @@ -package metrics - -import ( - "encoding/json" - "sync" -) - -// GaugeInfos hold a GaugeInfoValue value that can be set arbitrarily. -type GaugeInfo interface { - Snapshot() GaugeInfo - Update(GaugeInfoValue) - Value() GaugeInfoValue -} - -// GaugeInfoValue is a mappng of (string) keys to (string) values -type GaugeInfoValue map[string]string - -func (val GaugeInfoValue) String() string { - data, _ := json.Marshal(val) - return string(data) -} - -// GetOrRegisterGaugeInfo returns an existing GaugeInfo or constructs and registers a -// new StandardGaugeInfo. -func GetOrRegisterGaugeInfo(name string, r Registry) GaugeInfo { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewGaugeInfo()).(GaugeInfo) -} - -// NewGaugeInfo constructs a new StandardGaugeInfo. -func NewGaugeInfo() GaugeInfo { - if !Enabled { - return NilGaugeInfo{} - } - return &StandardGaugeInfo{ - value: GaugeInfoValue{}, - } -} - -// NewRegisteredGaugeInfo constructs and registers a new StandardGaugeInfo. -func NewRegisteredGaugeInfo(name string, r Registry) GaugeInfo { - c := NewGaugeInfo() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// NewFunctionalGauge constructs a new FunctionalGauge. -func NewFunctionalGaugeInfo(f func() GaugeInfoValue) GaugeInfo { - if !Enabled { - return NilGaugeInfo{} - } - return &FunctionalGaugeInfo{value: f} -} - -// NewRegisteredFunctionalGauge constructs and registers a new StandardGauge. -func NewRegisteredFunctionalGaugeInfo(name string, r Registry, f func() GaugeInfoValue) GaugeInfo { - c := NewFunctionalGaugeInfo(f) - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// GaugeInfoSnapshot is a read-only copy of another GaugeInfo. -type GaugeInfoSnapshot GaugeInfoValue - -// Snapshot returns the snapshot. -func (g GaugeInfoSnapshot) Snapshot() GaugeInfo { return g } - -// Update panics. -func (GaugeInfoSnapshot) Update(GaugeInfoValue) { - panic("Update called on a GaugeInfoSnapshot") -} - -// Value returns the value at the time the snapshot was taken. -func (g GaugeInfoSnapshot) Value() GaugeInfoValue { return GaugeInfoValue(g) } - -// NilGauge is a no-op Gauge. -type NilGaugeInfo struct{} - -// Snapshot is a no-op. -func (NilGaugeInfo) Snapshot() GaugeInfo { return NilGaugeInfo{} } - -// Update is a no-op. -func (NilGaugeInfo) Update(v GaugeInfoValue) {} - -// Value is a no-op. -func (NilGaugeInfo) Value() GaugeInfoValue { return GaugeInfoValue{} } - -// StandardGaugeInfo is the standard implementation of a GaugeInfo and uses -// sync.Mutex to manage a single string value. -type StandardGaugeInfo struct { - mutex sync.Mutex - value GaugeInfoValue -} - -// Snapshot returns a read-only copy of the gauge. -func (g *StandardGaugeInfo) Snapshot() GaugeInfo { - return GaugeInfoSnapshot(g.Value()) -} - -// Update updates the gauge's value. -func (g *StandardGaugeInfo) Update(v GaugeInfoValue) { - g.mutex.Lock() - defer g.mutex.Unlock() - g.value = v -} - -// Value returns the gauge's current value. -func (g *StandardGaugeInfo) Value() GaugeInfoValue { - g.mutex.Lock() - defer g.mutex.Unlock() - return g.value -} - -// FunctionalGaugeInfo returns value from given function -type FunctionalGaugeInfo struct { - value func() GaugeInfoValue -} - -// Value returns the gauge's current value. -func (g FunctionalGaugeInfo) Value() GaugeInfoValue { - return g.value() -} - -// Value returns the gauge's current value in JSON string format -func (g FunctionalGaugeInfo) ValueJsonString() string { - data, _ := json.Marshal(g.value()) - return string(data) -} - -// Snapshot returns the snapshot. -func (g FunctionalGaugeInfo) Snapshot() GaugeInfo { return GaugeInfoSnapshot(g.Value()) } - -// Update panics. -func (FunctionalGaugeInfo) Update(GaugeInfoValue) { - panic("Update called on a FunctionalGaugeInfo") -} diff --git a/metrics/gauge_info_test.go b/metrics/gauge_info_test.go deleted file mode 100644 index 4227a6a85f..0000000000 --- a/metrics/gauge_info_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package metrics - -import ( - "strconv" - "testing" -) - -func TestGaugeInfoJsonString(t *testing.T) { - g := NewGaugeInfo() - g.Update(GaugeInfoValue{ - "chain_id": "5", - "anotherKey": "any_string_value", - "third_key": "anything", - }, - ) - want := `{"anotherKey":"any_string_value","chain_id":"5","third_key":"anything"}` - if have := g.Value().String(); have != want { - t.Errorf("\nhave: %v\nwant: %v\n", have, want) - } -} - -func TestGaugeInfoSnapshot(t *testing.T) { - g := NewGaugeInfo() - g.Update(GaugeInfoValue{"value": "original"}) - snapshot := g.Snapshot() // Snapshot @chainid 5 - g.Update(GaugeInfoValue{"value": "updated"}) - // The 'g' should be updated - if have, want := g.Value().String(), `{"value":"updated"}`; have != want { - t.Errorf("\nhave: %v\nwant: %v\n", have, want) - } - // Snapshot should be unupdated - if have, want := snapshot.Value().String(), `{"value":"original"}`; have != want { - t.Errorf("\nhave: %v\nwant: %v\n", have, want) - } -} - -func TestGetOrRegisterGaugeInfo(t *testing.T) { - r := NewRegistry() - NewRegisteredGaugeInfo("foo", r).Update( - GaugeInfoValue{"chain_id": "5"}) - g := GetOrRegisterGaugeInfo("foo", r) - if have, want := g.Value().String(), `{"chain_id":"5"}`; have != want { - t.Errorf("have\n%v\nwant\n%v\n", have, want) - } -} - -func TestFunctionalGaugeInfo(t *testing.T) { - info := GaugeInfoValue{"chain_id": "0"} - counter := 1 - // A "functional" gauge invokes the method to obtain the value - fg := NewFunctionalGaugeInfo(func() GaugeInfoValue { - info["chain_id"] = strconv.Itoa(counter) - counter++ - return info - }) - fg.Value() - fg.Value() - if have, want := info["chain_id"], "2"; have != want { - t.Errorf("have %v want %v", have, want) - } -} - -func TestGetOrRegisterFunctionalGaugeInfo(t *testing.T) { - r := NewRegistry() - NewRegisteredFunctionalGaugeInfo("foo", r, func() GaugeInfoValue { - return GaugeInfoValue{ - "chain_id": "5", - } - }) - want := `{"chain_id":"5"}` - have := GetOrRegisterGaugeInfo("foo", r).Value().String() - if have != want { - t.Errorf("have\n%v\nwant\n%v\n", have, want) - } -} diff --git a/metrics/graphite.go b/metrics/graphite.go index 4e3dd3b3b8..29f72b0c41 100644 --- a/metrics/graphite.go +++ b/metrics/graphite.go @@ -73,8 +73,6 @@ func graphite(c *GraphiteConfig) error { fmt.Fprintf(w, "%s.%s.value %d %d\n", c.Prefix, name, metric.Value(), now) case GaugeFloat64: fmt.Fprintf(w, "%s.%s.value %f %d\n", c.Prefix, name, metric.Value(), now) - case GaugeInfo: - fmt.Fprintf(w, "%s.%s.value %s %d\n", c.Prefix, name, metric.Value().String(), now) case Histogram: h := metric.Snapshot() ps := h.Percentiles(c.Percentiles) diff --git a/metrics/influxdb/influxdb.go b/metrics/influxdb/influxdb.go index 9354f1a633..5dfbbab3ed 100644 --- a/metrics/influxdb/influxdb.go +++ b/metrics/influxdb/influxdb.go @@ -32,13 +32,6 @@ func readMeter(namespace, name string, i interface{}) (string, map[string]interf "value": metric.Snapshot().Value(), } return measurement, fields - case metrics.GaugeInfo: - ms := metric.Snapshot() - measurement := fmt.Sprintf("%s%s.gauge", namespace, name) - fields := map[string]interface{}{ - "value": ms.Value().String(), - } - return measurement, fields case metrics.Histogram: ms := metric.Snapshot() if ms.Count() <= 0 { diff --git a/metrics/influxdb/influxdb_test.go b/metrics/influxdb/influxdb_test.go deleted file mode 100644 index beeb36a531..0000000000 --- a/metrics/influxdb/influxdb_test.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2023 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package influxdb - -import ( - "fmt" - "io" - "net/http" - "net/http/httptest" - "net/url" - "os" - "strings" - "testing" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/metrics/internal" - influxdb2 "github.com/influxdata/influxdb-client-go/v2" -) - -func TestMain(m *testing.M) { - metrics.Enabled = true - os.Exit(m.Run()) -} - -func TestExampleV1(t *testing.T) { - r := internal.ExampleMetrics() - var have, want string - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - haveB, _ := io.ReadAll(r.Body) - have = string(haveB) - r.Body.Close() - })) - defer ts.Close() - u, _ := url.Parse(ts.URL) - rep := &reporter{ - reg: r, - url: *u, - namespace: "goth.", - } - if err := rep.makeClient(); err != nil { - t.Fatal(err) - } - if err := rep.send(978307200); err != nil { - t.Fatal(err) - } - if wantB, err := os.ReadFile("./testdata/influxdbv1.want"); err != nil { - t.Fatal(err) - } else { - want = string(wantB) - } - if have != want { - t.Errorf("\nhave:\n%v\nwant:\n%v\n", have, want) - t.Logf("have vs want:\n%v", findFirstDiffPos(have, want)) - } -} - -func TestExampleV2(t *testing.T) { - r := internal.ExampleMetrics() - var have, want string - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - haveB, _ := io.ReadAll(r.Body) - have = string(haveB) - r.Body.Close() - })) - defer ts.Close() - - rep := &v2Reporter{ - reg: r, - endpoint: ts.URL, - namespace: "goth.", - } - rep.client = influxdb2.NewClient(rep.endpoint, rep.token) - defer rep.client.Close() - rep.write = rep.client.WriteAPI(rep.organization, rep.bucket) - - rep.send(978307200) - - if wantB, err := os.ReadFile("./testdata/influxdbv2.want"); err != nil { - t.Fatal(err) - } else { - want = string(wantB) - } - if have != want { - t.Errorf("\nhave:\n%v\nwant:\n%v\n", have, want) - t.Logf("have vs want:\n %v", findFirstDiffPos(have, want)) - } -} - -func findFirstDiffPos(a, b string) string { - yy := strings.Split(b, "\n") - for i, x := range strings.Split(a, "\n") { - if i >= len(yy) { - return fmt.Sprintf("have:%d: %s\nwant:%d: ", i, x, i) - } - if y := yy[i]; x != y { - return fmt.Sprintf("have:%d: %s\nwant:%d: %s", i, x, i, y) - } - } - return "" -} diff --git a/metrics/influxdb/influxdbv1.go b/metrics/influxdb/influxdbv1.go index ac58280803..f65d30ef95 100644 --- a/metrics/influxdb/influxdbv1.go +++ b/metrics/influxdb/influxdbv1.go @@ -79,7 +79,7 @@ func InfluxDBWithTagsOnce(r metrics.Registry, url, database, username, password, return fmt.Errorf("unable to make InfluxDB client. err: %v", err) } - if err := rep.send(0); err != nil { + if err := rep.send(); err != nil { return fmt.Errorf("unable to send to InfluxDB. err: %v", err) } @@ -107,7 +107,7 @@ func (r *reporter) run() { for { select { case <-intervalTicker.C: - if err := r.send(0); err != nil { + if err := r.send(); err != nil { log.Warn("Unable to send to InfluxDB", "err", err) } case <-pingTicker.C: @@ -123,9 +123,7 @@ func (r *reporter) run() { } } -// send sends the measurements. If provided tstamp is >0, it is used. Otherwise, -// a 'fresh' timestamp is used. -func (r *reporter) send(tstamp int64) error { +func (r *reporter) send() error { bps, err := client.NewBatchPoints( client.BatchPointsConfig{ Database: r.database, @@ -134,12 +132,7 @@ func (r *reporter) send(tstamp int64) error { return err } r.reg.Each(func(name string, i interface{}) { - var now time.Time - if tstamp <= 0 { - now = time.Now() - } else { - now = time.Unix(tstamp, 0) - } + now := time.Now() measurement, fields := readMeter(r.namespace, name, i) if fields == nil { return diff --git a/metrics/influxdb/influxdbv2.go b/metrics/influxdb/influxdbv2.go index 0be5137d5e..7984898f32 100644 --- a/metrics/influxdb/influxdbv2.go +++ b/metrics/influxdb/influxdbv2.go @@ -64,7 +64,7 @@ func (r *v2Reporter) run() { for { select { case <-intervalTicker.C: - r.send(0) + r.send() case <-pingTicker.C: _, err := r.client.Health(context.Background()) if err != nil { @@ -74,16 +74,9 @@ func (r *v2Reporter) run() { } } -// send sends the measurements. If provided tstamp is >0, it is used. Otherwise, -// a 'fresh' timestamp is used. -func (r *v2Reporter) send(tstamp int64) { +func (r *v2Reporter) send() { r.reg.Each(func(name string, i interface{}) { - var now time.Time - if tstamp <= 0 { - now = time.Now() - } else { - now = time.Unix(tstamp, 0) - } + now := time.Now() measurement, fields := readMeter(r.namespace, name, i) if fields == nil { return diff --git a/metrics/influxdb/testdata/influxdbv1.want b/metrics/influxdb/testdata/influxdbv1.want deleted file mode 100644 index 5efffb9595..0000000000 --- a/metrics/influxdb/testdata/influxdbv1.want +++ /dev/null @@ -1,9 +0,0 @@ -goth.test/counter.count value=12345 978307200000000000 -goth.test/counter_float64.count value=54321.98 978307200000000000 -goth.test/gauge.gauge value=23456i 978307200000000000 -goth.test/gauge_float64.gauge value=34567.89 978307200000000000 -goth.test/gauge_info.gauge value="{\"arch\":\"amd64\",\"commit\":\"7caa2d8163ae3132c1c2d6978c76610caee2d949\",\"os\":\"linux\",\"protocol_versions\":\"64 65 66\",\"version\":\"1.10.18-unstable\"}" 978307200000000000 -goth.test/histogram.histogram count=3i,max=3i,mean=2,min=1i,p25=1,p50=2,p75=3,p95=3,p99=3,p999=3,p9999=3,stddev=0.816496580927726,variance=0.6666666666666666 978307200000000000 -goth.test/meter.meter count=0i,m1=0,m15=0,m5=0,mean=0 978307200000000000 -goth.test/resetting_timer.span count=6i,max=120000000i,mean=30000000,min=10000000i,p50=12000000i,p95=120000000i,p99=120000000i 978307200000000000 -goth.test/timer.timer count=6i,m1=0,m15=0,m5=0,max=120000000i,mean=38333333.333333336,meanrate=0,min=20000000i,p50=22500000,p75=48000000,p95=120000000,p99=120000000,p999=120000000,p9999=120000000,stddev=36545253.529775314,variance=1335555555555555.2 978307200000000000 diff --git a/metrics/influxdb/testdata/influxdbv2.want b/metrics/influxdb/testdata/influxdbv2.want deleted file mode 100644 index 5efffb9595..0000000000 --- a/metrics/influxdb/testdata/influxdbv2.want +++ /dev/null @@ -1,9 +0,0 @@ -goth.test/counter.count value=12345 978307200000000000 -goth.test/counter_float64.count value=54321.98 978307200000000000 -goth.test/gauge.gauge value=23456i 978307200000000000 -goth.test/gauge_float64.gauge value=34567.89 978307200000000000 -goth.test/gauge_info.gauge value="{\"arch\":\"amd64\",\"commit\":\"7caa2d8163ae3132c1c2d6978c76610caee2d949\",\"os\":\"linux\",\"protocol_versions\":\"64 65 66\",\"version\":\"1.10.18-unstable\"}" 978307200000000000 -goth.test/histogram.histogram count=3i,max=3i,mean=2,min=1i,p25=1,p50=2,p75=3,p95=3,p99=3,p999=3,p9999=3,stddev=0.816496580927726,variance=0.6666666666666666 978307200000000000 -goth.test/meter.meter count=0i,m1=0,m15=0,m5=0,mean=0 978307200000000000 -goth.test/resetting_timer.span count=6i,max=120000000i,mean=30000000,min=10000000i,p50=12000000i,p95=120000000i,p99=120000000i 978307200000000000 -goth.test/timer.timer count=6i,m1=0,m15=0,m5=0,max=120000000i,mean=38333333.333333336,meanrate=0,min=20000000i,p50=22500000,p75=48000000,p95=120000000,p99=120000000,p999=120000000,p9999=120000000,stddev=36545253.529775314,variance=1335555555555555.2 978307200000000000 diff --git a/metrics/internal/sampledata.go b/metrics/internal/sampledata.go deleted file mode 100644 index 9ace069576..0000000000 --- a/metrics/internal/sampledata.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2023 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package internal - -import ( - "time" - - "github.com/ethereum/go-ethereum/metrics" -) - -// ExampleMetrics returns an ordered registry populated with a sample of metrics. -func ExampleMetrics() metrics.Registry { - var registry = metrics.NewOrderedRegistry() - - metrics.NewRegisteredCounterFloat64("test/counter", registry).Inc(12345) - metrics.NewRegisteredCounterFloat64("test/counter_float64", registry).Inc(54321.98) - metrics.NewRegisteredGauge("test/gauge", registry).Update(23456) - metrics.NewRegisteredGaugeFloat64("test/gauge_float64", registry).Update(34567.89) - metrics.NewRegisteredGaugeInfo("test/gauge_info", registry).Update( - metrics.GaugeInfoValue{ - "version": "1.10.18-unstable", - "arch": "amd64", - "os": "linux", - "commit": "7caa2d8163ae3132c1c2d6978c76610caee2d949", - "protocol_versions": "64 65 66", - }) - metrics.NewRegisteredHistogram("test/histogram", registry, metrics.NewSampleSnapshot(3, []int64{1, 2, 3})) - registry.Register("test/meter", metrics.NewInactiveMeter()) - { - timer := metrics.NewRegisteredResettingTimer("test/resetting_timer", registry) - timer.Update(10 * time.Millisecond) - timer.Update(11 * time.Millisecond) - timer.Update(12 * time.Millisecond) - timer.Update(120 * time.Millisecond) - timer.Update(13 * time.Millisecond) - timer.Update(14 * time.Millisecond) - } - { - timer := metrics.NewRegisteredTimer("test/timer", registry) - timer.Update(20 * time.Millisecond) - timer.Update(21 * time.Millisecond) - timer.Update(22 * time.Millisecond) - timer.Update(120 * time.Millisecond) - timer.Update(23 * time.Millisecond) - timer.Update(24 * time.Millisecond) - timer.Stop() - } - registry.Register("test/empty_resetting_timer", metrics.NewResettingTimer().Snapshot()) - return registry -} diff --git a/metrics/librato/librato.go b/metrics/librato/librato.go index fa98595991..3d45f4c7be 100644 --- a/metrics/librato/librato.go +++ b/metrics/librato/librato.go @@ -126,10 +126,6 @@ func (rep *Reporter) BuildRequest(now time.Time, r metrics.Registry) (snapshot B measurement[Name] = name measurement[Value] = m.Value() snapshot.Gauges = append(snapshot.Gauges, measurement) - case metrics.GaugeInfo: - measurement[Name] = name - measurement[Value] = m.Value() - snapshot.Gauges = append(snapshot.Gauges, measurement) case metrics.Histogram: if m.Count() > 0 { gauges := make([]Measurement, histogramGaugeCount) diff --git a/metrics/log.go b/metrics/log.go index d71a1c3d9c..d1ce627a83 100644 --- a/metrics/log.go +++ b/metrics/log.go @@ -33,9 +33,6 @@ func LogScaled(r Registry, freq time.Duration, scale time.Duration, l Logger) { case GaugeFloat64: l.Printf("gauge %s\n", name) l.Printf(" value: %f\n", metric.Value()) - case GaugeInfo: - l.Printf("gauge %s\n", name) - l.Printf(" value: %s\n", metric.Value()) case Healthcheck: metric.Check() l.Printf("healthcheck %s\n", name) diff --git a/metrics/meter.go b/metrics/meter.go index 8a89dc4275..e8564d6a5e 100644 --- a/metrics/meter.go +++ b/metrics/meter.go @@ -58,16 +58,6 @@ func NewMeter() Meter { return m } -// NewInactiveMeter returns a meter but does not start any goroutines. This -// method is mainly intended for testing. -func NewInactiveMeter() Meter { - if !Enabled { - return NilMeter{} - } - m := newStandardMeter() - return m -} - // NewMeterForced constructs a new StandardMeter and launches a goroutine no matter // the global switch is enabled or not. // Be sure to call Stop() once the meter is of no use to allow for garbage collection. diff --git a/metrics/opentsdb.go b/metrics/opentsdb.go index 4d2e209238..c9fd2e75d5 100644 --- a/metrics/opentsdb.go +++ b/metrics/opentsdb.go @@ -3,7 +3,6 @@ package metrics import ( "bufio" "fmt" - "io" "log" "net" "os" @@ -58,10 +57,16 @@ func getShortHostname() string { return shortHostName } -// writeRegistry writes the registry-metrics on the opentsb format. -func (c *OpenTSDBConfig) writeRegistry(w io.Writer, now int64, shortHostname string) { +func openTSDB(c *OpenTSDBConfig) error { + shortHostname := getShortHostname() + now := time.Now().Unix() du := float64(c.DurationUnit) - + conn, err := net.DialTCP("tcp", nil, c.Addr) + if nil != err { + return err + } + defer conn.Close() + w := bufio.NewWriter(conn) c.Registry.Each(func(name string, i interface{}) { switch metric := i.(type) { case Counter: @@ -72,8 +77,6 @@ func (c *OpenTSDBConfig) writeRegistry(w io.Writer, now int64, shortHostname str fmt.Fprintf(w, "put %s.%s.value %d %d host=%s\n", c.Prefix, name, now, metric.Value(), shortHostname) case GaugeFloat64: fmt.Fprintf(w, "put %s.%s.value %d %f host=%s\n", c.Prefix, name, now, metric.Value(), shortHostname) - case GaugeInfo: - fmt.Fprintf(w, "put %s.%s.value %d %s host=%s\n", c.Prefix, name, now, metric.Value().String(), shortHostname) case Histogram: h := metric.Snapshot() ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) @@ -112,17 +115,7 @@ func (c *OpenTSDBConfig) writeRegistry(w io.Writer, now int64, shortHostname str fmt.Fprintf(w, "put %s.%s.fifteen-minute %d %.2f host=%s\n", c.Prefix, name, now, t.Rate15(), shortHostname) fmt.Fprintf(w, "put %s.%s.mean-rate %d %.2f host=%s\n", c.Prefix, name, now, t.RateMean(), shortHostname) } + w.Flush() }) -} - -func openTSDB(c *OpenTSDBConfig) error { - conn, err := net.DialTCP("tcp", nil, c.Addr) - if nil != err { - return err - } - defer conn.Close() - w := bufio.NewWriter(conn) - c.writeRegistry(w, time.Now().Unix(), getShortHostname()) - w.Flush() return nil } diff --git a/metrics/opentsdb_test.go b/metrics/opentsdb_test.go index c02b98af06..c43728960e 100644 --- a/metrics/opentsdb_test.go +++ b/metrics/opentsdb_test.go @@ -2,9 +2,6 @@ package metrics import ( "net" - "os" - "strings" - "testing" "time" ) @@ -22,30 +19,3 @@ func ExampleOpenTSDBWithConfig() { DurationUnit: time.Millisecond, }) } - -func TestExampleOpenTSB(t *testing.T) { - r := NewOrderedRegistry() - NewRegisteredGaugeInfo("foo", r).Update(GaugeInfoValue{"chain_id": "5"}) - NewRegisteredGaugeFloat64("pi", r).Update(3.14) - NewRegisteredCounter("months", r).Inc(12) - NewRegisteredCounterFloat64("tau", r).Inc(1.57) - NewRegisteredMeter("elite", r).Mark(1337) - NewRegisteredTimer("second", r).Update(time.Second) - NewRegisteredCounterFloat64("tau", r).Inc(1.57) - NewRegisteredCounterFloat64("tau", r).Inc(1.57) - - w := new(strings.Builder) - (&OpenTSDBConfig{ - Registry: r, - DurationUnit: time.Millisecond, - Prefix: "pre", - }).writeRegistry(w, 978307200, "hal9000") - - wantB, err := os.ReadFile("./testdata/opentsb.want") - if err != nil { - t.Fatal(err) - } - if have, want := w.String(), string(wantB); have != want { - t.Errorf("\nhave:\n%v\nwant:\n%v\n", have, want) - } -} diff --git a/metrics/prometheus/collector.go b/metrics/prometheus/collector.go index 8624311c4b..2bd9bf22cc 100644 --- a/metrics/prometheus/collector.go +++ b/metrics/prometheus/collector.go @@ -19,7 +19,6 @@ package prometheus import ( "bytes" "fmt" - "sort" "strconv" "strings" @@ -47,34 +46,6 @@ func newCollector() *collector { } } -// Add adds the metric i to the collector. This method returns an error if the -// metric type is not supported/known. -func (c *collector) Add(name string, i any) error { - switch m := i.(type) { - case metrics.Counter: - c.addCounter(name, m.Snapshot()) - case metrics.CounterFloat64: - c.addCounterFloat64(name, m.Snapshot()) - case metrics.Gauge: - c.addGauge(name, m.Snapshot()) - case metrics.GaugeFloat64: - c.addGaugeFloat64(name, m.Snapshot()) - case metrics.GaugeInfo: - c.addGaugeInfo(name, m.Snapshot()) - case metrics.Histogram: - c.addHistogram(name, m.Snapshot()) - case metrics.Meter: - c.addMeter(name, m.Snapshot()) - case metrics.Timer: - c.addTimer(name, m.Snapshot()) - case metrics.ResettingTimer: - c.addResettingTimer(name, m.Snapshot()) - default: - return fmt.Errorf("unknown prometheus metric type %T", i) - } - return nil -} - func (c *collector) addCounter(name string, m metrics.Counter) { c.writeGaugeCounter(name, m.Count()) } @@ -91,10 +62,6 @@ func (c *collector) addGaugeFloat64(name string, m metrics.GaugeFloat64) { c.writeGaugeCounter(name, m.Value()) } -func (c *collector) addGaugeInfo(name string, m metrics.GaugeInfo) { - c.writeGaugeInfo(name, m.Value()) -} - func (c *collector) addHistogram(name string, m metrics.Histogram) { pv := []float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999} ps := m.Percentiles(pv) @@ -135,19 +102,6 @@ func (c *collector) addResettingTimer(name string, m metrics.ResettingTimer) { c.buff.WriteRune('\n') } -func (c *collector) writeGaugeInfo(name string, value metrics.GaugeInfoValue) { - name = mutateKey(name) - c.buff.WriteString(fmt.Sprintf(typeGaugeTpl, name)) - c.buff.WriteString(name) - c.buff.WriteString(" ") - var kvs []string - for k, v := range value { - kvs = append(kvs, fmt.Sprintf("%v=%q", k, v)) - } - sort.Strings(kvs) - c.buff.WriteString(fmt.Sprintf("{%v} 1\n\n", strings.Join(kvs, ", "))) -} - func (c *collector) writeGaugeCounter(name string, value interface{}) { name = mutateKey(name) c.buff.WriteString(fmt.Sprintf(typeGaugeTpl, name)) diff --git a/metrics/prometheus/collector_test.go b/metrics/prometheus/collector_test.go index 3d7903d4ad..ff87c8e765 100644 --- a/metrics/prometheus/collector_test.go +++ b/metrics/prometheus/collector_test.go @@ -1,29 +1,11 @@ -// Copyright 2023 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - package prometheus import ( - "fmt" "os" - "strings" "testing" + "time" "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/metrics/internal" ) func TestMain(m *testing.M) { @@ -32,34 +14,104 @@ func TestMain(m *testing.M) { } func TestCollector(t *testing.T) { - var ( - c = newCollector() - want string - ) - internal.ExampleMetrics().Each(func(name string, i interface{}) { - c.Add(name, i) - }) - if wantB, err := os.ReadFile("./testdata/prometheus.want"); err != nil { - t.Fatal(err) - } else { - want = string(wantB) - } - if have := c.buff.String(); have != want { - t.Logf("have\n%v", have) - t.Logf("have vs want:\n%v", findFirstDiffPos(have, want)) - t.Fatalf("unexpected collector output") - } -} + c := newCollector() -func findFirstDiffPos(a, b string) string { - yy := strings.Split(b, "\n") - for i, x := range strings.Split(a, "\n") { - if i >= len(yy) { - return fmt.Sprintf("a:%d: %s\nb:%d: ", i, x, i) - } - if y := yy[i]; x != y { - return fmt.Sprintf("a:%d: %s\nb:%d: %s", i, x, i, y) - } + counter := metrics.NewCounter() + counter.Inc(12345) + c.addCounter("test/counter", counter) + + counterfloat64 := metrics.NewCounterFloat64() + counterfloat64.Inc(54321.98) + c.addCounterFloat64("test/counter_float64", counterfloat64) + + gauge := metrics.NewGauge() + gauge.Update(23456) + c.addGauge("test/gauge", gauge) + + gaugeFloat64 := metrics.NewGaugeFloat64() + gaugeFloat64.Update(34567.89) + c.addGaugeFloat64("test/gauge_float64", gaugeFloat64) + + histogram := metrics.NewHistogram(&metrics.NilSample{}) + c.addHistogram("test/histogram", histogram) + + meter := metrics.NewMeter() + defer meter.Stop() + meter.Mark(9999999) + c.addMeter("test/meter", meter) + + timer := metrics.NewTimer() + defer timer.Stop() + timer.Update(20 * time.Millisecond) + timer.Update(21 * time.Millisecond) + timer.Update(22 * time.Millisecond) + timer.Update(120 * time.Millisecond) + timer.Update(23 * time.Millisecond) + timer.Update(24 * time.Millisecond) + c.addTimer("test/timer", timer) + + resettingTimer := metrics.NewResettingTimer() + resettingTimer.Update(10 * time.Millisecond) + resettingTimer.Update(11 * time.Millisecond) + resettingTimer.Update(12 * time.Millisecond) + resettingTimer.Update(120 * time.Millisecond) + resettingTimer.Update(13 * time.Millisecond) + resettingTimer.Update(14 * time.Millisecond) + c.addResettingTimer("test/resetting_timer", resettingTimer.Snapshot()) + + emptyResettingTimer := metrics.NewResettingTimer().Snapshot() + c.addResettingTimer("test/empty_resetting_timer", emptyResettingTimer) + + const expectedOutput = `# TYPE test_counter gauge +test_counter 12345 + +# TYPE test_counter_float64 gauge +test_counter_float64 54321.98 + +# TYPE test_gauge gauge +test_gauge 23456 + +# TYPE test_gauge_float64 gauge +test_gauge_float64 34567.89 + +# TYPE test_histogram_count counter +test_histogram_count 0 + +# TYPE test_histogram summary +test_histogram {quantile="0.5"} 0 +test_histogram {quantile="0.75"} 0 +test_histogram {quantile="0.95"} 0 +test_histogram {quantile="0.99"} 0 +test_histogram {quantile="0.999"} 0 +test_histogram {quantile="0.9999"} 0 + +# TYPE test_meter gauge +test_meter 9999999 + +# TYPE test_timer_count counter +test_timer_count 6 + +# TYPE test_timer summary +test_timer {quantile="0.5"} 2.25e+07 +test_timer {quantile="0.75"} 4.8e+07 +test_timer {quantile="0.95"} 1.2e+08 +test_timer {quantile="0.99"} 1.2e+08 +test_timer {quantile="0.999"} 1.2e+08 +test_timer {quantile="0.9999"} 1.2e+08 + +# TYPE test_resetting_timer_count counter +test_resetting_timer_count 6 + +# TYPE test_resetting_timer summary +test_resetting_timer {quantile="0.50"} 12000000 +test_resetting_timer {quantile="0.95"} 120000000 +test_resetting_timer {quantile="0.99"} 120000000 + +` + exp := c.buff.String() + if exp != expectedOutput { + t.Log("Expected Output:\n", expectedOutput) + t.Log("Actual Output:\n", exp) + t.Fatal("unexpected collector output") } - return "" } diff --git a/metrics/prometheus/prometheus.go b/metrics/prometheus/prometheus.go index dbdeae6c7f..d966fa9a86 100644 --- a/metrics/prometheus/prometheus.go +++ b/metrics/prometheus/prometheus.go @@ -41,7 +41,25 @@ func Handler(reg metrics.Registry) http.Handler { for _, name := range names { i := reg.Get(name) - if err := c.Add(name, i); err != nil { + + switch m := i.(type) { + case metrics.Counter: + c.addCounter(name, m.Snapshot()) + case metrics.CounterFloat64: + c.addCounterFloat64(name, m.Snapshot()) + case metrics.Gauge: + c.addGauge(name, m.Snapshot()) + case metrics.GaugeFloat64: + c.addGaugeFloat64(name, m.Snapshot()) + case metrics.Histogram: + c.addHistogram(name, m.Snapshot()) + case metrics.Meter: + c.addMeter(name, m.Snapshot()) + case metrics.Timer: + c.addTimer(name, m.Snapshot()) + case metrics.ResettingTimer: + c.addResettingTimer(name, m.Snapshot()) + default: log.Warn("Unknown Prometheus metric type", "type", fmt.Sprintf("%T", i)) } } diff --git a/metrics/prometheus/testdata/prometheus.want b/metrics/prometheus/testdata/prometheus.want deleted file mode 100644 index f35496e61d..0000000000 --- a/metrics/prometheus/testdata/prometheus.want +++ /dev/null @@ -1,48 +0,0 @@ -# TYPE test_counter gauge -test_counter 12345 - -# TYPE test_counter_float64 gauge -test_counter_float64 54321.98 - -# TYPE test_gauge gauge -test_gauge 23456 - -# TYPE test_gauge_float64 gauge -test_gauge_float64 34567.89 - -# TYPE test_gauge_info gauge -test_gauge_info {arch="amd64", commit="7caa2d8163ae3132c1c2d6978c76610caee2d949", os="linux", protocol_versions="64 65 66", version="1.10.18-unstable"} 1 - -# TYPE test_histogram_count counter -test_histogram_count 3 - -# TYPE test_histogram summary -test_histogram {quantile="0.5"} 2 -test_histogram {quantile="0.75"} 3 -test_histogram {quantile="0.95"} 3 -test_histogram {quantile="0.99"} 3 -test_histogram {quantile="0.999"} 3 -test_histogram {quantile="0.9999"} 3 - -# TYPE test_meter gauge -test_meter 0 - -# TYPE test_resetting_timer_count counter -test_resetting_timer_count 6 - -# TYPE test_resetting_timer summary -test_resetting_timer {quantile="0.50"} 12000000 -test_resetting_timer {quantile="0.95"} 120000000 -test_resetting_timer {quantile="0.99"} 120000000 - -# TYPE test_timer_count counter -test_timer_count 6 - -# TYPE test_timer summary -test_timer {quantile="0.5"} 2.25e+07 -test_timer {quantile="0.75"} 4.8e+07 -test_timer {quantile="0.95"} 1.2e+08 -test_timer {quantile="0.99"} 1.2e+08 -test_timer {quantile="0.999"} 1.2e+08 -test_timer {quantile="0.9999"} 1.2e+08 - diff --git a/metrics/registry.go b/metrics/registry.go index 66dbc890c0..ec6e37c54f 100644 --- a/metrics/registry.go +++ b/metrics/registry.go @@ -3,7 +3,6 @@ package metrics import ( "fmt" "reflect" - "sort" "strings" "sync" ) @@ -48,39 +47,17 @@ type Registry interface { Unregister(string) } -type orderedRegistry struct { - StandardRegistry -} - -// Call the given function for each registered metric. -func (r *orderedRegistry) Each(f func(string, interface{})) { - var names []string - reg := r.registered() - for name := range reg { - names = append(names, name) - } - sort.Strings(names) - for _, name := range names { - f(name, reg[name]) - } -} - -// NewRegistry creates a new registry. -func NewRegistry() Registry { - return new(StandardRegistry) -} - -// NewOrderedRegistry creates a new ordered registry (for testing). -func NewOrderedRegistry() Registry { - return new(orderedRegistry) -} - // The standard implementation of a Registry uses sync.map // of names to metrics. type StandardRegistry struct { metrics sync.Map } +// Create a new registry. +func NewRegistry() Registry { + return &StandardRegistry{} +} + // Call the given function for each registered metric. func (r *StandardRegistry) Each(f func(string, interface{})) { for name, i := range r.registered() { @@ -214,7 +191,7 @@ func (r *StandardRegistry) Unregister(name string) { func (r *StandardRegistry) loadOrRegister(name string, i interface{}) (interface{}, bool, bool) { switch i.(type) { - case Counter, CounterFloat64, Gauge, GaugeFloat64, GaugeInfo, Healthcheck, Histogram, Meter, Timer, ResettingTimer: + case Counter, CounterFloat64, Gauge, GaugeFloat64, Healthcheck, Histogram, Meter, Timer, ResettingTimer: default: return nil, false, false } diff --git a/metrics/syslog.go b/metrics/syslog.go index 76c8490567..f23b07e199 100644 --- a/metrics/syslog.go +++ b/metrics/syslog.go @@ -23,8 +23,6 @@ func Syslog(r Registry, d time.Duration, w *syslog.Writer) { w.Info(fmt.Sprintf("gauge %s: value: %d", name, metric.Value())) case GaugeFloat64: w.Info(fmt.Sprintf("gauge %s: value: %f", name, metric.Value())) - case GaugeInfo: - w.Info(fmt.Sprintf("gauge %s: value: %s", name, metric.Value())) case Healthcheck: metric.Check() w.Info(fmt.Sprintf("healthcheck %s: error: %v", name, metric.Error())) diff --git a/metrics/testdata/opentsb.want b/metrics/testdata/opentsb.want deleted file mode 100644 index c8e40a5250..0000000000 --- a/metrics/testdata/opentsb.want +++ /dev/null @@ -1,23 +0,0 @@ -put pre.elite.count 978307200 0 host=hal9000 -put pre.elite.one-minute 978307200 0.00 host=hal9000 -put pre.elite.five-minute 978307200 0.00 host=hal9000 -put pre.elite.fifteen-minute 978307200 0.00 host=hal9000 -put pre.elite.mean 978307200 0.00 host=hal9000 -put pre.foo.value 978307200 {"chain_id":"5"} host=hal9000 -put pre.months.count 978307200 12 host=hal9000 -put pre.pi.value 978307200 3.140000 host=hal9000 -put pre.second.count 978307200 1 host=hal9000 -put pre.second.min 978307200 1000 host=hal9000 -put pre.second.max 978307200 1000 host=hal9000 -put pre.second.mean 978307200 1000.00 host=hal9000 -put pre.second.std-dev 978307200 0.00 host=hal9000 -put pre.second.50-percentile 978307200 1000.00 host=hal9000 -put pre.second.75-percentile 978307200 1000.00 host=hal9000 -put pre.second.95-percentile 978307200 1000.00 host=hal9000 -put pre.second.99-percentile 978307200 1000.00 host=hal9000 -put pre.second.999-percentile 978307200 1000.00 host=hal9000 -put pre.second.one-minute 978307200 0.00 host=hal9000 -put pre.second.five-minute 978307200 0.00 host=hal9000 -put pre.second.fifteen-minute 978307200 0.00 host=hal9000 -put pre.second.mean-rate 978307200 0.00 host=hal9000 -put pre.tau.count 978307200 1.570000 host=hal9000 diff --git a/metrics/writer.go b/metrics/writer.go index ec2e4f8c6a..82434e9d1d 100644 --- a/metrics/writer.go +++ b/metrics/writer.go @@ -39,9 +39,6 @@ func WriteOnce(r Registry, w io.Writer) { case GaugeFloat64: fmt.Fprintf(w, "gauge %s\n", namedMetric.name) fmt.Fprintf(w, " value: %f\n", metric.Value()) - case GaugeInfo: - fmt.Fprintf(w, "gauge %s\n", namedMetric.name) - fmt.Fprintf(w, " value: %s\n", metric.Value().String()) case Healthcheck: metric.Check() fmt.Fprintf(w, "healthcheck %s\n", namedMetric.name)