feat(grafana-metric-gateway): slice 1 — backend gateway transport
Route all prometheus widget queries through Grafana /api/ds/query instead of
direct Prom HTTP. PrometheusConfig: drop base_url, add grafana_url +
datasource_uid; secret grafana_api_key (required). PrometheusWidgetSource →
MetricSource with _gateway_query POST method. normalize_grafana_frames
recovered from 65bae95 + shared _dedup_label helper. Gateway-path status
check. Startup old-config validation. CHANGELOG migration note. All adapter
tests rewritten for POST /api/ds/query + Grafana frames mock. Backend: 331
pytest pass, ruff clean. Frontend: build green (unchanged in S1).
This commit is contained in:
@@ -37,6 +37,23 @@ from .version import get_backend_version, get_version_info
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _validate_prometheus_gateway_config() -> None:
|
||||
"""Warn (not crash) about old-shape prometheus services needing migration (GM-113)."""
|
||||
try:
|
||||
store = get_settings_store()
|
||||
for service in store.list_services("prometheus"):
|
||||
config = service.get("config") or {}
|
||||
if "base_url" in config and "grafana_url" not in config:
|
||||
logger.warning(
|
||||
"Prometheus service '%s' (id=%s) uses the old 'base_url' config shape. "
|
||||
"Reconfigure with grafana_url + grafana_api_key (see CHANGELOG).",
|
||||
service.get("name"),
|
||||
service.get("id"),
|
||||
)
|
||||
except Exception: # pragma: no cover - startup best-effort
|
||||
logger.exception("Failed to validate prometheus gateway config during startup")
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
"""Application lifespan — startup/shutdown."""
|
||||
@@ -58,6 +75,7 @@ async def lifespan(app: FastAPI):
|
||||
get_service_data_harness()
|
||||
except Exception:
|
||||
logger.exception("Failed to initialize service data harness during startup")
|
||||
_validate_prometheus_gateway_config()
|
||||
mail_queue = get_mail_queue()
|
||||
backup_poller = get_backup_poller()
|
||||
mail_queue.start()
|
||||
|
||||
Reference in New Issue
Block a user