github.com/grafana/pyroscope@v1.18.0/pkg/model/time.go (about)

     1  package model
     2  
     3  import (
     4  	"reflect"
     5  	"time"
     6  
     7  	"github.com/prometheus/common/model"
     8  )
     9  
    10  // TimeRangeRequest is a request that has a time interval.
    11  type TimeRangeRequest interface {
    12  	GetStart() int64
    13  	GetEnd() int64
    14  }
    15  
    16  // GetTimeRange returns the time interval and true if the request has an
    17  // interval, otherwise ok is false.
    18  func GetTimeRange(req TimeRangeRequest) (model.Interval, bool) {
    19  	if req.GetStart() == 0 || req.GetEnd() == 0 {
    20  		return model.Interval{}, false
    21  	}
    22  	return model.Interval{
    23  		Start: model.Time(req.GetStart()),
    24  		End:   model.Time(req.GetEnd()),
    25  	}, true
    26  }
    27  
    28  func GetSafeTimeRange(now time.Time, req any) model.Interval {
    29  	if r, ok := req.(TimeRangeRequest); ok {
    30  		x, ok := GetTimeRange(r)
    31  		if ok {
    32  			return x
    33  		}
    34  	}
    35  	return model.Interval{
    36  		Start: model.Time(now.Add(-time.Hour).UnixMilli()),
    37  		End:   model.Time(now.UnixMilli()),
    38  	}
    39  }
    40  
    41  func SetTimeRange(r interface{}, startTime, endTime model.Time) bool {
    42  	const startFieldName = "Start"
    43  	const endFieldName = "End"
    44  	defer func() { _ = recover() }()
    45  	v := reflect.ValueOf(r).Elem()
    46  	startField := v.FieldByName(startFieldName)
    47  	endField := v.FieldByName(endFieldName)
    48  	if !startField.IsValid() || !endField.IsValid() {
    49  		return false
    50  	}
    51  	if startField.Kind() != reflect.Int64 || endField.Kind() != reflect.Int64 {
    52  		return false
    53  	}
    54  	startField.SetInt(int64(startTime))
    55  	endField.SetInt(int64(endTime))
    56  	return true
    57  }