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