feat(aggregators.basicstats): Add percentage change (#13118)

This commit is contained in:
Joshua Powers 2023-05-02 05:24:43 -06:00 committed by GitHub
parent 129d8eb98e
commit ca13259989
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 3 deletions

View File

@ -26,11 +26,14 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
drop_original = false
## 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
- 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
## Measurements & Fields
@ -44,6 +47,7 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
- field1_mean
- field1_non_negative_diff (non-negative difference)
- field1_non_negative_rate (non-negative rate per second)
- field1_percent_change
- field1_sum
- field1_s2 (variance)
- field1_stdev (standard deviation)

View File

@ -33,6 +33,7 @@ type configuredStats struct {
nonNegativeDiff bool
rate bool
nonNegativeRate bool
percentChange bool
interval bool
}
@ -191,6 +192,9 @@ func (b *BasicStats) Push(acc telegraf.Accumulator) {
if b.statsConfig.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 {
fields[k+"_non_negative_rate"] = v.rate
}
@ -235,6 +239,8 @@ func (b *BasicStats) parseStats() *configuredStats {
parsed.rate = true
case "non_negative_rate":
parsed.nonNegativeRate = true
case "percent_change":
parsed.percentChange = true
case "interval":
parsed.interval = true
default:
@ -258,6 +264,7 @@ func (b *BasicStats) getConfiguredStats() {
nonNegativeDiff: false,
rate: false,
nonNegativeRate: false,
percentChange: false,
}
} else {
b.statsConfig = b.parseStats()

View File

@ -536,6 +536,31 @@ func TestBasicStatsWithNonNegativeRate(t *testing.T) {
}
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) {
aggregator := NewBasicStats()
aggregator.Stats = []string{"interval"}

View File

@ -8,4 +8,4 @@
drop_original = false
## 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"]