| """Prometheus tool wrappers — HTTP API queries to Prometheus.""" |
|
|
| import os |
| import time |
| from typing import Any |
|
|
| import requests |
|
|
| PROMETHEUS_URL = os.getenv( |
| "PROMETHEUS_URL", |
| "http://prometheus-kube-prometheus-prometheus.monitoring.svc.cluster.local:9090", |
| ) |
|
|
|
|
| def promql_query(query: str, time_unix: float | None = None) -> dict[str, Any]: |
| """Execute an instant PromQL query.""" |
| params = {"query": query} |
| if time_unix is not None: |
| params["time"] = str(time_unix) |
| try: |
| r = requests.get(f"{PROMETHEUS_URL}/api/v1/query", params=params, timeout=10) |
| r.raise_for_status() |
| data = r.json() |
| if data.get("status") != "success": |
| return {"success": False, "error": data.get("error", "unknown"), "raw": data} |
| return {"success": True, "result": data["data"]["result"], "resultType": data["data"]["resultType"]} |
| except requests.RequestException as e: |
| return {"success": False, "error": str(e)} |
|
|
|
|
| def promql_query_range(query: str, start: float | None = None, end: float | None = None, |
| step: str = "30s") -> dict[str, Any]: |
| """Execute a PromQL range query (last 15 min by default).""" |
| end = end or time.time() |
| start = start or (end - 900) |
| params = {"query": query, "start": str(start), "end": str(end), "step": step} |
| try: |
| r = requests.get(f"{PROMETHEUS_URL}/api/v1/query_range", params=params, timeout=15) |
| r.raise_for_status() |
| data = r.json() |
| if data.get("status") != "success": |
| return {"success": False, "error": data.get("error", "unknown")} |
| return {"success": True, "result": data["data"]["result"]} |
| except requests.RequestException as e: |
| return {"success": False, "error": str(e)} |
|
|