@@ -218,51 +218,91 @@ func (h *Handler) timelineFilterFromRequest(
218218
219219 filter .Bucket = model .CheckExecutionBucket (query .Get ("bucket" ))
220220
221- interval , err := h .checkInterval (filter .ServiceID , filter .CheckID )
221+ fields , err := h .checkFields (filter .ServiceID , filter .CheckID )
222222 if err != nil {
223223 return filter , err
224224 }
225- filter .Interval = interval
225+ filter .Interval = fields .Interval
226+
227+ if ! isAllowedBucket (filter .Bucket , fields .AllowedBuckets ) {
228+ return filter , fmt .Errorf (
229+ "bucket %q is not allowed for check %s/%s; allowed buckets: %v" ,
230+ filter .Bucket ,
231+ filter .ServiceID ,
232+ filter .CheckID ,
233+ allowedBuckets (fields .AllowedBuckets ),
234+ )
235+ }
226236
227237 return filter , filter .Validate ()
228238}
229239
230- func (h * Handler ) checkInterval (serviceID , checkID string ) (time.Duration , error ) {
240+ func allowedBuckets (allowed []string ) []string {
241+ if len (allowed ) > 0 {
242+ return allowed
243+ }
244+
245+ return []string {
246+ string (model .CheckExecutionBucketMinute ),
247+ string (model .CheckExecutionBucketHour ),
248+ }
249+ }
250+
251+ func isAllowedBucket (bucket model.CheckExecutionBucket , allowed []string ) bool {
252+ if bucket == "" {
253+ bucket = model .CheckExecutionBucketMinute
254+ }
255+
256+ if len (allowed ) == 0 {
257+ return bucket == model .CheckExecutionBucketMinute ||
258+ bucket == model .CheckExecutionBucketHour
259+ }
260+
261+ for i := range allowed {
262+ if model .CheckExecutionBucket (allowed [i ]) == bucket {
263+ return true
264+ }
265+ }
266+
267+ return false
268+ }
269+
270+ func (h * Handler ) checkFields (serviceID , checkID string ) (config.CheckFields , error ) {
231271 cfg := h .cfgProvider .Current ()
232272
233- if interval , ok := checkInterval (cfg .HttpChecks , serviceID , checkID ); ok {
234- return interval , nil
273+ if fields , ok := checkFields (cfg .HttpChecks , serviceID , checkID ); ok {
274+ return fields , nil
235275 }
236276
237- if interval , ok := checkInterval (cfg .TCPChecks , serviceID , checkID ); ok {
238- return interval , nil
277+ if fields , ok := checkFields (cfg .TCPChecks , serviceID , checkID ); ok {
278+ return fields , nil
239279 }
240280
241- if interval , ok := checkInterval (cfg .GRPCChecks , serviceID , checkID ); ok {
242- return interval , nil
281+ if fields , ok := checkFields (cfg .GRPCChecks , serviceID , checkID ); ok {
282+ return fields , nil
243283 }
244284
245- if interval , ok := checkInterval (cfg .DNSChecks , serviceID , checkID ); ok {
246- return interval , nil
285+ if fields , ok := checkFields (cfg .DNSChecks , serviceID , checkID ); ok {
286+ return fields , nil
247287 }
248288
249- if interval , ok := checkInterval (cfg .TLSChecks , serviceID , checkID ); ok {
250- return interval , nil
289+ if fields , ok := checkFields (cfg .TLSChecks , serviceID , checkID ); ok {
290+ return fields , nil
251291 }
252292
253- return 0 , fmt .Errorf ("check %s/%s not found" , serviceID , checkID )
293+ return config. CheckFields {} , fmt .Errorf ("check %s/%s not found" , serviceID , checkID )
254294}
255295
256- func checkInterval [T any ](
296+ func checkFields [T any ](
257297 checks map [string ]config.TypedCheck [T ],
258298 serviceID string ,
259299 checkID string ,
260- ) (time. Duration , bool ) {
300+ ) (config. CheckFields , bool ) {
261301 for i := range checks {
262302 if checks [i ].Service == serviceID && checks [i ].ID == checkID {
263- return checks [i ].Interval , true
303+ return checks [i ].CheckFields , true
264304 }
265305 }
266306
267- return 0 , false
307+ return config. CheckFields {} , false
268308}
0 commit comments