Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion plugins/outputs/sematext/processors/rename.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,9 @@ func (r *Rename) Process(points []telegraf.Metric) []telegraf.Metric {

replace, ok := fieldReplaces[key]
if !ok {
replace = ChangeNames(key)
// Use field.Key directly to avoid prepending measurement name.
// This prevents corruption on re-processing and ensures idempotency.
replace = ChangeNames(field.Key)
}
// we can't remove the fields
// while iterating because it
Expand Down
24 changes: 23 additions & 1 deletion plugins/outputs/sematext/processors/rename_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func TestRename(t *testing.T) {
assert.Equal(t, "apache", results[0].Name())
assert.Equal(t, "php", results[1].Name())
assert.Equal(t, "workers.dns", results[2].FieldList()[0].Key)
assert.Equal(t, "etcd.slow.requests", results[3].FieldList()[0].Key)
assert.Equal(t, "slow.requests", results[3].FieldList()[0].Key)
assert.Equal(t, "fpm.requests.slow", results[4].FieldList()[0].Key)
assert.Equal(t, "mongo", results[5].Name())
assert.Equal(t, "mongodb_col_stats.ok", results[5].FieldList()[0].Key)
Expand All @@ -34,6 +34,28 @@ func TestRename(t *testing.T) {
assert.Equal(t, "mongodb_shard_stats.in_use", results[8].FieldList()[0].Key)
}

func TestRenameIdempotent(t *testing.T) {
r := Rename{}

// Process a metric multiple times - field names should remain stable
m := newMetric("apache", nil, map[string]interface{}{"scboard_dnslookup": 120})

// First pass
results := r.Process([]telegraf.Metric{m})
assert.Equal(t, "apache", results[0].Name())
assert.Equal(t, "workers.dns", results[0].FieldList()[0].Key)

// Second pass - should NOT corrupt field names
results = r.Process(results)
assert.Equal(t, "apache", results[0].Name())
assert.Equal(t, "workers.dns", results[0].FieldList()[0].Key, "Field should remain 'workers.dns', not 'apache.workers.dns'")

// Third pass - still stable
results = r.Process(results)
assert.Equal(t, "apache", results[0].Name())
assert.Equal(t, "workers.dns", results[0].FieldList()[0].Key, "Field should remain 'workers.dns' after multiple passes")
}

func newMetric(name string, tags map[string]string, fields map[string]interface{}) telegraf.Metric {
if tags == nil {
tags = map[string]string{}
Expand Down