@@ -224,15 +224,9 @@ func (qapi *QueryAPI) parsePartialResponseParam(r *http.Request, defaultEnablePa
224
224
}
225
225
226
226
func (qapi * QueryAPI ) query (r * http.Request ) (interface {}, []error , * api.ApiError ) {
227
- var ts time.Time
228
- if t := r .FormValue ("time" ); t != "" {
229
- var err error
230
- ts , err = parseTime (t )
231
- if err != nil {
232
- return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
233
- }
234
- } else {
235
- ts = qapi .baseAPI .Now ()
227
+ ts , err := parseTimeParam (r , "time" , qapi .baseAPI .Now ())
228
+ if err != nil {
229
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
236
230
}
237
231
238
232
ctx := r .Context ()
@@ -425,12 +419,27 @@ func (qapi *QueryAPI) labelValues(r *http.Request) (interface{}, []error, *api.A
425
419
return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : errors .Errorf ("invalid label name: %q" , name )}
426
420
}
427
421
422
+ start , err := parseTimeParam (r , "start" , minTime )
423
+ if err != nil {
424
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
425
+ }
426
+ end , err := parseTimeParam (r , "end" , maxTime )
427
+ if err != nil {
428
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
429
+ }
430
+ // Prometheus doesn't check this, do we need to?
431
+ if end .Before (start ) {
432
+ err := errors .New ("end timestamp must not be before start time" )
433
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
434
+ }
435
+
428
436
enablePartialResponse , apiErr := qapi .parsePartialResponseParam (r , qapi .enableQueryPartialResponse )
429
437
if apiErr != nil {
430
438
return nil , nil , apiErr
431
439
}
432
440
433
- q , err := qapi .queryableCreate (true , nil , nil , 0 , enablePartialResponse , false ).Querier (ctx , math .MinInt64 , math .MaxInt64 )
441
+ q , err := qapi .queryableCreate (true , nil , nil , 0 , enablePartialResponse , false ).
442
+ Querier (ctx , timestamp .FromTime (start ), timestamp .FromTime (end ))
434
443
if err != nil {
435
444
return nil , nil , & api.ApiError {Typ : api .ErrorExec , Err : err }
436
445
}
@@ -464,26 +473,13 @@ func (qapi *QueryAPI) series(r *http.Request) (interface{}, []error, *api.ApiErr
464
473
return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : errors .New ("no match[] parameter provided" )}
465
474
}
466
475
467
- var start time.Time
468
- if t := r .FormValue ("start" ); t != "" {
469
- var err error
470
- start , err = parseTime (t )
471
- if err != nil {
472
- return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
473
- }
474
- } else {
475
- start = minTime
476
+ start , err := parseTimeParam (r , "start" , minTime )
477
+ if err != nil {
478
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
476
479
}
477
-
478
- var end time.Time
479
- if t := r .FormValue ("end" ); t != "" {
480
- var err error
481
- end , err = parseTime (t )
482
- if err != nil {
483
- return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
484
- }
485
- } else {
486
- end = maxTime
480
+ end , err := parseTimeParam (r , "end" , maxTime )
481
+ if err != nil {
482
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
487
483
}
488
484
489
485
var matcherSets [][]* labels.Matcher
@@ -540,6 +536,18 @@ func (qapi *QueryAPI) series(r *http.Request) (interface{}, []error, *api.ApiErr
540
536
return metrics , set .Warnings (), nil
541
537
}
542
538
539
+ func parseTimeParam (r * http.Request , paramName string , defaultValue time.Time ) (time.Time , error ) {
540
+ val := r .FormValue (paramName )
541
+ if val == "" {
542
+ return defaultValue , nil
543
+ }
544
+ result , err := parseTime (val )
545
+ if err != nil {
546
+ return time.Time {}, errors .Wrapf (err , "Invalid time value for '%s'" , paramName )
547
+ }
548
+ return result , nil
549
+ }
550
+
543
551
func parseTime (s string ) (time.Time , error ) {
544
552
if t , err := strconv .ParseFloat (s , 64 ); err == nil {
545
553
s , ns := math .Modf (t )
@@ -568,6 +576,19 @@ func parseDuration(s string) (time.Duration, error) {
568
576
func (qapi * QueryAPI ) labelNames (r * http.Request ) (interface {}, []error , * api.ApiError ) {
569
577
ctx := r .Context ()
570
578
579
+ start , err := parseTimeParam (r , "start" , minTime )
580
+ if err != nil {
581
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
582
+ }
583
+ end , err := parseTimeParam (r , "end" , maxTime )
584
+ if err != nil {
585
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
586
+ }
587
+ if end .Before (start ) {
588
+ err := errors .New ("end timestamp must not be before start time" )
589
+ return nil , nil , & api.ApiError {Typ : api .ErrorBadData , Err : err }
590
+ }
591
+
571
592
enablePartialResponse , apiErr := qapi .parsePartialResponseParam (r , qapi .enableQueryPartialResponse )
572
593
if apiErr != nil {
573
594
return nil , nil , apiErr
@@ -578,7 +599,7 @@ func (qapi *QueryAPI) labelNames(r *http.Request) (interface{}, []error, *api.Ap
578
599
return nil , nil , apiErr
579
600
}
580
601
581
- q , err := qapi .queryableCreate (true , nil , storeMatchers , 0 , enablePartialResponse , false ).Querier (ctx , math . MinInt64 , math . MaxInt64 )
602
+ q , err := qapi .queryableCreate (true , nil , storeMatchers , 0 , enablePartialResponse , false ).Querier (ctx , timestamp . FromTime ( start ), timestamp . FromTime ( end ) )
582
603
if err != nil {
583
604
return nil , nil , & api.ApiError {Typ : api .ErrorExec , Err : err }
584
605
}
0 commit comments