github.com/go-graphite/carbonapi@v0.17.0/expr/functions/percentileOfSeries/function.go (about) 1 package percentileOfSeries 2 3 import ( 4 "context" 5 6 "github.com/go-graphite/carbonapi/expr/consolidations" 7 fconfig "github.com/go-graphite/carbonapi/expr/functions/config" 8 "github.com/go-graphite/carbonapi/expr/helper" 9 "github.com/go-graphite/carbonapi/expr/interfaces" 10 "github.com/go-graphite/carbonapi/expr/types" 11 "github.com/go-graphite/carbonapi/pkg/parser" 12 ) 13 14 type Config struct { 15 ExtractTagsFromArgs bool 16 } 17 18 type percentileOfSeries struct { 19 extractTagsFromArgs bool 20 } 21 22 func GetOrder() interfaces.Order { 23 return interfaces.Any 24 } 25 26 func New(configFile string) []interfaces.FunctionMetadata { 27 res := make([]interfaces.FunctionMetadata, 0) 28 f := &percentileOfSeries{} 29 functions := []string{"percentileOfSeries"} 30 for _, n := range functions { 31 res = append(res, interfaces.FunctionMetadata{Name: n, F: f}) 32 } 33 return res 34 } 35 36 // percentileOfSeries(seriesList, n, interpolate=False) 37 func (f *percentileOfSeries) Do(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, error) { 38 // TODO(dgryski): make sure the arrays are all the same 'size' 39 if e.ArgsLen() < 2 { 40 return nil, parser.ErrMissingArgument 41 } 42 43 args, err := helper.GetSeriesArg(ctx, eval, e.Arg(0), from, until, values) 44 if err != nil { 45 return nil, err 46 } 47 48 if len(args) == 0 { 49 return []*types.MetricData{}, nil 50 } 51 52 percent, err := e.GetFloatArg(1) 53 if err != nil { 54 return nil, err 55 } 56 57 interpolate, err := e.GetBoolNamedOrPosArgDefault("interpolate", 2, false) 58 if err != nil { 59 return nil, err 60 } 61 62 xFilesFactor := args[0].XFilesFactor 63 64 return helper.AggregateSeries(e, args, func(values []float64) float64 { 65 return consolidations.Percentile(values, percent, interpolate) 66 }, float64(xFilesFactor), fconfig.Config.ExtractTagsFromArgs) 67 } 68 69 // SetExtractTagsFromArgs for use in tests 70 func (f *percentileOfSeries) SetExtractTagsFromArgs(e bool) { 71 f.extractTagsFromArgs = e 72 } 73 74 // Description is auto-generated description, based on output of https://github.com/graphite-project/graphite-web 75 func (f *percentileOfSeries) Description() map[string]types.FunctionDescription { 76 return map[string]types.FunctionDescription{ 77 "percentileOfSeries": { 78 Description: "percentileOfSeries returns a single series which is composed of the n-percentile\nvalues taken across a wildcard series at each point. Unless `interpolate` is\nset to True, percentile values are actual values contained in one of the\nsupplied series.", 79 Function: "percentileOfSeries(seriesList, n, interpolate=False)", 80 Group: "Combine", 81 Module: "graphite.render.functions", 82 Name: "percentileOfSeries", 83 Params: []types.FunctionParam{ 84 { 85 Name: "seriesList", 86 Required: true, 87 Type: types.SeriesList, 88 }, 89 { 90 Name: "n", 91 Required: true, 92 Type: types.Integer, 93 }, 94 { 95 Default: types.NewSuggestion(false), 96 Name: "interpolate", 97 Type: types.Boolean, 98 }, 99 }, 100 SeriesChange: true, // function aggregate metrics or change series items count 101 NameChange: true, // name changed 102 TagsChange: true, // name tag changed 103 ValuesChange: true, // values changed 104 }, 105 } 106 }