Skip to content

Commit ee43a03

Browse files
authored
Move roundInterval from intervalv2 grafana/grafana (#887)
1 parent 5577d46 commit ee43a03

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed

backend/gtime/gtime.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,103 @@ func ParseIntervalStringToTimeDuration(interval string) (time.Duration, error) {
166166
}
167167
return parsedInterval, nil
168168
}
169+
170+
// RoundInterval returns a predetermined, lower and rounder duration than the given
171+
//
172+
//nolint:gocyclo
173+
func RoundInterval(interval time.Duration) time.Duration {
174+
switch {
175+
// 0.01s
176+
case interval <= 10*time.Millisecond:
177+
return time.Millisecond * 1 // 0.001s
178+
// 0.015s
179+
case interval <= 15*time.Millisecond:
180+
return time.Millisecond * 10 // 0.01s
181+
// 0.035s
182+
case interval <= 35*time.Millisecond:
183+
return time.Millisecond * 20 // 0.02s
184+
// 0.075s
185+
case interval <= 75*time.Millisecond:
186+
return time.Millisecond * 50 // 0.05s
187+
// 0.15s
188+
case interval <= 150*time.Millisecond:
189+
return time.Millisecond * 100 // 0.1s
190+
// 0.35s
191+
case interval <= 350*time.Millisecond:
192+
return time.Millisecond * 200 // 0.2s
193+
// 0.75s
194+
case interval <= 750*time.Millisecond:
195+
return time.Millisecond * 500 // 0.5s
196+
// 1.5s
197+
case interval <= 1500*time.Millisecond:
198+
return time.Millisecond * 1000 // 1s
199+
// 3.5s
200+
case interval <= 3500*time.Millisecond:
201+
return time.Millisecond * 2000 // 2s
202+
// 7.5s
203+
case interval <= 7500*time.Millisecond:
204+
return time.Millisecond * 5000 // 5s
205+
// 12.5s
206+
case interval <= 12500*time.Millisecond:
207+
return time.Millisecond * 10000 // 10s
208+
// 17.5s
209+
case interval <= 17500*time.Millisecond:
210+
return time.Millisecond * 15000 // 15s
211+
// 25s
212+
case interval <= 25000*time.Millisecond:
213+
return time.Millisecond * 20000 // 20s
214+
// 45s
215+
case interval <= 45000*time.Millisecond:
216+
return time.Millisecond * 30000 // 30s
217+
// 1.5m
218+
case interval <= 90000*time.Millisecond:
219+
return time.Millisecond * 60000 // 1m
220+
// 3.5m
221+
case interval <= 210000*time.Millisecond:
222+
return time.Millisecond * 120000 // 2m
223+
// 7.5m
224+
case interval <= 450000*time.Millisecond:
225+
return time.Millisecond * 300000 // 5m
226+
// 12.5m
227+
case interval <= 750000*time.Millisecond:
228+
return time.Millisecond * 600000 // 10m
229+
// 17.5m
230+
case interval <= 1050000*time.Millisecond:
231+
return time.Millisecond * 900000 // 15m
232+
// 25m
233+
case interval <= 1500000*time.Millisecond:
234+
return time.Millisecond * 1200000 // 20m
235+
// 45m
236+
case interval <= 2700000*time.Millisecond:
237+
return time.Millisecond * 1800000 // 30m
238+
// 1.5h
239+
case interval <= 5400000*time.Millisecond:
240+
return time.Millisecond * 3600000 // 1h
241+
// 2.5h
242+
case interval <= 9000000*time.Millisecond:
243+
return time.Millisecond * 7200000 // 2h
244+
// 4.5h
245+
case interval <= 16200000*time.Millisecond:
246+
return time.Millisecond * 10800000 // 3h
247+
// 9h
248+
case interval <= 32400000*time.Millisecond:
249+
return time.Millisecond * 21600000 // 6h
250+
// 24h
251+
case interval <= 86400000*time.Millisecond:
252+
return time.Millisecond * 43200000 // 12h
253+
// 48h
254+
case interval <= 172800000*time.Millisecond:
255+
return time.Millisecond * 86400000 // 24h
256+
// 1w
257+
case interval <= 604800000*time.Millisecond:
258+
return time.Millisecond * 86400000 // 24h
259+
// 3w
260+
case interval <= 1814400000*time.Millisecond:
261+
return time.Millisecond * 604800000 // 1w
262+
// 2y
263+
case interval < 3628800000*time.Millisecond:
264+
return time.Millisecond * 2592000000 // 30d
265+
default:
266+
return time.Millisecond * 31536000000 // 1y
267+
}
268+
}

