diff --git a/metrics/graphite/graphite.go b/metrics/graphite/graphite.go index 31e00cc..888e5a7 100644 --- a/metrics/graphite/graphite.go +++ b/metrics/graphite/graphite.go @@ -28,11 +28,11 @@ type Emitter struct { prefix string - addr string - tcp bool - conn net.Conn - start sync.Once - stop chan bool + network, addr string + conn net.Conn + dialer Dialer + start sync.Once + stop chan bool mtx sync.Mutex counters []*counter @@ -44,16 +44,24 @@ // NewEmitter will return an Emitter that will prefix all // metrics names with the given prefix. Once started, it will attempt to create -// a TCP or a UDP connection with the given address and periodically post +// a connection with the given network and address via `net.Dial` and periodically post // metrics to the connection in the Graphite plaintext protocol. -// If the provided `tcp` parameter is false, a UDP connection will be used. -func NewEmitter(addr string, tcp bool, metricsPrefix string, logger log.Logger) *Emitter { +func NewEmitter(network, addr string, metricsPrefix string, logger log.Logger) *Emitter { + return NewEmitterDial(network, addr, net.Dial, metricsPrefix, logger) +} + +// NewEmitter will return an Emitter that will prefix all +// metrics names with the given prefix. Once started, it will attempt to create +// a connection with the given network and address via the given Dialer and periodically post +// metrics to the connection in the Graphite plaintext protocol. +func NewEmitterDial(network, addr string, dialer Dialer, metricsPrefix string, logger log.Logger) *Emitter { return &Emitter{ - addr: addr, - tcp: tcp, - stop: make(chan bool), - prefix: metricsPrefix, - logger: logger, + network: network, + addr: addr, + dialer: net.Dial, + stop: make(chan bool), + prefix: metricsPrefix, + logger: logger, } } @@ -118,27 +126,12 @@ } func (e *Emitter) dial() error { - if e.tcp { - tAddr, err := net.ResolveTCPAddr("tcp", e.addr) - if err != nil { - return err - } - e.conn, err = net.DialTCP("tcp", nil, tAddr) - if err != nil { - return err - } - } else { - uAddr, err := net.ResolveUDPAddr("udp", e.addr) - if err != nil { - return err - } - e.conn, err = net.DialUDP("udp", nil, uAddr) - if err != nil { - return err - } - } - return nil -} + var err error + e.conn, err = e.dialer(e.network, e.addr) + return err +} + +type Dialer func(network, addr string) (net.Conn, error) // Start will kick off a background goroutine to // call Flush once every interval. diff --git a/metrics/graphite/graphite_test.go b/metrics/graphite/graphite_test.go index 7dc385f..3c23038 100644 --- a/metrics/graphite/graphite_test.go +++ b/metrics/graphite/graphite_test.go @@ -12,7 +12,7 @@ func TestHistogramQuantiles(t *testing.T) { prefix := "prefix" - e := NewEmitter("", true, prefix, nil) + e := NewEmitter("", "", prefix, nil) var ( name = "test_histogram_quantiles" quantiles = []int{50, 90, 95, 99} @@ -36,7 +36,7 @@ prefix = "prefix" name = "m" value = 123 - e = NewEmitter("", true, prefix, nil) + e = NewEmitter("", "", prefix, nil) b bytes.Buffer ) e.NewCounter(name).With(metrics.Field{Key: "ignored", Value: "field"}).Add(uint64(value)) @@ -54,7 +54,7 @@ name = "xyz" value = 54321 delta = 12345 - e = NewEmitter("", true, prefix, nil) + e = NewEmitter("", "", prefix, nil) b bytes.Buffer g = e.NewGauge(name).With(metrics.Field{Key: "ignored", Value: "field"}) )