feat(alerting): add timeserie aggregation functions
This commit is contained in:
@@ -1,8 +1,47 @@
|
||||
package models
|
||||
|
||||
import "math"
|
||||
|
||||
type TimeSeries struct {
|
||||
Name string `json:"name"`
|
||||
Points [][2]float64 `json:"points"`
|
||||
|
||||
Avg float64
|
||||
Sum float64
|
||||
Min float64
|
||||
Max float64
|
||||
Mean float64
|
||||
}
|
||||
|
||||
type TimeSeriesSlice []*TimeSeries
|
||||
|
||||
func NewTimeSeries(name string, points [][2]float64) *TimeSeries {
|
||||
ts := &TimeSeries{
|
||||
Name: name,
|
||||
Points: points,
|
||||
}
|
||||
|
||||
ts.Min = points[0][0]
|
||||
ts.Max = points[0][0]
|
||||
|
||||
for _, v := range points {
|
||||
value := v[0]
|
||||
|
||||
if value > ts.Max {
|
||||
ts.Max = value
|
||||
}
|
||||
|
||||
if value < ts.Min {
|
||||
ts.Min = value
|
||||
}
|
||||
|
||||
ts.Sum += value
|
||||
}
|
||||
|
||||
ts.Avg = ts.Sum / float64(len(points))
|
||||
midPosition := int64(math.Floor(float64(len(points)) / float64(2)))
|
||||
|
||||
ts.Mean = points[midPosition][0]
|
||||
|
||||
return ts
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestTimeSeries(t *testing.T) {
|
||||
Convey("timeseries aggregation tests", t, func() {
|
||||
ts := NewTimeSeries("test", [][2]float64{
|
||||
{1, 0},
|
||||
{2, 0},
|
||||
{3, 0},
|
||||
})
|
||||
|
||||
Convey("sum", func() {
|
||||
So(ts.Sum, ShouldEqual, 6)
|
||||
})
|
||||
|
||||
Convey("avg", func() {
|
||||
So(ts.Avg, ShouldEqual, 2)
|
||||
})
|
||||
|
||||
Convey("min", func() {
|
||||
So(ts.Min, ShouldEqual, 1)
|
||||
})
|
||||
|
||||
Convey("max", func() {
|
||||
So(ts.Max, ShouldEqual, 3)
|
||||
})
|
||||
|
||||
Convey("mean", func() {
|
||||
So(ts.Mean, ShouldEqual, 2)
|
||||
})
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user