feat(aggregators.basicstats): Add percentage change (#13118)
This commit is contained in:
parent
129d8eb98e
commit
ca13259989
|
|
@ -26,11 +26,14 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||||
drop_original = false
|
drop_original = false
|
||||||
|
|
||||||
## Configures which basic stats to push as fields
|
## Configures which basic stats to push as fields
|
||||||
# stats = ["count","diff","rate","min","max","mean","non_negative_diff","non_negative_rate","stdev","s2","sum","interval"]
|
# stats = ["count","diff","rate","min","max","mean","non_negative_diff","non_negative_rate","percent_change","stdev","s2","sum","interval"]
|
||||||
```
|
```
|
||||||
|
|
||||||
- stats
|
- stats
|
||||||
- If not specified, then `count`, `min`, `max`, `mean`, `stdev`, and `s2` are aggregated and pushed as fields. `sum`, `diff` and `non_negative_diff` are not aggregated by default to maintain backwards compatibility.
|
- If not specified, then `count`, `min`, `max`, `mean`, `stdev`, and `s2` are
|
||||||
|
aggregated and pushed as fields. `sum`, `diff`, `non_negative_diff`,
|
||||||
|
`percent_change` are not aggregated by default to maintain backwards
|
||||||
|
compatibility.
|
||||||
- If empty array, no stats are aggregated
|
- If empty array, no stats are aggregated
|
||||||
|
|
||||||
## Measurements & Fields
|
## Measurements & Fields
|
||||||
|
|
@ -44,6 +47,7 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||||
- field1_mean
|
- field1_mean
|
||||||
- field1_non_negative_diff (non-negative difference)
|
- field1_non_negative_diff (non-negative difference)
|
||||||
- field1_non_negative_rate (non-negative rate per second)
|
- field1_non_negative_rate (non-negative rate per second)
|
||||||
|
- field1_percent_change
|
||||||
- field1_sum
|
- field1_sum
|
||||||
- field1_s2 (variance)
|
- field1_s2 (variance)
|
||||||
- field1_stdev (standard deviation)
|
- field1_stdev (standard deviation)
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ type configuredStats struct {
|
||||||
nonNegativeDiff bool
|
nonNegativeDiff bool
|
||||||
rate bool
|
rate bool
|
||||||
nonNegativeRate bool
|
nonNegativeRate bool
|
||||||
|
percentChange bool
|
||||||
interval bool
|
interval bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -191,6 +192,9 @@ func (b *BasicStats) Push(acc telegraf.Accumulator) {
|
||||||
if b.statsConfig.rate {
|
if b.statsConfig.rate {
|
||||||
fields[k+"_rate"] = v.rate
|
fields[k+"_rate"] = v.rate
|
||||||
}
|
}
|
||||||
|
if b.statsConfig.percentChange {
|
||||||
|
fields[k+"_percent_change"] = v.diff / v.LAST * 100
|
||||||
|
}
|
||||||
if b.statsConfig.nonNegativeRate && v.diff >= 0 {
|
if b.statsConfig.nonNegativeRate && v.diff >= 0 {
|
||||||
fields[k+"_non_negative_rate"] = v.rate
|
fields[k+"_non_negative_rate"] = v.rate
|
||||||
}
|
}
|
||||||
|
|
@ -235,6 +239,8 @@ func (b *BasicStats) parseStats() *configuredStats {
|
||||||
parsed.rate = true
|
parsed.rate = true
|
||||||
case "non_negative_rate":
|
case "non_negative_rate":
|
||||||
parsed.nonNegativeRate = true
|
parsed.nonNegativeRate = true
|
||||||
|
case "percent_change":
|
||||||
|
parsed.percentChange = true
|
||||||
case "interval":
|
case "interval":
|
||||||
parsed.interval = true
|
parsed.interval = true
|
||||||
default:
|
default:
|
||||||
|
|
@ -258,6 +264,7 @@ func (b *BasicStats) getConfiguredStats() {
|
||||||
nonNegativeDiff: false,
|
nonNegativeDiff: false,
|
||||||
rate: false,
|
rate: false,
|
||||||
nonNegativeRate: false,
|
nonNegativeRate: false,
|
||||||
|
percentChange: false,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
b.statsConfig = b.parseStats()
|
b.statsConfig = b.parseStats()
|
||||||
|
|
|
||||||
|
|
@ -536,6 +536,31 @@ func TestBasicStatsWithNonNegativeRate(t *testing.T) {
|
||||||
}
|
}
|
||||||
acc.AssertContainsTaggedFields(t, "m1", expectedFields, expectedTags)
|
acc.AssertContainsTaggedFields(t, "m1", expectedFields, expectedTags)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBasicStatsWithPctChange(t *testing.T) {
|
||||||
|
aggregator := NewBasicStats()
|
||||||
|
aggregator.Stats = []string{"percent_change"}
|
||||||
|
aggregator.Log = testutil.Logger{}
|
||||||
|
aggregator.getConfiguredStats()
|
||||||
|
|
||||||
|
aggregator.Add(m1)
|
||||||
|
aggregator.Add(m2)
|
||||||
|
|
||||||
|
acc := testutil.Accumulator{}
|
||||||
|
aggregator.Push(&acc)
|
||||||
|
expectedFields := map[string]interface{}{
|
||||||
|
"a_percent_change": float64(0),
|
||||||
|
"b_percent_change": float64(200),
|
||||||
|
"c_percent_change": float64(100),
|
||||||
|
"d_percent_change": float64(200),
|
||||||
|
"g_percent_change": float64(-66.66666666666666),
|
||||||
|
}
|
||||||
|
expectedTags := map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
}
|
||||||
|
acc.AssertContainsTaggedFields(t, "m1", expectedFields, expectedTags)
|
||||||
|
}
|
||||||
|
|
||||||
func TestBasicStatsWithInterval(t *testing.T) {
|
func TestBasicStatsWithInterval(t *testing.T) {
|
||||||
aggregator := NewBasicStats()
|
aggregator := NewBasicStats()
|
||||||
aggregator.Stats = []string{"interval"}
|
aggregator.Stats = []string{"interval"}
|
||||||
|
|
|
||||||
|
|
@ -8,4 +8,4 @@
|
||||||
drop_original = false
|
drop_original = false
|
||||||
|
|
||||||
## Configures which basic stats to push as fields
|
## Configures which basic stats to push as fields
|
||||||
# stats = ["count","diff","rate","min","max","mean","non_negative_diff","non_negative_rate","stdev","s2","sum","interval"]
|
# stats = ["count","diff","rate","min","max","mean","non_negative_diff","non_negative_rate","percent_change","stdev","s2","sum","interval"]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue