From f3ee8aa3beb257af5e7629f76b61c99a81e2d2d0 Mon Sep 17 00:00:00 2001 From: Shakeel Sorathia Date: Mon, 3 Apr 2017 13:05:02 -0700 Subject: [PATCH] - move filter creation to function - created a bool such that we only compile the filter on the first gather - no longer collecting errors but rather displaying them as we go along - Changelog updated --- CHANGELOG.md | 1 + plugins/inputs/docker/docker.go | 45 ++++++++++++++++++---------- plugins/inputs/docker/docker_test.go | 13 +++----- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa4b820c7e341..e7da095d4eba7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ be deprecated eventually. - [#2332](https://github.com/influxdata/telegraf/pull/2332): Add Elasticsearch 5.x output - [#2587](https://github.com/influxdata/telegraf/pull/2587): Add json timestamp units configurability - [#2597](https://github.com/influxdata/telegraf/issues/2597): Add support for Linux sysctl-fs metrics. +- [#2425](https://github.com/influxdata/telegraf/pull/2425): Support to include/exclude docker container labels as tags ### Bugfixes diff --git a/plugins/inputs/docker/docker.go b/plugins/inputs/docker/docker.go index c333d57010828..47d1db14b09ec 100644 --- a/plugins/inputs/docker/docker.go +++ b/plugins/inputs/docker/docker.go @@ -40,7 +40,8 @@ type Docker struct { client *client.Client engine_host string - testing bool + testing bool + labelFiltersCreated bool } // infoWrapper wraps client.Client.List for testing. @@ -146,22 +147,13 @@ func (d *Docker) Gather(acc telegraf.Accumulator) error { } d.client = c } - - // Create label filters - if len(d.LabelInclude) != 0 { - var err error - d.LabelFilter.labelInclude, err = filter.Compile(d.LabelInclude) - if err != nil { - return err - } - } - - if len(d.LabelExclude) != 0 { - var err error - d.LabelFilter.labelExclude, err = filter.Compile(d.LabelExclude) + // Create label filters if not already created + if !d.labelFiltersCreated { + err := d.createLabelFilters() if err != nil { return err } + d.labelFiltersCreated = true } // Get daemon info @@ -633,11 +625,32 @@ func parseSize(sizeStr string) (int64, error) { return int64(size), nil } +func (d *Docker) createLabelFilters() error { + if len(d.LabelInclude) != 0 && d.LabelFilter.labelInclude == nil { + var err error + d.LabelFilter.labelInclude, err = filter.Compile(d.LabelInclude) + if err != nil { + return err + } + } + + if len(d.LabelExclude) != 0 && d.LabelFilter.labelExclude == nil { + var err error + d.LabelFilter.labelExclude, err = filter.Compile(d.LabelExclude) + if err != nil { + return err + } + } + + return nil +} + func init() { inputs.Add("docker", func() telegraf.Input { return &Docker{ - PerDevice: true, - Timeout: internal.Duration{Duration: time.Second * 5}, + PerDevice: true, + Timeout: internal.Duration{Duration: time.Second * 5}, + labelFiltersCreated: false, } }) } diff --git a/plugins/inputs/docker/docker_test.go b/plugins/inputs/docker/docker_test.go index 9de07d16a2a29..3e2e1607b4c08 100644 --- a/plugins/inputs/docker/docker_test.go +++ b/plugins/inputs/docker/docker_test.go @@ -6,7 +6,6 @@ import ( "github.com/influxdata/telegraf/testutil" - "fmt" "github.com/docker/docker/api/types" "github.com/stretchr/testify/require" ) @@ -280,23 +279,19 @@ func TestDockerGatherLabels(t *testing.T) { err := d.Gather(&acc) require.NoError(t, err) - var expectedErrors []string for _, label := range tt.expected { if !acc.HasTag("docker_container_cpu", label) { - expectedErrors = append(expectedErrors, fmt.Sprintf("%s ", label)) + t.Errorf("Didn't get expected label of %s. Test was: Include: %s Exclude %s", + label, tt.include, tt.exclude) } } - var notexpectedErrors []string for _, label := range tt.notexpected { if acc.HasTag("docker_container_cpu", label) { - notexpectedErrors = append(notexpectedErrors, fmt.Sprintf("%s ", label)) + t.Errorf("Got unexpected label of %s. Test was: Include: %s Exclude %s", + label, tt.include, tt.exclude) } } - - if len(expectedErrors) > 0 || len(notexpectedErrors) > 0 { - t.Errorf("Failed test for: Include: %s Exclude: %s", tt.include, tt.exclude) - } } }