github.com/go-graphite/carbonapi@v0.17.0/expr/functions/changed/function.go (about) 1 package changed 2 3 import ( 4 "context" 5 "math" 6 7 "github.com/go-graphite/carbonapi/expr/helper" 8 "github.com/go-graphite/carbonapi/expr/interfaces" 9 "github.com/go-graphite/carbonapi/expr/types" 10 "github.com/go-graphite/carbonapi/pkg/parser" 11 ) 12 13 type changed struct{} 14 15 func GetOrder() interfaces.Order { 16 return interfaces.Any 17 } 18 19 func New(configFile string) []interfaces.FunctionMetadata { 20 res := make([]interfaces.FunctionMetadata, 0) 21 f := &changed{} 22 functions := []string{"changed"} 23 for _, n := range functions { 24 res = append(res, interfaces.FunctionMetadata{Name: n, F: f}) 25 } 26 return res 27 } 28 29 // changed(SeriesList) 30 func (f *changed) Do(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, error) { 31 args, err := helper.GetSeriesArg(ctx, eval, e.Arg(0), from, until, values) 32 if err != nil { 33 return nil, err 34 } 35 36 result := make([]*types.MetricData, len(args)) 37 for i, a := range args { 38 r := a.CopyTag(e.Target()+"("+a.Name+")", a.Tags) 39 r.Values = make([]float64, len(a.Values)) 40 41 prev := math.NaN() 42 for i, v := range a.Values { 43 if math.IsNaN(prev) { 44 prev = v 45 r.Values[i] = 0 46 } else if !math.IsNaN(v) && prev != v { 47 r.Values[i] = 1 48 prev = v 49 } else { 50 r.Values[i] = 0 51 } 52 } 53 result[i] = r 54 } 55 return result, nil 56 } 57 58 // Description is auto-generated description, based on output of https://github.com/graphite-project/graphite-web 59 func (f *changed) Description() map[string]types.FunctionDescription { 60 return map[string]types.FunctionDescription{ 61 "changed": { 62 Description: "Takes one metric or a wildcard seriesList.\nOutput 1 when the value changed, 0 when null or the same\n\nExample:\n\n.. code-block:: none\n\n &target=changed(Server01.connections.handled)", 63 Function: "changed(seriesList)", 64 Group: "Special", 65 Module: "graphite.render.functions", 66 Name: "changed", 67 Params: []types.FunctionParam{ 68 { 69 Name: "seriesList", 70 Required: true, 71 Type: types.SeriesList, 72 }, 73 }, 74 NameChange: true, // name changed 75 ValuesChange: true, // values changed 76 }, 77 } 78 }