diff --git a/pkg/api/collectorcontrollerv1alpha1/types.go b/pkg/api/collectorcontrollerv1alpha1/types.go index 3e48eb7..3f5cba2 100644 --- a/pkg/api/collectorcontrollerv1alpha1/types.go +++ b/pkg/api/collectorcontrollerv1alpha1/types.go @@ -322,6 +322,9 @@ const ( // ContainerImageLabel is the label for the container image ContainerImageLabel = "container_image" + // ContainerImageIDLabel is the label for the container image with digest + ContainerImageIDLabel = "container_image_id" + // ExportedNamespaceLabel is the label name of the namespace for a pod // Defined by the pod namespace ExportedNamespaceLabel = "exported_namespace" @@ -1127,6 +1130,8 @@ type BuiltInLabelsMask struct { PVType bool `json:"pv_type,omitempty" yaml:"pv_type,omitempty"` ContainerImage bool `json:"container_image,omitempty" yaml:"container_image,omitempty"` + + ContainerImageID bool `json:"container_image_id,omitempty" yaml:"container_image_id,omitempty"` } // ExtensionsLabelMask is a mask for user defined metric labels. diff --git a/pkg/collector/builtin_labels.go b/pkg/collector/builtin_labels.go index 6a4d847..a7122fc 100644 --- a/pkg/collector/builtin_labels.go +++ b/pkg/collector/builtin_labels.go @@ -30,6 +30,8 @@ type builtInLabelsValues struct { ContainerName string `json:"exported_container,omitempty" yaml:"exported_container,omitempty"` // ContainerImage is the container image in the container ContainerImage string `json:"container_image,omitempty" yaml:"container_image,omitempty"` + // ContainerImageID is the container image with digest in the container + ContainerImageID string `json:"container_image_id,omitempty" yaml:"container_image_id,omitempty"` // PodName is the name of a pod. PodName string `json:"exported_pod,omitempty" yaml:"exported_pod,omitempty"` // NamespaceName is the name of a namespace. @@ -100,6 +102,9 @@ func getBuiltInLabelNames(mask collectorcontrollerv1alpha1.BuiltInLabelsMask) [] if mask.ContainerImage { labels = append(labels, collectorcontrollerv1alpha1.ContainerImageLabel) } + if mask.ContainerImageID { + labels = append(labels, collectorcontrollerv1alpha1.ContainerImageIDLabel) + } if mask.PodName { labels = append(labels, collectorcontrollerv1alpha1.ExportedPodLabel) } @@ -178,6 +183,9 @@ func builtInMask(mask collectorcontrollerv1alpha1.BuiltInLabelsMask, m builtInLa if !mask.ContainerImage { s.ContainerImage = "" } + if !mask.ContainerImageID { + s.ContainerImageID = "" + } if !mask.PodName { s.PodName = "" } @@ -255,6 +263,9 @@ func getBuiltInLabelValues(mask collectorcontrollerv1alpha1.BuiltInLabelsMask, m if mask.ContainerImage { labels = append(labels, m.ContainerImage) } + if mask.ContainerImageID { + labels = append(labels, m.ContainerImageID) + } if mask.PodName { labels = append(labels, m.PodName) } @@ -335,6 +346,7 @@ func getOverrideBuiltInLabelValues(m builtInLabelsValues, overrides map[string]s s := m s.ContainerName = f(collectorcontrollerv1alpha1.ExportedContainerLabel, m.ContainerName) s.ContainerImage = f(collectorcontrollerv1alpha1.ContainerImageLabel, m.ContainerImage) + s.ContainerImageID = f(collectorcontrollerv1alpha1.ContainerImageIDLabel, m.ContainerImageID) s.PodName = f(collectorcontrollerv1alpha1.ExportedPodLabel, m.PodName) s.NamespaceName = f(collectorcontrollerv1alpha1.ExportedNamespaceLabel, m.NamespaceName) s.NodeName = f(collectorcontrollerv1alpha1.ExportedNodeLabel, m.NodeName) @@ -371,6 +383,13 @@ func (l builtInLabler) SetLabelsForContainer(labels *builtInLabelsValues, c *cor labels.ContainerImage = c.Image } +func (l builtInLabler) SetLabelsForContainerStatus(labels *builtInLabelsValues, c *corev1.ContainerStatus) { + if c == nil { + return + } + labels.ContainerImageID = c.ImageID +} + func (l builtInLabler) SetLabelsForPod( labels *builtInLabelsValues, p *corev1.Pod, w workload, node *corev1.Node, namespace *corev1.Namespace) { diff --git a/pkg/collector/collector.go b/pkg/collector/collector.go index cda7929..06eba5b 100644 --- a/pkg/collector/collector.go +++ b/pkg/collector/collector.go @@ -718,6 +718,17 @@ func getContainerNameToID(pod *corev1.Pod) (map[string]string, string) { return containerNameToID, podUID } +func getContainerNameToContainerStatus(statuses []corev1.ContainerStatus) map[string]*corev1.ContainerStatus { + if len(statuses) == 0 { + return nil + } + m := make(map[string]*corev1.ContainerStatus) + for i := range statuses { + m[statuses[i].Name] = &statuses[i] + } + return m +} + func normalizeContainerID(id string) string { if index := strings.Index(id, "://"); index >= 0 { id = id[index+3:] @@ -782,6 +793,9 @@ func (c *Collector) collectContainers(o *CapacityObjects, ch chan<- prometheus.M // use the Pod containerStatuses field to map the container name to a containerID. containerNameToID, podUID := getContainerNameToID(pod) + // get container status by name + containerNameToStatuses := getContainerNameToContainerStatus(pod.Status.ContainerStatuses) + var samplerPodName, samplerPodPhase string if samplerPod, ok := o.SamplersByNode[pod.Spec.NodeName]; ok { samplerPodName = samplerPod.Name @@ -795,6 +809,7 @@ func (c *Collector) collectContainers(o *CapacityObjects, ch chan<- prometheus.M container := &pod.Spec.Containers[i] containerLabels := podLabels c.Labeler.SetLabelsForContainer(&containerLabels, container) + c.Labeler.SetLabelsForContainerStatus(&containerLabels, containerNameToStatuses[container.Name]) // first try to get the metrics based on the container name and namespace id := sampler.ContainerKey{ContainerName: container.Name, PodName: pod.Name, NamespaceName: pod.Namespace} diff --git a/pkg/collector/labels.go b/pkg/collector/labels.go index 7d4ef59..aa34bbe 100644 --- a/pkg/collector/labels.go +++ b/pkg/collector/labels.go @@ -37,6 +37,13 @@ func (l Labeler) SetLabelsForContainer( // no extension labels for containers } +// SetLabelsForContainerStatus parses metric labels from a container status +func (l Labeler) SetLabelsForContainerStatus( + labels *LabelsValues, container *corev1.ContainerStatus) { + l.BuiltIn.SetLabelsForContainerStatus(&labels.BuiltIn, container) + // no extension labels for containers +} + func (l Labeler) SetLabelsForPod( labels *LabelsValues, pod *corev1.Pod, w workload, node *corev1.Node, namespace *corev1.Namespace) { diff --git a/pkg/collector/testdata/collector/containers-builtin-deployment/expected.txt b/pkg/collector/testdata/collector/containers-builtin-deployment/expected.txt index 9a2be9b..03a1b3e 100644 --- a/pkg/collector/testdata/collector/containers-builtin-deployment/expected.txt +++ b/pkg/collector/testdata/collector/containers-builtin-deployment/expected.txt @@ -28,44 +28,44 @@ kube_usage_cluster_sum_requests_allocated_cpu_cores{priority_class="p1"} 6 kube_usage_cluster_sum_requests_allocated_memory_bytes{priority_class="p1"} 3e+08 # HELP kube_usage_container_sum_limits_allocated_cpu_cores kube_usage_container_sum_limits_allocated_cpu_cores # TYPE kube_usage_container_sum_limits_allocated_cpu_cores gauge -kube_usage_container_sum_limits_allocated_cpu_cores{app="app-1",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 2 -kube_usage_container_sum_limits_allocated_cpu_cores{app="app-1",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 2 -kube_usage_container_sum_limits_allocated_cpu_cores{app="app-1",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1 -kube_usage_container_sum_limits_allocated_cpu_cores{app="app-1",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1 -kube_usage_container_sum_limits_allocated_cpu_cores{app="app-2",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 2 -kube_usage_container_sum_limits_allocated_cpu_cores{app="app-2",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 2 -kube_usage_container_sum_limits_allocated_cpu_cores{app="app-2",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1 -kube_usage_container_sum_limits_allocated_cpu_cores{app="app-2",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1 +kube_usage_container_sum_limits_allocated_cpu_cores{app="app-1",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 2 +kube_usage_container_sum_limits_allocated_cpu_cores{app="app-1",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 2 +kube_usage_container_sum_limits_allocated_cpu_cores{app="app-1",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1 +kube_usage_container_sum_limits_allocated_cpu_cores{app="app-1",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1 +kube_usage_container_sum_limits_allocated_cpu_cores{app="app-2",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 2 +kube_usage_container_sum_limits_allocated_cpu_cores{app="app-2",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 2 +kube_usage_container_sum_limits_allocated_cpu_cores{app="app-2",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1 +kube_usage_container_sum_limits_allocated_cpu_cores{app="app-2",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1 # HELP kube_usage_container_sum_limits_allocated_memory_bytes kube_usage_container_sum_limits_allocated_memory_bytes # TYPE kube_usage_container_sum_limits_allocated_memory_bytes gauge -kube_usage_container_sum_limits_allocated_memory_bytes{app="app-1",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1e+08 -kube_usage_container_sum_limits_allocated_memory_bytes{app="app-1",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1e+08 -kube_usage_container_sum_limits_allocated_memory_bytes{app="app-1",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 5e+07 -kube_usage_container_sum_limits_allocated_memory_bytes{app="app-1",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 5e+07 -kube_usage_container_sum_limits_allocated_memory_bytes{app="app-2",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1e+08 -kube_usage_container_sum_limits_allocated_memory_bytes{app="app-2",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1e+08 -kube_usage_container_sum_limits_allocated_memory_bytes{app="app-2",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 5e+07 -kube_usage_container_sum_limits_allocated_memory_bytes{app="app-2",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 5e+07 +kube_usage_container_sum_limits_allocated_memory_bytes{app="app-1",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1e+08 +kube_usage_container_sum_limits_allocated_memory_bytes{app="app-1",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1e+08 +kube_usage_container_sum_limits_allocated_memory_bytes{app="app-1",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 5e+07 +kube_usage_container_sum_limits_allocated_memory_bytes{app="app-1",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 5e+07 +kube_usage_container_sum_limits_allocated_memory_bytes{app="app-2",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1e+08 +kube_usage_container_sum_limits_allocated_memory_bytes{app="app-2",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1e+08 +kube_usage_container_sum_limits_allocated_memory_bytes{app="app-2",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 5e+07 +kube_usage_container_sum_limits_allocated_memory_bytes{app="app-2",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 5e+07 # HELP kube_usage_container_sum_requests_allocated_cpu_cores kube_usage_container_sum_requests_allocated_cpu_cores # TYPE kube_usage_container_sum_requests_allocated_cpu_cores gauge -kube_usage_container_sum_requests_allocated_cpu_cores{app="app-1",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1 -kube_usage_container_sum_requests_allocated_cpu_cores{app="app-1",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1 -kube_usage_container_sum_requests_allocated_cpu_cores{app="app-1",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 0.5 -kube_usage_container_sum_requests_allocated_cpu_cores{app="app-1",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 0.5 -kube_usage_container_sum_requests_allocated_cpu_cores{app="app-2",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1 -kube_usage_container_sum_requests_allocated_cpu_cores{app="app-2",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1 -kube_usage_container_sum_requests_allocated_cpu_cores{app="app-2",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 0.5 -kube_usage_container_sum_requests_allocated_cpu_cores{app="app-2",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 0.5 +kube_usage_container_sum_requests_allocated_cpu_cores{app="app-1",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1 +kube_usage_container_sum_requests_allocated_cpu_cores{app="app-1",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 1 +kube_usage_container_sum_requests_allocated_cpu_cores{app="app-1",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 0.5 +kube_usage_container_sum_requests_allocated_cpu_cores{app="app-1",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 0.5 +kube_usage_container_sum_requests_allocated_cpu_cores{app="app-2",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1 +kube_usage_container_sum_requests_allocated_cpu_cores{app="app-2",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 1 +kube_usage_container_sum_requests_allocated_cpu_cores{app="app-2",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 0.5 +kube_usage_container_sum_requests_allocated_cpu_cores{app="app-2",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 0.5 # HELP kube_usage_container_sum_requests_allocated_memory_bytes kube_usage_container_sum_requests_allocated_memory_bytes # TYPE kube_usage_container_sum_requests_allocated_memory_bytes gauge -kube_usage_container_sum_requests_allocated_memory_bytes{app="app-1",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 5e+07 -kube_usage_container_sum_requests_allocated_memory_bytes{app="app-1",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 5e+07 -kube_usage_container_sum_requests_allocated_memory_bytes{app="app-1",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 2.5e+07 -kube_usage_container_sum_requests_allocated_memory_bytes{app="app-1",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 2.5e+07 -kube_usage_container_sum_requests_allocated_memory_bytes{app="app-2",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 5e+07 -kube_usage_container_sum_requests_allocated_memory_bytes{app="app-2",container_image="images.example/app:v4",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 5e+07 -kube_usage_container_sum_requests_allocated_memory_bytes{app="app-2",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 2.5e+07 -kube_usage_container_sum_requests_allocated_memory_bytes{app="app-2",container_image="images.my-company.example/log-aggregator:v6",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 2.5e+07 +kube_usage_container_sum_requests_allocated_memory_bytes{app="app-1",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 5e+07 +kube_usage_container_sum_requests_allocated_memory_bytes{app="app-1",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 5e+07 +kube_usage_container_sum_requests_allocated_memory_bytes{app="app-1",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 2.5e+07 +kube_usage_container_sum_requests_allocated_memory_bytes{app="app-1",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-1",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-1"} 2.5e+07 +kube_usage_container_sum_requests_allocated_memory_bytes{app="app-2",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 5e+07 +kube_usage_container_sum_requests_allocated_memory_bytes{app="app-2",container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_container="app",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 5e+07 +kube_usage_container_sum_requests_allocated_memory_bytes{app="app-2",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-1",exported_pod="test-pod-1-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 2.5e+07 +kube_usage_container_sum_requests_allocated_memory_bytes{app="app-2",container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_container="log-aggregator",exported_namespace="test-namespace-1",exported_node="test-node-2",exported_pod="test-pod-2-deployment-2",priority_class="p1",scheduled="true",workload_api_group="apps",workload_api_version="v1",workload_kind="deployment",workload_name="test-deployment-2"} 2.5e+07 # HELP kube_usage_namespace_sum_limits_allocated_cpu_cores kube_usage_namespace_sum_limits_allocated_cpu_cores # TYPE kube_usage_namespace_sum_limits_allocated_cpu_cores gauge kube_usage_namespace_sum_limits_allocated_cpu_cores{exported_namespace="test-namespace-1",priority_class="p1"} 12 diff --git a/pkg/collector/testdata/collector/containers-builtin-deployment/input_client_objects.yaml b/pkg/collector/testdata/collector/containers-builtin-deployment/input_client_objects.yaml index ad1036d..e5819e2 100644 --- a/pkg/collector/testdata/collector/containers-builtin-deployment/input_client_objects.yaml +++ b/pkg/collector/testdata/collector/containers-builtin-deployment/input_client_objects.yaml @@ -34,6 +34,11 @@ spec: cpu: "1" status: phase: Running + containerStatuses: + - name: log-aggregator + imageID: images.my-company.example/log-aggregator@sha256:digest + - name: app + imageID: images.example/app@sha256:digest --- apiVersion: v1 kind: Pod @@ -71,6 +76,11 @@ spec: cpu: "1" status: phase: Running + containerStatuses: + - name: log-aggregator + imageID: images.my-company.example/log-aggregator@sha256:digest + - name: app + imageID: images.example/app@sha256:digest --- apiVersion: apps/v1 kind: ReplicaSet @@ -119,6 +129,11 @@ spec: cpu: "1" status: phase: Running + containerStatuses: + - name: log-aggregator + imageID: images.my-company.example/log-aggregator@sha256:digest + - name: app + imageID: images.example/app@sha256:digest --- apiVersion: v1 kind: Pod @@ -156,6 +171,11 @@ spec: cpu: "1" status: phase: Running + containerStatuses: + - name: log-aggregator + imageID: images.my-company.example/log-aggregator@sha256:digest + - name: app + imageID: images.example/app@sha256:digest --- apiVersion: apps/v1 kind: ReplicaSet diff --git a/pkg/collector/testdata/collector/containers-builtin-deployment/input_collector_spec.yaml b/pkg/collector/testdata/collector/containers-builtin-deployment/input_collector_spec.yaml index 2ae70c0..3934531 100644 --- a/pkg/collector/testdata/collector/containers-builtin-deployment/input_collector_spec.yaml +++ b/pkg/collector/testdata/collector/containers-builtin-deployment/input_collector_spec.yaml @@ -27,6 +27,7 @@ aggregations: # aggregate metrics and export them priority_class: true scheduled: true container_image: true + container_image_id: true - mask: name: "workload" # sum all containers / pods into workload metrics builtIn: diff --git a/pkg/collector/testdata/collector/items/expected.txt b/pkg/collector/testdata/collector/items/expected.txt index 6f71a10..143830a 100644 --- a/pkg/collector/testdata/collector/items/expected.txt +++ b/pkg/collector/testdata/collector/items/expected.txt @@ -1,7 +1,7 @@ # HELP kube_usage_namespace_images_sum_container_items kube_usage_namespace_images_sum_container_items # TYPE kube_usage_namespace_images_sum_container_items gauge -kube_usage_namespace_images_sum_container_items{container_image="images.example/app:v4",exported_namespace="test-namespace-1",namespace_annotation="namespace-annotation-1",namespace_label="namespace-label-1"} 4 -kube_usage_namespace_images_sum_container_items{container_image="images.my-company.example/log-aggregator:v6",exported_namespace="test-namespace-1",namespace_annotation="namespace-annotation-1",namespace_label="namespace-label-1"} 4 +kube_usage_namespace_images_sum_container_items{container_image="images.example/app:v4",container_image_id="images.example/app@sha256:digest",exported_namespace="test-namespace-1",namespace_annotation="namespace-annotation-1",namespace_label="namespace-label-1"} 4 +kube_usage_namespace_images_sum_container_items{container_image="images.my-company.example/log-aggregator:v6",container_image_id="images.my-company.example/log-aggregator@sha256:digest",exported_namespace="test-namespace-1",namespace_annotation="namespace-annotation-1",namespace_label="namespace-label-1"} 4 # HELP kube_usage_namespace_max_pod_schedule_wait_time_seconds kube_usage_namespace_max_pod_schedule_wait_time_seconds # TYPE kube_usage_namespace_max_pod_schedule_wait_time_seconds gauge kube_usage_namespace_max_pod_schedule_wait_time_seconds{exported_namespace="test-namespace-1",node_label=""} 30 diff --git a/pkg/collector/testdata/collector/items/input_client_objects.yaml b/pkg/collector/testdata/collector/items/input_client_objects.yaml index d9c34ef..f0b63cd 100644 --- a/pkg/collector/testdata/collector/items/input_client_objects.yaml +++ b/pkg/collector/testdata/collector/items/input_client_objects.yaml @@ -37,6 +37,11 @@ spec: cpu: "1" status: phase: Running + containerStatuses: + - name: log-aggregator + imageID: images.my-company.example/log-aggregator@sha256:digest + - name: app + imageID: images.example/app@sha256:digest --- apiVersion: v1 kind: Pod @@ -82,6 +87,11 @@ status: - lastTransitionTime: "2022-03-23T01:00:10Z" status: "True" type: PodScheduled + containerStatuses: + - name: log-aggregator + imageID: images.my-company.example/log-aggregator@sha256:digest + - name: app + imageID: images.example/app@sha256:digest --- apiVersion: apps/v1 kind: ReplicaSet @@ -135,6 +145,11 @@ status: - lastTransitionTime: "2022-03-23T01:30:00Z" status: "True" type: PodScheduled + containerStatuses: + - name: log-aggregator + imageID: images.my-company.example/log-aggregator@sha256:digest + - name: app + imageID: images.example/app@sha256:digest --- apiVersion: v1 kind: Pod @@ -172,6 +187,11 @@ spec: cpu: "1" status: phase: Running + containerStatuses: + - name: log-aggregator + imageID: images.my-company.example/log-aggregator@sha256:digest + - name: app + imageID: images.example/app@sha256:digest --- apiVersion: apps/v1 kind: ReplicaSet diff --git a/pkg/collector/testdata/collector/items/input_collector_spec.yaml b/pkg/collector/testdata/collector/items/input_collector_spec.yaml index 57fa574..cb89b31 100644 --- a/pkg/collector/testdata/collector/items/input_collector_spec.yaml +++ b/pkg/collector/testdata/collector/items/input_collector_spec.yaml @@ -34,6 +34,7 @@ aggregations: builtIn: exported_namespace: true container_image: true + container_image_id: true extensions: namespace_label: true namespace_annotation: true