From 196509cc53035e65f52a249fdce3c62d4b32a094 Mon Sep 17 00:00:00 2001
From: Pieter Slabbert <zan.xhipe@gmail.com>
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 db0b3a82..d53be049 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 0ff6866e..37c0bf17 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 f6078749..667fb108 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())
+}
-- 
GitLab