From 48aece9cc8200a72ba74c00020d5ae871be04d68 Mon Sep 17 00:00:00 2001 From: Xinfeng Liu Date: Fri, 29 Sep 2023 14:56:09 +0800 Subject: [PATCH] adjust stats sampling order Signed-off-by: Xinfeng Liu --- daemon/stats.go | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/daemon/stats.go b/daemon/stats.go index 94374d605961b..81fb9ae0d60a5 100644 --- a/daemon/stats.go +++ b/daemon/stats.go @@ -156,28 +156,30 @@ func (daemon *Daemon) unsubscribeToContainerStats(c *container.Container, ch cha // GetContainerStats collects all the stats published by a container func (daemon *Daemon) GetContainerStats(container *container.Container) (*types.StatsJSON, error) { - var stats *types.StatsJSON - var err error - - stats, err = daemon.stats(container) + var systemUsage uint64 + var onlineCPUs uint32 + stats, err := daemon.stats(container) + if err != nil { + goto done + } + // Sample system CPU usage close to container usage to avoid + // noise in metric calculations. + systemUsage, onlineCPUs, err = getSystemCPUUsage() + if err != nil { + goto done + } + // FIXME: move to containerd on Linux (not Windows) + stats.CPUStats.SystemUsage = systemUsage + stats.CPUStats.OnlineCPUs = onlineCPUs // We already have the network stats on Windows directly from HCS. - if err == nil && !container.Config.NetworkDisabled && runtime.GOOS != "windows" { + if !container.Config.NetworkDisabled && runtime.GOOS != "windows" { stats.Networks, err = daemon.getNetworkStats(container) } +done: switch err.(type) { case nil: - // Sample system CPU usage close to container usage to avoid - // noise in metric calculations. - systemUsage, onlineCPUs, err := getSystemCPUUsage() - if err != nil { - log.G(context.TODO()).WithError(err).WithField("container_id", container.ID).Errorf("collecting system cpu usage") - return nil, err - } - // FIXME: move to containerd on Linux (not Windows) - stats.CPUStats.SystemUsage = systemUsage - stats.CPUStats.OnlineCPUs = onlineCPUs return stats, nil case errdefs.ErrConflict, errdefs.ErrNotFound: // return empty stats containing only name and ID if not running or not found @@ -186,7 +188,7 @@ func (daemon *Daemon) GetContainerStats(container *container.Container) (*types. ID: container.ID, }, nil default: - log.G(context.TODO()).Errorf("collecting stats for container %s: %v", container.ID, err) + log.G(context.TODO()).Errorf("collecting stats for container %s: %v", container.Name, err) return nil, err } }