Warning
VMware has ended active development of this project. this repository will no longer be updated.
go-metrics-wavefront

This is a plugin for go-metrics which adds a Wavefront reporter and a simple abstraction that supports tagging at the host and metric level.
Imports
import (
metrics "github.com/rcrowley/go-metrics"
"github.com/wavefronthq/go-metrics-wavefront/reporting"
"github.com/wavefronthq/wavefront-sdk-go/application"
"github.com/wavefronthq/wavefront-sdk-go/senders"
)Set Up a Wavefront Reporter
This SDK provides a WavefrontMetricsReporter that allows you to:
- Report metrics to Wavefront at regular intervals or
- Manually report metrics to Wavefront
The steps for creating a WavefrontMetricsReporter are:
- Create a Wavefront
Senderfor managing communication with Wavefront. - Create a
WavefrontMetricsReporter
1. Set Up a Wavefront Sender
A "Wavefront sender" is an object that implements the low-level interface for sending data to Wavefront. You can choose to send data using either the Wavefront proxy or direct ingestion.
- If you have already set up a Wavefront sender for another SDK that will run in the same process, use that one. (For details, see Share a Wavefront Sender.)
- Otherwise, follow the steps in Set Up a Wavefront Sender to configure a proxy
Senderor a directSender.
The following example configures a direct Sender with default direct ingestion properties:
directCfg := &senders.DirectConfiguration{
Server: "https://INSTANCE.wavefront.com",
Token: "YOUR_API_TOKEN",
}
sender, err := senders.NewDirectSender(directCfg)
if err != nil {
panic(err)
}2. Create the WavefrontMetricsReporter
The WavefrontMetricsReporter supports tagging at the host level. Any tags passed to the reporter here will be applied to every metric before being sent to Wavefront.
To create the WavefrontMetricsReporter you initialize it with the sender instance you created in the previous step along with a few other properties:
reporter := reporting.NewMetricsReporter(
sender,
reporting.ApplicationTag(application.New("app", "srv")),
reporting.Source("go-metrics-test"),
reporting.Prefix("some.prefix"),
reporting.LogErrors(true),
)Tagging Metrics
In addition to tagging at the reporter level, you can add tags to individual metrics:
tags := map[string]string{
"key1": "val1",
"key2": "val2",
}
counter := metrics.NewCounter() // Create a counter
reporter.RegisterMetric("foo", counter, tags) // will create a 'some.prefix.foo.count' metric with tags
counter.Inc(47)Extended Code Example
package main
import (
"fmt"
"math/rand"
"os"
"time"
metrics "github.com/rcrowley/go-metrics"
"github.com/wavefronthq/go-metrics-wavefront/reporting"
"github.com/wavefronthq/wavefront-sdk-go/application"
"github.com/wavefronthq/wavefront-sdk-go/senders"
)
func main() {
//Tags we'll add to the metric
tags := map[string]string{
"key2": "val2",
"key1": "val1",
"key0": "val0",
"key4": "val4",
"key3": "val3",
}
// Create a direct sender
directCfg := &senders.DirectConfiguration{
Server: "https://" + os.Getenv("WF_INSTANCE") + ".reporting.com",
Token: os.Getenv("WF_TOKEN"),
BatchSize: 10000,
MaxBufferSize: 50000,
FlushIntervalSeconds: 1,
}
sender, err := senders.NewDirectSender(directCfg)
if err != nil {
panic(err)
}
reporter := reporting.NewMetricsReporter(
sender,
reporting.ApplicationTag(application.New("app", "srv")),
reporting.Source("go-metrics-test"),
reporting.Prefix("some.prefix"),
reporting.LogErrors(true),
)
counter := metrics.NewCounter() //Create a counter
reporter.RegisterMetric("foo", counter, tags) // will create a 'some.prefix.foo.count' metric with tags
counter.Inc(47)
histogram := reporting.NewHistogram()
reporter.RegisterMetric("duration", histogram, tags) // will create a 'some.prefix.duration' histogram metric with tags
histogram2 := reporting.NewHistogram()
reporter.Register("duration2", histogram2) // will create a 'some.prefix.duration2' histogram metric with no tags
deltaCounter := metrics.NewCounter()
reporter.RegisterMetric(reporting.DeltaCounterName("delta.metric"), deltaCounter, tags)
deltaCounter.Inc(10)
fmt.Println("Search wavefront: ts(\"some.prefix.foo.count\")")
fmt.Println("Entering loop to simulate metrics flushing. Hit ctrl+c to cancel")
for {
counter.Inc(rand.Int63())
histogram.Update(rand.Int63())
histogram2.Update(rand.Int63())
deltaCounter.Inc(10)
time.Sleep(time.Second * 10)
}
}Golang Runtime Metrics
To enable golang runtime metrics reporting, set the RuntimeMetric flag in reporter to true:
reporting.NewMetricsReporter(
sender,
reporting.ApplicationTag(application.New("app", "srv")),
reporting.Source("go-metrics-test"),
reporting.Prefix("some.prefix"),
reporting.RuntimeMetric(true),
)
}