From e2f9617228cebeb5fcdf7b5904bb2033e6d6297e Mon Sep 17 00:00:00 2001 From: Cameron Sparr 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 8cb3e6196..36e7ea73e 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 a46af0a87..7591864c2 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 bb0d68c16..9fbaf5372 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 {