diff --git a/src/core/stats.go b/src/core/stats.go index 0d4ecb13e..7a5c3e957 100644 --- a/src/core/stats.go +++ b/src/core/stats.go @@ -18,6 +18,8 @@ package core import ( "context" + "github.com/sirupsen/logrus" + "sync" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" ) @@ -53,16 +55,23 @@ func (ds *dockerService) ListContainerStats( return nil, err } - var stats []*runtimeapi.ContainerStats + var mtx sync.Mutex + var wg sync.WaitGroup + var stats = make([]*runtimeapi.ContainerStats, 0, len(listResp.Containers)) for _, container := range listResp.Containers { - containerStats, err := ds.getContainerStats(container.Id) - if err != nil { - return nil, err - } - if containerStats != nil { - stats = append(stats, containerStats) - } + go func() { + wg.Add(1) + defer wg.Done() + if containerStats, err := ds.getContainerStats(container.Id); err == nil && containerStats != nil { + mtx.Lock() + stats = append(stats, containerStats) + mtx.Unlock() + } else if err != nil { + logrus.Error(err, "Failed to get stats from container "+container.Id) + } + }() } + wg.Wait() return &runtimeapi.ListContainerStatsResponse{Stats: stats}, nil }