From ecfddcf22738a4949a8d35a9f22488f079e760ff Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Tue, 14 Feb 2017 10:48:42 -0800 Subject: [PATCH] Merge pull request #29702 from WeiZhang555/stats-all-format-name-panic Send "Name" and "ID" when stating stopped containers (cherry picked from commit 22472c8be50ca0ddaf8207d46c6a9f5e792bd0af) Signed-off-by: Sebastiaan van Stijn --- daemon/stats.go | 4 +++- daemon/stats_collector.go | 7 +++++++ integration-cli/docker_cli_stats_test.go | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/daemon/stats.go b/daemon/stats.go index 51f5962d17..1778adf92e 100644 --- a/daemon/stats.go +++ b/daemon/stats.go @@ -33,7 +33,9 @@ func (daemon *Daemon) ContainerStats(ctx context.Context, prefixOrName string, c // If the container is either not running or restarting and requires no stream, return an empty stats. if (!container.IsRunning() || container.IsRestarting()) && !config.Stream { - return json.NewEncoder(config.OutStream).Encode(&types.Stats{}) + return json.NewEncoder(config.OutStream).Encode(&types.StatsJSON{ + Name: container.Name, + ID: container.ID}) } outStream := config.OutStream diff --git a/daemon/stats_collector.go b/daemon/stats_collector.go index dc6825e705..291933b7ac 100644 --- a/daemon/stats_collector.go +++ b/daemon/stats_collector.go @@ -120,7 +120,14 @@ func (s *statsCollector) run() { if err != nil { if _, ok := err.(errNotRunning); !ok { logrus.Errorf("collecting stats for %s: %v", pair.container.ID, err) + continue } + + // publish empty stats containing only name and ID if not running + pair.publisher.Publish(types.StatsJSON{ + Name: pair.container.Name, + ID: pair.container.ID, + }) continue } // FIXME: move to containerd on Linux (not Windows) diff --git a/integration-cli/docker_cli_stats_test.go b/integration-cli/docker_cli_stats_test.go index 5cb1a3ea02..804074d269 100644 --- a/integration-cli/docker_cli_stats_test.go +++ b/integration-cli/docker_cli_stats_test.go @@ -157,3 +157,22 @@ func (s *DockerSuite) TestStatsAllNewContainersAdded(c *check.C) { // ignore, done } } + +func (s *DockerSuite) TestStatsFormatAll(c *check.C) { + // Windows does not support stats + testRequires(c, DaemonIsLinux) + + dockerCmd(c, "run", "-d", "--name=RunningOne", "busybox", "top") + c.Assert(waitRun("RunningOne"), check.IsNil) + dockerCmd(c, "run", "-d", "--name=ExitedOne", "busybox", "top") + dockerCmd(c, "stop", "ExitedOne") + c.Assert(waitExited("ExitedOne", 5*time.Second), check.IsNil) + + out, _ := dockerCmd(c, "stats", "--no-stream", "--format", "{{.Name}}") + c.Assert(out, checker.Contains, "RunningOne") + c.Assert(out, checker.Not(checker.Contains), "ExitedOne") + + out, _ = dockerCmd(c, "stats", "--all", "--no-stream", "--format", "{{.Name}}") + c.Assert(out, checker.Contains, "RunningOne") + c.Assert(out, checker.Contains, "ExitedOne") +}