From 82b5a9cee75bde68ca5f2e24da67aaebb6bdf509 Mon Sep 17 00:00:00 2001 From: Lorenzo Torracchi Date: Tue, 29 Oct 2019 11:32:55 +0100 Subject: [PATCH] Cpu% and Memory% based on requests rather than limits --- internal/resource/pod.go | 2 -- internal/resource/pod_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/internal/resource/pod.go b/internal/resource/pod.go index af2061d4..31a58666 100644 --- a/internal/resource/pod.go +++ b/internal/resource/pod.go @@ -324,8 +324,6 @@ func (r *Pod) gatherPodMX(po *v1.Pod) (c, p metric) { func containerResources(co v1.Container) (cpu, mem *resource.Quantity) { req, limit := co.Resources.Requests, co.Resources.Limits switch { - case len(req) != 0 && len(limit) != 0: - cpu, mem = limit.Cpu(), limit.Memory() case len(req) != 0: cpu, mem = req.Cpu(), req.Memory() case len(limit) != 0: diff --git a/internal/resource/pod_test.go b/internal/resource/pod_test.go index a47ccdd7..fc9fc3c6 100644 --- a/internal/resource/pod_test.go +++ b/internal/resource/pod_test.go @@ -44,6 +44,28 @@ func TestPodFields(t *testing.T) { assert.Equal(t, "fred", r[0]) } +func TestPodFieldsPercentageCpuAndMemRelatedToContainerRequestSpec(t *testing.T) { + metrics := makeMxPod("fred", "250m", "256Mi") + + r := NewPodWithMetrics(metrics, v1.ResourceRequirements{ + Requests: makeRes("500m", "512Mi"), + }).Fields("blee") + + assert.Equal(t, "150", r[6]) + assert.Equal(t, "150", r[7]) +} + +func TestPodFieldsPercentageCpuAndMemFallbackToContainerLimitSpecWhenRequestNotDefined(t *testing.T) { + metrics := makeMxPod("fred", "250m", "256Mi") + + r := NewPodWithMetrics(metrics, v1.ResourceRequirements{ + Limits: makeRes("1000m", "1024Mi"), + }).Fields("blee") + + assert.Equal(t, "75", r[6]) + assert.Equal(t, "75", r[7]) +} + func TestPodMarshal(t *testing.T) { mc := NewMockConnection() mr := NewMockCruder() @@ -100,6 +122,11 @@ func BenchmarkPodFields(b *testing.B) { // ---------------------------------------------------------------------------- // Helpers... +func makePodWithContainerSpec(resources v1.ResourceRequirements) *v1.Pod { + pod := makePod() + pod.Spec.Containers[0].Resources = resources + return pod +} func makePod() *v1.Pod { var i int32 = 1 @@ -159,6 +186,13 @@ func newPod() resource.Columnar { return resource.NewPod(mc).New(makePod()) } +func NewPodWithMetrics(metrics mv1beta1.PodMetrics, resources v1.ResourceRequirements) resource.Columnar { + mc := NewMockConnection() + r := resource.NewPod(mc).New(makePodWithContainerSpec(resources)) + r.SetPodMetrics(&metrics) + return r +} + func poYaml() string { return `apiVersion: v1 kind: Pod