Files
2026-06-04 10:55:23 +08:00

57 lines
1.8 KiB
Python

from fastapi import APIRouter
from fastapi.responses import JSONResponse
from sqlalchemy import text
from app.core.config import settings
from app.core.response import ok
from app.db.session import SessionLocal
router = APIRouter()
@router.get("/live")
def live():
"""存活检查:确认 FastAPI 进程已启动并可以响应请求。"""
return ok({"status": "live", "environment": settings.app_env})
@router.get("/ready")
def ready():
"""就绪检查:验证生产配置、MySQL 和 Redis 是否支持核心业务运行。"""
checks: dict[str, object] = {
"configuration": {"ok": True, "errors": []},
"mysql": {"ok": False},
"redis": {"ok": False},
}
config_errors = settings.deployment_config_errors()
checks["configuration"] = {"ok": not config_errors, "errors": config_errors}
try:
with SessionLocal() as db:
db.execute(text("SELECT 1"))
checks["mysql"] = {"ok": True}
except Exception:
checks["mysql"] = {"ok": False, "message": "database connection failed"}
try:
import redis
redis.Redis.from_url(
settings.redis_url,
decode_responses=True,
socket_connect_timeout=2,
socket_timeout=2,
).ping()
checks["redis"] = {"ok": True}
except Exception:
checks["redis"] = {"ok": False, "message": "redis connection failed"}
is_ready = all(bool(item.get("ok")) for item in checks.values() if isinstance(item, dict))
payload = {
"code": "OK" if is_ready else "SERVICE_NOT_READY",
"message": "success" if is_ready else "service dependencies are not ready",
"data": {"status": "ready" if is_ready else "not_ready", "checks": checks},
}
return JSONResponse(status_code=200 if is_ready else 503, content=payload)