Go port of Coda Hale's Metrics library
Clone or download
mihasya Merge pull request #246 from sykesm/racing-stop
Replace lock with CAS in standard meter stop
Latest commit 3113b84 Oct 16, 2018
Permalink
Failed to load latest commit information.
cmd initial implementation of GaugeFloat64 Mar 22, 2014
exp PrefixRegistries of PrefixedRegistries Sep 6, 2016
librato Merge pull request #114 from pressly/master Nov 29, 2015
stathat initial implementation of GaugeFloat64 Mar 22, 2014
.gitignore never-read debugging tool. Aug 9, 2013
.travis.yml Drop support for Go 1.2 Apr 5, 2018
LICENSE Updated docs, deleted Makefiles. Feb 23, 2012
README.md Added Wavefront Client to README May 3, 2018
counter.go Allow lazy instantiation of metric in GetOrRegister. Mar 28, 2014
counter_test.go Fully introduce snapshots for all metric types. Jan 7, 2014
debug.go Use time.Tick everywhere else we should, too Aug 3, 2014
debug_test.go Skip tests that require GOMAXPROCS > 1. Oct 31, 2013
ewma.go Optimizes ewma to reduce lock contention Apr 5, 2018
ewma_test.go add race test for EWMA Apr 6, 2018
gauge.go gofmt the code Nov 26, 2016
gauge_float64.go Update gauge_float64.go to reduce lock contention Apr 5, 2018
gauge_float64_test.go Add parallel bench test for gauge_float64 Apr 5, 2018
gauge_test.go add race test for Gauge Apr 6, 2018
graphite.go deprecate the graphite client in favor of the new separate lib Jul 12, 2015
graphite_test.go gofmt pass Jul 12, 2015
healthcheck.go Mostly documentation and naming changes. Jan 7, 2014
histogram.go Alphabetize Oct 4, 2014
histogram_test.go Fix tests broken by sample changes. Jan 14, 2014
json.go rename "Dump" to "GetAll" Nov 28, 2017
json_test.go Added JSON->io.Writer; consistent ordering to WriteOnce Jun 6, 2014
log.go use interface for logger Feb 23, 2016
memory.md Installation and usage. Nov 21, 2011
meter.go Replace lock with CAS in standard meter stop Oct 1, 2018
meter_test.go Replace lock with CAS in standard meter stop Oct 1, 2018
metrics.go ETOOCLEVER so s/ObserverEffect/UseNilMetrics/. Sep 13, 2013
metrics_test.go Document how to create a threadsafe registry Sep 14, 2016
opentsdb.go Fix #74 for OpenTSDB, too Nov 8, 2014
opentsdb_test.go gofmt pass Jul 12, 2015
registry.go Changed registry's mutex to be RWMutex for performance gains when Get… Apr 6, 2018
registry_test.go Changed registry's mutex to be RWMutex for performance gains when Get… Apr 6, 2018
runtime.go Add thread count metric Dec 1, 2015
runtime_cgo.go Fixes: Won't compile on AppEngine #67 Oct 15, 2014
runtime_gccpufraction.go Add support for fraction of CPU time used by GC Nov 29, 2015
runtime_no_cgo.go Fixes: Won't compile on AppEngine #67 Oct 15, 2014
runtime_no_gccpufraction.go Add support for fraction of CPU time used by GC Nov 29, 2015
runtime_test.go Add thread count metric Dec 1, 2015
sample.go Merge pull request #97 from Dieterbe/ExpDecaySample-url Nov 28, 2016
sample_test.go Test for #104 May 26, 2015
syslog.go Use time.Tick everywhere else we should, too Aug 3, 2014
timer.go Use set of meters and update documentation Sep 2, 2017
timer_test.go add Stop() to Timer Apr 17, 2017
validate.sh more go versions; add race detector to tests Nov 28, 2017
writer.go Use time.Tick everywhere else we should, too Aug 3, 2014
writer_test.go Merge branch 'master' of github.com:stuartcarnie/go-metrics Jul 26, 2014

README.md

go-metrics

travis build status

Go port of Coda Hale's Metrics library: https://github.com/dropwizard/metrics.

Documentation: http://godoc.org/github.com/rcrowley/go-metrics.

Usage

Create and update metrics:

c := metrics.NewCounter()
metrics.Register("foo", c)
c.Inc(47)

g := metrics.NewGauge()
metrics.Register("bar", g)
g.Update(47)

r := NewRegistry()
g := metrics.NewRegisteredFunctionalGauge("cache-evictions", r, func() int64 { return cache.getEvictionsCount() })

s := metrics.NewExpDecaySample(1028, 0.015) // or metrics.NewUniformSample(1028)
h := metrics.NewHistogram(s)
metrics.Register("baz", h)
h.Update(47)

m := metrics.NewMeter()
metrics.Register("quux", m)
m.Mark(47)

t := metrics.NewTimer()
metrics.Register("bang", t)
t.Time(func() {})
t.Update(47)

Register() is not threadsafe. For threadsafe metric registration use GetOrRegister:

t := metrics.GetOrRegisterTimer("account.create.latency", nil)
t.Time(func() {})
t.Update(47)

NOTE: Be sure to unregister short-lived meters and timers otherwise they will leak memory:

// Will call Stop() on the Meter to allow for garbage collection
metrics.Unregister("quux")
// Or similarly for a Timer that embeds a Meter
metrics.Unregister("bang")

Periodically log every metric in human-readable form to standard error:

go metrics.Log(metrics.DefaultRegistry, 5 * time.Second, log.New(os.Stderr, "metrics: ", log.Lmicroseconds))

Periodically log every metric in slightly-more-parseable form to syslog:

w, _ := syslog.Dial("unixgram", "/dev/log", syslog.LOG_INFO, "metrics")
go metrics.Syslog(metrics.DefaultRegistry, 60e9, w)

Periodically emit every metric to Graphite using the Graphite client:

import "github.com/cyberdelia/go-metrics-graphite"

addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:2003")
go graphite.Graphite(metrics.DefaultRegistry, 10e9, "metrics", addr)

Periodically emit every metric into InfluxDB:

NOTE: this has been pulled out of the library due to constant fluctuations in the InfluxDB API. In fact, all client libraries are on their way out. see issues #121 and #124 for progress and details.

import "github.com/vrischmann/go-metrics-influxdb"

go influxdb.InfluxDB(metrics.DefaultRegistry,
  10e9, 
  "127.0.0.1:8086", 
  "database-name", 
  "username", 
  "password"
)

Periodically upload every metric to Librato using the Librato client:

Note: the client included with this repository under the librato package has been deprecated and moved to the repository linked above.

import "github.com/mihasya/go-metrics-librato"

go librato.Librato(metrics.DefaultRegistry,
    10e9,                  // interval
    "example@example.com", // account owner email address
    "token",               // Librato API token
    "hostname",            // source
    []float64{0.95},       // percentiles to send
    time.Millisecond,      // time unit
)

Periodically emit every metric to StatHat:

import "github.com/rcrowley/go-metrics/stathat"

go stathat.Stathat(metrics.DefaultRegistry, 10e9, "example@example.com")

Maintain all metrics along with expvars at /debug/metrics:

This uses the same mechanism as the official expvar but exposed under /debug/metrics, which shows a json representation of all your usual expvars as well as all your go-metrics.

import "github.com/rcrowley/go-metrics/exp"

exp.Exp(metrics.DefaultRegistry)

Installation

go get github.com/rcrowley/go-metrics

StatHat support additionally requires their Go client:

go get github.com/stathat/go

Publishing Metrics

Clients are available for the following destinations: