@@ -30,6 +30,7 @@ import (
30
30
"strings"
31
31
"time"
32
32
33
+ "golang.org/x/exp/constraints"
33
34
"golang.org/x/net/http/httpguts"
34
35
)
35
36
@@ -140,10 +141,18 @@ const (
140
141
MaxMultiHttpVariables = 5 // Max variables per multi-http target.
141
142
142
143
// Frequencies (in milliseconds)
143
- MaxCheckFrequency = 120 * 1000 // Maximum value for the check's frequency.
144
- minCheckFrequency = 1 * 1000 // Minimum default value for the check's frequency.
145
- minTracerouteFrequency = 120 * 1000 // Minimum value for the traceroute check's frequency.
146
- minK6Frequency = 60 * 1000 // Minimum value for k6-class check's frequency.
144
+ MaxCheckFrequency = 1 * 60 * 60 * 1000 // Maximum value for the check's frequency (1 hour).
145
+ minCheckFrequency = 1 * 1000 // Minimum default value for the check's frequency (1 second).
146
+ minTracerouteFrequency = 120 * 1000 // Minimum value for the traceroute check's frequency (2 min).
147
+ minK6Frequency = 60 * 1000 // Minimum value for k6-class check's frequency (1 min).
148
+
149
+ // Timeouts (in milliseconds)
150
+ minCheckTimeout = minCheckFrequency
151
+ MaxCheckTimeout = 1 * 60 * 1000 // Maximum value for the check's timeout (1 minute).
152
+ minScriptedTimeout = minCheckTimeout // Minimum timeout for scripted checks (1 second).
153
+ maxScriptedTimeout = MaxCheckTimeout // Maximum timeout for scripted checks (1 minute).
154
+ minTracerouteTimeout = 30 * 1000 // Minimum timeout for traceroute checks (30 second).
155
+ maxTracerouteTimeout = 30 * 1000 // Minimum timeout for traceroute checks (30 second).
147
156
)
148
157
149
158
type validatable interface {
@@ -316,57 +325,51 @@ func (c Check) validateTarget() error {
316
325
}
317
326
318
327
func (c Check ) validateFrequency () error {
319
- // All checks have a maximum frequency of MaxCheckFrequency.
320
- if c . Frequency > MaxCheckFrequency {
321
- return ErrInvalidCheckFrequency
322
- }
328
+ var (
329
+ minFrequency int64 = minCheckFrequency
330
+ maxFrequency int64 = MaxCheckFrequency
331
+ )
323
332
324
- // Different check types have different minimum allowed values for the frequency.
333
+ // Some check types have different allowed values for the frequency.
325
334
326
335
switch c .Type () {
327
336
case CheckTypeTraceroute :
328
- if c .Frequency < minTracerouteFrequency {
329
- return ErrInvalidCheckFrequency
330
- }
337
+ minFrequency = minTracerouteFrequency
331
338
332
339
case CheckTypeScripted , CheckTypeMultiHttp :
333
- if c .Frequency < minK6Frequency {
334
- return ErrInvalidCheckFrequency
335
- }
340
+ minFrequency = minK6Frequency
341
+ }
336
342
337
- default :
338
- if c .Frequency < minCheckFrequency {
339
- return ErrInvalidCheckFrequency
340
- }
343
+ if ! inClosedRange (c .Frequency , minFrequency , maxFrequency ) {
344
+ return ErrInvalidCheckFrequency
341
345
}
342
346
343
347
return nil
344
348
}
345
349
346
350
func (c Check ) validateTimeout () error {
351
+ var minTimeout , maxTimeout int64
352
+
347
353
switch {
348
354
case c .Settings .Traceroute != nil :
349
- // We are hardcoding traceroute frequency and timeout until we can get data on what the boundaries should be
350
- if c .Timeout != 30 * 1000 {
351
- return ErrInvalidCheckTimeout
352
- }
355
+ minTimeout , maxTimeout = minTracerouteTimeout , min (c .Frequency , maxTracerouteTimeout )
353
356
354
- case c .Settings .Scripted != nil || c .Settings .Multihttp != nil :
355
- // This is expirimental. A 30 second timeout means we have more
356
- // checks lingering around. timeout must be in [1, 30] seconds,
357
- // and it must be less than frequency (otherwise we can end up
358
- // running overlapping checks)
359
- if c .Timeout < 1 * 1000 || c .Timeout > 30 * 1000 || c .Timeout > c .Frequency {
360
- return ErrInvalidCheckTimeout
361
- }
362
-
363
- default :
364
- // timeout must be in [1, 10] seconds, and it must be less than
357
+ case c .Settings .Scripted != nil , c .Settings .Multihttp != nil :
358
+ // This is experimental. A large timeout means we have more
359
+ // checks lingering around. timeout must be less or equal than
365
360
// frequency (otherwise we can end up running overlapping
366
361
// checks)
367
- if c .Timeout < 1 * 1000 || c .Timeout > 10 * 1000 || c .Timeout > c .Frequency {
368
- return ErrInvalidCheckTimeout
369
- }
362
+ minTimeout , maxTimeout = minScriptedTimeout , min (c .Frequency , maxScriptedTimeout )
363
+
364
+ default :
365
+ // timeout must be within the defined limits, and it must be
366
+ // less than frequency (otherwise we can end up running
367
+ // overlapping checks)
368
+ minTimeout , maxTimeout = minCheckTimeout , min (c .Frequency , MaxCheckTimeout )
369
+ }
370
+
371
+ if ! inClosedRange (c .Timeout , minTimeout , maxTimeout ) {
372
+ return ErrInvalidCheckTimeout
370
373
}
371
374
372
375
return nil
@@ -1399,3 +1402,8 @@ func validateDnsLabel(label string, isLast bool) error {
1399
1402
1400
1403
return nil
1401
1404
}
1405
+
1406
+ // inClosedRange returns true if the value `v` is in [lower, upper].
1407
+ func inClosedRange [T constraints.Ordered ](v , lower , upper T ) bool {
1408
+ return v >= lower && v <= upper
1409
+ }
0 commit comments