github.com/go-graphite/carbonapi@v0.17.0/expr/functions/aggregateLine/function_test.go (about) 1 package aggregateLine 2 3 import ( 4 "context" 5 "math" 6 "testing" 7 "time" 8 9 "github.com/go-graphite/carbonapi/expr/interfaces" 10 "github.com/go-graphite/carbonapi/expr/metadata" 11 "github.com/go-graphite/carbonapi/expr/types" 12 "github.com/go-graphite/carbonapi/pkg/parser" 13 th "github.com/go-graphite/carbonapi/tests" 14 ) 15 16 var ( 17 md []interfaces.FunctionMetadata = New("") 18 ) 19 20 func init() { 21 for _, m := range md { 22 metadata.RegisterFunction(m.Name, m.F) 23 } 24 } 25 26 func TestConstantLine(t *testing.T) { 27 now32 := int64(time.Now().Unix()) 28 29 tests := []th.EvalTestItem{ 30 { 31 "aggregateLine(metric[123])", 32 map[parser.MetricRequest][]*types.MetricData{ 33 {Metric: "metric[123]", From: 0, Until: 1}: { 34 types.MakeMetricData("metric1", []float64{1.0, math.NaN(), 2.0, 3.0, 4.0, 5.0}, 1, now32), 35 types.MakeMetricData("metric2", []float64{2.0, math.NaN(), 3.0, math.NaN(), 5.0, 6.0}, 1, now32), 36 types.MakeMetricData("metric3", []float64{3.0, math.NaN(), 4.0, 5.0, 6.0, math.NaN()}, 1, now32), 37 }, 38 }, 39 []*types.MetricData{ 40 types.MakeMetricData("aggregateLine(metric1, 3)", []float64{3, 3}, 6, now32).SetTag("name", "metric1"), 41 types.MakeMetricData("aggregateLine(metric2, 4)", []float64{4, 4}, 6, now32).SetTag("name", "metric2"), 42 types.MakeMetricData("aggregateLine(metric3, 4.5)", []float64{4.5, 4.5}, 6, now32).SetTag("name", "metric3"), 43 }, 44 }, 45 { 46 "aggregateLine(metric[12],'avg',true)", 47 map[parser.MetricRequest][]*types.MetricData{ 48 {Metric: "metric[12]", From: 0, Until: 1}: { 49 types.MakeMetricData("metric1", []float64{math.NaN(), math.NaN(), math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32), 50 types.MakeMetricData("metric2", []float64{2.0, 6.0, 3.0, 2.0, 5.0, 6.0}, 1, now32), 51 }, 52 }, 53 []*types.MetricData{ 54 types.MakeMetricData("aggregateLine(metric1, None)", []float64{math.NaN(), math.NaN(), math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32).SetTag("name", "metric1"), 55 types.MakeMetricData("aggregateLine(metric2, 4)", []float64{4, 4, 4, 4, 4, 4}, 1, now32).SetTag("name", "metric2"), 56 }, 57 }, 58 } 59 60 for _, tt := range tests { 61 testName := tt.Target 62 t.Run(testName, func(t *testing.T) { 63 eval := th.EvaluatorFromFunc(md[0].F) 64 th.TestEvalExpr(t, eval, &tt) 65 }) 66 } 67 68 } 69 70 func BenchmarkAverageSeries(b *testing.B) { 71 target := "aggregateLine(metric[12],'avg',true)" 72 metrics := map[parser.MetricRequest][]*types.MetricData{ 73 {Metric: "metric[12]", From: 0, Until: 1}: { 74 types.MakeMetricData("metric1", []float64{math.NaN(), math.NaN(), math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, 1), 75 types.MakeMetricData("metric2", []float64{2.0, 6.0, 3.0, 2.0, 5.0, 6.0}, 1, 1), 76 }, 77 } 78 79 eval := th.EvaluatorFromFunc(md[0].F) 80 exp, _, err := parser.ParseExpr(target) 81 if err != nil { 82 b.Fatalf("failed to parse %s: %+v", target, err) 83 } 84 85 b.ResetTimer() 86 for n := 0; n < b.N; n++ { 87 g, err := eval.Eval(context.Background(), exp, 0, 1, metrics) 88 if err != nil { 89 b.Fatalf("failed to eval %s: %+v", target, err) 90 } 91 _ = g 92 } 93 }