From 7f4d27d99c1dbcb90b767ddc6f999cb78ffde7d4 Mon Sep 17 00:00:00 2001 From: Nick Farrell Date: Tue, 7 May 2024 23:20:36 +1000 Subject: [PATCH] fix(input.redis): Discard invalid errorstat lines (#15312) --- plugins/inputs/redis/redis.go | 15 +++++++++++---- plugins/inputs/redis/redis_test.go | 21 +++++++++++++++++++-- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/plugins/inputs/redis/redis.go b/plugins/inputs/redis/redis.go index 960495631..95ccb08d1 100644 --- a/plugins/inputs/redis/redis.go +++ b/plugins/inputs/redis/redis.go @@ -665,11 +665,18 @@ func gatherErrorstatsLine( } tags["err"] = strings.TrimPrefix(name, "errorstat_") kv := strings.Split(line, "=") - ival, err := strconv.ParseInt(kv[1], 10, 64) - if err == nil { - fields := map[string]interface{}{"total": ival} - acc.AddFields("redis_errorstat", fields, tags) + if len(kv) < 2 { + acc.AddError(fmt.Errorf("invalid line for %q: %s", name, line)) + return } + ival, err := strconv.ParseInt(kv[1], 10, 64) + if err != nil { + acc.AddError(fmt.Errorf("parsing value in line %q failed: %w", line, err)) + return + } + + fields := map[string]interface{}{"total": ival} + acc.AddFields("redis_errorstat", fields, tags) } func init() { diff --git a/plugins/inputs/redis/redis_test.go b/plugins/inputs/redis/redis_test.go index 7e381412f..0e96c49c3 100644 --- a/plugins/inputs/redis/redis_test.go +++ b/plugins/inputs/redis/redis_test.go @@ -15,8 +15,7 @@ import ( "github.com/influxdata/telegraf/testutil" ) -type testClient struct { -} +type testClient struct{} func (t *testClient) BaseTags() map[string]string { return map[string]string{"host": "redis.net"} @@ -386,6 +385,24 @@ func TestRedis_ParseIntOnString(t *testing.T) { require.IsType(t, int64(0), clientsInTimeout) } +func TestRedis_GatherErrorstatsLine(t *testing.T) { + var acc testutil.Accumulator + globalTags := map[string]string{} + + gatherErrorstatsLine("FOO", "BAR", &acc, globalTags) + require.Len(t, acc.Errors, 1) + require.Equal(t, "invalid line for \"FOO\": BAR", acc.Errors[0].Error()) + + acc = testutil.Accumulator{} + gatherErrorstatsLine("FOO", "BAR=a", &acc, globalTags) + require.Len(t, acc.Errors, 1) + require.Equal(t, "parsing value in line \"BAR=a\" failed: strconv.ParseInt: parsing \"a\": invalid syntax", acc.Errors[0].Error()) + + acc = testutil.Accumulator{} + gatherErrorstatsLine("FOO", "BAR=77", &acc, globalTags) + require.Empty(t, acc.Errors) +} + const testOutput = `# Server redis_version:6.0.9 redis_git_sha1:00000000