func GetOneTimeResourceUsageOnNode()

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
}