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 }