A library that provides an interface for sending metrics from your script, application, or service. Metrics consist of a name, value, and optionally some tags that are made up of key/value pairs.
Multiple implementations are provided to allow for production, local development, and testing use cases. The following clients are available:
Client | Description |
---|---|
LoggerClient |
Writes metrics into a log stream. Useful when running locally. |
DataDogClient |
Writes metrics into DataDog. Useful for production. |
NullClient |
Acts like a mock that does nothing. Useful for testing. |
RecorderClient |
Writes metrics into memory and provides a query interface. Useful for testing. |
Generally you will instantiate one of the above clients and then write metrics to it. First, install the library:
# If using dep, glide, godep, etc then use that tool. For example:
dep ensure github.com/istreamlabs/go-metrics
# Otherwise, just go get it:
go get github.com/istreamlabs/go-metrics/metrics
Then you can use it:
import "github.com/istreamlabs/go-metrics/metrics"
var client metrics.Client
if os.Getenv("env") == "prod" {
client = metrics.NewDataDogClient("127.0.0.1:8125", "myprefix")
} else {
// Log to standard out instead of sending production metrics.
client = metrics.NewLoggerClient(nil)
}
defer client.Close()
// Simple incrementing counter
client.Incr("requests.count")
// Tagging with counters
client.WithTags(map[string]string{
"tag": "value"
}).Incr("requests.count")
The above code would result in myprefix.requests.count
with a value of 1
showing up in DataDog if you have dogstatsd
running locally and an environment variable env
set to prod
, otherwise it will print metrics to standard out. See the Client
interface for a list of available metrics methods.
Sometimes you wouldn't want to send a metric every single time a piece of code is executed. This is supported by setting a sample rate:
// Sample rate for high-throughput applications
client.WithRate(0.01).Incr("requests.count")
Sample rates apply to metrics but not events. Any count-type metric (Incr
, Decr
, Count
, and timing/histogram counts) will get multiplied to the full value, while gauges are sent unmodified. For example, when emitting a 10% sampled timing metric that takes an average of 200ms
to DataDog, you would see 1 call * (1/0.1 sample rate) = 10 calls
added to the histogram count while the average value remains 200ms
in the DataDog UI.
Also provided are useful clients for testing. For example, the following asserts that a metric with the given name, value, and tag was emitted during a test:
func TestFoo(t *testing.T)
client := metrics.NewRecorderClient().WithTest(t)
client.WithTags(map[string]string{
"tag": "value",
}).Count("requests.count", 1)
// Now, assert that the metric was emitted.
client.
Expect("requests.count").
Value(1).
Tag("tag", "value")
}
For more information and examples, see the godocs.
Copyright © 2017 iStreamPlanet Co., LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.