summaryrefslogtreecommitdiff
path: root/robusta_krr/strategies
diff options
context:
space:
mode:
authorLeaveMyYard <zhukovpavel2001@gmail.com>2023-08-18 15:07:51 +0300
committerLeaveMyYard <zhukovpavel2001@gmail.com>2023-08-18 15:07:51 +0300
commit357ce77e8419c6cb569accbaacd5470987217cfb (patch)
tree80e3351ed14221f3065fca08c9d6a5f3d0546e93 /robusta_krr/strategies
parent99ad46ea6917e5bac0b38ffc134184fbd36cb069 (diff)
Add minimal points required for recommendation
Diffstat (limited to 'robusta_krr/strategies')
-rw-r--r--robusta_krr/strategies/simple.py31
1 files changed, 28 insertions, 3 deletions
diff --git a/robusta_krr/strategies/simple.py b/robusta_krr/strategies/simple.py
index d7efae8..8cb8bfc 100644
--- a/robusta_krr/strategies/simple.py
+++ b/robusta_krr/strategies/simple.py
@@ -11,7 +11,13 @@ from robusta_krr.core.abstract.strategies import (
RunResult,
StrategySettings,
)
-from robusta_krr.core.integrations.prometheus.metrics import MaxMemoryLoader, PercentileCPULoader, PrometheusMetric
+from robusta_krr.core.integrations.prometheus.metrics import (
+ MaxMemoryLoader,
+ PercentileCPULoader,
+ PrometheusMetric,
+ CPUAmountLoader,
+ MemoryAmountLoader,
+)
class SimpleStrategySettings(StrategySettings):
@@ -19,6 +25,9 @@ class SimpleStrategySettings(StrategySettings):
memory_buffer_percentage: float = pd.Field(
15, gt=0, description="The percentage of added buffer to the peak memory usage for memory recommendation."
)
+ points_required: int = pd.Field(
+ 100, ge=1, description="The number of data points required to make a recommendation for a resource."
+ )
def calculate_memory_proposal(self, data: PodsTimeData) -> float:
data_ = [np.max(values[:, 1]) for values in data.values()]
@@ -57,16 +66,24 @@ class SimpleStrategy(BaseStrategy[SimpleStrategySettings]):
@property
def metrics(self) -> list[type[PrometheusMetric]]:
- return [PercentileCPULoader(self.settings.cpu_percentile), MaxMemoryLoader]
+ return [PercentileCPULoader(self.settings.cpu_percentile), MaxMemoryLoader, CPUAmountLoader, MemoryAmountLoader]
def __calculate_cpu_proposal(
self, history_data: MetricsPodData, object_data: K8sObjectData
) -> ResourceRecommendation:
data = history_data["PercentileCPULoader"]
+ data_count = {pod: values[0, 1] for pod, values in history_data["CPUAmountLoader"].items()}
if len(data) == 0:
return ResourceRecommendation.undefined(info="No data")
+ filtered_data = {
+ pod: values for pod, values in data.items() if data_count.get(pod, 0) >= self.settings.points_required
+ }
+
+ if len(filtered_data) == 0:
+ return ResourceRecommendation.undefined(info="Not enough data")
+
if object_data.hpa is not None and object_data.hpa.target_cpu_utilization_percentage is not None:
return ResourceRecommendation.undefined(info="HPA detected")
@@ -77,14 +94,22 @@ class SimpleStrategy(BaseStrategy[SimpleStrategySettings]):
self, history_data: MetricsPodData, object_data: K8sObjectData
) -> ResourceRecommendation:
data = history_data["MaxMemoryLoader"]
+ data_count = {pod: values[0, 1] for pod, values in history_data["MemoryAmountLoader"].items()}
if len(data) == 0:
return ResourceRecommendation.undefined(info="No data")
+ filtered_data = {
+ pod: value for pod, value in data.items() if data_count.get(pod, 0) >= self.settings.points_required
+ }
+
+ if len(filtered_data) == 0:
+ return ResourceRecommendation.undefined(info="Not enough data")
+
if object_data.hpa is not None and object_data.hpa.target_memory_utilization_percentage is not None:
return ResourceRecommendation.undefined(info="HPA detected")
- memory_usage = self.settings.calculate_memory_proposal(data)
+ memory_usage = self.settings.calculate_memory_proposal(filtered_data)
return ResourceRecommendation(request=memory_usage, limit=memory_usage)
def run(self, history_data: MetricsPodData, object_data: K8sObjectData) -> RunResult: