From 87d08e25fd0f478207f9dbcc6d65ec00cb71be86 Mon Sep 17 00:00:00 2001 From: Daniel Nelson Date: Tue, 29 Aug 2017 16:22:03 -0700 Subject: [PATCH] Convert bool fields to int in graphite serializer --- docs/DATA_FORMATS_OUTPUT.md | 3 +- plugins/serializers/graphite/graphite.go | 8 +++++- plugins/serializers/graphite/graphite_test.go | 28 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/docs/DATA_FORMATS_OUTPUT.md b/docs/DATA_FORMATS_OUTPUT.md index 15a4e39eb..136780381 100644 --- a/docs/DATA_FORMATS_OUTPUT.md +++ b/docs/DATA_FORMATS_OUTPUT.md @@ -96,7 +96,8 @@ tars.cpu-total.us-east-1.cpu.usage_user 0.89 1455320690 tars.cpu-total.us-east-1.cpu.usage_idle 98.09 1455320690 ``` -Fields with non-numeric values will be skipped. +Fields with string values will be skipped. Boolean fields will be converted +to 1 (true) or 0 (false). ### Graphite Configuration: diff --git a/plugins/serializers/graphite/graphite.go b/plugins/serializers/graphite/graphite.go index 7cebff4e6..084ba54e7 100644 --- a/plugins/serializers/graphite/graphite.go +++ b/plugins/serializers/graphite/graphite.go @@ -32,9 +32,15 @@ func (s *GraphiteSerializer) Serialize(metric telegraf.Metric) ([]byte, error) { } for fieldName, value := range metric.Fields() { - switch value.(type) { + switch v := value.(type) { case string: continue + case bool: + if v { + value = 1 + } else { + value = 0 + } } metricString := fmt.Sprintf("%s %#v %d\n", // insert "field" section of template diff --git a/plugins/serializers/graphite/graphite_test.go b/plugins/serializers/graphite/graphite_test.go index da622732f..62d0f2a24 100644 --- a/plugins/serializers/graphite/graphite_test.go +++ b/plugins/serializers/graphite/graphite_test.go @@ -187,6 +187,34 @@ func TestSerializeValueString(t *testing.T) { assert.Equal(t, "", mS[0]) } +func TestSerializeValueBoolean(t *testing.T) { + now := time.Now() + tags := map[string]string{ + "host": "localhost", + "cpu": "cpu0", + "datacenter": "us-west-2", + } + fields := map[string]interface{}{ + "enabled": true, + "disabled": false, + } + m, err := metric.New("cpu", tags, fields, now) + assert.NoError(t, err) + + s := GraphiteSerializer{ + Template: "host.field.tags.measurement", + } + buf, _ := s.Serialize(m) + mS := strings.Split(strings.TrimSpace(string(buf)), "\n") + assert.NoError(t, err) + + expS := []string{ + fmt.Sprintf("localhost.enabled.cpu0.us-west-2.cpu 1 %d", now.Unix()), + fmt.Sprintf("localhost.disabled.cpu0.us-west-2.cpu 0 %d", now.Unix()), + } + assert.Equal(t, expS, mS) +} + // test that fields with spaces get fixed. func TestSerializeFieldWithSpaces(t *testing.T) { now := time.Now()