diff --git a/container.go b/container.go index a039d60..e2ae50b 100644 --- a/container.go +++ b/container.go @@ -10,7 +10,6 @@ type Container struct { name string state string metrics collector.Metrics - collect collector.Collector widgets widgets.ContainerWidgets } @@ -25,17 +24,13 @@ func (c *Container) Collapse() { func (c *Container) SetState(s string) { c.state = s c.widgets.SetStatus(s) - // start collector if necessary - if s == "running" && !c.collect.Running() { - c.Collect() - } } -func (c *Container) Collect() { - log.Infof("starting collector for container: %s", c.id) - c.collect.Start() +// Read metric stream, updating widgets +func (c *Container) Read(stream chan collector.Metrics) { + log.Infof("starting reader for container: %s", c.id) go func() { - for metrics := range c.collect.Stream() { + for metrics := range stream { c.metrics = metrics c.widgets.SetCPU(metrics.CPUUtil) c.widgets.SetMem(metrics.MemUsage, metrics.MemLimit, metrics.MemPercent) diff --git a/containermap.go b/containermap.go index 1419552..4c01485 100644 --- a/containermap.go +++ b/containermap.go @@ -10,6 +10,12 @@ import ( "github.com/fsouza/go-dockerclient" ) +type ContainerMap struct { + client *docker.Client + containers map[string]*Container + collectors map[string]collector.Collector +} + func NewContainerMap() *ContainerMap { // init docker client client, err := docker.NewClient(config.GetVal("dockerHost")) @@ -19,16 +25,12 @@ func NewContainerMap() *ContainerMap { cm := &ContainerMap{ client: client, containers: make(map[string]*Container), + collectors: make(map[string]collector.Collector), } cm.Refresh() return cm } -type ContainerMap struct { - client *docker.Client - containers map[string]*Container -} - func (cm *ContainerMap) Refresh() { var id, name string @@ -43,15 +45,16 @@ func (cm *ContainerMap) Refresh() { for _, c := range containers { id = c.ID[:12] states[id] = c.State + if _, ok := cm.containers[id]; ok == false { name = strings.Replace(c.Names[0], "/", "", 1) // use primary container name cm.containers[id] = &Container{ id: id, name: name, - collect: collector.NewDocker(cm.client, id), widgets: widgets.NewCompact(id, name), } } + } var removeIDs []string @@ -62,6 +65,15 @@ func (cm *ContainerMap) Refresh() { continue } c.SetState(states[id]) + // start collector if needed + if c.state == "running" { + if _, ok := cm.collectors[id]; ok == false { + log.Infof("starting collector for container: %s", id) + cm.collectors[id] = collector.NewDocker(cm.client, id) + cm.collectors[id].Start() + c.Read(cm.collectors[id].Stream()) + } + } } // remove dead containers diff --git a/sort.go b/sort.go index 8574083..bcc9a45 100644 --- a/sort.go +++ b/sort.go @@ -9,8 +9,6 @@ import ( type sortMethod func(c1, c2 *Container) bool -func lessStr(s1, s2 string) bool { return s1 < s2 } - var idSorter = func(c1, c2 *Container) bool { return c1.id < c2.id } var nameSorter = func(c1, c2 *Container) bool { return c1.name < c2.name }