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  }