Wavefront plugin for go-metrics
Warning
VMware has ended active development of this project. this repository will no longer be updated.
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.
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")
This SDK provides a WavefrontMetricsReporter that allows you to:
The steps for creating a WavefrontMetricsReporter are:
Sender for managing communication with Wavefront.WavefrontMetricsReporterA “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.
Sender or a direct Sender.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)}
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),)
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 counterreporter.RegisterMetric("foo", counter, tags) // will create a 'some.prefix.foo.count' metric with tagscounter.Inc(47)
package mainimport ("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 metrictags := map[string]string{"key2": "val2","key1": "val1","key0": "val0","key4": "val4","key3": "val3",}// Create a direct senderdirectCfg := &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 counterreporter.RegisterMetric("foo", counter, tags) // will create a 'some.prefix.foo.count' metric with tagscounter.Inc(47)histogram := reporting.NewHistogram()reporter.RegisterMetric("duration", histogram, tags) // will create a 'some.prefix.duration' histogram metric with tagshistogram2 := reporting.NewHistogram()reporter.Register("duration2", histogram2) // will create a 'some.prefix.duration2' histogram metric with no tagsdeltaCounter := 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)}}
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),)}