Files
grafana-zabbix/pkg/datasource/functions.go
Alexander Zobnin addd86d7cd More agg functions
2021-05-25 16:04:05 +03:00

78 lines
1.7 KiB
Go

package datasource
import (
"fmt"
"github.com/alexanderzobnin/grafana-zabbix/pkg/gtime"
"github.com/alexanderzobnin/grafana-zabbix/pkg/timeseries"
)
var errFunctionNotSupported = func(name string) error {
return fmt.Errorf("function not supported: %s", name)
}
type DataProcessingFunc = func(series timeseries.TimeSeries, params ...string) (timeseries.TimeSeries, error)
var funcMap map[string]DataProcessingFunc
func init() {
funcMap = map[string]DataProcessingFunc{
"groupBy": applyGroupBy,
}
}
func applyFunctions(series []*timeseries.TimeSeriesData, functions []QueryFunction) ([]*timeseries.TimeSeriesData, error) {
for _, f := range functions {
if applyFunc, ok := funcMap[f.Def.Name]; ok {
for _, s := range series {
result, err := applyFunc(s.TS, f.Params...)
if err != nil {
return nil, err
}
s.TS = result
}
} else {
err := errFunctionNotSupported(f.Def.Name)
return series, err
}
}
return series, nil
}
func applyGroupBy(series timeseries.TimeSeries, params ...string) (timeseries.TimeSeries, error) {
pInterval := params[0]
pAgg := params[1]
interval, err := gtime.ParseInterval(pInterval)
if err != nil {
return nil, err
}
aggFunc := getAggFunc(pAgg)
s := series.GroupBy(interval, aggFunc)
return s, nil
}
func getAggFunc(agg string) timeseries.AggFunc {
switch agg {
case "avg":
return timeseries.AggAvg
case "max":
return timeseries.AggMax
case "min":
return timeseries.AggMin
case "sum":
return timeseries.AggSum
case "median":
return timeseries.AggMedian
case "count":
return timeseries.AggCount
case "first":
return timeseries.AggFirst
case "last":
return timeseries.AggLast
default:
return timeseries.AggAvg
}
}