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  }