diff --git a/api/server/container.go b/api/server/container.go index 468fe55605..650ce23f55 100644 --- a/api/server/container.go +++ b/api/server/container.go @@ -103,7 +103,7 @@ func (s *Server) getContainersStats(version version.Version, w http.ResponseWrit Stop: closeNotifier, } - return s.daemon.ContainerStats(vars["name"], config) + return s.daemon.ContainerStats(container, config) } func (s *Server) getContainersLogs(version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error { diff --git a/daemon/daemon.go b/daemon/daemon.go index 7c3c39e441..c4599bf8bb 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -886,20 +886,12 @@ func (daemon *Daemon) stats(c *Container) (*execdriver.ResourceStats, error) { return daemon.execDriver.Stats(c.ID) } -func (daemon *Daemon) subscribeToContainerStats(name string) (chan interface{}, error) { - c, err := daemon.Get(name) - if err != nil { - return nil, err - } +func (daemon *Daemon) subscribeToContainerStats(c *Container) (chan interface{}, error) { ch := daemon.statsCollector.collect(c) return ch, nil } -func (daemon *Daemon) unsubscribeToContainerStats(name string, ch chan interface{}) error { - c, err := daemon.Get(name) - if err != nil { - return err - } +func (daemon *Daemon) unsubscribeToContainerStats(c *Container, ch chan interface{}) error { daemon.statsCollector.unsubscribe(c, ch) return nil } diff --git a/daemon/stats.go b/daemon/stats.go index aa356633b7..9d8ec0cbf7 100644 --- a/daemon/stats.go +++ b/daemon/stats.go @@ -20,8 +20,8 @@ type ContainerStatsConfig struct { // ContainerStats writes information about the container to the stream // given in the config object. -func (daemon *Daemon) ContainerStats(name string, config *ContainerStatsConfig) error { - updates, err := daemon.subscribeToContainerStats(name) +func (daemon *Daemon) ContainerStats(container *Container, config *ContainerStatsConfig) error { + updates, err := daemon.subscribeToContainerStats(container) if err != nil { return err } @@ -34,7 +34,7 @@ func (daemon *Daemon) ContainerStats(name string, config *ContainerStatsConfig) getStat := func(v interface{}) *types.Stats { update := v.(*execdriver.ResourceStats) // Retrieve the nw statistics from libnetwork and inject them in the Stats - if nwStats, err := daemon.getNetworkStats(name); err == nil { + if nwStats, err := daemon.getNetworkStats(container); err == nil { update.Stats.Interfaces = nwStats } ss := convertStatsToAPITypes(update.Stats) @@ -48,7 +48,7 @@ func (daemon *Daemon) ContainerStats(name string, config *ContainerStatsConfig) enc := json.NewEncoder(config.OutStream) - defer daemon.unsubscribeToContainerStats(name, updates) + defer daemon.unsubscribeToContainerStats(container, updates) noStreamFirstFrame := true for { @@ -78,14 +78,9 @@ func (daemon *Daemon) ContainerStats(name string, config *ContainerStatsConfig) } } -func (daemon *Daemon) getNetworkStats(name string) ([]*libcontainer.NetworkInterface, error) { +func (daemon *Daemon) getNetworkStats(c *Container) ([]*libcontainer.NetworkInterface, error) { var list []*libcontainer.NetworkInterface - c, err := daemon.Get(name) - if err != nil { - return list, err - } - sb, err := daemon.netController.SandboxByID(c.NetworkSettings.SandboxID) if err != nil { return list, err