Add Docker container environment variables as tags. Only whitelisted envvars will be processed.
This commit is contained in:
parent
393f5044bb
commit
0490b9a61d
|
@ -22,6 +22,8 @@ for the stat structure can be found
|
||||||
endpoint = "unix:///var/run/docker.sock"
|
endpoint = "unix:///var/run/docker.sock"
|
||||||
# Only collect metrics for these containers, collect all if empty
|
# Only collect metrics for these containers, collect all if empty
|
||||||
container_names = []
|
container_names = []
|
||||||
|
# Which environment variables should we use as a tag
|
||||||
|
gather_environment = ["ENV", "DC"]
|
||||||
```
|
```
|
||||||
|
|
||||||
### Measurements & Fields:
|
### Measurements & Fields:
|
||||||
|
|
|
@ -22,11 +22,12 @@ import (
|
||||||
|
|
||||||
// Docker object
|
// Docker object
|
||||||
type Docker struct {
|
type Docker struct {
|
||||||
Endpoint string
|
Endpoint string
|
||||||
ContainerNames []string
|
ContainerNames []string
|
||||||
Timeout internal.Duration
|
Timeout internal.Duration
|
||||||
PerDevice bool `toml:"perdevice"`
|
PerDevice bool `toml:"perdevice"`
|
||||||
Total bool `toml:"total"`
|
Total bool `toml:"total"`
|
||||||
|
GatherEnvironment []string `toml:"gather_environment"`
|
||||||
|
|
||||||
client DockerClient
|
client DockerClient
|
||||||
engine_host string
|
engine_host string
|
||||||
|
@ -37,6 +38,7 @@ type DockerClient interface {
|
||||||
Info(ctx context.Context) (types.Info, error)
|
Info(ctx context.Context) (types.Info, error)
|
||||||
ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error)
|
ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error)
|
||||||
ContainerStats(ctx context.Context, containerID string, stream bool) (io.ReadCloser, error)
|
ContainerStats(ctx context.Context, containerID string, stream bool) (io.ReadCloser, error)
|
||||||
|
ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// KB, MB, GB, TB, PB...human friendly
|
// KB, MB, GB, TB, PB...human friendly
|
||||||
|
@ -67,6 +69,8 @@ var sampleConfig = `
|
||||||
perdevice = true
|
perdevice = true
|
||||||
## Whether to report for each container total blkio and network stats or not
|
## Whether to report for each container total blkio and network stats or not
|
||||||
total = false
|
total = false
|
||||||
|
## Which environment variables should we use as a tag
|
||||||
|
gather_environment = ["ENV", "DC"]
|
||||||
|
|
||||||
`
|
`
|
||||||
|
|
||||||
|
@ -261,6 +265,22 @@ func (d *Docker) gatherContainer(
|
||||||
tags[k] = label
|
tags[k] = label
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add whitelisted environment variables to tags
|
||||||
|
if len(d.GatherEnvironment) > 0 {
|
||||||
|
info, err := d.client.ContainerInspect(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)
|
gatherContainerStats(v, acc, tags, container.ID, d.PerDevice, d.Total)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"github.com/docker/engine-api/types"
|
"github.com/docker/engine-api/types"
|
||||||
|
"github.com/docker/engine-api/types/container"
|
||||||
"github.com/docker/engine-api/types/registry"
|
"github.com/docker/engine-api/types/registry"
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
|
|
||||||
|
@ -384,10 +385,24 @@ func (d FakeDockerClient) ContainerStats(ctx context.Context, containerID string
|
||||||
return stat, nil
|
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
|
||||||
|
}
|
||||||
|
|
||||||
func TestDockerGatherInfo(t *testing.T) {
|
func TestDockerGatherInfo(t *testing.T) {
|
||||||
var acc testutil.Accumulator
|
var acc testutil.Accumulator
|
||||||
client := FakeDockerClient{}
|
client := FakeDockerClient{}
|
||||||
d := Docker{client: client}
|
d := Docker{client: client, GatherEnvironment: []string{"ENVVAR1", "ENVVAR2"}}
|
||||||
|
|
||||||
err := d.Gather(&acc)
|
err := d.Gather(&acc)
|
||||||
|
|
||||||
|
@ -433,6 +448,8 @@ func TestDockerGatherInfo(t *testing.T) {
|
||||||
"cpu": "cpu3",
|
"cpu": "cpu3",
|
||||||
"container_version": "v2.2.2",
|
"container_version": "v2.2.2",
|
||||||
"engine_host": "absol",
|
"engine_host": "absol",
|
||||||
|
"ENVVAR1": "loremipsum",
|
||||||
|
"ENVVAR2": "dolorsitamet",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
acc.AssertContainsTaggedFields(t,
|
acc.AssertContainsTaggedFields(t,
|
||||||
|
@ -479,6 +496,8 @@ func TestDockerGatherInfo(t *testing.T) {
|
||||||
"container_name": "etcd2",
|
"container_name": "etcd2",
|
||||||
"container_image": "quay.io/coreos/etcd",
|
"container_image": "quay.io/coreos/etcd",
|
||||||
"container_version": "v2.2.2",
|
"container_version": "v2.2.2",
|
||||||
|
"ENVVAR1": "loremipsum",
|
||||||
|
"ENVVAR2": "dolorsitamet",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue