diff --git a/metrics/cloudwatch/cloudwatch.go b/metrics/cloudwatch/cloudwatch.go index 0aad8a334..b14cdcd18 100644 --- a/metrics/cloudwatch/cloudwatch.go +++ b/metrics/cloudwatch/cloudwatch.go @@ -255,7 +255,7 @@ func (cw *CloudWatch) Send() error { } var firstErr error for i := 0; i < cap(errors); i++ { - if err := <-errors; err != nil && firstErr != nil { + if err := <-errors; err != nil && firstErr == nil { firstErr = err } } diff --git a/metrics/cloudwatch/cloudwatch_test.go b/metrics/cloudwatch/cloudwatch_test.go index 7496525ba..d534b7ec5 100644 --- a/metrics/cloudwatch/cloudwatch_test.go +++ b/metrics/cloudwatch/cloudwatch_test.go @@ -15,6 +15,10 @@ import ( "github.com/go-kit/kit/metrics/teststat" ) +const metricNameToGenerateError = "metric_name_used_to_throw_an_error" + +var errTest = errors.New("test error") + type mockCloudWatch struct { cloudwatchiface.CloudWatchAPI mtx sync.RWMutex @@ -33,6 +37,10 @@ func (mcw *mockCloudWatch) PutMetricData(input *cloudwatch.PutMetricDataInput) ( mcw.mtx.Lock() defer mcw.mtx.Unlock() for _, datum := range input.MetricData { + if *datum.MetricName == metricNameToGenerateError { + return nil, errTest + } + if len(datum.Values) > 0 { for _, v := range datum.Values { mcw.valuesReceived[*datum.MetricName] = append(mcw.valuesReceived[*datum.MetricName], *v) @@ -125,8 +133,7 @@ func TestCounterLowSendConcurrency(t *testing.T) { wants = append(wants, teststat.FillCounter(counters[name])) } - err := cw.Send() - if err != nil { + if err := cw.Send(); err != nil { t.Fatal(err) } @@ -280,3 +287,13 @@ func TestHistogram(t *testing.T) { t.Fatal(err) } } + +func TestErrorLog(t *testing.T) { + namespace := "abc" + svc := newMockCloudWatch() + cw := New(namespace, svc, WithLogger(log.NewNopLogger())) + cw.NewGauge(metricNameToGenerateError).Set(123) + if err := cw.Send(); err != errTest { + t.Fatal("Expected error, but didn't get one") + } +}