Implement timeShift
This commit is contained in:
@@ -3,9 +3,11 @@ package datasource
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/alexanderzobnin/grafana-zabbix/pkg/gtime"
|
||||
"github.com/alexanderzobnin/grafana-zabbix/pkg/timeseries"
|
||||
"github.com/alexanderzobnin/grafana-zabbix/pkg/zabbix"
|
||||
)
|
||||
|
||||
const RANGE_VARIABLE_VALUE = "range_series"
|
||||
@@ -41,12 +43,16 @@ type DataProcessingFunc = func(series timeseries.TimeSeries, params ...interface
|
||||
|
||||
type AggDataProcessingFunc = func(series []*timeseries.TimeSeriesData, params ...interface{}) ([]*timeseries.TimeSeriesData, error)
|
||||
|
||||
type PreProcessingFunc = func(query *QueryModel, items []*zabbix.Item, params ...interface{}) error
|
||||
|
||||
var seriesFuncMap map[string]DataProcessingFunc
|
||||
|
||||
var aggFuncMap map[string]AggDataProcessingFunc
|
||||
|
||||
var filterFuncMap map[string]AggDataProcessingFunc
|
||||
|
||||
var timeFuncMap map[string]PreProcessingFunc
|
||||
|
||||
var frontendFuncMap map[string]bool
|
||||
|
||||
func init() {
|
||||
@@ -55,6 +61,7 @@ func init() {
|
||||
"scale": applyScale,
|
||||
"offset": applyOffset,
|
||||
"percentile": applyPercentile,
|
||||
"timeShift": applyTimeShiftPost,
|
||||
}
|
||||
|
||||
aggFuncMap = map[string]AggDataProcessingFunc{
|
||||
@@ -69,6 +76,10 @@ func init() {
|
||||
"sortSeries": applySortSeries,
|
||||
}
|
||||
|
||||
timeFuncMap = map[string]PreProcessingFunc{
|
||||
"timeShift": applyTimeShiftPre,
|
||||
}
|
||||
|
||||
// Functions processing on the frontend
|
||||
frontendFuncMap = map[string]bool{
|
||||
"setAlias": true,
|
||||
@@ -109,6 +120,20 @@ func applyFunctions(series []*timeseries.TimeSeriesData, functions []QueryFuncti
|
||||
return series, nil
|
||||
}
|
||||
|
||||
// applyFunctionsPre applies functions requires pre-processing, like timeShift() (it needs to change original time range)
|
||||
func applyFunctionsPre(query *QueryModel, items []*zabbix.Item) error {
|
||||
for _, f := range query.Functions {
|
||||
if applyFunc, ok := timeFuncMap[f.Def.Name]; ok {
|
||||
err := applyFunc(query, items, f.Params...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func applyGroupBy(series timeseries.TimeSeries, params ...interface{}) (timeseries.TimeSeries, error) {
|
||||
pInterval, err := MustString(params[0])
|
||||
pAgg, err := MustString(params[1])
|
||||
@@ -256,6 +281,58 @@ func applySortSeries(series []*timeseries.TimeSeriesData, params ...interface{})
|
||||
return sorted, nil
|
||||
}
|
||||
|
||||
func applyTimeShiftPre(query *QueryModel, items []*zabbix.Item, params ...interface{}) error {
|
||||
pInterval, err := MustString(params[0])
|
||||
if err != nil {
|
||||
return errParsingFunctionParam(err)
|
||||
}
|
||||
shiftForward := false
|
||||
pInterval = strings.TrimPrefix(pInterval, "-")
|
||||
if strings.Index(pInterval, "+") == 0 {
|
||||
pInterval = strings.TrimPrefix(pInterval, "+")
|
||||
shiftForward = true
|
||||
}
|
||||
|
||||
interval, err := gtime.ParseInterval(pInterval)
|
||||
if err != nil {
|
||||
return errParsingFunctionParam(err)
|
||||
}
|
||||
|
||||
if shiftForward {
|
||||
query.TimeRange.From = query.TimeRange.From.Add(interval)
|
||||
query.TimeRange.To = query.TimeRange.To.Add(interval)
|
||||
} else {
|
||||
query.TimeRange.From = query.TimeRange.From.Add(-interval)
|
||||
query.TimeRange.To = query.TimeRange.To.Add(-interval)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func applyTimeShiftPost(series timeseries.TimeSeries, params ...interface{}) (timeseries.TimeSeries, error) {
|
||||
pInterval, err := MustString(params[0])
|
||||
if err != nil {
|
||||
return nil, errParsingFunctionParam(err)
|
||||
}
|
||||
shiftForward := false
|
||||
pInterval = strings.TrimPrefix(pInterval, "-")
|
||||
if strings.Index(pInterval, "+") == 0 {
|
||||
pInterval = strings.TrimPrefix(pInterval, "+")
|
||||
shiftForward = true
|
||||
}
|
||||
|
||||
interval, err := gtime.ParseInterval(pInterval)
|
||||
if err != nil {
|
||||
return nil, errParsingFunctionParam(err)
|
||||
}
|
||||
if shiftForward == true {
|
||||
interval = -interval
|
||||
}
|
||||
|
||||
transformFunc := timeseries.TransformShiftTime(interval)
|
||||
return series.Transform(transformFunc), nil
|
||||
}
|
||||
|
||||
func getAggFunc(agg string) timeseries.AggFunc {
|
||||
switch agg {
|
||||
case "avg":
|
||||
|
||||
Reference in New Issue
Block a user