Skip to content

Commit 7e5a451

Browse files
committed
make reservoir tests more dynamic
improve comments
1 parent d067744 commit 7e5a451

File tree

3 files changed

+32
-21
lines changed

3 files changed

+32
-21
lines changed

settings.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,12 @@ const (
2020
DefaultFlushIntervalS = 5
2121
// DefaultLoggingSinkDisabled is the default behavior of logging sink suppression, default is false.
2222
DefaultLoggingSinkDisabled = false
23-
DefaultUseReservoirTimer = false // DefaultUseReservoirTimer defines if reservoir timers should be used by default, default is false.
24-
DefaultTimerReservoirSize = 128 // DefaultTimerReservoirSize is the max capacity of the reservoir for reservoir timers. needs to be rounded to a power of two e.g. 1 << bits.Len(uint(100)) = 128
23+
// DefaultUseReservoirTimer defines if reservoir timers should be used by default, default is false.
24+
DefaultUseReservoirTimer = false
25+
// FixedTimerReservoirSize is the max capacity of the reservoir for reservoir timers.
26+
// note: needs to be rounded to a power of two e.g. 1 << bits.Len(uint(100)) = 128
27+
// todo: see if we can use not-strict number and just account for the offset
28+
FixedTimerReservoirSize = 128
2529
)
2630

2731
// The Settings type is used to configure gostats. gostats uses environment

stats.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -609,9 +609,9 @@ func (s *statStore) newTimer(serializedName string, base time.Duration) timer {
609609
t = &reservoirTimer{
610610
name: serializedName,
611611
base: base,
612-
ringSize: DefaultTimerReservoirSize,
613-
ringMask: DefaultTimerReservoirSize - 1,
614-
values: make([]float64, DefaultTimerReservoirSize),
612+
ringSize: FixedTimerReservoirSize,
613+
ringMask: FixedTimerReservoirSize - 1,
614+
values: make([]float64, FixedTimerReservoirSize),
615615
}
616616
} else {
617617
t = &standardTimer{

stats_test.go

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,13 @@ func TestTimerReservoir_Disabled(t *testing.T) {
134134
t.Fatalf("Failed to set GOSTATS_USE_RESERVOIR_TIMER environment variable: %s", err)
135135
}
136136

137-
expectedStatCount := 1000
137+
statsToSend := FixedTimerReservoirSize * 3
138+
expectedStatCount := statsToSend
138139

139140
ts, sink := setupTestNetSink(t, "tcp", false)
140141
store := NewStore(sink, true)
141142

142-
for i := 0; i < 1000; i++ {
143+
for i := 0; i < statsToSend; i++ {
143144
store.NewTimer("test").AddValue(float64(i % 10))
144145
}
145146

@@ -174,13 +175,14 @@ func TestTimerReservoir_Overflow(t *testing.T) {
174175
t.Fatalf("Failed to set GOSTATS_USE_RESERVOIR_TIMER environment variable: %s", err)
175176
}
176177

177-
expectedStatCount := 128 // reservoir size
178+
statsToSend := FixedTimerReservoirSize * 3
179+
expectedStatCount := FixedTimerReservoirSize
178180

179181
ts, sink := setupTestNetSink(t, "tcp", false)
180182
store := NewStore(sink, true)
181183

182184
// this should equate to a 0.1 sample rate; 0.1 * 1280 = 128
183-
for i := 0; i < 1280; i++ {
185+
for i := 0; i < statsToSend; i++ {
184186
store.NewTimer("test").AddValue(float64(i % 10))
185187
}
186188

@@ -202,8 +204,8 @@ func TestTimerReservoir_Overflow(t *testing.T) {
202204
for _, stat := range stats {
203205
value := strings.Split(stat, ":")[1]
204206
sampleRate := strings.Split(value, ("|@"))[1]
205-
if sampleRate != "0.10" {
206-
t.Errorf("A stat was written without a 0.10 sample rate: %s", stat)
207+
if sampleRate != "0.33" {
208+
t.Errorf("A stat was written without a 0.33 sample rate: %s", stat)
207209
}
208210
}
209211

@@ -216,12 +218,13 @@ func TestTimerReservoir_Full(t *testing.T) {
216218
t.Fatalf("Failed to set GOSTATS_USE_RESERVOIR_TIMER environment variable: %s", err)
217219
}
218220

219-
expectedStatCount := 128 // reservoir size
221+
statsToSend := FixedTimerReservoirSize
222+
expectedStatCount := statsToSend
220223

221224
ts, sink := setupTestNetSink(t, "tcp", false)
222225
store := NewStore(sink, true)
223226

224-
for i := 0; i < 128; i++ {
227+
for i := 0; i < statsToSend; i++ {
225228
store.NewTimer("test").AddValue(float64(i % 10))
226229
}
227230

@@ -257,12 +260,13 @@ func TestTimerReservoir_NotFull(t *testing.T) {
257260
t.Fatalf("Failed to set GOSTATS_USE_RESERVOIR_TIMER environment variable: %s", err)
258261
}
259262

260-
expectedStatCount := 50
263+
statsToSend := FixedTimerReservoirSize / 2
264+
expectedStatCount := statsToSend
261265

262266
ts, sink := setupTestNetSink(t, "tcp", false)
263267
store := NewStore(sink, true)
264268

265-
for i := 0; i < 50; i++ {
269+
for i := 0; i < statsToSend; i++ {
266270
store.NewTimer("test").AddValue(float64(i % 10))
267271
}
268272

@@ -298,12 +302,13 @@ func TestTimerReservoir_IndependantReservoirs(t *testing.T) {
298302
t.Fatalf("Failed to set GOSTATS_USE_RESERVOIR_TIMER environment variable: %s", err)
299303
}
300304

301-
expectedStatCount := 1000
305+
statsToSend := FixedTimerReservoirSize * 3
306+
expectedStatCount := statsToSend
302307

303308
ts, sink := setupTestNetSink(t, "tcp", false)
304309
store := NewStore(sink, true)
305310

306-
for i := 0; i < 1000; i++ {
311+
for i := 0; i < statsToSend; i++ {
307312
store.NewTimer("test" + strconv.Itoa(i)).AddValue(float64(i % 10)) // use different names so that we don't conflate the metrics into the same reservoir
308313
}
309314

@@ -339,12 +344,13 @@ func TestTimerReservoir_ReusedStore(t *testing.T) {
339344
t.Fatalf("Failed to set GOSTATS_USE_RESERVOIR_TIMER environment variable: %s", err)
340345
}
341346

342-
expectedStatCount := 100
347+
statsToSend := FixedTimerReservoirSize / 2
348+
expectedStatCount := statsToSend
343349

344350
ts, sink := setupTestNetSink(t, "tcp", false)
345351
store := NewStore(sink, true)
346352

347-
for i := 0; i < 100; i++ {
353+
for i := 0; i < statsToSend; i++ {
348354
store.NewTimer("test").AddValue(float64(i % 10))
349355
}
350356

@@ -375,9 +381,10 @@ func TestTimerReservoir_ReusedStore(t *testing.T) {
375381
t.Errorf("Sink hasn't been cleared")
376382
}
377383

378-
expectedStatCount = 50
384+
statsToSend = FixedTimerReservoirSize
385+
expectedStatCount = statsToSend
379386

380-
for i := 0; i < 50; i++ {
387+
for i := 0; i < statsToSend; i++ {
381388
store.NewTimer("test").AddValue(float64(i % 10))
382389
}
383390

0 commit comments

Comments
 (0)