Fix: Add query_range method to PrometheusClient for historical metrics
This commit is contained in:
@@ -79,6 +79,59 @@ class PrometheusClient:
|
|||||||
logger.error(f"Error executing Prometheus query: {e}")
|
logger.error(f"Error executing Prometheus query: {e}")
|
||||||
return {"status": "error", "message": str(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]:
|
async def get_pod_cpu_usage(self, namespace: str, pod_name: str) -> Dict[str, Any]:
|
||||||
"""Get CPU usage for a specific pod"""
|
"""Get CPU usage for a specific pod"""
|
||||||
query = f'rate(container_cpu_usage_seconds_total{{namespace="{namespace}", pod="{pod_name}"}}[5m])'
|
query = f'rate(container_cpu_usage_seconds_total{{namespace="{namespace}", pod="{pod_name}"}}[5m])'
|
||||||
|
|||||||
Reference in New Issue
Block a user