github.com/go-graphite/carbonapi@v0.17.0/expr/functions/delay/function_test.go (about)

     1  package delay
     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  	"github.com/go-graphite/carbonapi/tests/compare"
    15  )
    16  
    17  var (
    18  	md []interfaces.FunctionMetadata = New("")
    19  )
    20  
    21  func init() {
    22  	for _, m := range md {
    23  		metadata.RegisterFunction(m.Name, m.F)
    24  	}
    25  }
    26  
    27  func TestDelay(t *testing.T) {
    28  	now32 := int64(time.Now().Unix())
    29  
    30  	tests := []th.EvalTestItem{
    31  		{
    32  			"delay(metric1,3)",
    33  			map[parser.MetricRequest][]*types.MetricData{
    34  				{Metric: "metric1", From: 0, Until: 1}: {types.MakeMetricData("metric1", []float64{1, 2, 3, math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32)},
    35  			},
    36  			[]*types.MetricData{types.MakeMetricData("delay(metric1,3)",
    37  				[]float64{math.NaN(), math.NaN(), math.NaN(), 1, 2, 3, math.NaN()}, 1, now32).SetTag("delay", "3").SetNameTag("metric1")},
    38  		},
    39  		{
    40  			"delay(metric1,-3)",
    41  			map[parser.MetricRequest][]*types.MetricData{
    42  				{Metric: "metric1", From: 0, Until: 1}: {types.MakeMetricData("metric1", []float64{math.NaN(), math.NaN(), math.NaN(), 1, 2, 3, math.NaN()}, 1, now32)},
    43  			},
    44  			[]*types.MetricData{types.MakeMetricData("delay(metric1,-3)",
    45  				[]float64{1, 2, 3, math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32).SetTag("delay", "-3").SetNameTag("metric1")},
    46  		},
    47  		{
    48  			"delay(metric1,0)",
    49  			map[parser.MetricRequest][]*types.MetricData{
    50  				{Metric: "metric1", From: 0, Until: 1}: {types.MakeMetricData("metric1", []float64{1, 2, 3, math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32)},
    51  			},
    52  			[]*types.MetricData{types.MakeMetricData("delay(metric1,0)",
    53  				[]float64{1, 2, 3, math.NaN(), math.NaN(), math.NaN(), math.NaN()}, 1, now32).SetTag("delay", "0").SetNameTag("metric1")},
    54  		},
    55  	}
    56  
    57  	for _, tt := range tests {
    58  		testName := tt.Target
    59  		t.Run(testName, func(t *testing.T) {
    60  			eval := th.EvaluatorFromFunc(md[0].F)
    61  			th.TestEvalExpr(t, eval, &tt)
    62  		})
    63  	}
    64  
    65  }
    66  
    67  func BenchmarkDelay(b *testing.B) {
    68  	target := "delay(metric*,3)"
    69  	metrics := map[parser.MetricRequest][]*types.MetricData{
    70  		{Metric: "metric*", From: 0, Until: 1}: {
    71  			types.MakeMetricData("metric1", compare.GenerateMetrics(2046, 1, 10, 1), 1, 1),
    72  			types.MakeMetricData("metric2", compare.GenerateMetrics(2046, 1, 10, 1), 1, 1),
    73  		},
    74  	}
    75  
    76  	eval := th.EvaluatorFromFunc(md[0].F)
    77  	exp, _, err := parser.ParseExpr(target)
    78  	if err != nil {
    79  		b.Fatalf("failed to parse %s: %+v", target, err)
    80  	}
    81  
    82  	b.ResetTimer()
    83  	for n := 0; n < b.N; n++ {
    84  		g, err := eval.Eval(context.Background(), exp, 0, 1, metrics)
    85  		if err != nil {
    86  			b.Fatalf("failed to eval %s: %+v", target, err)
    87  		}
    88  		_ = g
    89  	}
    90  }
    91  
    92  func BenchmarkDelayReverse(b *testing.B) {
    93  	target := "delay(metric*,-3)"
    94  	metrics := map[parser.MetricRequest][]*types.MetricData{
    95  		{Metric: "metric*", From: 0, Until: 1}: {
    96  			types.MakeMetricData("metric1", compare.GenerateMetrics(2046, 1, 10, 1), 1, 1),
    97  			types.MakeMetricData("metric2", compare.GenerateMetrics(2046, 1, 10, 1), 1, 1),
    98  		},
    99  	}
   100  
   101  	eval := th.EvaluatorFromFunc(md[0].F)
   102  	exp, _, err := parser.ParseExpr(target)
   103  	if err != nil {
   104  		b.Fatalf("failed to parse %s: %+v", target, err)
   105  	}
   106  
   107  	b.ResetTimer()
   108  	for n := 0; n < b.N; n++ {
   109  		g, err := eval.Eval(context.Background(), exp, 0, 1, metrics)
   110  		if err != nil {
   111  			b.Fatalf("failed to eval %s: %+v", target, err)
   112  		}
   113  		_ = g
   114  	}
   115  }