From e2f9617228cebeb5fcdf7b5904bb2033e6d6297e Mon Sep 17 00:00:00 2001
From: Cameron Sparr <cameronsparr@gmail.com>
Date: Tue, 13 Dec 2016 15:24:05 +0000
Subject: [PATCH] Support strings in statsd set measurements

closes #2068
---
 CHANGELOG.md                         |  1 +
 plugins/inputs/statsd/statsd.go      | 13 ++++++++-----
 plugins/inputs/statsd/statsd_test.go |  7 +++++++
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8cb3e619..36e7ea73 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,6 +18,7 @@
 - [#1913](https://github.com/influxdata/telegraf/pull/1913): OpenTSDB basic auth support.
 - [#1908](https://github.com/influxdata/telegraf/pull/1908): RabbitMQ Connection metrics.
 - [#1937](https://github.com/influxdata/telegraf/pull/1937): HAProxy session limit metric.
+- [#2068](https://github.com/influxdata/telegraf/issues/2068): Accept strings for StatsD sets.
 
 ### Bugfixes
 
diff --git a/plugins/inputs/statsd/statsd.go b/plugins/inputs/statsd/statsd.go
index a46af0a8..7591864c 100644
--- a/plugins/inputs/statsd/statsd.go
+++ b/plugins/inputs/statsd/statsd.go
@@ -98,6 +98,7 @@ type metric struct {
 	hash       string
 	intvalue   int64
 	floatvalue float64
+	strvalue   string
 	mtype      string
 	additive   bool
 	samplerate float64
@@ -106,7 +107,7 @@ type metric struct {
 
 type cachedset struct {
 	name   string
-	fields map[string]map[int64]bool
+	fields map[string]map[string]bool
 	tags   map[string]string
 }
 
@@ -435,7 +436,7 @@ func (s *Statsd) parseStatsdLine(line string) error {
 				return errors.New("Error Parsing statsd line")
 			}
 			m.floatvalue = v
-		case "c", "s":
+		case "c":
 			var v int64
 			v, err := strconv.ParseInt(pipesplit[0], 10, 64)
 			if err != nil {
@@ -451,6 +452,8 @@ func (s *Statsd) parseStatsdLine(line string) error {
 				v = int64(float64(v) / m.samplerate)
 			}
 			m.intvalue = v
+		case "s":
+			m.strvalue = pipesplit[0]
 		}
 
 		// Parse the name & tags from bucket
@@ -625,16 +628,16 @@ func (s *Statsd) aggregate(m metric) {
 		if !ok {
 			s.sets[m.hash] = cachedset{
 				name:   m.name,
-				fields: make(map[string]map[int64]bool),
+				fields: make(map[string]map[string]bool),
 				tags:   m.tags,
 			}
 		}
 		// check if the field exists
 		_, ok = s.sets[m.hash].fields[m.field]
 		if !ok {
-			s.sets[m.hash].fields[m.field] = make(map[int64]bool)
+			s.sets[m.hash].fields[m.field] = make(map[string]bool)
 		}
-		s.sets[m.hash].fields[m.field][m.intvalue] = true
+		s.sets[m.hash].fields[m.field][m.strvalue] = true
 	}
 }
 
diff --git a/plugins/inputs/statsd/statsd_test.go b/plugins/inputs/statsd/statsd_test.go
index bb0d68c1..9fbaf537 100644
--- a/plugins/inputs/statsd/statsd_test.go
+++ b/plugins/inputs/statsd/statsd_test.go
@@ -139,6 +139,9 @@ func TestParse_Sets(t *testing.T) {
 		"scientific.notation.sets:4.696E+5|s",
 		"scientific.notation.sets:4.696E+5|s",
 		"scientific.notation.sets:4.697E+5|s",
+		"string.sets:foobar|s",
+		"string.sets:foobar|s",
+		"string.sets:bar|s",
 	}
 
 	for _, line := range valid_lines {
@@ -164,6 +167,10 @@ func TestParse_Sets(t *testing.T) {
 			"oneuser_id",
 			1,
 		},
+		{
+			"string_sets",
+			2,
+		},
 	}
 
 	for _, test := range validations {
-- 
GitLab