Skip to content

Commit f89002e

Browse files
committed
Add test proving metrics are not properly reset on WriteTo errors
1 parent d7cefca commit f89002e

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

metrics/dogstatsd/dogstatsd_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package dogstatsd
22

33
import (
4+
"errors"
45
"testing"
56

7+
"github.com/go-kit/kit/metrics/internal/lv"
68
"github.com/go-kit/kit/metrics/teststat"
79
"github.com/go-kit/log"
810
)
@@ -88,3 +90,74 @@ func TestTimingSampled(t *testing.T) {
8890
t.Fatal(err)
8991
}
9092
}
93+
94+
func TestDogstatsd_WriteToDiscardsMetricsOnError(t *testing.T) {
95+
walker := func(counter *int) func(string, lv.LabelValues, []float64) bool {
96+
return func(string, lv.LabelValues, []float64) bool {
97+
*counter++
98+
return true
99+
}
100+
}
101+
102+
d := New("dogstatsd.", log.NewNopLogger())
103+
104+
// Add some metrics.
105+
d.NewCounter("counter-1", 1.0).Add(1.0)
106+
d.NewTiming("timing-1", 1.0).Observe(1.0)
107+
d.NewHistogram("histogram-1", 1.0).Observe(1.0)
108+
109+
// Count metrics buffered in the Dogstatsd object.
110+
var (
111+
countersCount int
112+
timingsCount int
113+
histogramsCount int
114+
)
115+
d.counters.Walk(walker(&countersCount))
116+
d.timings.Walk(walker(&timingsCount))
117+
d.histograms.Walk(walker(&histogramsCount))
118+
119+
// Assert we have one of each type.
120+
if countersCount != 1 {
121+
t.Fatalf("expected counters count to be 1; got %d", countersCount)
122+
}
123+
if timingsCount != 1 {
124+
t.Fatalf("expected timings count to be 1; got %d", timingsCount)
125+
}
126+
if histogramsCount != 1 {
127+
t.Fatalf("expected histograms count to be 1; got %d", histogramsCount)
128+
}
129+
130+
// Simulate an error while sending metrics.
131+
count, err := d.WriteTo(errorWriter{})
132+
if count != 0 {
133+
t.Fatalf("expected count to be 0; got %d", count)
134+
}
135+
if err == nil {
136+
t.Fatalf("expected error to be nil; got %v", err)
137+
}
138+
139+
// Reset counters and count again.
140+
countersCount = 0
141+
timingsCount = 0
142+
histogramsCount = 0
143+
d.counters.Walk(walker(&countersCount))
144+
d.timings.Walk(walker(&timingsCount))
145+
d.histograms.Walk(walker(&histogramsCount))
146+
147+
// Assert buffered metrics were cleared.
148+
if countersCount != 0 {
149+
t.Fatalf("expected counters count to be 0; got %d", countersCount)
150+
}
151+
if timingsCount != 0 {
152+
t.Fatalf("expected timings count to be 0; got %d", timingsCount)
153+
}
154+
if histogramsCount != 0 {
155+
t.Fatalf("expected histograms count to be 0; got %d", histogramsCount)
156+
}
157+
}
158+
159+
type errorWriter struct{}
160+
161+
func (w errorWriter) Write([]byte) (int, error) {
162+
return 0, errors.New("boom")
163+
}

0 commit comments

Comments
 (0)