in clusterloader2/pkg/measurement/util/kubelet/kubelet.go [37:86]
func GetOneTimeResourceUsageOnNode(c clientset.Interface, nodeName string, port int, containerNames func() []string) (util.ResourceUsagePerContainer, error) {
// Get information of all containers on the node.
summary, err := getStatsSummary(c, nodeName, port)
if err != nil {
return nil, err
}
f := func(name string, newStats *stats.ContainerStats) *util.ContainerResourceUsage {
if newStats == nil || newStats.CPU == nil || newStats.Memory == nil {
return nil
}
return &util.ContainerResourceUsage{
Name: name,
Timestamp: newStats.StartTime.Time,
CPUUsageInCores: float64(removeUint64Ptr(newStats.CPU.UsageNanoCores)) / 1000000000,
MemoryUsageInBytes: removeUint64Ptr(newStats.Memory.UsageBytes),
MemoryWorkingSetInBytes: removeUint64Ptr(newStats.Memory.WorkingSetBytes),
MemoryRSSInBytes: removeUint64Ptr(newStats.Memory.RSSBytes),
CPUInterval: 0,
}
}
// Process container infos that are relevant to us.
containers := containerNames()
usageMap := make(util.ResourceUsagePerContainer, len(containers)+len(summary.Node.SystemContainers))
for _, pod := range summary.Pods {
for _, container := range pod.Containers {
isInteresting := false
for _, interestingContainerName := range containers {
if container.Name == interestingContainerName {
isInteresting = true
break
}
}
if !isInteresting {
continue
}
if usage := f(pod.PodRef.Name+"/"+container.Name, &container); usage != nil {
usageMap[pod.PodRef.Name+"/"+container.Name] = usage
}
}
}
// Always process the system container information: kubelet and pods
for _, sysContainer := range summary.Node.SystemContainers {
if usage := f(nodeName+"/"+sysContainer.Name, &sysContainer); usage != nil {
usageMap[nodeName+"/"+sysContainer.Name] = usage
}
}
return usageMap, nil
}