github.com/go-graphite/carbonapi@v0.17.0/expr/functions/averageOutsidePercentile/function.go (about) 1 package averageOutsidePercentile 2 3 import ( 4 "context" 5 6 "github.com/go-graphite/carbonapi/expr/consolidations" 7 "github.com/go-graphite/carbonapi/expr/helper" 8 "github.com/go-graphite/carbonapi/expr/interfaces" 9 "github.com/go-graphite/carbonapi/expr/types" 10 "github.com/go-graphite/carbonapi/pkg/parser" 11 ) 12 13 type averageOutsidePercentile struct{} 14 15 func GetOrder() interfaces.Order { 16 return interfaces.Any 17 } 18 19 func New(configFile string) []interfaces.FunctionMetadata { 20 res := make([]interfaces.FunctionMetadata, 0) 21 f := &averageOutsidePercentile{} 22 for _, n := range []string{"averageOutsidePercentile"} { 23 res = append(res, interfaces.FunctionMetadata{Name: n, F: f}) 24 } 25 return res 26 } 27 28 // averageOutsidePercentile(seriesList, n) 29 func (f *averageOutsidePercentile) Do(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, error) { 30 if e.ArgsLen() < 2 { 31 return nil, parser.ErrMissingArgument 32 } 33 34 args, err := helper.GetSeriesArg(ctx, eval, e.Arg(0), from, until, values) 35 if err != nil { 36 return nil, err 37 } 38 39 number, err := e.GetFloatArg(1) 40 if err != nil { 41 return nil, err 42 } 43 44 var results []*types.MetricData 45 46 if number < 50.0 { 47 number = 100.0 - number 48 } 49 50 var lowerThreshold float64 51 var higherThreshold float64 52 53 var averages = make([]float64, len(args)) 54 for i, arg := range args { 55 averages[i] = consolidations.AggMean(arg.Values) 56 } 57 58 if len(averages) > 0 { 59 lowerThreshold = consolidations.Percentile(averages, (100.0 - number), false) 60 higherThreshold = consolidations.Percentile(averages, number, false) 61 } 62 63 for i, arg := range args { 64 if !(averages[i] > lowerThreshold && averages[i] < higherThreshold) { 65 results = append(results, arg) 66 } 67 68 } 69 return results, nil 70 } 71 72 // Description is auto-generated description, based on output of https://github.com/graphite-project/graphite-web 73 func (f *averageOutsidePercentile) Description() map[string]types.FunctionDescription { 74 return map[string]types.FunctionDescription{ 75 "averageOutsidePercentile": { 76 Description: "Removes series lying inside an average percentile interval.\n\n", 77 Function: "averageOutsidePercentile(seriesList, n)", 78 Group: "Combine", 79 Module: "graphite.render.functions", 80 Name: "averageSeriesWithWildcards", 81 Params: []types.FunctionParam{ 82 { 83 Name: "seriesList", 84 Required: true, 85 Type: types.SeriesList, 86 }, 87 { 88 Required: true, 89 Name: "n", 90 Type: types.Integer, 91 }, 92 }, 93 }, 94 } 95 }