Skip to content

Commit

Permalink
Add Docker container environment variables as tags. Only whitelisted i…
Browse files Browse the repository at this point in the history
  • Loading branch information
rsingh2411 committed Mar 28, 2017
1 parent 78c7f4e commit ded088f
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
33 changes: 33 additions & 0 deletions plugins/inputs/docker/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type Docker struct {
Timeout internal.Duration
PerDevice bool `toml:"perdevice"`
Total bool `toml:"total"`
GatherEnvironment []string `toml:"gather_environment"`

client *client.Client
engine_host string
Expand Down Expand Up @@ -70,6 +71,20 @@ func statsWrapper(
return fc.ContainerStats(ctx, containerID, stream)
}

func inspectWrapper(
c *client.Client,
ctx context.Context,
containerID string,
) (types.ContainerJSON, error) {
if c != nil {
return c.ContainerInspect(ctx, containerID)
}
fc := FakeDockerClient{}
return fc.ContainerInspect(ctx, containerID)
}



// KB, MB, GB, TB, PB...human friendly
const (
KB = 1000
Expand Down Expand Up @@ -98,6 +113,8 @@ var sampleConfig = `
perdevice = true
## Whether to report for each container total blkio and network stats or not
total = false
## Which environment variables should we use as a tag
gather_environment = ["ENV", "DC"]
`

Expand Down Expand Up @@ -295,7 +312,23 @@ func (d *Docker) gatherContainer(
for k, label := range container.Labels {
tags[k] = label
}

// Add whitelisted environment variables to tags
if len(d.GatherEnvironment) > 0 {
info, err := inspectWrapper(d.client, ctx, container.ID)
if err != nil {
return fmt.Errorf("Error getting docker container inspect: %s", err.Error())
}

for _, envvar := range info.Config.Env {
kvs := strings.SplitN(envvar, "=", 2)
if !sliceContains(kvs[0], d.GatherEnvironment) {
continue
}
tags[kvs[0]] = kvs[1]
}
}

gatherContainerStats(v, acc, tags, container.ID, d.PerDevice, d.Total)

return nil
Expand Down
5 changes: 5 additions & 0 deletions plugins/inputs/docker/docker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ func TestDockerGatherInfo(t *testing.T) {
d := Docker{
client: nil,
testing: true,
GatherEnvironment: []string{"ENVVAR1", "ENVVAR2"},
}

err := d.Gather(&acc)
Expand Down Expand Up @@ -294,6 +295,8 @@ func TestDockerGatherInfo(t *testing.T) {
"cpu": "cpu3",
"container_version": "v2.2.2",
"engine_host": "absol",
"ENVVAR1": "loremipsum",
"ENVVAR2": "dolorsitamet",
},
)
acc.AssertContainsTaggedFields(t,
Expand Down Expand Up @@ -340,6 +343,8 @@ func TestDockerGatherInfo(t *testing.T) {
"container_name": "etcd2",
"container_image": "quay.io:4443/coreos/etcd",
"container_version": "v2.2.2",
"ENVVAR1": "loremipsum",
"ENVVAR2": "dolorsitamet",
},
)

Expand Down
15 changes: 15 additions & 0 deletions plugins/inputs/docker/fake_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"strings"

"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/registry"
)

Expand Down Expand Up @@ -141,3 +142,17 @@ func (d FakeDockerClient) ContainerStats(ctx context.Context, containerID string
stat.Body = ioutil.NopCloser(strings.NewReader(jsonStat))
return stat, nil
}

func (d FakeDockerClient) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) {
json := types.ContainerJSON{
Config: &container.Config{
Env: []string{
"ENVVAR1=loremipsum",
"ENVVAR2=dolorsitamet",
"PATH=/bin:/sbin",
},
},
}

return json, nil
}

0 comments on commit ded088f

Please sign in to comment.