aggregation.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package transformers
  2. import (
  3. "fmt"
  4. "math"
  5. "github.com/grafana/grafana/pkg/tsdb"
  6. )
  7. func NewAggregationTransformer(method string) *AggregationTransformer {
  8. return &AggregationTransformer{
  9. Method: method,
  10. }
  11. }
  12. type AggregationTransformer struct {
  13. Method string
  14. }
  15. func (at *AggregationTransformer) Transform(timeserie *tsdb.TimeSeries) (float64, error) {
  16. if at.Method == "avg" {
  17. sum := float64(0)
  18. for _, point := range timeserie.Points {
  19. sum += point[0]
  20. }
  21. return sum / float64(len(timeserie.Points)), nil
  22. }
  23. if at.Method == "sum" {
  24. sum := float64(0)
  25. for _, v := range timeserie.Points {
  26. sum += v[0]
  27. }
  28. return sum, nil
  29. }
  30. if at.Method == "min" {
  31. min := timeserie.Points[0][0]
  32. for _, v := range timeserie.Points {
  33. if v[0] < min {
  34. min = v[0]
  35. }
  36. }
  37. return min, nil
  38. }
  39. if at.Method == "max" {
  40. max := timeserie.Points[0][0]
  41. for _, v := range timeserie.Points {
  42. if v[0] > max {
  43. max = v[0]
  44. }
  45. }
  46. return max, nil
  47. }
  48. if at.Method == "mean" {
  49. midPosition := int64(math.Floor(float64(len(timeserie.Points)) / float64(2)))
  50. return timeserie.Points[midPosition][0], nil
  51. }
  52. return float64(0), fmt.Errorf("Missing method")
  53. }