Support strings in statsd set measurements

closes #2068
This commit is contained in:
Cameron Sparr 2016-12-13 15:24:05 +00:00
parent e097ae9632
commit e2f9617228
No known key found for this signature in database
GPG Key ID: 19E67263DCB25D0F
3 changed files with 16 additions and 5 deletions

View File

@ -18,6 +18,7 @@
- [#1913](https://github.com/influxdata/telegraf/pull/1913): OpenTSDB basic auth support. - [#1913](https://github.com/influxdata/telegraf/pull/1913): OpenTSDB basic auth support.
- [#1908](https://github.com/influxdata/telegraf/pull/1908): RabbitMQ Connection metrics. - [#1908](https://github.com/influxdata/telegraf/pull/1908): RabbitMQ Connection metrics.
- [#1937](https://github.com/influxdata/telegraf/pull/1937): HAProxy session limit metric. - [#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 ### Bugfixes

View File

@ -98,6 +98,7 @@ type metric struct {
hash string hash string
intvalue int64 intvalue int64
floatvalue float64 floatvalue float64
strvalue string
mtype string mtype string
additive bool additive bool
samplerate float64 samplerate float64
@ -106,7 +107,7 @@ type metric struct {
type cachedset struct { type cachedset struct {
name string name string
fields map[string]map[int64]bool fields map[string]map[string]bool
tags map[string]string tags map[string]string
} }
@ -435,7 +436,7 @@ func (s *Statsd) parseStatsdLine(line string) error {
return errors.New("Error Parsing statsd line") return errors.New("Error Parsing statsd line")
} }
m.floatvalue = v m.floatvalue = v
case "c", "s": case "c":
var v int64 var v int64
v, err := strconv.ParseInt(pipesplit[0], 10, 64) v, err := strconv.ParseInt(pipesplit[0], 10, 64)
if err != nil { if err != nil {
@ -451,6 +452,8 @@ func (s *Statsd) parseStatsdLine(line string) error {
v = int64(float64(v) / m.samplerate) v = int64(float64(v) / m.samplerate)
} }
m.intvalue = v m.intvalue = v
case "s":
m.strvalue = pipesplit[0]
} }
// Parse the name & tags from bucket // Parse the name & tags from bucket
@ -625,16 +628,16 @@ func (s *Statsd) aggregate(m metric) {
if !ok { if !ok {
s.sets[m.hash] = cachedset{ s.sets[m.hash] = cachedset{
name: m.name, name: m.name,
fields: make(map[string]map[int64]bool), fields: make(map[string]map[string]bool),
tags: m.tags, tags: m.tags,
} }
} }
// check if the field exists // check if the field exists
_, ok = s.sets[m.hash].fields[m.field] _, ok = s.sets[m.hash].fields[m.field]
if !ok { 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
} }
} }

View File

@ -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.696E+5|s", "scientific.notation.sets:4.696E+5|s",
"scientific.notation.sets:4.697E+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 { for _, line := range valid_lines {
@ -164,6 +167,10 @@ func TestParse_Sets(t *testing.T) {
"oneuser_id", "oneuser_id",
1, 1,
}, },
{
"string_sets",
2,
},
} }
for _, test := range validations { for _, test := range validations {