Return an empty stats if "container not found"

If we get "container not found" error from containerd, it's possibly
because that this container has already been stopped. It will be ok to
ignore this error and just return an empty stats.

Signed-off-by: Yuanhong Peng <pengyuanhong@huawei.com>
This commit is contained in:
Yuanhong Peng
2017-07-07 15:33:45 +08:00
parent 20eb2caa3b
commit 4a6cbf9bcb
4 changed files with 36 additions and 12 deletions

View File

@@ -88,24 +88,25 @@ func (s *Collector) Run() {
for _, pair := range pairs {
stats, err := s.supervisor.GetContainerStats(pair.container)
if err != nil {
if _, ok := err.(notRunningErr); !ok {
logrus.Errorf("collecting stats for %s: %v", pair.container.ID, err)
continue
}
// publish empty stats containing only name and ID if not running
switch err.(type) {
case nil:
// FIXME: move to containerd on Linux (not Windows)
stats.CPUStats.SystemUsage = systemUsage
stats.CPUStats.OnlineCPUs = onlineCPUs
pair.publisher.Publish(*stats)
case notRunningErr, notFoundErr:
// publish empty stats containing only name and ID if not running or not found
pair.publisher.Publish(types.StatsJSON{
Name: pair.container.Name,
ID: pair.container.ID,
})
continue
}
// FIXME: move to containerd on Linux (not Windows)
stats.CPUStats.SystemUsage = systemUsage
stats.CPUStats.OnlineCPUs = onlineCPUs
pair.publisher.Publish(*stats)
default:
logrus.Errorf("collecting stats for %s: %v", pair.container.ID, err)
}
}
}
}
@@ -114,3 +115,8 @@ type notRunningErr interface {
error
ContainerIsRunning() bool
}
type notFoundErr interface {
error
ContainerNotFound() bool
}