@@ -203,15 +203,9 @@ func (qapi *QueryAPI) parsePartialResponseParam(r *http.Request, defaultEnablePa
203
203
}
204
204
205
205
func (qapi * QueryAPI ) query (r * http.Request ) (interface {}, []error , * api.ApiError ) {
206
- var ts time.Time
207
- if t := r .FormValue ("time" ); t != "" {
208
- var err error
209
- ts , err = parseTime (t )
210
- if err != nil {
211
- return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
212
- }
213
- } else {
214
- ts = qapi .baseAPI .Now ()
206
+ ts , err := parseTimeParam (r , "time" , qapi .baseAPI .Now ())
207
+ if err != nil {
208
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
215
209
}
216
210
217
211
ctx := r .Context ()
@@ -394,12 +388,27 @@ func (qapi *QueryAPI) labelValues(r *http.Request) (interface{}, []error, *api.A
394
388
return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : errors .Errorf ("invalid label name: %q" , name )}
395
389
}
396
390
391
+ start , err := parseTimeParam (r , "start" , minTime )
392
+ if err != nil {
393
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
394
+ }
395
+ end , err := parseTimeParam (r , "end" , maxTime )
396
+ if err != nil {
397
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
398
+ }
399
+ // Prometheus doesn't check this, do we need to?
400
+ if end .Before (start ) {
401
+ err := errors .New ("end timestamp must not be before start time" )
402
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
403
+ }
404
+
397
405
enablePartialResponse , apiErr := qapi .parsePartialResponseParam (r , qapi .enableQueryPartialResponse )
398
406
if apiErr != nil {
399
407
return nil , nil , apiErr
400
408
}
401
409
402
- q , err := qapi .queryableCreate (true , nil , 0 , enablePartialResponse , false ).Querier (ctx , math .MinInt64 , math .MaxInt64 )
410
+ q , err := qapi .queryableCreate (true , nil , 0 , enablePartialResponse , false ).
411
+ Querier (ctx , timestamp .FromTime (start ), timestamp .FromTime (end ))
403
412
if err != nil {
404
413
return nil , nil , & api.ApiError {Typ : api .ErrorExec , Err : err }
405
414
}
@@ -433,26 +442,13 @@ func (qapi *QueryAPI) series(r *http.Request) (interface{}, []error, *api.ApiErr
433
442
return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : errors .New ("no match[] parameter provided" )}
434
443
}
435
444
436
- var start time.Time
437
- if t := r .FormValue ("start" ); t != "" {
438
- var err error
439
- start , err = parseTime (t )
440
- if err != nil {
441
- return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
442
- }
443
- } else {
444
- start = minTime
445
+ start , err := parseTimeParam (r , "start" , minTime )
446
+ if err != nil {
447
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
445
448
}
446
-
447
- var end time.Time
448
- if t := r .FormValue ("end" ); t != "" {
449
- var err error
450
- end , err = parseTime (t )
451
- if err != nil {
452
- return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
453
- }
454
- } else {
455
- end = maxTime
449
+ end , err := parseTimeParam (r , "end" , maxTime )
450
+ if err != nil {
451
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
456
452
}
457
453
458
454
var matcherSets [][]* labels.Matcher
@@ -504,6 +500,18 @@ func (qapi *QueryAPI) series(r *http.Request) (interface{}, []error, *api.ApiErr
504
500
return metrics , set .Warnings (), nil
505
501
}
506
502
503
+ func parseTimeParam (r * http.Request , paramName string , defaultValue time.Time ) (time.Time , error ) {
504
+ val := r .FormValue (paramName )
505
+ if val == "" {
506
+ return defaultValue , nil
507
+ }
508
+ result , err := parseTime (val )
509
+ if err != nil {
510
+ return time.Time {}, errors .Wrapf (err , "Invalid time value for '%s'" , paramName )
511
+ }
512
+ return result , nil
513
+ }
514
+
507
515
func parseTime (s string ) (time.Time , error ) {
508
516
if t , err := strconv .ParseFloat (s , 64 ); err == nil {
509
517
s , ns := math .Modf (t )
@@ -532,12 +540,26 @@ func parseDuration(s string) (time.Duration, error) {
532
540
func (qapi * QueryAPI ) labelNames (r * http.Request ) (interface {}, []error , * api.ApiError ) {
533
541
ctx := r .Context ()
534
542
543
+ start , err := parseTimeParam (r , "start" , minTime )
544
+ if err != nil {
545
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
546
+ }
547
+ end , err := parseTimeParam (r , "end" , maxTime )
548
+ if err != nil {
549
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
550
+ }
551
+ if end .Before (start ) {
552
+ err := errors .New ("end timestamp must not be before start time" )
553
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
554
+ }
555
+
535
556
enablePartialResponse , apiErr := qapi .parsePartialResponseParam (r , qapi .enableQueryPartialResponse )
536
557
if apiErr != nil {
537
558
return nil , nil , apiErr
538
559
}
539
560
540
- q , err := qapi .queryableCreate (true , nil , 0 , enablePartialResponse , false ).Querier (ctx , math .MinInt64 , math .MaxInt64 )
561
+ q , err := qapi .queryableCreate (true , nil , 0 , enablePartialResponse , false ).
562
+ Querier (ctx , timestamp .FromTime (start ), timestamp .FromTime (end ))
541
563
if err != nil {
542
564
return nil , nil , & api.ApiError {Typ : api .ErrorExec , Err : err }
543
565
}
0 commit comments