From 7d37ddfe513168382135329bbca2553b54bd8a76 Mon Sep 17 00:00:00 2001 From: Sven Rebhan <36194019+srebhan@users.noreply.github.com> Date: Thu, 27 Oct 2022 17:56:12 +0200 Subject: [PATCH] fix(processors.parser): Keep name of original metric if parser doesn't return one (#12116) --- plugins/processors/parser/parser.go | 8 ++++- plugins/processors/parser/parser_test.go | 46 ++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/plugins/processors/parser/parser.go b/plugins/processors/parser/parser.go index 2ed0bb42a..41f1dc875 100644 --- a/plugins/processors/parser/parser.go +++ b/plugins/processors/parser/parser.go @@ -49,7 +49,13 @@ func (p *Parser) Apply(metrics ...telegraf.Metric) []telegraf.Metric { } for _, m := range fromFieldMetric { - if m.Name() == "" { + // The parser get the parent plugin's name as + // default measurement name. Thus, in case the + // parsed metric does not provide a name itself, + // the parser will return 'parser' as we are in + // processors.parser. In those cases we want to + // keep the original metric name. + if m.Name() == "" || m.Name() == "parser" { m.SetName(metric.Name()) } } diff --git a/plugins/processors/parser/parser_test.go b/plugins/processors/parser/parser_test.go index 804cb02d7..688aede1a 100644 --- a/plugins/processors/parser/parser_test.go +++ b/plugins/processors/parser/parser_test.go @@ -10,10 +10,12 @@ import ( //Blank import to register all new-style parsers + "github.com/influxdata/telegraf/plugins/parsers" "github.com/influxdata/telegraf/plugins/parsers/grok" "github.com/influxdata/telegraf/plugins/parsers/influx" "github.com/influxdata/telegraf/plugins/parsers/json" "github.com/influxdata/telegraf/plugins/parsers/logfmt" + "github.com/influxdata/telegraf/plugins/parsers/value" "github.com/influxdata/telegraf/testutil" ) @@ -558,6 +560,50 @@ func TestApply(t *testing.T) { time.Unix(0, 0)), }, }, + { + name: "parser without metric name (issue #12115)", + parseFields: []string{"value"}, + merge: "override", + // Create parser the config way with the name of the parent plugin. + parser: func() telegraf.Parser { + p := parsers.Parsers["value"]("parser") + vp := p.(*value.Parser) + vp.DataType = "float" + vp.FieldName = "value" + return vp + }(), + input: metric.New( + "myname", + map[string]string{}, + map[string]interface{}{"value": "7.2"}, + time.Unix(0, 0)), + expected: []telegraf.Metric{ + metric.New( + "myname", + map[string]string{}, + map[string]interface{}{"value": float64(7.2)}, + time.Unix(0, 0)), + }, + }, + { + name: "parser with metric name (issue #12115)", + parseFields: []string{"value"}, + merge: "override", + // Create parser the config way with the name of the parent plugin. + parser: parsers.Parsers["influx"]("parser"), + input: metric.New( + "myname", + map[string]string{}, + map[string]interface{}{"value": "test value=7.2"}, + time.Unix(0, 0)), + expected: []telegraf.Metric{ + metric.New( + "test", + map[string]string{}, + map[string]interface{}{"value": float64(7.2)}, + time.Unix(0, 0)), + }, + }, } for _, tt := range tests {