Spaces:
Running
Running
sync: 193 file da Baida98/AI@bfa5fae8 (2026-08-28 07:20 UTC) [deploy-all] (#90)
Browse files- sync: 193 file da Baida98/AI@bfa5fae8 (2026-08-28 07:20 UTC) [deploy-all] (b1a3f45b3f9b0e05c6a5884aca3471562eb6abc5)
- api/performance_rum.py +31 -0
api/performance_rum.py
CHANGED
|
@@ -18,6 +18,7 @@ import re
|
|
| 18 |
import time
|
| 19 |
from datetime import datetime, timezone
|
| 20 |
from typing import Annotated, Any
|
|
|
|
| 21 |
|
| 22 |
from fastapi import APIRouter, Depends, Header, HTTPException, Request, status
|
| 23 |
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
@@ -123,6 +124,29 @@ def _db_url() -> str:
|
|
| 123 |
return value
|
| 124 |
|
| 125 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
def _execute(sql: str, params: dict[str, Any], *, fetch: bool = False) -> list[dict[str, Any]]:
|
| 127 |
import psycopg2
|
| 128 |
import psycopg2.extras
|
|
@@ -200,6 +224,7 @@ async def debug_db_check(role: AuthRole = Depends(require_role(AuthRole.MACHINE)
|
|
| 200 |
return {
|
| 201 |
"ok": True,
|
| 202 |
"db_now": rows[0].get("db_now") if rows else None,
|
|
|
|
| 203 |
"latency_ms": elapsed_ms,
|
| 204 |
"tls_required": True,
|
| 205 |
"connect_timeout_s": 5,
|
|
@@ -221,10 +246,16 @@ async def debug_db_check(role: AuthRole = Depends(require_role(AuthRole.MACHINE)
|
|
| 221 |
category = "database"
|
| 222 |
pgcode = getattr(exc, "pgcode", None)
|
| 223 |
_logger.error("RUM db probe failed type=%s category=%s elapsed_ms=%s", name, category, elapsed_ms)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 224 |
return {
|
| 225 |
"ok": False,
|
| 226 |
"error_category": category,
|
| 227 |
"exception_type": name,
|
|
|
|
| 228 |
"sqlstate": pgcode[:5] if isinstance(pgcode, str) else None,
|
| 229 |
"latency_ms": elapsed_ms,
|
| 230 |
"tls_required": True,
|
|
|
|
| 18 |
import time
|
| 19 |
from datetime import datetime, timezone
|
| 20 |
from typing import Annotated, Any
|
| 21 |
+
from urllib.parse import parse_qs, urlsplit
|
| 22 |
|
| 23 |
from fastapi import APIRouter, Depends, Header, HTTPException, Request, status
|
| 24 |
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
|
|
| 124 |
return value
|
| 125 |
|
| 126 |
|
| 127 |
+
def _db_target_metadata() -> dict[str, Any]:
|
| 128 |
+
"""Return only non-secret connection metadata for the temporary probe."""
|
| 129 |
+
raw = _db_url()
|
| 130 |
+
parsed = urlsplit(raw)
|
| 131 |
+
host = (parsed.hostname or "").lower()
|
| 132 |
+
port = parsed.port or 5432
|
| 133 |
+
query = parse_qs(parsed.query)
|
| 134 |
+
sslmode = query.get("sslmode", [None])[0]
|
| 135 |
+
if "pooler" in host or port in {6543, 6544}:
|
| 136 |
+
target = "pooler"
|
| 137 |
+
else:
|
| 138 |
+
target = "direct"
|
| 139 |
+
return {
|
| 140 |
+
"scheme": parsed.scheme,
|
| 141 |
+
"target": target,
|
| 142 |
+
"port": port,
|
| 143 |
+
"sslmode_in_url": sslmode or "not_explicit",
|
| 144 |
+
"has_database": bool(parsed.path and parsed.path != "/"),
|
| 145 |
+
"has_username": bool(parsed.username),
|
| 146 |
+
"has_password": bool(parsed.password),
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
|
| 150 |
def _execute(sql: str, params: dict[str, Any], *, fetch: bool = False) -> list[dict[str, Any]]:
|
| 151 |
import psycopg2
|
| 152 |
import psycopg2.extras
|
|
|
|
| 224 |
return {
|
| 225 |
"ok": True,
|
| 226 |
"db_now": rows[0].get("db_now") if rows else None,
|
| 227 |
+
"connection": _db_target_metadata(),
|
| 228 |
"latency_ms": elapsed_ms,
|
| 229 |
"tls_required": True,
|
| 230 |
"connect_timeout_s": 5,
|
|
|
|
| 246 |
category = "database"
|
| 247 |
pgcode = getattr(exc, "pgcode", None)
|
| 248 |
_logger.error("RUM db probe failed type=%s category=%s elapsed_ms=%s", name, category, elapsed_ms)
|
| 249 |
+
metadata: dict[str, Any]
|
| 250 |
+
try:
|
| 251 |
+
metadata = _db_target_metadata()
|
| 252 |
+
except Exception:
|
| 253 |
+
metadata = {"configuration": "invalid_or_unavailable"}
|
| 254 |
return {
|
| 255 |
"ok": False,
|
| 256 |
"error_category": category,
|
| 257 |
"exception_type": name,
|
| 258 |
+
"connection": metadata,
|
| 259 |
"sqlstate": pgcode[:5] if isinstance(pgcode, str) else None,
|
| 260 |
"latency_ms": elapsed_ms,
|
| 261 |
"tls_required": True,
|