backend/gtime/gtime_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,48 @@ func TestParseIntervalStringToTimeDuration(t *testing.T) {
183183
})
184184
}
185185
}
186+
187+
func TestRoundInterval(t *testing.T) {
188+
tcs := []struct {
189+
input time.Duration
190+
expected time.Duration
191+
}{
192+
{input: 9 * time.Millisecond, expected: time.Millisecond * 1},
193+
{input: 14 * time.Millisecond, expected: time.Millisecond * 10},
194+
{input: 34 * time.Millisecond, expected: time.Millisecond * 20},
195+
{input: 74 * time.Millisecond, expected: time.Millisecond * 50},
196+
{input: 140 * time.Millisecond, expected: time.Millisecond * 100},
197+
{input: 320 * time.Millisecond, expected: time.Millisecond * 200},
198+
{input: 740 * time.Millisecond, expected: time.Millisecond * 500},
199+
{input: 1400 * time.Millisecond, expected: time.Millisecond * 1000},
200+
{input: 3200 * time.Millisecond, expected: time.Millisecond * 2000},
201+
{input: 7400 * time.Millisecond, expected: time.Millisecond * 5000},
202+
{input: 12400 * time.Millisecond, expected: time.Millisecond * 10000},
203+
{input: 17250 * time.Millisecond, expected: time.Millisecond * 15000},
204+
{input: 23000 * time.Millisecond, expected: time.Millisecond * 20000},
205+
{input: 42000 * time.Millisecond, expected: time.Millisecond * 30000},
206+
{input: 85000 * time.Millisecond, expected: time.Millisecond * 60000},
207+
{input: 200000 * time.Millisecond, expected: time.Millisecond * 120000},
208+
{input: 420000 * time.Millisecond, expected: time.Millisecond * 300000},
209+
{input: 720000 * time.Millisecond, expected: time.Millisecond * 600000},
210+
{input: 1000000 * time.Millisecond, expected: time.Millisecond * 900000},
211+
{input: 1250000 * time.Millisecond, expected: time.Millisecond * 1200000},
212+
{input: 2500000 * time.Millisecond, expected: time.Millisecond * 1800000},
213+
{input: 5200000 * time.Millisecond, expected: time.Millisecond * 3600000},
214+
{input: 8500000 * time.Millisecond, expected: time.Millisecond * 7200000},
215+
{input: 15000000 * time.Millisecond, expected: time.Millisecond * 10800000},
216+
{input: 30000000 * time.Millisecond, expected: time.Millisecond * 21600000},
217+
{input: 85000000 * time.Millisecond, expected: time.Millisecond * 43200000},
218+
{input: 150000000 * time.Millisecond, expected: time.Millisecond * 86400000},
219+
{input: 600000000 * time.Millisecond, expected: time.Millisecond * 86400000},
220+
{input: 1500000000 * time.Millisecond, expected: time.Millisecond * 604800000},
221+
{input: 3500000000 * time.Millisecond, expected: time.Millisecond * 2592000000},
222+
{input: 40000000000 * time.Millisecond, expected: time.Millisecond * 31536000000},
223+
}
224+
for i, tc := range tcs {
225+
t.Run(fmt.Sprintf("testcase %d", i), func(t *testing.T) {
226+
res := RoundInterval(tc.input)
227+
require.Equal(t, tc.expected, res, "input %q", tc.input)
228+
})
229+
}
230+
}

0 commit comments

Comments
 (0)