diff options
| author | LeaveMyYard <zhukovpavel2001@gmail.com> | 2023-08-18 15:07:51 +0300 |
|---|---|---|
| committer | LeaveMyYard <zhukovpavel2001@gmail.com> | 2023-08-18 15:07:51 +0300 |
| commit | 357ce77e8419c6cb569accbaacd5470987217cfb (patch) | |
| tree | 80e3351ed14221f3065fca08c9d6a5f3d0546e93 /robusta_krr/strategies | |
| parent | 99ad46ea6917e5bac0b38ffc134184fbd36cb069 (diff) | |
Add minimal points required for recommendation
Diffstat (limited to 'robusta_krr/strategies')
| -rw-r--r-- | robusta_krr/strategies/simple.py | 31 |
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: |
