diff --git a/src/go/plugin/go.d/collector/docker/collect.go b/src/go/plugin/go.d/collector/docker/collect.go index 1a34ac1142f163..55986cf7713842 100644 --- a/src/go/plugin/go.d/collector/docker/collect.go +++ b/src/go/plugin/go.d/collector/docker/collect.go @@ -111,7 +111,7 @@ func (c *Collector) collectContainers(mx map[string]int64) error { ctx, cancel := context.WithTimeout(context.Background(), c.Timeout.Duration()) defer cancel() - v, err := c.client.ContainerList(ctx, typesContainer.ListOptions{ + containers, err := c.client.ContainerList(ctx, typesContainer.ListOptions{ All: true, Filters: filters.NewArgs(filters.KeyValuePair{Key: "health", Value: status}), Size: c.CollectContainerSize, @@ -119,7 +119,7 @@ func (c *Collector) collectContainers(mx map[string]int64) error { if err != nil { return err } - containerSet[status] = v + containerSet[status] = containers return nil }(); err != nil { @@ -154,6 +154,10 @@ func (c *Collector) collectContainers(mx map[string]int64) error { name := strings.TrimPrefix(cntr.Names[0], "/") + if c.cntrSr != nil && !c.cntrSr.MatchString(name) { + continue + } + seen[name] = true if !c.containers[name] { diff --git a/src/go/plugin/go.d/collector/docker/collector.go b/src/go/plugin/go.d/collector/docker/collector.go index 163d55348eb4b1..d151998ec20b31 100644 --- a/src/go/plugin/go.d/collector/docker/collector.go +++ b/src/go/plugin/go.d/collector/docker/collector.go @@ -8,6 +8,7 @@ import ( "errors" "time" + "github.com/netdata/netdata/go/plugins/pkg/matcher" "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module" "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/confopt" "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/dockerhost" @@ -35,6 +36,7 @@ func New() *Collector { Config: Config{ Address: docker.DefaultDockerHost, Timeout: confopt.Duration(time.Second * 2), + ContainerSelector: "*", CollectContainerSize: false, }, @@ -42,6 +44,7 @@ func New() *Collector { newClient: func(cfg Config) (dockerClient, error) { return docker.NewClientWithOpts(docker.WithHost(cfg.Address)) }, + cntrSr: matcher.TRUE(), containers: make(map[string]bool), } } @@ -51,6 +54,7 @@ type Config struct { UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"` Address string `yaml:"address" json:"address"` Timeout confopt.Duration `yaml:"timeout,omitempty" json:"timeout"` + ContainerSelector string `yaml:"container_selector,omitempty" json:"container_selector"` CollectContainerSize bool `yaml:"collect_container_size" json:"collect_container_size"` } @@ -66,6 +70,7 @@ type ( verNegotiated bool containers map[string]bool + cntrSr matcher.Matcher } dockerClient interface { NegotiateAPIVersion(context.Context) @@ -85,6 +90,14 @@ func (c *Collector) Init(context.Context) error { c.Infof("using docker host from environment: %s ", addr) c.Address = addr } + if c.ContainerSelector != "" { + sr, err := matcher.NewSimplePatternsMatcher(c.ContainerSelector) + if err != nil { + return err + } + c.cntrSr = sr + } + return nil } diff --git a/src/go/plugin/go.d/collector/docker/config_schema.json b/src/go/plugin/go.d/collector/docker/config_schema.json index 3d40562eb839dd..0c1fc4fbeab6cb 100644 --- a/src/go/plugin/go.d/collector/docker/config_schema.json +++ b/src/go/plugin/go.d/collector/docker/config_schema.json @@ -23,6 +23,12 @@ "type": "number", "default": 2 }, + "container_selector": { + "title": "Container Selector", + "description": "[Pattern](https://github.com/netdata/netdata/tree/master/src/libnetdata/simple_pattern#readme) to specify which containers to monitor. Leave empty to collect metrics for all containers.", + "type": "string", + "default": "*" + }, "collect_container_size": { "title": "Collect container size", "description": "Collect container writable layer size.", diff --git a/src/go/plugin/go.d/collector/docker/metadata.yaml b/src/go/plugin/go.d/collector/docker/metadata.yaml index 8fc6853a92c2a7..88f1dcbba98032 100644 --- a/src/go/plugin/go.d/collector/docker/metadata.yaml +++ b/src/go/plugin/go.d/collector/docker/metadata.yaml @@ -73,6 +73,10 @@ modules: description: Request timeout in seconds. default_value: 2 required: false + - name: container_selector + description: [Pattern](https://github.com/netdata/netdata/tree/master/src/libnetdata/simple_pattern#readme) to specify which containers to monitor. + default_value: "*" + required: false - name: collect_container_size description: Whether to collect container writable layer size. default_value: "no" diff --git a/src/go/plugin/go.d/collector/docker/testdata/config.json b/src/go/plugin/go.d/collector/docker/testdata/config.json index 66ce0a2e5de812..6519f23f5731f5 100644 --- a/src/go/plugin/go.d/collector/docker/testdata/config.json +++ b/src/go/plugin/go.d/collector/docker/testdata/config.json @@ -3,5 +3,6 @@ "update_every": 123, "address": "ok", "timeout": 123.123, + "container_selector": "ok", "collect_container_size": true } diff --git a/src/go/plugin/go.d/collector/docker/testdata/config.yaml b/src/go/plugin/go.d/collector/docker/testdata/config.yaml index 1db31a8d1edc0f..19135456004c30 100644 --- a/src/go/plugin/go.d/collector/docker/testdata/config.yaml +++ b/src/go/plugin/go.d/collector/docker/testdata/config.yaml @@ -2,4 +2,5 @@ vnode: "ok" update_every: 123 address: "ok" timeout: 123.123 +container_selector: "ok" collect_container_size: yes