From 196509cc53035e65f52a249fdce3c62d4b32a094 Mon Sep 17 00:00:00 2001 From: Pieter Slabbert Date: Wed, 16 Nov 2016 15:13:31 +0200 Subject: [PATCH] Trim null characters in Value data format (#2049) * Trim null characters in Value data format Some producers (such as the paho embedded c mqtt client) add a null character "\x00" to the end of a message. The Value parser would fail on any message from such a producer. * Trim whitespace and null in all Value data formats * No unnecessary reassignments in Value data format parser * Update change log for Value data format fix --- CHANGELOG.md | 1 + plugins/parsers/value/parser.go | 9 ++++----- plugins/parsers/value/parser_test.go | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db0b3a825..d53be0497 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### Bugfixes +- [#2049](https://github.com/influxdata/telegraf/pull/2049): Fix the Value data format not trimming null characters from input. - [#1949](https://github.com/influxdata/telegraf/issues/1949): Fix windows `net` plugin. - [#1775](https://github.com/influxdata/telegraf/issues/1775): Cache & expire metrics for delivery to prometheus diff --git a/plugins/parsers/value/parser.go b/plugins/parsers/value/parser.go index 0ff6866ee..37c0bf17c 100644 --- a/plugins/parsers/value/parser.go +++ b/plugins/parsers/value/parser.go @@ -17,13 +17,12 @@ type ValueParser struct { } func (v *ValueParser) Parse(buf []byte) ([]telegraf.Metric, error) { + vStr := string(bytes.TrimSpace(bytes.Trim(buf, "\x00"))) + // unless it's a string, separate out any fields in the buffer, // ignore anything but the last. - var vStr string - if v.DataType == "string" { - vStr = strings.TrimSpace(string(buf)) - } else { - values := bytes.Fields(buf) + if v.DataType != "string" { + values := strings.Fields(vStr) if len(values) < 1 { return []telegraf.Metric{}, nil } diff --git a/plugins/parsers/value/parser_test.go b/plugins/parsers/value/parser_test.go index f60787491..667fb108c 100644 --- a/plugins/parsers/value/parser_test.go +++ b/plugins/parsers/value/parser_test.go @@ -236,3 +236,18 @@ func TestParseValidValuesDefaultTags(t *testing.T) { }, metrics[0].Fields()) assert.Equal(t, map[string]string{"test": "tag"}, metrics[0].Tags()) } + +func TestParseValuesWithNullCharacter(t *testing.T) { + parser := ValueParser{ + MetricName: "value_test", + DataType: "integer", + } + metrics, err := parser.Parse([]byte("55\x00")) + assert.NoError(t, err) + assert.Len(t, metrics, 1) + assert.Equal(t, "value_test", metrics[0].Name()) + assert.Equal(t, map[string]interface{}{ + "value": int64(55), + }, metrics[0].Fields()) + assert.Equal(t, map[string]string{}, metrics[0].Tags()) +}