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