func QueryRange(url, query, start, end string, step time.Duration, p printer) int {
	config := api.Config{
		Address: url,
	}

	// Create new client.
	c, err := api.NewClient(config)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error creating API client:", err)
		return 1
	}

	var stime, etime time.Time

	if end == "" {
		etime = time.Now()
	} else {
		etime, err = parseTime(end)
		if err != nil {
			fmt.Fprintln(os.Stderr, "error parsing end time:", err)
			return 1
		}
	}

	if start == "" {
		stime = etime.Add(-5 * time.Minute)
	} else {
		stime, err = parseTime(start)
		if err != nil {
			fmt.Fprintln(os.Stderr, "error parsing start time:", err)
		}
	}

	if !stime.Before(etime) {
		fmt.Fprintln(os.Stderr, "start time is not before end time")
	}

	if step == 0 {
		resolution := math.Max(math.Floor(etime.Sub(stime).Seconds()/250), 1)
		// Convert seconds to nanoseconds such that time.Duration parses correctly.
		step = time.Duration(resolution) * time.Second
	}

	// Run query against client.
	api := v1.NewAPI(c)
	r := v1.Range{Start: stime, End: etime, Step: step}
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	val, err := api.QueryRange(ctx, query, r)
	cancel()

	if err != nil {
		fmt.Fprintln(os.Stderr, "query error:", err)
		return 1
	}

	p.printValue(val)
	return 0
}
func QueryRange(url, query, start, end string, step time.Duration, p printer) int {
	config := api.Config{
		Address: url,
	}

	
	c, err := api.NewClient(config)
	if err != nil {
		fmt.Fprintln(os.Stderr, "error creating API client:", err)
		return 1
	}

	var stime, etime time.Time

	if end == "" {
		etime = time.Now()
	} else {
		etime, err = parseTime(end)
		if err != nil {
			fmt.Fprintln(os.Stderr, "error parsing end time:", err)
			return 1
		}
	}

	if start == "" {
		stime = etime.Add(-5 * time.Minute)
	} else {
		stime, err = parseTime(start)
		if err != nil {
			fmt.Fprintln(os.Stderr, "error parsing start time:", err)
		}
	}

	if !stime.Before(etime) {
		fmt.Fprintln(os.Stderr, "start time is not before end time")
	}

	if step == 0 {
		resolution := math.Max(math.Floor(etime.Sub(stime).Seconds()/250), 1)
		
		step = time.Duration(resolution) * time.Second
	}

	
	api := v1.NewAPI(c)
	r := v1.Range{Start: stime, End: etime, Step: step}
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	val, err := api.QueryRange(ctx, query, r)
	cancel()

	if err != nil {
		fmt.Fprintln(os.Stderr, "query error:", err)
		return 1
	}

	p.printValue(val)
	return 0
}
func QueryRange ( url , query , start , end string , step time . Duration , p printer ) int { config := api . Config { Address : url , } // Create new client. c , err := api . NewClient ( config ) if err != nil { fmt . Fprintln ( os . Stderr , " " , err ) return 1 } var stime , etime time . Time if end == " " { etime = time . Now ( ) } else { etime , err = parseTime ( end ) if err != nil { fmt . Fprintln ( os . Stderr , " " , err ) return 1 } } if start == " " { stime = etime . Add ( - 5 * time . Minute ) } else { stime , err = parseTime ( start ) if err != nil { fmt . Fprintln ( os . Stderr , " " , err ) } } if ! stime . Before ( etime ) { fmt . Fprintln ( os . Stderr , " " ) } if step == 0 { resolution := math . Max ( math . Floor ( etime . Sub ( stime ) . Seconds ( ) / 250 ) , 1 ) // Convert seconds to nanoseconds such that time.Duration parses correctly. step = time . Duration ( resolution ) * time . Second } // Run query against client. api := v1 . NewAPI ( c ) r := v1 . Range { Start : stime , End : etime , Step : step } ctx , cancel := context . WithTimeout ( context . Background ( ) , 2 * time . Minute ) val , err := api . QueryRange ( ctx , query , r ) cancel ( ) if err != nil { fmt . Fprintln ( os . Stderr , " " , err ) return 1 } p . printValue ( val ) return 0 }
// QueryRange performs a range query against a Prometheus server.
QueryRange performs a range query against a Prometheus server .