Documentation
¶
Overview ¶
Package datadog provides a DataDog exporter.
Deprecated: This package is no longer supported.
Index ¶
Examples ¶
Constants ¶
View Source
const ( // DefaultStatsAddrUDP specifies the default protocol (UDP) and address // for the DogStatsD service. DefaultStatsAddrUDP = "localhost:8125" )
Variables ¶
This section is empty.
Functions ¶
func SemVersion ¶ added in v0.25.0
func SemVersion() string
SemVersion is the semantic version to be supplied to tracer/meter creation.
Types ¶
type Exporter ¶
type Exporter struct {
// contains filtered or unexported fields
}
Exporter forwards metrics to a DataDog agent
Example ¶
package main
import (
"context"
"fmt"
"net"
"os"
"time"
"github.com/DataDog/datadog-go/statsd"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/global"
controller "go.opentelemetry.io/otel/sdk/metric/controller/basic"
"go.opentelemetry.io/otel/sdk/metric/processor/basic"
"go.opentelemetry.io/otel/sdk/metric/selector/simple"
"go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
)
type TestUDPServer struct {
*net.UDPConn
}
func main() {
const testHostPort = ":8159"
selector := simple.NewWithInexpensiveDistribution()
exp, err := NewExporter(Options{
StatsAddr: testHostPort,
Tags: []string{"env:dev"},
StatsDOptions: []statsd.Option{statsd.WithoutTelemetry()},
})
if err != nil {
panic(err)
}
s, err := getTestServer(testHostPort)
if err != nil {
panic(err)
}
defer s.Close()
go func() {
defer exp.Close()
processor := basic.NewFactory(selector, exp)
cont := controller.New(processor, controller.WithExporter(exp), controller.WithCollectPeriod(time.Second*10),
controller.WithResource(resource.Default()),
controller.WithResource(resource.NewSchemaless(semconv.ServiceNameKey.String("ExampleExporter"))))
ctx := context.Background()
err := cont.Start(ctx)
if err != nil {
panic(err)
}
defer func() { handleErr(cont.Stop(ctx)) }()
global.SetMeterProvider(cont)
meter := global.Meter("marwandist")
m := metric.Must(meter).NewInt64Counter("mycounter")
meter.RecordBatch(context.Background(), []attribute.KeyValue{attribute.Int("l", 1)},
m.Measurement(1), m.Measurement(50), m.Measurement(100))
}()
statsChan := make(chan []byte, 1)
timedOutChan, stopChan := make(chan struct{}), make(chan struct{})
defer close(stopChan)
go s.ReadPackets(statsChan, 500*time.Millisecond, timedOutChan, stopChan)
for {
select {
case d := <-statsChan:
// only look for "max" value, since we don't want to rely on
// specifics of OpenTelemetry aggregator calculations
// "max" is something that will always exist and always be the same
statLine := string(d)
fmt.Println(statLine)
case <-timedOutChan:
_, _ = fmt.Fprintln(os.Stderr, "Server timed out waiting for packets")
return
case <-time.After(2 * time.Second):
fmt.Println("no data received after 1 second")
return
}
}
}
func getTestServer(addr string) (*TestUDPServer, error) {
udpAddr, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
return nil, err
}
conn, err := net.ListenUDP("udp", udpAddr)
if err != nil {
return nil, err
}
return &TestUDPServer{conn}, nil
}
// ReadPackets reads one "transmission" at a time from the UDP connection
//
// In the case of StatsD, there is one transmission per stat.
// If there is nothing on the connection for longer than maxIdleTime, the
// routine will return, assuming that everything has been sent
// doneChan is an output channel that is closed when ReadPackets returns
// stopChan is an input channel that tells ReadPackets to exit
func (s TestUDPServer) ReadPackets(
xferChan chan []byte,
maxIdleTime time.Duration,
doneChan chan<- struct{},
stopChan <-chan struct{}) {
const readTimeout = 50 * time.Millisecond
var timeouts int
buffer := make([]byte, 1500)
defer close(doneChan)
n := 0
for {
select {
case <-stopChan:
return
default:
_ = s.SetReadDeadline(time.Now().Add(readTimeout))
nn, _, err := s.ReadFrom(buffer[n:])
if err == nil {
timeouts = 0
data := make([]byte, nn)
_ = copy(data, buffer[n:n+nn])
xferChan <- data
n += nn
continue
} else {
if nerr, ok := err.(*net.OpError); ok && nerr.Timeout() {
timeouts++
if time.Duration(timeouts)*readTimeout > maxIdleTime {
return
}
continue
}
// give connection some time to connect
time.Sleep(2 * time.Millisecond)
}
}
}
}
func handleErr(err error) {
if err != nil {
fmt.Println("Encountered error: ", err.Error())
}
}
Output: mycounter:151|c|#env:dev,l:1,service.name:ExampleExporter,telemetry.sdk.language:go,telemetry.sdk.name:opentelemetry,telemetry.sdk.version:1.4.0
func NewExporter ¶
NewExporter exports to a datadog client
func (*Exporter) Close ¶
Close cloess the underlying datadog client which flushes any pending buffers
func (*Exporter) TemporalityFor ¶ added in v0.27.0
func (e *Exporter) TemporalityFor(*sdkapi.Descriptor, aggregation.Kind) aggregation.Temporality
TemporalityFor returns export.DeltaExporter for statsd-derived exporters
type Options ¶
type Options struct {
// StatsAddr specifies the host[:port] address for DogStatsD. It defaults
// to DefaultStatsAddrUDP.
StatsAddr string
// Tags specifies a set of global tags to attach to each metric.
Tags []string
// UseDistribution uses a DataDog Distribution type instead of Histogram
UseDistribution bool
// MetricNameFormatter lets you customize the metric name that gets sent to
// datadog before exporting
MetricNameFormatter func(namespace, name string) string
// StatsD specific Options
StatsDOptions []statsd.Option
}
Options contains options for configuring the exporter.
Click to show internal directories.
Click to hide internal directories.