From 288c8de2a52a879d9fe654538e2c167c554ec950 Mon Sep 17 00:00:00 2001 From: LeaveMyYard <33721692+LeaveMyYard@users.noreply.github.com> Date: Wed, 2 Aug 2023 10:45:58 +0300 Subject: Fix minor issues left --- robusta_krr/api/models.py | 4 +- robusta_krr/core/abstract/metrics.py | 4 +- robusta_krr/core/abstract/strategies.py | 6 +-- .../core/integrations/prometheus/metrics/base.py | 6 +-- .../core/integrations/prometheus/metrics/cpu.py | 46 ++++++++++++---------- .../core/integrations/prometheus/metrics/memory.py | 44 ++++++++++----------- .../metrics_service/base_metric_service.py | 4 +- .../metrics_service/prometheus_metrics_service.py | 4 +- robusta_krr/strategies/simple.py | 6 +-- robusta_krr/utils/progress_bar.py | 2 +- tests/conftest.py | 2 +- 11 files changed, 67 insertions(+), 61 deletions(-) diff --git a/robusta_krr/api/models.py b/robusta_krr/api/models.py index 7c4f587..c6eb8f5 100644 --- a/robusta_krr/api/models.py +++ b/robusta_krr/api/models.py @@ -1,5 +1,5 @@ from robusta_krr.core.abstract.strategies import ( - MetricPodData, + PodsTimeData, MetricsPodData, ResourceRecommendation, RunResult, @@ -20,7 +20,7 @@ __all__ = [ "register_severity_calculator", "ResourceScan", "ResourceRecommendation", - "MetricPodData", + "PodsTimeData", "MetricsPodData", "RunResult", ] diff --git a/robusta_krr/core/abstract/metrics.py b/robusta_krr/core/abstract/metrics.py index 28de381..1dbeda7 100644 --- a/robusta_krr/core/abstract/metrics.py +++ b/robusta_krr/core/abstract/metrics.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod import datetime -from robusta_krr.core.abstract.strategies import MetricPodData +from robusta_krr.core.abstract.strategies import PodsTimeData from robusta_krr.core.models.objects import K8sObjectData @@ -17,5 +17,5 @@ class BaseMetric(ABC): @abstractmethod async def load_data( self, object: K8sObjectData, period: datetime.timedelta, step: datetime.timedelta - ) -> MetricPodData: + ) -> PodsTimeData: ... diff --git a/robusta_krr/core/abstract/strategies.py b/robusta_krr/core/abstract/strategies.py index cc8432b..a9a084d 100644 --- a/robusta_krr/core/abstract/strategies.py +++ b/robusta_krr/core/abstract/strategies.py @@ -64,8 +64,8 @@ class StrategySettings(pd.BaseModel): ArrayNx2 = Annotated[NDArray[np.float64], Literal["N", 2]] -MetricPodData = dict[str, ArrayNx2] # Mapping: pod -> [(time, value)] -MetricsPodData = dict[type["BaseMetric"], MetricPodData] +PodsTimeData = dict[str, ArrayNx2] # Mapping: pod -> [(time, value)] +MetricsPodData = dict[type["BaseMetric"], PodsTimeData] RunResult = dict[ResourceType, ResourceRecommendation] @@ -156,7 +156,7 @@ __all__ = [ "AnyStrategy", "BaseStrategy", "StrategySettings", - "MetricPodData", + "PodsTimeData", "MetricsPodData", "K8sObjectData", "ResourceType", diff --git a/robusta_krr/core/integrations/prometheus/metrics/base.py b/robusta_krr/core/integrations/prometheus/metrics/base.py index 434ef0a..d076ff4 100644 --- a/robusta_krr/core/integrations/prometheus/metrics/base.py +++ b/robusta_krr/core/integrations/prometheus/metrics/base.py @@ -11,7 +11,7 @@ import numpy as np import pydantic as pd from robusta_krr.core.abstract.metrics import BaseMetric -from robusta_krr.core.abstract.strategies import MetricPodData +from robusta_krr.core.abstract.strategies import PodsTimeData from robusta_krr.core.models.config import Config from robusta_krr.core.models.objects import K8sObjectData from robusta_krr.utils.configurable import Configurable @@ -67,7 +67,7 @@ class PrometheusMetric(BaseMetric, Configurable): return f', {self.config.prometheus_label}="{self.config.prometheus_cluster_label}"' @abc.abstractmethod - def get_query(self, object: K8sObjectData, resolution: Optional[str]) -> str: + def get_query(self, object: K8sObjectData, resolution: str) -> str: """ This method should be implemented by all subclasses to provide a query string to fetch metrics. @@ -128,7 +128,7 @@ class PrometheusMetric(BaseMetric, Configurable): async def load_data( self, object: K8sObjectData, period: datetime.timedelta, step: datetime.timedelta - ) -> MetricPodData: + ) -> PodsTimeData: """ Asynchronous method that loads metric data for a specific object. diff --git a/robusta_krr/core/integrations/prometheus/metrics/cpu.py b/robusta_krr/core/integrations/prometheus/metrics/cpu.py index 28b5a80..41e1137 100644 --- a/robusta_krr/core/integrations/prometheus/metrics/cpu.py +++ b/robusta_krr/core/integrations/prometheus/metrics/cpu.py @@ -1,33 +1,39 @@ -from typing import Optional - from robusta_krr.core.models.objects import K8sObjectData from .base import QueryMetric, QueryRangeMetric, FilterMetric class CPULoader(QueryRangeMetric, FilterMetric): - def get_query(self, object: K8sObjectData, resolution: Optional[str]) -> str: + def get_query(self, object: K8sObjectData, resolution: str) -> str: pods_selector = "|".join(pod.name for pod in object.pods) cluster_label = self.get_prometheus_cluster_label() - return ( - "sum(irate(container_cpu_usage_seconds_total{" - f'namespace="{object.namespace}", ' - f'pod=~"{pods_selector}", ' - f'container="{object.container}"' - f"{cluster_label}" - "}[5m])) by (container, pod, job)" - ) + return f""" + sum( + irate( + container_cpu_usage_seconds_total{{ + namespace="{object.namespace}", + pod=~"{pods_selector}", + container="{object.container}" + {cluster_label} + }}[5m] + ) + ) by (container, pod, job) + """ class MaxCPULoader(QueryMetric, FilterMetric): - def get_query(self, object: K8sObjectData, resolution: Optional[str]) -> str: + def get_query(self, object: K8sObjectData, resolution: str) -> str: pods_selector = "|".join(pod.name for pod in object.pods) cluster_label = self.get_prometheus_cluster_label() - return ( - "sum(irate(container_cpu_usage_seconds_total{" - f'namespace="{object.namespace}", ' - f'pod=~"{pods_selector}", ' - f'container="{object.container}"' - f"{cluster_label}" - "}[5m])) by (container, pod, job)" - ) + return f""" + sum( + irate( + container_cpu_usage_seconds_total{{ + namespace="{object.namespace}", + pod=~"{pods_selector}", + container="{object.container}" + {cluster_label} + }}[{resolution}] + ) + ) by (container, pod, job) + """ diff --git a/robusta_krr/core/integrations/prometheus/metrics/memory.py b/robusta_krr/core/integrations/prometheus/metrics/memory.py index 00c19f8..32df5f4 100644 --- a/robusta_krr/core/integrations/prometheus/metrics/memory.py +++ b/robusta_krr/core/integrations/prometheus/metrics/memory.py @@ -1,35 +1,35 @@ -from typing import Optional - from robusta_krr.core.models.objects import K8sObjectData from .base import QueryMetric, QueryRangeMetric, FilterMetric class MemoryLoader(QueryRangeMetric, FilterMetric): - def get_query(self, object: K8sObjectData, resolution: Optional[str]) -> str: + def get_query(self, object: K8sObjectData, resolution: str) -> str: pods_selector = "|".join(pod.name for pod in object.pods) cluster_label = self.get_prometheus_cluster_label() - return ( - "sum(container_memory_working_set_bytes{" - f'namespace="{object.namespace}", ' - f'pod=~"{pods_selector}", ' - f'container="{object.container}"' - f"{cluster_label}" - "}) by (container, pod, job, id)" - ) + return f""" + sum( + container_memory_working_set_bytes{{ + namespace="{object.namespace}", + pod=~"{pods_selector}", + container="{object.container}" + {cluster_label} + }} + ) by (container, pod, job, id) + """ class MaxMemoryLoader(QueryMetric, FilterMetric): - def get_query(self, object: K8sObjectData, resolution: Optional[str]) -> str: + def get_query(self, object: K8sObjectData, resolution: str) -> str: pods_selector = "|".join(pod.name for pod in object.pods) cluster_label = self.get_prometheus_cluster_label() - resolution_formatted = f"[{resolution}]" if resolution else "" - return ( - f"max_over_time(container_memory_working_set_bytes{{" - f'namespace="{object.namespace}", ' - f'pod=~"{pods_selector}", ' - f'container="{object.container}"' - f"{cluster_label}}}" - f"{resolution_formatted}" - f")" - ) + return f""" + max_over_time( + container_memory_working_set_bytes{{ + namespace="{object.namespace}", + pod=~"{pods_selector}", + container="{object.container}" + {cluster_label} + }}[{resolution}] + ) + """ diff --git a/robusta_krr/core/integrations/prometheus/metrics_service/base_metric_service.py b/robusta_krr/core/integrations/prometheus/metrics_service/base_metric_service.py index 6501f7c..b0adfb7 100644 --- a/robusta_krr/core/integrations/prometheus/metrics_service/base_metric_service.py +++ b/robusta_krr/core/integrations/prometheus/metrics_service/base_metric_service.py @@ -5,7 +5,7 @@ from typing import List, Optional from kubernetes.client.api_client import ApiClient -from robusta_krr.core.abstract.strategies import MetricPodData +from robusta_krr.core.abstract.strategies import PodsTimeData from robusta_krr.core.models.config import Config from robusta_krr.core.models.objects import K8sObjectData from robusta_krr.utils.configurable import Configurable @@ -54,7 +54,7 @@ class MetricsService(Configurable, abc.ABC): LoaderClass: type[PrometheusMetric], period: datetime.timedelta, step: datetime.timedelta = datetime.timedelta(minutes=30), - ) -> MetricPodData: + ) -> PodsTimeData: ... def get_prometheus_cluster_label(self) -> str: diff --git a/robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py b/robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py index b380abc..02d3d6d 100644 --- a/robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py +++ b/robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py @@ -7,7 +7,7 @@ from kubernetes.client import ApiClient from prometheus_api_client import PrometheusApiClientException from requests.exceptions import ConnectionError, HTTPError -from robusta_krr.core.abstract.strategies import MetricPodData +from robusta_krr.core.abstract.strategies import PodsTimeData from robusta_krr.core.models.config import Config from robusta_krr.core.models.objects import K8sObjectData, PodData from robusta_krr.utils.service_discovery import MetricsServiceDiscovery @@ -149,7 +149,7 @@ class PrometheusMetricsService(MetricsService): LoaderClass: type[PrometheusMetric], period: datetime.timedelta, step: datetime.timedelta = datetime.timedelta(minutes=30), - ) -> MetricPodData: + ) -> PodsTimeData: """ ResourceHistoryData: The gathered resource history data. """ diff --git a/robusta_krr/strategies/simple.py b/robusta_krr/strategies/simple.py index 690ee25..d3b20be 100644 --- a/robusta_krr/strategies/simple.py +++ b/robusta_krr/strategies/simple.py @@ -3,7 +3,7 @@ import pydantic as pd from robusta_krr.core.abstract.strategies import ( BaseStrategy, - MetricPodData, + PodsTimeData, MetricsPodData, K8sObjectData, ResourceRecommendation, @@ -20,14 +20,14 @@ class SimpleStrategySettings(StrategySettings): 5, gt=0, description="The percentage of added buffer to the peak memory usage for memory recommendation." ) - def calculate_memory_proposal(self, data: MetricPodData) -> float: + def calculate_memory_proposal(self, data: PodsTimeData) -> float: data_ = [np.max(values[:, 1]) for values in data.values()] if len(data_) == 0: return float("NaN") return max(data_) * (1 + self.memory_buffer_percentage / 100) - def calculate_cpu_proposal(self, data: MetricPodData) -> float: + def calculate_cpu_proposal(self, data: PodsTimeData) -> float: if len(data) == 0: return float("NaN") diff --git a/robusta_krr/utils/progress_bar.py b/robusta_krr/utils/progress_bar.py index 621dc18..32bf211 100644 --- a/robusta_krr/utils/progress_bar.py +++ b/robusta_krr/utils/progress_bar.py @@ -14,7 +14,7 @@ class ProgressBar(Configurable): def __init__(self, config: Config, **kwargs) -> None: super().__init__(config) - self.show_bar = self.echo_active and False + self.show_bar = self.echo_active if self.show_bar: self.alive_bar = alive_bar(**kwargs) diff --git a/tests/conftest.py b/tests/conftest.py index f39a30b..327425e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,7 +5,7 @@ from unittest.mock import AsyncMock, patch import numpy as np import pytest -from robusta_krr.api.models import K8sObjectData, PodData, ResourceAllocations, MetricPodData +from robusta_krr.api.models import K8sObjectData, PodData, ResourceAllocations TEST_OBJECT = K8sObjectData( cluster="mock-cluster", -- cgit v1.2.3