Add example to topk readme. Fix defaults to skip loop (#5220)
This commit is contained in:
parent
10b2260daf
commit
3c4e737f6b
|
@ -72,3 +72,36 @@ This processor does not add tags by default. But the setting `add_groupby_tag` w
|
||||||
### Fields:
|
### 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 ""
|
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
|
||||||
|
```
|
||||||
|
|
|
@ -43,8 +43,8 @@ func New() *TopK {
|
||||||
topk.Aggregation = "mean"
|
topk.Aggregation = "mean"
|
||||||
topk.GroupBy = []string{"*"}
|
topk.GroupBy = []string{"*"}
|
||||||
topk.AddGroupByTag = ""
|
topk.AddGroupByTag = ""
|
||||||
topk.AddRankFields = []string{""}
|
topk.AddRankFields = []string{}
|
||||||
topk.AddAggregateFields = []string{""}
|
topk.AddAggregateFields = []string{}
|
||||||
|
|
||||||
// Initialize cache
|
// Initialize cache
|
||||||
topk.Reset()
|
topk.Reset()
|
||||||
|
@ -203,9 +203,11 @@ func (t *TopK) Apply(in ...telegraf.Metric) []telegraf.Metric {
|
||||||
if t.aggFieldSet == nil {
|
if t.aggFieldSet == nil {
|
||||||
t.aggFieldSet = make(map[string]bool)
|
t.aggFieldSet = make(map[string]bool)
|
||||||
for _, f := range t.AddAggregateFields {
|
for _, f := range t.AddAggregateFields {
|
||||||
|
if f != "" {
|
||||||
t.aggFieldSet[f] = true
|
t.aggFieldSet[f] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add the metrics received to our internal cache
|
// Add the metrics received to our internal cache
|
||||||
for _, m := range in {
|
for _, m := range in {
|
||||||
|
@ -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
|
// Get the top K metrics for each field and add them to the return value
|
||||||
addedKeys := make(map[string]bool)
|
addedKeys := make(map[string]bool)
|
||||||
groupTag := t.AddGroupByTag
|
|
||||||
for _, field := range t.Fields {
|
for _, field := range t.Fields {
|
||||||
|
|
||||||
// Sort the aggregations
|
// 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
|
// Create a one dimensional list with the top K metrics of each key
|
||||||
for i, ag := range aggregations[0:min(t.K, len(aggregations))] {
|
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
|
// 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] {
|
for _, m := range t.cache[ag.groupbykey] {
|
||||||
|
|
||||||
// Add the aggregation final value if requested
|
// Add the aggregation final value if requested
|
||||||
_, addAggField := t.aggFieldSet[field]
|
_, addAggField := t.aggFieldSet[field]
|
||||||
if addAggField && m.HasField(field) {
|
if addAggField && m.HasField(field) {
|
||||||
|
@ -330,7 +330,6 @@ func (t *TopK) push() []telegraf.Metric {
|
||||||
|
|
||||||
// Function that generates the aggregation functions
|
// Function that generates the aggregation functions
|
||||||
func (t *TopK) getAggregationFunction(aggOperation string) (func([]telegraf.Metric, []string) map[string]float64, error) {
|
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
|
// 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 {
|
var aggregator = func(ms []telegraf.Metric, fields []string, f func(map[string]float64, float64, string)) map[string]float64 {
|
||||||
agg := make(map[string]float64)
|
agg := make(map[string]float64)
|
||||||
|
|
Loading…
Reference in New Issue