Skip to content

Commit

Permalink
feat(aggregators.final): Add option to disable appending _final (#15268)
Browse files Browse the repository at this point in the history
  • Loading branch information
LarsStegman authored May 2, 2024
1 parent 920f92f commit d3f0ba9
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 6 deletions.
3 changes: 3 additions & 0 deletions plugins/aggregators/final/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
## aggregator and will not get sent to the output plugins.
# drop_original = false

## If false, _final is added to every field name
# keep_original_field_names = false

## The time that a series is not updated until considering it final. Ignored
## when output_strategy is "periodic".
# series_timeout = "5m"
Expand Down
17 changes: 12 additions & 5 deletions plugins/aggregators/final/final.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ import (
var sampleConfig string

type Final struct {
OutputStrategy string `toml:"output_strategy"`
SeriesTimeout config.Duration `toml:"series_timeout"`
OutputStrategy string `toml:"output_strategy"`
SeriesTimeout config.Duration `toml:"series_timeout"`
KeepOriginalFieldNames bool `toml:"keep_original_field_names"`

// The last metric for all series which are active
metricCache map[uint64]telegraf.Metric
Expand Down Expand Up @@ -64,10 +65,16 @@ func (m *Final) Push(acc telegraf.Accumulator) {
// younger than that. So skip the output for this period.
continue
}
fields := map[string]interface{}{}
for _, field := range metric.FieldList() {
fields[field.Key+"_final"] = field.Value
var fields map[string]any
if m.KeepOriginalFieldNames {
fields = metric.Fields()
} else {
fields = map[string]any{}
for _, field := range metric.FieldList() {
fields[field.Key+"_final"] = field.Value
}
}

acc.AddFields(metric.Name(), fields, metric.Tags(), metric.Time())
delete(m.metricCache, id)
}
Expand Down
35 changes: 34 additions & 1 deletion plugins/aggregators/final/final_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,42 @@ func TestOutputStrategyPeriodic(t *testing.T) {
metric.New(
"m",
tags,
map[string]interface{}{"a_final": int64(4)},
map[string]interface{}{
"a_final": 4,
},
now.Add(time.Second*-20),
),
}
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics(), testutil.SortMetrics())
}

func TestKeepOriginalFieldNames(t *testing.T) {
final := &Final{
OutputStrategy: "periodic",
SeriesTimeout: config.Duration(30 * time.Second),
KeepOriginalFieldNames: true,
}

require.NoError(t, final.Init())

now := time.Now()
tags := map[string]string{"foo": "bar"}
m1 := metric.New("m",
tags,
map[string]any{"a": 3},
now.Add(time.Second*-90))

var acc testutil.Accumulator
final.Add(m1)
final.Push(&acc)
expected := []telegraf.Metric{
metric.New(
"m",
tags,
map[string]any{"a": 3},
now.Add(time.Second*-90),
),
}

testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics(), testutil.SortMetrics())
}
3 changes: 3 additions & 0 deletions plugins/aggregators/final/sample.conf
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
## aggregator and will not get sent to the output plugins.
# drop_original = false

## If false, _final is added to every field name
# keep_original_field_names = false

## The time that a series is not updated until considering it final. Ignored
## when output_strategy is "periodic".
# series_timeout = "5m"
Expand Down

0 comments on commit d3f0ba9

Please sign in to comment.