in clusterloader2/pkg/measurement/util/gatherers/container_resource_gatherer.go [180:231]
func (g *ContainerResourceGatherer) StopAndSummarize(percentiles []int) (*ResourceUsageSummary, error) {
g.stop()
klog.V(2).Infof("Closed stop channel. Waiting for %v workers", len(g.workers))
finished := make(chan struct{})
go func() {
g.workerWg.Wait()
finished <- struct{}{}
}()
select {
case <-finished:
klog.V(2).Infof("Waitgroup finished.")
case <-time.After(2 * time.Minute):
unfinished := make([]string, 0)
for i := range g.workers {
if !g.workers[i].finished {
unfinished = append(unfinished, g.workers[i].nodeName)
}
}
klog.V(1).Infof("Timed out while waiting for waitgroup, some workers failed to finish: %v", unfinished)
}
if len(percentiles) == 0 {
klog.Warningf("Empty percentile list for stopAndPrintData.")
return &ResourceUsageSummary{}, fmt.Errorf("failed to get any resource usage data")
}
data := make(map[int]util.ResourceUsagePerContainer)
for i := range g.workers {
if g.workers[i].finished {
stats := util.ComputePercentiles(g.workers[i].dataSeries, percentiles)
data = util.LeftMergeData(stats, data)
}
}
// Workers has been stopped. We need to gather data stored in them.
sortedKeys := []string{}
for name := range data[percentiles[0]] {
sortedKeys = append(sortedKeys, name)
}
sort.Strings(sortedKeys)
summary := make(ResourceUsageSummary)
for _, perc := range percentiles {
for _, name := range sortedKeys {
usage := data[perc][name]
summary[strconv.Itoa(perc)] = append(summary[strconv.Itoa(perc)], util.SingleContainerSummary{
Name: name,
CPU: usage.CPUUsageInCores,
Mem: usage.MemoryWorkingSetInBytes,
})
}
}
return &summary, nil
}