Implement timeShift

This commit is contained in:
Alexander Zobnin
2021-05-27 14:16:10 +03:00
parent 9a63a1f70f
commit 43e9527a0f
3 changed files with 96 additions and 0 deletions

View File

@@ -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":