From 5c5643576fe636bb29d10ac6a09c5b651f0a13af Mon Sep 17 00:00:00 2001 From: andersonid Date: Tue, 30 Sep 2025 17:45:18 -0300 Subject: [PATCH] Fix: Add query_range method to PrometheusClient for historical metrics --- app/core/prometheus_client.py | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/app/core/prometheus_client.py b/app/core/prometheus_client.py index 5a07e99..e59a2bb 100644 --- a/app/core/prometheus_client.py +++ b/app/core/prometheus_client.py @@ -79,6 +79,59 @@ class PrometheusClient: logger.error(f"Error executing Prometheus query: {e}") return {"status": "error", "message": str(e)} + async def query_range(self, query: str, time_range: str = "24h") -> List[List[float]]: + """Execute a Prometheus range query""" + if not self.initialized or not self.session: + return [] + + try: + # Calculate time range + end_time = datetime.now() + if time_range == "1h": + start_time = end_time - timedelta(hours=1) + step = "1m" + elif time_range == "6h": + start_time = end_time - timedelta(hours=6) + step = "5m" + elif time_range == "24h": + start_time = end_time - timedelta(hours=24) + step = "15m" + elif time_range == "7d": + start_time = end_time - timedelta(days=7) + step = "1h" + else: + start_time = end_time - timedelta(hours=24) + step = "15m" + + params = { + 'query': query, + 'start': int(start_time.timestamp()), + 'end': int(end_time.timestamp()), + 'step': step + } + + async with self.session.get( + f"{self.base_url}/api/v1/query_range", + params=params, + ssl=False + ) as response: + if response.status == 200: + data = await response.json() + if data.get("status") == "success" and data.get("data", {}).get("result"): + # Extract time series data points + result = data["data"]["result"][0] + return result.get("values", []) + else: + logger.warning(f"No data returned for query: {query}") + return [] + else: + logger.error(f"Prometheus range query failed: {response.status}") + return [] + + except Exception as e: + logger.error(f"Error querying Prometheus range: {e}") + return [] + async def get_pod_cpu_usage(self, namespace: str, pod_name: str) -> Dict[str, Any]: """Get CPU usage for a specific pod""" query = f'rate(container_cpu_usage_seconds_total{{namespace="{namespace}", pod="{pod_name}"}}[5m])'