diff --git a/go.mod b/go.mod index 5df1343..858874b 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,12 @@ go 1.12 require ( github.com/DataDog/datadog-go v3.2.0+incompatible + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect + github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible github.com/circonus-labs/circonusllhist v0.1.3 // indirect github.com/golang/protobuf v1.2.0 + github.com/hashicorp/go-hclog v0.10.1 github.com/hashicorp/go-immutable-radix v1.0.0 github.com/hashicorp/go-retryablehttp v0.5.3 // indirect github.com/pascaldekloe/goe v0.1.0 @@ -14,6 +17,8 @@ require ( github.com/prometheus/client_golang v0.9.2 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 - github.com/stretchr/testify v1.3.0 // indirect + github.com/sirupsen/logrus v1.4.2 + github.com/stretchr/testify v1.4.0 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 // indirect + gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect ) diff --git a/go.sum b/go.sum index 0c4c45c..81ff4a3 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,9 @@ github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= @@ -8,10 +12,17 @@ github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v0.10.1 h1:uyt/l0dWjJ879yiAu+T7FG3/6QX+zwm4bQ8P7XsYt3o= +github.com/hashicorp/go-hclog v0.10.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-retryablehttp v0.5.3 h1:QlWt0KvWT0lq8MFppF9tsJGF+ynG7ztc2KIPhzRGk7s= @@ -20,6 +31,12 @@ github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCS github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -34,14 +51,29 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/logger/logger.go b/logger/logger.go new file mode 100644 index 0000000..26084be --- /dev/null +++ b/logger/logger.go @@ -0,0 +1,39 @@ +package logger + +import ( + log "github.com/hashicorp/go-hclog" +) + +// OurLogger implements an empty logger struct to wrap the go-hclog logger +type OurLogger struct { +} + +//Logger interface is used to make stuff happen with things in places +type Logger interface { + Error(string, ...interface{}) +} + +// Error wraps the go-hclog Error function and logs a separate error for each argument in the error object passed +func Error(msg string, l Logger, args ...interface{}) { + l.Error(msg, "msg", args) +} + // ************* [DISCARDED ATTEMPT] ************* + // fmt.Printf("%v", args) + // fmt.Println("---") + // for _, v := range args { + // l.Error(msg, "msg", v) + } + + // fmt.Printf("%v", v) + // fmt.Println("---") + + +func (ol *OurLogger) Error(msg string, args ...interface{}) { + ol.Error(msg, args) +} + +//New creates and returns a new go-hclog logger +func (ol *OurLogger) New() Logger { + l := log.Default() + return l +} diff --git a/prometheus/prometheus.go b/prometheus/prometheus.go index f648c60..45d5ef2 100644 --- a/prometheus/prometheus.go +++ b/prometheus/prometheus.go @@ -4,14 +4,13 @@ package prometheus import ( "fmt" - "log" + "regexp" "strings" "sync" "time" - "regexp" - "github.com/armon/go-metrics" + logger "github.com/armon/go-metrics/logger" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" ) @@ -38,6 +37,7 @@ type PrometheusSink struct { counters map[string]prometheus.Counter updates map[string]time.Time expiration time.Duration + logger logger.Logger } // NewPrometheusSink creates a new PrometheusSink using the default options. @@ -45,14 +45,35 @@ func NewPrometheusSink() (*PrometheusSink, error) { return NewPrometheusSinkFrom(DefaultPrometheusOpts) } -// NewPrometheusSinkFrom creates a new PrometheusSink using the passed options. +// NewPrometheusSinkWithCustomLogger creates a new PrometheusSink using the default options and a custom logger. +func NewPrometheusSinkWithCustomLogger(l logger.Logger) (*PrometheusSink, error) { + return NewPrometheusSinkFromWithCustomLogger(l, DefaultPrometheusOpts) +} + +// NewPrometheusSinkFrom creates a new PrometheusSink using the passed options, uses go-hclog by default. func NewPrometheusSinkFrom(opts PrometheusOpts) (*PrometheusSink, error) { + l := &logger.OurLogger{} + sink := &PrometheusSink{ + gauges: make(map[string]prometheus.Gauge), + summaries: make(map[string]prometheus.Summary), + counters: make(map[string]prometheus.Counter), + updates: make(map[string]time.Time), + expiration: opts.Expiration, + logger: l.New(), + } + + return sink, prometheus.Register(sink) +} + +// NewPrometheusSinkFromWithCustomLogger creates a new PrometheusSink using the passed options and a separate logger paramater. +func NewPrometheusSinkFromWithCustomLogger(l logger.Logger, opts PrometheusOpts) (*PrometheusSink, error) { sink := &PrometheusSink{ gauges: make(map[string]prometheus.Gauge), summaries: make(map[string]prometheus.Summary), counters: make(map[string]prometheus.Counter), updates: make(map[string]time.Time), expiration: opts.Expiration, + logger: l, } return sink, prometheus.Register(sink) @@ -236,7 +257,7 @@ func (s *PrometheusPushSink) flushMetrics() { case <-ticker.C: err := s.pusher.Push() if err != nil { - log.Printf("[ERR] Error pushing to Prometheus! Err: %s", err) + logger.Error("Error pushing to Prometheus", s.logger, err) } case <-s.stopChan: ticker.Stop() diff --git a/statsd.go b/statsd.go index 1bfffce..671679a 100644 --- a/statsd.go +++ b/statsd.go @@ -3,11 +3,12 @@ package metrics import ( "bytes" "fmt" - "log" "net" "net/url" "strings" "time" + + logger "github.com/armon/go-metrics/logger" ) const ( @@ -22,6 +23,7 @@ const ( type StatsdSink struct { addr string metricQueue chan string + logger logger.Logger } // NewStatsdSinkFromURL creates an StatsdSink from a URL. It is used @@ -30,11 +32,30 @@ func NewStatsdSinkFromURL(u *url.URL) (MetricSink, error) { return NewStatsdSink(u.Host) } -// NewStatsdSink is used to create a new StatsdSink +// NewStatsdSinkFromURLWithCustomLogger creates an StatsdSink from a URL with a custom logger. It is used +// (and tested) from NewMetricSinkFromURL. +func NewStatsdSinkFromURLWithCustomLogger(u *url.URL, l logger.Logger) (MetricSink, error) { + return NewStatsdSinkWithCustomLogger(u.Host, l) +} + +// NewStatsdSink is used to create a new StatsdSink and uses go-hclog by default func NewStatsdSink(addr string) (*StatsdSink, error) { + l := &logger.OurLogger{} + s := &StatsdSink{ + addr: addr, + metricQueue: make(chan string, 4096), + logger: l.New(), + } + go s.flushMetrics() + return s, nil +} + +// NewStatsdSinkWithCustomLogger is used to create a new StatsdSink with a custom logger +func NewStatsdSinkWithCustomLogger(addr string, l logger.Logger) (*StatsdSink, error) { s := &StatsdSink{ addr: addr, metricQueue: make(chan string, 4096), + logger: l, } go s.flushMetrics() return s, nil @@ -126,7 +147,7 @@ CONNECT: // Attempt to connect sock, err = net.Dial("udp", s.addr) if err != nil { - log.Printf("[ERR] Error connecting to statsd! Err: %s", err) + logger.Error("Error connecting to statsd", s.logger, err) goto WAIT } @@ -143,7 +164,7 @@ CONNECT: _, err := sock.Write(buf.Bytes()) buf.Reset() if err != nil { - log.Printf("[ERR] Error writing to statsd! Err: %s", err) + logger.Error("Error connecting to statsd", s.logger, err) goto WAIT } } @@ -159,7 +180,7 @@ CONNECT: _, err := sock.Write(buf.Bytes()) buf.Reset() if err != nil { - log.Printf("[ERR] Error flushing to statsd! Err: %s", err) + logger.Error("Error connecting to statsd", s.logger, err) goto WAIT } } @@ -170,7 +191,7 @@ WAIT: wait = time.After(time.Duration(5) * time.Second) for { select { - // Dequeue the messages to avoid backlog + // Dequeue the messages to avoid backstandardLogger case _, ok := <-s.metricQueue: if !ok { goto QUIT diff --git a/statsite.go b/statsite.go index 6c0d284..208df42 100644 --- a/statsite.go +++ b/statsite.go @@ -3,11 +3,13 @@ package metrics import ( "bufio" "fmt" - "log" + "net" "net/url" "strings" "time" + + logger "github.com/armon/go-metrics/logger" ) const ( @@ -18,23 +20,43 @@ const ( ) // NewStatsiteSinkFromURL creates an StatsiteSink from a URL. It is used -// (and tested) from NewMetricSinkFromURL. +// (and tested) from NewMetricSinkFromURL uses go-hclog by default. func NewStatsiteSinkFromURL(u *url.URL) (MetricSink, error) { return NewStatsiteSink(u.Host) } +// NewStatsiteSinkFromURLWithCustomLogger creates an StatsiteSink from a URL. +// It allows use of a custom logger +func NewStatsiteSinkFromURLWithCustomLogger(u *url.URL, l logger.Logger) (MetricSink, error) { + return NewStatsiteSinkWithCustomLogger(u.Host, l) +} + // StatsiteSink provides a MetricSink that can be used with a // statsite metrics server type StatsiteSink struct { addr string metricQueue chan string + logger logger.Logger } // NewStatsiteSink is used to create a new StatsiteSink func NewStatsiteSink(addr string) (*StatsiteSink, error) { + l := &logger.OurLogger{} + s := &StatsiteSink{ + addr: addr, + metricQueue: make(chan string, 4096), + logger: l.New(), + } + go s.flushMetrics() + return s, nil +} + +// NewStatsiteSinkWithCustomLogger is used to create a new StatsiteSink with a custom logger +func NewStatsiteSinkWithCustomLogger(addr string, l logger.Logger) (*StatsiteSink, error) { s := &StatsiteSink{ addr: addr, metricQueue: make(chan string, 4096), + logger: l, } go s.flushMetrics() return s, nil @@ -124,7 +146,7 @@ CONNECT: // Attempt to connect sock, err = net.Dial("tcp", s.addr) if err != nil { - log.Printf("[ERR] Error connecting to statsite! Err: %s", err) + logger.Error("Error connecting to statsite", s.logger, err) goto WAIT } @@ -142,12 +164,12 @@ CONNECT: // Try to send to statsite _, err := buffered.Write([]byte(metric)) if err != nil { - log.Printf("[ERR] Error writing to statsite! Err: %s", err) + logger.Error("Error writing to statsite", s.logger, err) goto WAIT } case <-ticker.C: if err := buffered.Flush(); err != nil { - log.Printf("[ERR] Error flushing to statsite! Err: %s", err) + logger.Error("Error flushing to statsite", s.logger, err) goto WAIT } }