diff --git a/api/applications/applications_controller_test.go b/api/applications/applications_controller_test.go index 861cf834..2b632ffb 100644 --- a/api/applications/applications_controller_test.go +++ b/api/applications/applications_controller_test.go @@ -2002,7 +2002,7 @@ func Test_GetUsedResources(t *testing.T) { require.NoError(t, err) expectedUtilization := applicationModels.NewPodResourcesUtilizationResponse() - expectedUtilization.SetCpuReqs("dev", "web", "web-abcd-1", 1) + expectedUtilization.SetCpuRequests("dev", "web", "web-abcd-1", 1) cpuReqs := []metrics.LabeledResults{{Value: 1, Namespace: appName1 + "-dev", Component: "web", Pod: "web-abcd-1"}} @@ -2010,10 +2010,10 @@ func Test_GetUsedResources(t *testing.T) { validator.EXPECT().ValidateToken(gomock.Any(), gomock.Any()).Times(1).Return(controllertest.NewTestPrincipal(true), nil) client := mock2.NewMockClient(ctrl) - client.EXPECT().GetCpuReqs(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(cpuReqs, nil) - client.EXPECT().GetCpuAvg(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return([]metrics.LabeledResults{}, nil) - client.EXPECT().GetMemReqs(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return([]metrics.LabeledResults{}, nil) - client.EXPECT().GetMemMax(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return([]metrics.LabeledResults{}, ts.expectedError) + client.EXPECT().GetCpuRequests(gomock.Any(), gomock.Any()).Times(1).Return(cpuReqs, nil) + client.EXPECT().GetCpuAverage(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return([]metrics.LabeledResults{}, nil) + client.EXPECT().GetMemoryRequests(gomock.Any(), gomock.Any()).Times(1).Return([]metrics.LabeledResults{}, nil) + client.EXPECT().GetMemoryMaximum(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return([]metrics.LabeledResults{}, ts.expectedError) metricsHandler := metrics.NewHandler(client) controllerTestUtils := controllertest.NewTestUtils(kubeClient, radixClient, kedaClient, secretProviderClient, certClient, validator, diff --git a/api/applications/models/resource_utilization.go b/api/applications/models/resource_utilization.go index 95147dd3..be192949 100644 --- a/api/applications/models/resource_utilization.go +++ b/api/applications/models/resource_utilization.go @@ -16,16 +16,16 @@ type ComponentUtilization struct { type ReplicaUtilization struct { // Memory Requests // required: true - MemReqs float64 `json:"mem_reqs"` + MemoryRequests float64 `json:"memoryRequests"` // Max memory used // required: true - MemMax float64 `json:"mem_max"` + MemoryMaximum float64 `json:"memoryMaximum"` // Cpu Requests // required: true - CpuReqs float64 `json:"cpu_reqs"` + CpuRequests float64 `json:"cpuRequests"` // Average CPU Used // required: true - CpuAvg float64 `json:"cpu_avg"` + CpuAverage float64 `json:"cpuAverage"` } func NewPodResourcesUtilizationResponse() *ReplicaResourcesUtilizationResponse { @@ -34,35 +34,35 @@ func NewPodResourcesUtilizationResponse() *ReplicaResourcesUtilizationResponse { } } -func (r *ReplicaResourcesUtilizationResponse) SetCpuReqs(environment, component, pod string, value float64) { +func (r *ReplicaResourcesUtilizationResponse) SetCpuRequests(environment, component, pod string, value float64) { r.ensurePod(environment, component, pod) p := r.Environments[environment].Components[component].Replicas[pod] - p.CpuReqs = value + p.CpuRequests = value r.Environments[environment].Components[component].Replicas[pod] = p } -func (r *ReplicaResourcesUtilizationResponse) SetCpuAvg(environment, component, pod string, value float64) { +func (r *ReplicaResourcesUtilizationResponse) SetCpuAverage(environment, component, pod string, value float64) { r.ensurePod(environment, component, pod) p := r.Environments[environment].Components[component].Replicas[pod] - p.CpuAvg = value + p.CpuAverage = value r.Environments[environment].Components[component].Replicas[pod] = p } -func (r *ReplicaResourcesUtilizationResponse) SetMemReqs(environment, component, pod string, value float64) { +func (r *ReplicaResourcesUtilizationResponse) SetMemoryRequests(environment, component, pod string, value float64) { r.ensurePod(environment, component, pod) p := r.Environments[environment].Components[component].Replicas[pod] - p.MemReqs = value + p.MemoryRequests = value r.Environments[environment].Components[component].Replicas[pod] = p } -func (r *ReplicaResourcesUtilizationResponse) SetMemMax(environment, component, pod string, value float64) { +func (r *ReplicaResourcesUtilizationResponse) SetMemoryMaximum(environment, component, pod string, value float64) { r.ensurePod(environment, component, pod) p := r.Environments[environment].Components[component].Replicas[pod] - p.MemMax = value + p.MemoryMaximum = value r.Environments[environment].Components[component].Replicas[pod] = p } diff --git a/api/applications/models/resource_utilization_test.go b/api/applications/models/resource_utilization_test.go index a3481a66..fae072f5 100644 --- a/api/applications/models/resource_utilization_test.go +++ b/api/applications/models/resource_utilization_test.go @@ -13,10 +13,10 @@ func TestComponentUtilization(t *testing.T) { assert.Empty(t, r.Environments) - r.SetCpuReqs("dev", "web", "web-abccdc-1234", 1) - r.SetMemReqs("prod", "srv", "srv-abccdc-1234", 2) - r.SetMemMax("dev", "web", "web-abccdc-1234", 1500) - r.SetCpuAvg("prod", "srv", "srv-abccdc-1234", 2.5) + r.SetCpuRequests("dev", "web", "web-abccdc-1234", 1) + r.SetMemoryRequests("prod", "srv", "srv-abccdc-1234", 2) + r.SetMemoryMaximum("dev", "web", "web-abccdc-1234", 1500) + r.SetCpuAverage("prod", "srv", "srv-abccdc-1234", 2.5) require.Len(t, r.Environments, 2) require.Contains(t, r.Environments, "dev") @@ -29,9 +29,9 @@ func TestComponentUtilization(t *testing.T) { require.Contains(t, r.Environments["dev"].Components["web"].Replicas, "web-abccdc-1234") require.Contains(t, r.Environments["prod"].Components["srv"].Replicas, "srv-abccdc-1234") - assert.Equal(t, 1.0, r.Environments["dev"].Components["web"].Replicas["web-abccdc-1234"].CpuReqs) - assert.Equal(t, 2.0, r.Environments["prod"].Components["srv"].Replicas["srv-abccdc-1234"].MemReqs) + assert.Equal(t, 1.0, r.Environments["dev"].Components["web"].Replicas["web-abccdc-1234"].CpuRequests) + assert.Equal(t, 2.0, r.Environments["prod"].Components["srv"].Replicas["srv-abccdc-1234"].MemoryRequests) - assert.Equal(t, 1500.0, r.Environments["dev"].Components["web"].Replicas["web-abccdc-1234"].MemMax) - assert.Equal(t, 2.5, r.Environments["prod"].Components["srv"].Replicas["srv-abccdc-1234"].CpuAvg) + assert.Equal(t, 1500.0, r.Environments["dev"].Components["web"].Replicas["web-abccdc-1234"].MemoryMaximum) + assert.Equal(t, 2.5, r.Environments["prod"].Components["srv"].Replicas["srv-abccdc-1234"].CpuAverage) } diff --git a/api/metrics/metrics_handler.go b/api/metrics/metrics_handler.go index 9b88fcfb..52fb74a0 100644 --- a/api/metrics/metrics_handler.go +++ b/api/metrics/metrics_handler.go @@ -19,10 +19,10 @@ type LabeledResults struct { Pod string } type Client interface { - GetCpuReqs(ctx context.Context, appName, namespace string) ([]LabeledResults, error) - GetCpuAvg(ctx context.Context, appName, namespace, duration string) ([]LabeledResults, error) - GetMemReqs(ctx context.Context, appName, namespace string) ([]LabeledResults, error) - GetMemMax(ctx context.Context, appName, namespace, duration string) ([]LabeledResults, error) + GetCpuRequests(ctx context.Context, namespace string) ([]LabeledResults, error) + GetCpuAverage(ctx context.Context, namespace, duration string) ([]LabeledResults, error) + GetMemoryRequests(ctx context.Context, namespace string) ([]LabeledResults, error) + GetMemoryMaximum(ctx context.Context, namespace, duration string) ([]LabeledResults, error) } type Handler struct { @@ -44,40 +44,41 @@ func (pc *Handler) GetReplicaResourcesUtilization(ctx context.Context, appName, namespace = appName + "-" + envName } - results, err := pc.client.GetCpuReqs(ctx, appName, namespace) + extractEnv := func(namespace string) string { + env, _ := strings.CutPrefix(namespace, appName+"-") + return env + } + + results, err := pc.client.GetCpuRequests(ctx, namespace) if err != nil { return nil, err } for _, result := range results { - environment, _ := strings.CutPrefix(result.Namespace, appName+"-") - utilization.SetCpuReqs(environment, result.Component, result.Pod, math.Round(result.Value*1e6)/1e6) + utilization.SetCpuRequests(extractEnv(result.Namespace), result.Component, result.Pod, math.Round(result.Value*1e6)/1e6) } - results, err = pc.client.GetCpuAvg(ctx, appName, namespace, DefaultDuration) + results, err = pc.client.GetCpuAverage(ctx, namespace, DefaultDuration) if err != nil { return nil, err } for _, result := range results { - environment, _ := strings.CutPrefix(result.Namespace, appName+"-") - utilization.SetCpuAvg(environment, result.Component, result.Pod, math.Round(result.Value*1e6)/1e6) + utilization.SetCpuAverage(extractEnv(result.Namespace), result.Component, result.Pod, math.Round(result.Value*1e6)/1e6) } - results, err = pc.client.GetMemReqs(ctx, appName, namespace) + results, err = pc.client.GetMemoryRequests(ctx, namespace) if err != nil { return nil, err } for _, result := range results { - environment, _ := strings.CutPrefix(result.Namespace, appName+"-") - utilization.SetMemReqs(environment, result.Component, result.Pod, math.Round(result.Value)) + utilization.SetMemoryRequests(extractEnv(result.Namespace), result.Component, result.Pod, math.Round(result.Value)) } - results, err = pc.client.GetMemMax(ctx, appName, namespace, DefaultDuration) + results, err = pc.client.GetMemoryMaximum(ctx, namespace, DefaultDuration) if err != nil { return nil, err } for _, result := range results { - environment, _ := strings.CutPrefix(result.Namespace, appName+"-") - utilization.SetMemMax(environment, result.Component, result.Pod, math.Round(result.Value)) + utilization.SetMemoryMaximum(extractEnv(result.Namespace), result.Component, result.Pod, math.Round(result.Value)) } return utilization, nil diff --git a/api/metrics/metrics_handler_test.go b/api/metrics/metrics_handler_test.go index ff5351dc..1f5fbdd7 100644 --- a/api/metrics/metrics_handler_test.go +++ b/api/metrics/metrics_handler_test.go @@ -59,10 +59,10 @@ func Test_handler_GetReplicaResourcesUtilization(t *testing.T) { {Value: 100, Namespace: appName1 + "-dev", Component: "web", Pod: "web-abcd-2"}, } - client.EXPECT().GetCpuReqs(gomock.Any(), ts.appName, expectedNamespace).Times(1).Return(cpuReqs, nil) - client.EXPECT().GetCpuAvg(gomock.Any(), ts.appName, expectedNamespace, "24h").Times(1).Return(cpuAvg, nil) - client.EXPECT().GetMemReqs(gomock.Any(), ts.appName, expectedNamespace).Times(1).Return(memReqs, nil) - client.EXPECT().GetMemMax(gomock.Any(), ts.appName, expectedNamespace, "24h").Times(1).Return(MemMax, nil) + client.EXPECT().GetCpuRequests(gomock.Any(), expectedNamespace).Times(1).Return(cpuReqs, nil) + client.EXPECT().GetCpuAverage(gomock.Any(), expectedNamespace, "24h").Times(1).Return(cpuAvg, nil) + client.EXPECT().GetMemoryRequests(gomock.Any(), expectedNamespace).Times(1).Return(memReqs, nil) + client.EXPECT().GetMemoryMaximum(gomock.Any(), expectedNamespace, "24h").Times(1).Return(MemMax, nil) metricsHandler := metrics.NewHandler(client) response, err := metricsHandler.GetReplicaResourcesUtilization(context.Background(), appName1, ts.envName) @@ -74,15 +74,15 @@ func Test_handler_GetReplicaResourcesUtilization(t *testing.T) { assert.Contains(t, response.Environments["dev"].Components["web"].Replicas, "web-abcd-1") assert.Contains(t, response.Environments["dev"].Components["web"].Replicas, "web-abcd-2") - assert.EqualValues(t, 1, response.Environments["dev"].Components["web"].Replicas["web-abcd-1"].CpuReqs) - assert.EqualValues(t, 0.5, response.Environments["dev"].Components["web"].Replicas["web-abcd-1"].CpuAvg) - assert.EqualValues(t, 100, response.Environments["dev"].Components["web"].Replicas["web-abcd-1"].MemReqs) - assert.EqualValues(t, 50, response.Environments["dev"].Components["web"].Replicas["web-abcd-1"].MemMax) + assert.EqualValues(t, 1, response.Environments["dev"].Components["web"].Replicas["web-abcd-1"].CpuRequests) + assert.EqualValues(t, 0.5, response.Environments["dev"].Components["web"].Replicas["web-abcd-1"].CpuAverage) + assert.EqualValues(t, 100, response.Environments["dev"].Components["web"].Replicas["web-abcd-1"].MemoryRequests) + assert.EqualValues(t, 50, response.Environments["dev"].Components["web"].Replicas["web-abcd-1"].MemoryMaximum) - assert.EqualValues(t, 2, response.Environments["dev"].Components["web"].Replicas["web-abcd-2"].CpuReqs) - assert.EqualValues(t, 0.7, response.Environments["dev"].Components["web"].Replicas["web-abcd-2"].CpuAvg) - assert.EqualValues(t, 200, response.Environments["dev"].Components["web"].Replicas["web-abcd-2"].MemReqs) - assert.EqualValues(t, 100, response.Environments["dev"].Components["web"].Replicas["web-abcd-2"].MemMax) + assert.EqualValues(t, 2, response.Environments["dev"].Components["web"].Replicas["web-abcd-2"].CpuRequests) + assert.EqualValues(t, 0.7, response.Environments["dev"].Components["web"].Replicas["web-abcd-2"].CpuAverage) + assert.EqualValues(t, 200, response.Environments["dev"].Components["web"].Replicas["web-abcd-2"].MemoryRequests) + assert.EqualValues(t, 100, response.Environments["dev"].Components["web"].Replicas["web-abcd-2"].MemoryMaximum) assert.NotEmpty(t, response) }) diff --git a/api/metrics/mock/metrics_handler_mock.go b/api/metrics/mock/metrics_handler_mock.go index a555425e..e5408fb2 100644 --- a/api/metrics/mock/metrics_handler_mock.go +++ b/api/metrics/mock/metrics_handler_mock.go @@ -35,62 +35,62 @@ func (m *MockClient) EXPECT() *MockClientMockRecorder { return m.recorder } -// GetCpuAvg mocks base method. -func (m *MockClient) GetCpuAvg(ctx context.Context, appName, namespace, duration string) ([]metrics.LabeledResults, error) { +// GetCpuAverage mocks base method. +func (m *MockClient) GetCpuAverage(ctx context.Context, namespace, duration string) ([]metrics.LabeledResults, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetCpuAvg", ctx, appName, namespace, duration) + ret := m.ctrl.Call(m, "GetCpuAverage", ctx, namespace, duration) ret0, _ := ret[0].([]metrics.LabeledResults) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetCpuAvg indicates an expected call of GetCpuAvg. -func (mr *MockClientMockRecorder) GetCpuAvg(ctx, appName, namespace, duration interface{}) *gomock.Call { +// GetCpuAverage indicates an expected call of GetCpuAverage. +func (mr *MockClientMockRecorder) GetCpuAverage(ctx, namespace, duration interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCpuAvg", reflect.TypeOf((*MockClient)(nil).GetCpuAvg), ctx, appName, namespace, duration) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCpuAverage", reflect.TypeOf((*MockClient)(nil).GetCpuAverage), ctx, namespace, duration) } -// GetCpuReqs mocks base method. -func (m *MockClient) GetCpuReqs(ctx context.Context, appName, namespace string) ([]metrics.LabeledResults, error) { +// GetCpuRequests mocks base method. +func (m *MockClient) GetCpuRequests(ctx context.Context, namespace string) ([]metrics.LabeledResults, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetCpuReqs", ctx, appName, namespace) + ret := m.ctrl.Call(m, "GetCpuRequests", ctx, namespace) ret0, _ := ret[0].([]metrics.LabeledResults) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetCpuReqs indicates an expected call of GetCpuReqs. -func (mr *MockClientMockRecorder) GetCpuReqs(ctx, appName, namespace interface{}) *gomock.Call { +// GetCpuRequests indicates an expected call of GetCpuRequests. +func (mr *MockClientMockRecorder) GetCpuRequests(ctx, namespace interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCpuReqs", reflect.TypeOf((*MockClient)(nil).GetCpuReqs), ctx, appName, namespace) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCpuRequests", reflect.TypeOf((*MockClient)(nil).GetCpuRequests), ctx, namespace) } -// GetMemMax mocks base method. -func (m *MockClient) GetMemMax(ctx context.Context, appName, namespace, duration string) ([]metrics.LabeledResults, error) { +// GetMemoryMaximum mocks base method. +func (m *MockClient) GetMemoryMaximum(ctx context.Context, namespace, duration string) ([]metrics.LabeledResults, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetMemMax", ctx, appName, namespace, duration) + ret := m.ctrl.Call(m, "GetMemoryMaximum", ctx, namespace, duration) ret0, _ := ret[0].([]metrics.LabeledResults) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetMemMax indicates an expected call of GetMemMax. -func (mr *MockClientMockRecorder) GetMemMax(ctx, appName, namespace, duration interface{}) *gomock.Call { +// GetMemoryMaximum indicates an expected call of GetMemoryMaximum. +func (mr *MockClientMockRecorder) GetMemoryMaximum(ctx, namespace, duration interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMemMax", reflect.TypeOf((*MockClient)(nil).GetMemMax), ctx, appName, namespace, duration) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMemoryMaximum", reflect.TypeOf((*MockClient)(nil).GetMemoryMaximum), ctx, namespace, duration) } -// GetMemReqs mocks base method. -func (m *MockClient) GetMemReqs(ctx context.Context, appName, namespace string) ([]metrics.LabeledResults, error) { +// GetMemoryRequests mocks base method. +func (m *MockClient) GetMemoryRequests(ctx context.Context, namespace string) ([]metrics.LabeledResults, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetMemReqs", ctx, appName, namespace) + ret := m.ctrl.Call(m, "GetMemoryRequests", ctx, namespace) ret0, _ := ret[0].([]metrics.LabeledResults) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetMemReqs indicates an expected call of GetMemReqs. -func (mr *MockClientMockRecorder) GetMemReqs(ctx, appName, namespace interface{}) *gomock.Call { +// GetMemoryRequests indicates an expected call of GetMemoryRequests. +func (mr *MockClientMockRecorder) GetMemoryRequests(ctx, namespace interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMemReqs", reflect.TypeOf((*MockClient)(nil).GetMemReqs), ctx, appName, namespace) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMemoryRequests", reflect.TypeOf((*MockClient)(nil).GetMemoryRequests), ctx, namespace) } diff --git a/api/metrics/prometheus/prometheus_client.go b/api/metrics/prometheus/prometheus_client.go index 1d85ab87..f02201c7 100644 --- a/api/metrics/prometheus/prometheus_client.go +++ b/api/metrics/prometheus/prometheus_client.go @@ -42,24 +42,24 @@ func NewClient(api QueryAPI) metrics.Client { return &Client{api: api} } -// GetCpuReqs returns a list of all pods with their CPU requets. The Namespace can be regex. It will return the labels label_radix_component, namespace, pod and container. -func (c *Client) GetCpuReqs(ctx context.Context, appName, namespace string) ([]metrics.LabeledResults, error) { - return c.queryVector(ctx, fmt.Sprintf(`max by(namespace, container, pod) (kube_pod_container_resource_requests{container!="",namespace!="%s-app", namespace=~"%s",resource="cpu"}) * on(pod) group_left(label_radix_component) kube_pod_labels{label_radix_component!=""}`, appName, namespace)) +// GetCpuRequests returns a list of all pods with their CPU requets. The Namespace can be regex. It will return the labels label_radix_component, namespace, pod and container. +func (c *Client) GetCpuRequests(ctx context.Context, namespace string) ([]metrics.LabeledResults, error) { + return c.queryVector(ctx, fmt.Sprintf(`max by(namespace, container, pod) (kube_pod_container_resource_requests{container!="", namespace=~"%s",resource="cpu"}) * on(pod) group_left(label_radix_component) kube_pod_labels{label_radix_component!=""}`, namespace)) } -// GetCpuAvg returns a list of all pods with their average CPU usage. The Namespace can be regex. It will return the labels label_radix_component, namespace, pod and container. -func (c *Client) GetCpuAvg(ctx context.Context, appName, namespace, duration string) ([]metrics.LabeledResults, error) { - return c.queryVector(ctx, fmt.Sprintf(`max by(namespace, container, pod) (avg_over_time(irate(container_cpu_usage_seconds_total{container!="",namespace!="%s-app", namespace=~"%s"}[1m]) [%s:])) * on(pod) group_left(label_radix_component) kube_pod_labels{label_radix_component!=""}`, appName, namespace, duration)) +// GetCpuAverage returns a list of all pods with their average CPU usage. The Namespace can be regex. It will return the labels label_radix_component, namespace, pod and container. +func (c *Client) GetCpuAverage(ctx context.Context, namespace, duration string) ([]metrics.LabeledResults, error) { + return c.queryVector(ctx, fmt.Sprintf(`max by(namespace, container, pod) (avg_over_time(irate(container_cpu_usage_seconds_total{container!="", namespace=~"%s"}[1m]) [%s:])) * on(pod) group_left(label_radix_component) kube_pod_labels{label_radix_component!=""}`, namespace, duration)) } -// GetMemReqs returns a list of all pods with their Memory requets. The Namespace can be regex. It will return the labels label_radix_component, namespace, pod and container. -func (c *Client) GetMemReqs(ctx context.Context, appName, namespace string) ([]metrics.LabeledResults, error) { - return c.queryVector(ctx, fmt.Sprintf(`max by(namespace, container, pod) (kube_pod_container_resource_requests{container!="",namespace!="%s-app", namespace=~"%s",resource="memory"}) * on(pod) group_left(label_radix_component) kube_pod_labels{label_radix_component!=""}`, appName, namespace)) +// GetMemoryRequests returns a list of all pods with their Memory requets. The Namespace can be regex. It will return the labels label_radix_component, namespace, pod and container. +func (c *Client) GetMemoryRequests(ctx context.Context, namespace string) ([]metrics.LabeledResults, error) { + return c.queryVector(ctx, fmt.Sprintf(`max by(namespace, container, pod) (kube_pod_container_resource_requests{container!="", namespace=~"%s",resource="memory"}) * on(pod) group_left(label_radix_component) kube_pod_labels{label_radix_component!=""}`, namespace)) } -// GetMemMax returns a list of all pods with their maximum Memory usage. The Namespace can be regex. It will return the labels label_radix_component, namespace, pod and container. -func (c *Client) GetMemMax(ctx context.Context, appName, namespace, duration string) ([]metrics.LabeledResults, error) { - return c.queryVector(ctx, fmt.Sprintf(`max by(namespace, container, pod) (max_over_time(container_memory_usage_bytes{container!="",namespace!="%s-app", namespace=~"%s"} [%s:])) * on(pod) group_left(label_radix_component) kube_pod_labels{label_radix_component!=""}`, appName, namespace, duration)) +// GetMemoryMaximum returns a list of all pods with their maximum Memory usage. The Namespace can be regex. It will return the labels label_radix_component, namespace, pod and container. +func (c *Client) GetMemoryMaximum(ctx context.Context, namespace, duration string) ([]metrics.LabeledResults, error) { + return c.queryVector(ctx, fmt.Sprintf(`max by(namespace, container, pod) (max_over_time(container_memory_usage_bytes{container!="", namespace=~"%s"} [%s:])) * on(pod) group_left(label_radix_component) kube_pod_labels{label_radix_component!=""}`, namespace, duration)) } func (c *Client) queryVector(ctx context.Context, query string) ([]metrics.LabeledResults, error) { diff --git a/api/metrics/prometheus/prometheus_client_test.go b/api/metrics/prometheus/prometheus_client_test.go index 605f278e..051faefb 100644 --- a/api/metrics/prometheus/prometheus_client_test.go +++ b/api/metrics/prometheus/prometheus_client_test.go @@ -23,7 +23,6 @@ func TestArguemtsExistsInQuery(t *testing.T) { func(ctx context.Context, query string, ts time.Time, opts ...v1.Option) (model.Value, v1.Warnings, error) { assert.Contains(t, query, "namespace1") - assert.Contains(t, query, "app1") return nil, nil, nil }, @@ -32,7 +31,6 @@ func TestArguemtsExistsInQuery(t *testing.T) { func(ctx context.Context, query string, ts time.Time, opts ...v1.Option) (model.Value, v1.Warnings, error) { assert.Contains(t, query, "namespace2") - assert.Contains(t, query, "app2") return nil, nil, nil }, @@ -41,7 +39,6 @@ func TestArguemtsExistsInQuery(t *testing.T) { func(ctx context.Context, query string, ts time.Time, opts ...v1.Option) (model.Value, v1.Warnings, error) { assert.Contains(t, query, "namespace3") - assert.Contains(t, query, "app3") assert.Contains(t, query, "24h") return nil, nil, nil @@ -51,7 +48,6 @@ func TestArguemtsExistsInQuery(t *testing.T) { func(ctx context.Context, query string, ts time.Time, opts ...v1.Option) (model.Value, v1.Warnings, error) { assert.Contains(t, query, "namespace4") - assert.Contains(t, query, "app4") assert.Contains(t, query, "36h") return nil, nil, nil @@ -60,8 +56,8 @@ func TestArguemtsExistsInQuery(t *testing.T) { ) client := prometheus.NewClient(mock) - _, _ = client.GetCpuReqs(context.Background(), "app1", "namespace1") - _, _ = client.GetMemReqs(context.Background(), "app2", "namespace2") - _, _ = client.GetCpuAvg(context.Background(), "app3", "namespace3", "24h") - _, _ = client.GetMemMax(context.Background(), "app4", "namespace4", "36h") + _, _ = client.GetCpuRequests(context.Background(), "namespace1") + _, _ = client.GetMemoryRequests(context.Background(), "namespace2") + _, _ = client.GetCpuAverage(context.Background(), "namespace3", "24h") + _, _ = client.GetMemoryMaximum(context.Background(), "namespace4", "36h") } diff --git a/swaggerui/html/swagger.json b/swaggerui/html/swagger.json index ca157a40..7eae8107 100644 --- a/swaggerui/html/swagger.json +++ b/swaggerui/html/swagger.json @@ -8021,35 +8021,35 @@ "ReplicaUtilization": { "type": "object", "required": [ - "mem_reqs", - "mem_max", - "cpu_reqs", - "cpu_avg" + "memoryRequests", + "memoryMaximum", + "cpuRequests", + "cpuAverage" ], "properties": { - "cpu_avg": { + "cpuAverage": { "description": "Average CPU Used", "type": "number", "format": "double", - "x-go-name": "CpuAvg" + "x-go-name": "CpuAverage" }, - "cpu_reqs": { + "cpuRequests": { "description": "Cpu Requests", "type": "number", "format": "double", - "x-go-name": "CpuReqs" + "x-go-name": "CpuRequests" }, - "mem_max": { + "memoryMaximum": { "description": "Max memory used", "type": "number", "format": "double", - "x-go-name": "MemMax" + "x-go-name": "MemoryMaximum" }, - "mem_reqs": { + "memoryRequests": { "description": "Memory Requests", "type": "number", "format": "double", - "x-go-name": "MemReqs" + "x-go-name": "MemoryRequests" } }, "x-go-package": "github.com/equinor/radix-api/api/applications/models"