From 6b133e24b9b99d5f3ac54cecec4b1023fb774cef Mon Sep 17 00:00:00 2001 From: Alex Antonov Date: Tue, 8 Aug 2017 19:54:35 -0500 Subject: [PATCH] Added RetryMetrics to DataDog and StatsD providers --- middlewares/datadog.go | 5 ++++- middlewares/datadog_test.go | 6 ++++++ middlewares/metrics.go | 4 ---- middlewares/statsd.go | 4 +++- middlewares/statsd_test.go | 6 ++++++ 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/middlewares/datadog.go b/middlewares/datadog.go index e8c003676..9dd67974e 100644 --- a/middlewares/datadog.go +++ b/middlewares/datadog.go @@ -11,7 +11,8 @@ import ( "github.com/go-kit/kit/metrics/dogstatsd" ) -var _ Metrics = (Metrics)(nil) +var _ Metrics = (*Datadog)(nil) +var _ RetryMetrics = (*Datadog)(nil) var datadogClient = dogstatsd.New("traefik.", kitlog.LoggerFunc(func(keyvals ...interface{}) error { log.Info(keyvals) @@ -24,6 +25,7 @@ var datadogTicker *time.Ticker const ( ddMetricsReqsName = "requests.total" ddMetricsLatencyName = "request.duration" + ddRetriesTotalName = "backend.retries.total" ) // Datadog is an Implementation for Metrics that exposes datadog metrics for the latency @@ -55,6 +57,7 @@ func NewDataDog(name string) *Datadog { m.reqsCounter = datadogClient.NewCounter(ddMetricsReqsName, 1.0).With("service", name) m.reqDurationHistogram = datadogClient.NewHistogram(ddMetricsLatencyName, 1.0).With("service", name) + m.retryCounter = datadogClient.NewCounter(ddRetriesTotalName, 1.0).With("service", name) return &m } diff --git a/middlewares/datadog_test.go b/middlewares/datadog_test.go index 3a95c0d3a..aed332c3b 100644 --- a/middlewares/datadog_test.go +++ b/middlewares/datadog_test.go @@ -40,10 +40,16 @@ func TestDatadog(t *testing.T) { req1 := testhelpers.MustNewRequest(http.MethodGet, "http://localhost:3000/ok", nil) req2 := testhelpers.MustNewRequest(http.MethodGet, "http://localhost:3000/not-found", nil) + retryListener := NewMetricsRetryListener(dd) + retryListener.Retried(1) + retryListener.Retried(2) + expected := []string{ // We are only validating counts, as it is nearly impossible to validate latency, since it varies every run "traefik.requests.total:1.000000|c|#service:test,code:404,method:GET\n", "traefik.requests.total:1.000000|c|#service:test,code:200,method:GET\n", + "traefik.backend.retries.total:2.000000|c|#service:test\n", + "traefik.request.duration", } udp.ShouldReceiveAll(t, expected, func() { diff --git a/middlewares/metrics.go b/middlewares/metrics.go index b5f459df7..e39e5491d 100644 --- a/middlewares/metrics.go +++ b/middlewares/metrics.go @@ -65,10 +65,6 @@ func (mm *MultiMetrics) getRetryCounter() metrics.Counter { return mm.retryCounter } -func (mm *MultiMetrics) getWrappedMetrics() *[]Metrics { - return mm.wrappedMetrics -} - // MetricsWrapper is a Negroni compatible Handler which relies on a // given Metrics implementation to expose and monitor Traefik Metrics. type MetricsWrapper struct { diff --git a/middlewares/statsd.go b/middlewares/statsd.go index 4d8a9935e..ad54015e3 100644 --- a/middlewares/statsd.go +++ b/middlewares/statsd.go @@ -11,7 +11,8 @@ import ( "github.com/go-kit/kit/metrics/statsd" ) -var _ Metrics = (Metrics)(nil) +var _ Metrics = (*Statsd)(nil) +var _ RetryMetrics = (*Statsd)(nil) var statsdClient = statsd.New("traefik.", kitlog.LoggerFunc(func(keyvals ...interface{}) error { log.Info(keyvals) @@ -48,6 +49,7 @@ func NewStatsD(name string) *Statsd { m.reqsCounter = statsdClient.NewCounter(ddMetricsReqsName, 1.0).With("service", name) m.reqDurationHistogram = statsdClient.NewTiming(ddMetricsLatencyName, 1.0).With("service", name) + m.retryCounter = statsdClient.NewCounter(ddRetriesTotalName, 1.0).With("service", name) return &m } diff --git a/middlewares/statsd_test.go b/middlewares/statsd_test.go index 4c6be042c..2f5b60437 100644 --- a/middlewares/statsd_test.go +++ b/middlewares/statsd_test.go @@ -40,9 +40,15 @@ func TestStatsD(t *testing.T) { req1 := testhelpers.MustNewRequest(http.MethodGet, "http://localhost:3000/ok", nil) req2 := testhelpers.MustNewRequest(http.MethodGet, "http://localhost:3000/not-found", nil) + retryListener := NewMetricsRetryListener(c) + retryListener.Retried(1) + retryListener.Retried(2) + expected := []string{ // We are only validating counts, as it is nearly impossible to validate latency, since it varies every run "traefik.requests.total:2.000000|c\n", + "traefik.backend.retries.total:2.000000|c\n", + "traefik.request.duration", } udp.ShouldReceiveAll(t, expected, func() {