Skip to content

Commit

Permalink
Fix minor issues left
Browse files Browse the repository at this point in the history
  • Loading branch information
LeaveMyYard committed Aug 2, 2023
1 parent f152bfb commit 288c8de
Show file tree
Hide file tree
Showing 11 changed files with 67 additions and 61 deletions.
4 changes: 2 additions & 2 deletions robusta_krr/api/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from robusta_krr.core.abstract.strategies import (
MetricPodData,
PodsTimeData,
MetricsPodData,
ResourceRecommendation,
RunResult,
Expand All @@ -20,7 +20,7 @@
"register_severity_calculator",
"ResourceScan",
"ResourceRecommendation",
"MetricPodData",
"PodsTimeData",
"MetricsPodData",
"RunResult",
]
4 changes: 2 additions & 2 deletions robusta_krr/core/abstract/metrics.py
Original file line number Diff line number Diff line change
@@ -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


Expand All @@ -17,5 +17,5 @@ class BaseMetric(ABC):
@abstractmethod
async def load_data(
self, object: K8sObjectData, period: datetime.timedelta, step: datetime.timedelta
) -> MetricPodData:
) -> PodsTimeData:
...
6 changes: 3 additions & 3 deletions robusta_krr/core/abstract/strategies.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ def timeframe_timedelta(self) -> datetime.timedelta:
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]

Expand Down Expand Up @@ -156,7 +156,7 @@ def get_settings_type(cls) -> type[StrategySettings]:
"AnyStrategy",
"BaseStrategy",
"StrategySettings",
"MetricPodData",
"PodsTimeData",
"MetricsPodData",
"K8sObjectData",
"ResourceType",
Expand Down
6 changes: 3 additions & 3 deletions robusta_krr/core/integrations/prometheus/metrics/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
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
Expand Down Expand Up @@ -67,7 +67,7 @@ def get_prometheus_cluster_label(self) -> str:
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.
Expand Down Expand Up @@ -128,7 +128,7 @@ async def query_prometheus(self, data: PrometheusMetricData) -> list[dict]:

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.
Expand Down
46 changes: 26 additions & 20 deletions robusta_krr/core/integrations/prometheus/metrics/cpu.py
Original file line number Diff line number Diff line change
@@ -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)
"""
44 changes: 22 additions & 22 deletions robusta_krr/core/integrations/prometheus/metrics/memory.py
Original file line number Diff line number Diff line change
@@ -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}]
)
"""
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

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
Expand Down Expand Up @@ -54,7 +54,7 @@ async def gather_data(
LoaderClass: type[PrometheusMetric],
period: datetime.timedelta,
step: datetime.timedelta = datetime.timedelta(minutes=30),
) -> MetricPodData:
) -> PodsTimeData:
...

def get_prometheus_cluster_label(self) -> str:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
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
Expand Down Expand Up @@ -149,7 +149,7 @@ async def gather_data(
LoaderClass: type[PrometheusMetric],
period: datetime.timedelta,
step: datetime.timedelta = datetime.timedelta(minutes=30),
) -> MetricPodData:
) -> PodsTimeData:
"""
ResourceHistoryData: The gathered resource history data.
"""
Expand Down
6 changes: 3 additions & 3 deletions robusta_krr/strategies/simple.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from robusta_krr.core.abstract.strategies import (
BaseStrategy,
MetricPodData,
PodsTimeData,
MetricsPodData,
K8sObjectData,
ResourceRecommendation,
Expand All @@ -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")

Expand Down
2 changes: 1 addition & 1 deletion robusta_krr/utils/progress_bar.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
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",
Expand Down

0 comments on commit 288c8de

Please sign in to comment.