From 3fbfe3acd2f4b55567c601c27640ae73e57b280a Mon Sep 17 00:00:00 2001 From: Daniel Nelson Date: Thu, 27 Dec 2018 13:08:19 -0800 Subject: [PATCH] Fix usage of loop variable in function closure (#5195) --- plugins/processors/strings/strings.go | 20 ++++++--- plugins/processors/strings/strings_test.go | 51 ++++++++++++++-------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/plugins/processors/strings/strings.go b/plugins/processors/strings/strings.go index 69e89f025..00c7d99b1 100644 --- a/plugins/processors/strings/strings.go +++ b/plugins/processors/strings/strings.go @@ -72,8 +72,8 @@ const sampleConfig = ` # field = "read_count" # suffix = "_count" - ## Replace substrings within field names - # [[processors.strings.trim_suffix]] + ## Replace all non-overlapping instances of old with new + # [[processors.strings.replace]] # measurement = "*" # old = ":" # new = "_" @@ -100,8 +100,8 @@ func (c *converter) convertTag(metric telegraf.Metric) { tags[c.Tag] = tv } - for tag, value := range tags { - dest := tag + for key, value := range tags { + dest := key if c.Tag != "*" && c.Dest != "" { dest = c.Dest } @@ -122,9 +122,9 @@ func (c *converter) convertField(metric telegraf.Metric) { fields[c.Field] = fv } - for tag, value := range fields { - dest := tag - if c.Tag != "*" && c.Dest != "" { + for key, value := range fields { + dest := key + if c.Field != "*" && c.Dest != "" { dest = c.Dest } if fv, ok := value.(string); ok { @@ -170,6 +170,7 @@ func (s *Strings) initOnce() { s.converters = append(s.converters, c) } for _, c := range s.Trim { + c := c if c.Cutset != "" { c.fn = func(s string) string { return strings.Trim(s, c.Cutset) } } else { @@ -178,6 +179,7 @@ func (s *Strings) initOnce() { s.converters = append(s.converters, c) } for _, c := range s.TrimLeft { + c := c if c.Cutset != "" { c.fn = func(s string) string { return strings.TrimLeft(s, c.Cutset) } } else { @@ -186,6 +188,7 @@ func (s *Strings) initOnce() { s.converters = append(s.converters, c) } for _, c := range s.TrimRight { + c := c if c.Cutset != "" { c.fn = func(s string) string { return strings.TrimRight(s, c.Cutset) } } else { @@ -194,14 +197,17 @@ func (s *Strings) initOnce() { s.converters = append(s.converters, c) } for _, c := range s.TrimPrefix { + c := c c.fn = func(s string) string { return strings.TrimPrefix(s, c.Prefix) } s.converters = append(s.converters, c) } for _, c := range s.TrimSuffix { + c := c c.fn = func(s string) string { return strings.TrimSuffix(s, c.Suffix) } s.converters = append(s.converters, c) } for _, c := range s.Replace { + c := c c.fn = func(s string) string { newString := strings.Replace(s, c.Old, c.New, -1) if newString == "" { diff --git a/plugins/processors/strings/strings_test.go b/plugins/processors/strings/strings_test.go index f1bf93419..e108c04f7 100644 --- a/plugins/processors/strings/strings_test.go +++ b/plugins/processors/strings/strings_test.go @@ -25,24 +25,6 @@ func newM1() telegraf.Metric { return m1 } -func newM2() telegraf.Metric { - m2, _ := metric.New("IIS_log", - map[string]string{ - "verb": "GET", - "resp_code": "200", - "s-computername": "MIXEDCASE_hostname", - }, - map[string]interface{}{ - "request": "/mixed/CASE/paTH/?from=-1D&to=now", - "cs-host": "AAAbbb", - "ignore_number": int64(200), - "ignore_bool": true, - }, - time.Now(), - ) - return m2 -} - func TestFieldConversions(t *testing.T) { tests := []struct { name string @@ -404,9 +386,38 @@ func TestMultipleConversions(t *testing.T) { Tag: "verb", }, }, + Replace: []converter{ + { + Tag: "foo", + Old: "a", + New: "x", + }, + { + Tag: "bar", + Old: "b", + New: "y", + }, + }, } - processed := plugin.Apply(newM2()) + m, _ := metric.New("IIS_log", + map[string]string{ + "verb": "GET", + "resp_code": "200", + "s-computername": "MIXEDCASE_hostname", + "foo": "a", + "bar": "b", + }, + map[string]interface{}{ + "request": "/mixed/CASE/paTH/?from=-1D&to=now", + "cs-host": "AAAbbb", + "ignore_number": int64(200), + "ignore_bool": true, + }, + time.Now(), + ) + + processed := plugin.Apply(m) expectedFields := map[string]interface{}{ "request": "/mixed/case/path/?from=-1d&to=now", @@ -419,6 +430,8 @@ func TestMultipleConversions(t *testing.T) { "verb": "GET", "resp_code": "200", "s-computername": "mixedcase_hostname", + "foo": "x", + "bar": "y", } assert.Equal(t, expectedFields, processed[0].Fields())