package dogstatsd

import "go.opentelemetry.io/otel/exporter/metric/dogstatsd"

Index

Examples

Types

type Config

type Config = statsd.Config

type Exporter

type Exporter struct {
	*statsd.Exporter
	*statsd.LabelEncoder

	ReencodedLabelsCount int
}

Exporter implements a dogstatsd-format statsd exporter, which encodes label sets as independent fields in the output.

TODO: find a link for this syntax. It's been copied out of code, not a specification:

https://github.com/stripe/veneur/blob/master/sinks/datadog/datadog.go

func New

func New(config Config) (*Exporter, error)

New returns a new Dogstatsd-syntax exporter. This type implements the metric.LabelEncoder interface, allowing the SDK's unique label encoding to be pre-computed for the exporter and stored in the LabelSet.

Example

Code:play 

package main

import (
	"context"
	"fmt"
	"io"
	"log"
	"sync"
	"time"

	"go.opentelemetry.io/otel/api/key"
	"go.opentelemetry.io/otel/api/metric"
	"go.opentelemetry.io/otel/exporter/metric/dogstatsd"
	"go.opentelemetry.io/otel/sdk/metric/batcher/ungrouped"
	"go.opentelemetry.io/otel/sdk/metric/controller/push"
	"go.opentelemetry.io/otel/sdk/metric/selector/simple"
)

func main() {
	// Create a "server"
	wg := &sync.WaitGroup{}
	wg.Add(1)

	reader, writer := io.Pipe()

	go func() {
		defer wg.Done()

		for {
			var buf [4096]byte
			n, err := reader.Read(buf[:])
			if err == io.EOF {
				return
			} else if err != nil {
				log.Fatal("Read err: ", err)
			} else if n >= len(buf) {
				log.Fatal("Read small buffer: ", n)
			} else {
				fmt.Print(string(buf[0:n]))
			}
		}
	}()

	// Create a meter
	selector := simple.NewWithExactMeasure()
	exporter, err := dogstatsd.New(dogstatsd.Config{
		// The Writer field provides test support.
		Writer: writer,

		// In real code, use the URL field:
		//
		// URL: fmt.Sprint("unix://", path),
	})
	if err != nil {
		log.Fatal("Could not initialize dogstatsd exporter:", err)
	}
	// The ungrouped batcher ensures that the export sees the full
	// set of labels as dogstatsd tags.
	batcher := ungrouped.New(selector, false)

	// The pusher automatically recognizes that the exporter
	// implements the LabelEncoder interface, which ensures the
	// export encoding for labels is encoded in the LabelSet.
	pusher := push.New(batcher, exporter, time.Hour)
	pusher.Start()

	ctx := context.Background()

	key := key.New("key")

	// pusher implements the metric.MeterProvider interface:
	meter := pusher.Meter("example")

	// Create and update a single counter:
	counter := meter.NewInt64Counter("a.counter", metric.WithKeys(key))
	labels := meter.Labels(key.String("value"))

	counter.Add(ctx, 100, labels)

	// Flush the exporter, close the pipe, and wait for the reader.
	pusher.Stop()
	writer.Close()
	wg.Wait()

}

Output:

a.counter:100|c|#key:value

func (*Exporter) AppendName

func (*Exporter) AppendName(rec export.Record, buf *bytes.Buffer)

AppendName is part of the stats-internal adapter interface.

func (*Exporter) AppendTags

func (e *Exporter) AppendTags(rec export.Record, buf *bytes.Buffer)

AppendTags is part of the stats-internal adapter interface.

Source Files

dogstatsd.go

Version
v0.2.0
Published
Dec 3, 2019
Platform
linux/amd64
Imports
3 packages
Last checked
1 minute ago

Tools for package owners.