Go port of Coda Hale's Metrics library
Go Shell
Latest commit 1f30fe9 Nov 28, 2016 @mihasya mihasya committed on GitHub Merge pull request #97 from Dieterbe/ExpDecaySample-url
alternate paper location that doesn't 404
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 Add support for Golang 1.5 in Travis CI Nov 29, 2015
LICENSE Updated docs, deleted Makefiles. Feb 23, 2012
README.md Fix typo for link to Ganglia Sep 21, 2016
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 gofmt pass Jul 12, 2015
ewma_test.go Benchmarks for everyone! Oct 17, 2013
gauge.go gofmt the code Nov 26, 2016
gauge_float64.go Adding FunctionalGauge Feb 24, 2016
gauge_float64_test.go gofmt the code Nov 26, 2016
gauge_test.go Document how to create a threadsafe registry Sep 14, 2016
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 Support JSON marshalling of PrefixedRegistry. Sep 5, 2016
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 Fix Meter.RateMean int64 overflow May 22, 2014
meter_test.go Fix race condition on test Nov 29, 2015
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 gofmt the code Nov 26, 2016
registry_test.go gofmt the code Nov 26, 2016
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 Alphabetize Oct 4, 2014
timer_test.go Document how to create a threadsafe registry Sep 14, 2016
validate.sh first attempt at basic travis build Jul 18, 2015
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)

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, &influxdb.Config{
    Host:     "127.0.0.1:8086",
    Database: "metrics",
    Username: "test",
    Password: "test",
})

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: