diff --git a/plugins/processors/topk/README.md b/plugins/processors/topk/README.md index 9c9e48af9..15046991d 100644 --- a/plugins/processors/topk/README.md +++ b/plugins/processors/topk/README.md @@ -72,3 +72,36 @@ This processor does not add tags by default. But the setting `add_groupby_tag` w ### Fields: This processor does not add fields by default. But the settings `add_rank_fields` and `add_aggregation_fields` will add one or several fields if set to anything other than "" + + +### Example +**Config** +```toml +[[processors.topk]] + period = 20 + k = 3 + group_by = ["pid"] + fields = ["cpu_usage"] +``` + +**Output difference with topk** +```diff +< procstat,pid=2088,process_name=Xorg cpu_usage=7.296576662282613 1546473820000000000 +< procstat,pid=2780,process_name=ibus-engine-simple cpu_usage=0 1546473820000000000 +< procstat,pid=2554,process_name=gsd-sound cpu_usage=0 1546473820000000000 +< procstat,pid=3484,process_name=chrome cpu_usage=4.274300361942799 1546473820000000000 +< procstat,pid=2467,process_name=gnome-shell-calendar-server cpu_usage=0 1546473820000000000 +< procstat,pid=2525,process_name=gvfs-goa-volume-monitor cpu_usage=0 1546473820000000000 +< procstat,pid=2888,process_name=gnome-terminal-server cpu_usage=1.0224991500287577 1546473820000000000 +< procstat,pid=2454,process_name=ibus-x11 cpu_usage=0 1546473820000000000 +< procstat,pid=2564,process_name=gsd-xsettings cpu_usage=0 1546473820000000000 +< procstat,pid=12184,process_name=docker cpu_usage=0 1546473820000000000 +< procstat,pid=2432,process_name=pulseaudio cpu_usage=9.892858669796528 1546473820000000000 +--- +> procstat,pid=2432,process_name=pulseaudio cpu_usage=11.486933087507786 1546474120000000000 +> procstat,pid=2432,process_name=pulseaudio cpu_usage=10.056503212060552 1546474130000000000 +> procstat,pid=23620,process_name=chrome cpu_usage=2.098690278123081 1546474120000000000 +> procstat,pid=23620,process_name=chrome cpu_usage=17.52514619948493 1546474130000000000 +> procstat,pid=2088,process_name=Xorg cpu_usage=1.6016732172309973 1546474120000000000 +> procstat,pid=2088,process_name=Xorg cpu_usage=8.481040931533833 1546474130000000000 +``` diff --git a/plugins/processors/topk/topk.go b/plugins/processors/topk/topk.go index df5d542e3..c2244c6e3 100644 --- a/plugins/processors/topk/topk.go +++ b/plugins/processors/topk/topk.go @@ -43,8 +43,8 @@ func New() *TopK { topk.Aggregation = "mean" topk.GroupBy = []string{"*"} topk.AddGroupByTag = "" - topk.AddRankFields = []string{""} - topk.AddAggregateFields = []string{""} + topk.AddRankFields = []string{} + topk.AddAggregateFields = []string{} // Initialize cache topk.Reset() @@ -203,7 +203,9 @@ func (t *TopK) Apply(in ...telegraf.Metric) []telegraf.Metric { if t.aggFieldSet == nil { t.aggFieldSet = make(map[string]bool) for _, f := range t.AddAggregateFields { - t.aggFieldSet[f] = true + if f != "" { + t.aggFieldSet[f] = true + } } } @@ -279,7 +281,6 @@ func (t *TopK) push() []telegraf.Metric { // Get the top K metrics for each field and add them to the return value addedKeys := make(map[string]bool) - groupTag := t.AddGroupByTag for _, field := range t.Fields { // Sort the aggregations @@ -288,9 +289,8 @@ func (t *TopK) push() []telegraf.Metric { // Create a one dimensional list with the top K metrics of each key for i, ag := range aggregations[0:min(t.K, len(aggregations))] { // Check whether of not we need to add fields of tags to the selected metrics - if len(t.aggFieldSet) != 0 || len(t.rankFieldSet) != 0 || groupTag != "" { + if len(t.aggFieldSet) != 0 || len(t.rankFieldSet) != 0 || t.AddGroupByTag != "" { for _, m := range t.cache[ag.groupbykey] { - // Add the aggregation final value if requested _, addAggField := t.aggFieldSet[field] if addAggField && m.HasField(field) { @@ -330,7 +330,6 @@ func (t *TopK) push() []telegraf.Metric { // Function that generates the aggregation functions func (t *TopK) getAggregationFunction(aggOperation string) (func([]telegraf.Metric, []string) map[string]float64, error) { - // This is a function aggregates a set of metrics using a given aggregation function var aggregator = func(ms []telegraf.Metric, fields []string, f func(map[string]float64, float64, string)) map[string]float64 { agg := make(map[string]float64)