72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
package transformers
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
|
|
"github.com/grafana/grafana/pkg/tsdb"
|
|
)
|
|
|
|
func NewAggregationTransformer(method string) *AggregationTransformer {
|
|
return &AggregationTransformer{
|
|
Method: method,
|
|
}
|
|
}
|
|
|
|
type AggregationTransformer struct {
|
|
Method string
|
|
}
|
|
|
|
func (at *AggregationTransformer) Transform(timeserie *tsdb.TimeSeries) (float64, error) {
|
|
|
|
if at.Method == "avg" {
|
|
sum := float64(0)
|
|
for _, point := range timeserie.Points {
|
|
sum += point[0]
|
|
}
|
|
|
|
return sum / float64(len(timeserie.Points)), nil
|
|
}
|
|
|
|
if at.Method == "sum" {
|
|
sum := float64(0)
|
|
|
|
for _, v := range timeserie.Points {
|
|
sum += v[0]
|
|
}
|
|
|
|
return sum, nil
|
|
}
|
|
|
|
if at.Method == "min" {
|
|
min := timeserie.Points[0][0]
|
|
|
|
for _, v := range timeserie.Points {
|
|
if v[0] < min {
|
|
min = v[0]
|
|
}
|
|
}
|
|
|
|
return min, nil
|
|
}
|
|
|
|
if at.Method == "max" {
|
|
max := timeserie.Points[0][0]
|
|
|
|
for _, v := range timeserie.Points {
|
|
if v[0] > max {
|
|
max = v[0]
|
|
}
|
|
}
|
|
|
|
return max, nil
|
|
}
|
|
|
|
if at.Method == "mean" {
|
|
midPosition := int64(math.Floor(float64(len(timeserie.Points)) / float64(2)))
|
|
return timeserie.Points[midPosition][0], nil
|
|
}
|
|
|
|
return float64(0), fmt.Errorf("Missing method")
|
|
}
|