From ef4f4eed3a70c8f0fbac3a4fd739178439fc4e4b Mon Sep 17 00:00:00 2001 From: Russ Savage Date: Wed, 31 Jul 2019 16:55:25 -0700 Subject: [PATCH] Add left function to string processor (#6189) --- plugins/processors/strings/README.md | 6 ++++ plugins/processors/strings/strings.go | 18 ++++++++++++ plugins/processors/strings/strings_test.go | 32 ++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/plugins/processors/strings/README.md b/plugins/processors/strings/README.md index 30d2cbb08a17e..367732c6f9305 100644 --- a/plugins/processors/strings/README.md +++ b/plugins/processors/strings/README.md @@ -11,6 +11,7 @@ Implemented functions are: - trim_prefix - trim_suffix - replace +- left Please note that in this implementation these are processed in the order that they appear above. @@ -62,6 +63,11 @@ If you'd like to apply multiple processings to the same `tag_key` or `field_key` # measurement = "*" # old = ":" # new = "_" + + ## Trims strings based on width + # [[processors.strings.left]] + # field = "message" + # width = 10 ``` #### Trim, TrimLeft, TrimRight diff --git a/plugins/processors/strings/strings.go b/plugins/processors/strings/strings.go index 56bcf1b2c52b3..e185bdd3b4042 100644 --- a/plugins/processors/strings/strings.go +++ b/plugins/processors/strings/strings.go @@ -17,6 +17,7 @@ type Strings struct { TrimPrefix []converter `toml:"trim_prefix"` TrimSuffix []converter `toml:"trim_suffix"` Replace []converter `toml:"replace"` + Left []converter `toml:"left"` converters []converter init bool @@ -36,6 +37,7 @@ type converter struct { Prefix string Old string New string + Width int fn ConvertFunc } @@ -79,6 +81,11 @@ const sampleConfig = ` # measurement = "*" # old = ":" # new = "_" + + ## Trims strings based on width + # [[processors.strings.left]] + # field = "message" + # width = 10 ` func (s *Strings) SampleConfig() string { @@ -270,6 +277,17 @@ func (s *Strings) initOnce() { } s.converters = append(s.converters, c) } + for _, c := range s.Left { + c := c + c.fn = func(s string) string { + if len(s) < c.Width { + return s + } else { + return s[:c.Width] + } + } + s.converters = append(s.converters, c) + } s.init = true } diff --git a/plugins/processors/strings/strings_test.go b/plugins/processors/strings/strings_test.go index c89ab7b66eb8f..95d16c05eac6f 100644 --- a/plugins/processors/strings/strings_test.go +++ b/plugins/processors/strings/strings_test.go @@ -479,6 +479,38 @@ func TestFieldKeyConversions(t *testing.T) { require.Equal(t, "/mixed/CASE/paTH/?from=-1D&to=now", fv) }, }, + { + name: "Should trim the existing field to 6 characters", + plugin: &Strings{ + Left: []converter{ + { + Field: "Request", + Width: 6, + }, + }, + }, + check: func(t *testing.T, actual telegraf.Metric) { + fv, ok := actual.GetField("Request") + require.True(t, ok) + require.Equal(t, "/mixed", fv) + }, + }, + { + name: "Should do nothing to the string", + plugin: &Strings{ + Left: []converter{ + { + Field: "Request", + Width: 600, + }, + }, + }, + check: func(t *testing.T, actual telegraf.Metric) { + fv, ok := actual.GetField("Request") + require.True(t, ok) + require.Equal(t, "/mixed/CASE/paTH/?from=-1D&to=now", fv) + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {