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 }