github.com/go-graphite/carbonapi@v0.17.0/expr/functions/aliasByNode/function.go (about)

     1  package aliasByNode
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/go-graphite/carbonapi/expr/helper"
     7  	"github.com/go-graphite/carbonapi/expr/interfaces"
     8  	"github.com/go-graphite/carbonapi/expr/types"
     9  	"github.com/go-graphite/carbonapi/pkg/parser"
    10  )
    11  
    12  type aliasByNode struct{}
    13  
    14  func GetOrder() interfaces.Order {
    15  	return interfaces.Any
    16  }
    17  
    18  func New(configFile string) []interfaces.FunctionMetadata {
    19  	res := make([]interfaces.FunctionMetadata, 0)
    20  	f := &aliasByNode{}
    21  	for _, n := range []string{"aliasByNode", "aliasByTags"} {
    22  		res = append(res, interfaces.FunctionMetadata{Name: n, F: f})
    23  	}
    24  	return res
    25  }
    26  
    27  func (f *aliasByNode) Do(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, error) {
    28  	if e.ArgsLen() < 2 {
    29  		return nil, parser.ErrMissingArgument
    30  	}
    31  
    32  	args, err := helper.GetSeriesArg(ctx, eval, e.Arg(0), from, until, values)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	nodesOrTags, err := e.GetNodeOrTagArgs(1, false)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  
    42  	results := make([]*types.MetricData, len(args))
    43  
    44  	for i, a := range args {
    45  		r := a.CopyLinkTags()
    46  		r.Name = helper.AggKey(a, nodesOrTags)
    47  		results[i] = r
    48  	}
    49  
    50  	return results, nil
    51  }
    52  
    53  // Description is auto-generated description, based on output of https://github.com/graphite-project/graphite-web
    54  func (f *aliasByNode) Description() map[string]types.FunctionDescription {
    55  	return map[string]types.FunctionDescription{
    56  		"aliasByNode": {
    57  			Description: "Takes a seriesList and applies an alias derived from one or more \"node\"\nportion/s of the target name or tags. Node indices are 0 indexed.\n\n.. code-block:: none\n\n  &target=aliasByNode(ganglia.*.cpu.load5,1)\n\nEach node may be an integer referencing a node in the series name or a string identifying a tag.\n\n.. code-block :: none\n\n  &target=seriesByTag(\"name=~cpu.load.*\", \"server=~server[1-9}+\", \"datacenter=dc1\")|aliasByNode(\"datacenter\", \"server\", 1)\n\n  # will produce output series like\n  # dc1.server1.load5, dc1.server2.load5, dc1.server1.load10, dc1.server2.load10",
    58  			Function:    "aliasByNode(seriesList, *nodes)",
    59  			Group:       "Alias",
    60  			Module:      "graphite.render.functions",
    61  			Name:        "aliasByNode",
    62  			Params: []types.FunctionParam{
    63  				{
    64  					Name:     "seriesList",
    65  					Required: true,
    66  					Type:     types.SeriesList,
    67  				},
    68  				{
    69  					Multiple: true,
    70  					Name:     "nodes",
    71  					Required: true,
    72  					Type:     types.NodeOrTag,
    73  				},
    74  			},
    75  			NameChange: true, // name changed
    76  			TagsChange: true, // name tag changed
    77  		},
    78  		"aliasByTags": {
    79  			Description: "Takes a seriesList and applies an alias derived from one or more tags",
    80  			Function:    "aliasByTags(seriesList, *tags)",
    81  			Group:       "Alias",
    82  			Module:      "graphite.render.functions",
    83  			Name:        "aliasByTags",
    84  			Params: []types.FunctionParam{
    85  				{
    86  					Name:     "seriesList",
    87  					Required: true,
    88  					Type:     types.SeriesList,
    89  				},
    90  				{
    91  					Multiple: true,
    92  					Name:     "tags",
    93  					Required: true,
    94  					Type:     types.NodeOrTag,
    95  				},
    96  			},
    97  			NameChange: true, // name changed
    98  			TagsChange: true, // name tag changed
    99  		},
   100  	}
   101  }