chore: release v1.0.0 — каркас FastAPI, ingress Grafana, интеграции, документация
Made-with: Cursor
This commit is contained in:
77
onguard24/status_snapshot.py
Normal file
77
onguard24/status_snapshot.py
Normal file
@ -0,0 +1,77 @@
|
||||
"""Единая сборка ответа /api/v1/status (БД, Vault, Grafana, Forgejo)."""
|
||||
|
||||
from fastapi import Request
|
||||
|
||||
from onguard24.config import Settings
|
||||
from onguard24.integrations import forgejo_api, grafana_api
|
||||
from onguard24.vaultcheck import ping as vault_ping
|
||||
|
||||
|
||||
async def build(request: Request) -> dict:
|
||||
out: dict = {"service": "onGuard24"}
|
||||
pool = getattr(request.app.state, "pool", None)
|
||||
settings: Settings = request.app.state.settings
|
||||
|
||||
if pool:
|
||||
try:
|
||||
async with pool.acquire() as conn:
|
||||
await conn.fetchval("SELECT 1")
|
||||
out["database"] = {"status": "ok"}
|
||||
except Exception as e:
|
||||
out["database"] = {"status": "error", "detail": str(e)}
|
||||
else:
|
||||
out["database"] = "disabled"
|
||||
|
||||
if settings.vault_addr and settings.vault_token:
|
||||
ok, err = await vault_ping(settings.vault_addr, settings.vault_token)
|
||||
if ok:
|
||||
out["vault"] = {"status": "ok", "url": settings.vault_addr}
|
||||
else:
|
||||
out["vault"] = {"status": "error", "detail": err, "url": settings.vault_addr}
|
||||
else:
|
||||
out["vault"] = "disabled"
|
||||
|
||||
gu = settings.grafana_url.strip()
|
||||
if not gu:
|
||||
out["grafana"] = "disabled"
|
||||
elif settings.grafana_service_account_token.strip():
|
||||
ok, err = await grafana_api.ping(gu, settings.grafana_service_account_token)
|
||||
if ok:
|
||||
user, _ = await grafana_api.get_signed_in_user(gu, settings.grafana_service_account_token)
|
||||
entry: dict = {"status": "ok", "url": gu, "api": "authenticated"}
|
||||
if user:
|
||||
login = user.get("login") or user.get("email")
|
||||
if login:
|
||||
entry["service_account_login"] = login
|
||||
out["grafana"] = entry
|
||||
else:
|
||||
out["grafana"] = {"status": "error", "detail": err, "url": gu}
|
||||
else:
|
||||
live_ok, live_err = await grafana_api.health_live(gu)
|
||||
if live_ok:
|
||||
out["grafana"] = {
|
||||
"status": "reachable",
|
||||
"url": gu,
|
||||
"detail": "задай GRAFANA_SERVICE_ACCOUNT_TOKEN для вызовов API",
|
||||
}
|
||||
else:
|
||||
out["grafana"] = {"status": "error", "detail": live_err, "url": gu}
|
||||
|
||||
fj = settings.forgejo_url.strip()
|
||||
if not fj:
|
||||
out["forgejo"] = "disabled"
|
||||
elif settings.forgejo_token.strip():
|
||||
entry_fj = await forgejo_api.probe(fj, settings.forgejo_token)
|
||||
out["forgejo"] = entry_fj
|
||||
else:
|
||||
pub_ok, pub_err = await forgejo_api.health_public(fj)
|
||||
if pub_ok:
|
||||
out["forgejo"] = {
|
||||
"status": "reachable",
|
||||
"url": fj,
|
||||
"detail": "задай FORGEJO_TOKEN (Personal Access Token в Forgejo)",
|
||||
}
|
||||
else:
|
||||
out["forgejo"] = {"status": "error", "detail": pub_err, "url": fj}
|
||||
|
||||
return out
|
||||
Reference in New Issue
Block a user