- 在analyze_markdown、analyze_markdown_stream和get_markdown_outline函数中添加了 try-catch块来处理临时文件清理过程中的异常 - 将/analyze/md/outline接口从GET方法改为POST方法以支持文件上传 - 确保在所有情况下都能正确清理临时文件,并记录清理失败的日志 refactor(health): 改进健康检查逻辑验证实际数据库连接 - 修改MySQL健康检查,实际执行SELECT 1查询来验证连接 - 修改MongoDB健康检查,执行ping命令来验证连接 - 修改Redis健康检查,执行ping命令来验证连接 - 添加异常捕获并记录具体的错误日志 refactor(upload): 使用os.path.basename优化文件名提取 - 替换手动字符串分割为os.path.basename来获取文件名 - 统一Excel上传和导出中文件名的处理方式 feat(instruction): 新增指令执行框架模块 - 创建instruction包包含意图解析和指令执行的基础架构 - 添加IntentParser和InstructionExecutor抽象基类 - 提供默认实现但标记为未完成,为未来功能扩展做准备 refactor(frontend): 调整AuthContext导入路径并移除重复文件 - 将AuthContext从src/context移动到src/contexts目录 - 更新App.tsx和RouteGuard.tsx中的导入路径 - 移除旧的AuthContext.tsx文件 fix(backend-api): 修复AI分析API的HTTP方法错误 - 将aiApi中的fetch请求方法从GET改为POST以支持文件上传
94 lines
2.5 KiB
Python
94 lines
2.5 KiB
Python
"""
|
|
健康检查接口
|
|
"""
|
|
from datetime import datetime
|
|
from typing import Any, Dict
|
|
|
|
from fastapi import APIRouter
|
|
|
|
from app.core.database import mysql_db, mongodb, redis_db
|
|
|
|
router = APIRouter(tags=["健康检查"])
|
|
|
|
|
|
@router.get("/health")
|
|
async def health_check() -> Dict[str, Any]:
|
|
"""
|
|
健康检查接口
|
|
|
|
返回各数据库连接状态和应用信息
|
|
"""
|
|
# 检查各数据库连接状态
|
|
mysql_status = "unknown"
|
|
mongodb_status = "unknown"
|
|
redis_status = "unknown"
|
|
|
|
try:
|
|
if mysql_db.async_engine is None:
|
|
mysql_status = "disconnected"
|
|
else:
|
|
# 实际执行一次查询验证连接
|
|
from sqlalchemy import text
|
|
async with mysql_db.async_engine.connect() as conn:
|
|
await conn.execute(text("SELECT 1"))
|
|
mysql_status = "connected"
|
|
except Exception as e:
|
|
logger.warning(f"MySQL 健康检查失败: {e}")
|
|
mysql_status = "error"
|
|
|
|
try:
|
|
if mongodb.client is None:
|
|
mongodb_status = "disconnected"
|
|
else:
|
|
# 实际 ping 验证
|
|
await mongodb.client.admin.command('ping')
|
|
mongodb_status = "connected"
|
|
except Exception as e:
|
|
logger.warning(f"MongoDB 健康检查失败: {e}")
|
|
mongodb_status = "error"
|
|
|
|
try:
|
|
if not redis_db.is_connected or redis_db.client is None:
|
|
redis_status = "disconnected"
|
|
else:
|
|
# 实际执行 ping 验证
|
|
await redis_db.client.ping()
|
|
redis_status = "connected"
|
|
except Exception as e:
|
|
logger.warning(f"Redis 健康检查失败: {e}")
|
|
redis_status = "error"
|
|
|
|
return {
|
|
"status": "healthy" if all([
|
|
mysql_status == "connected",
|
|
mongodb_status == "connected",
|
|
redis_status == "connected"
|
|
]) else "degraded",
|
|
"timestamp": datetime.utcnow().isoformat(),
|
|
"services": {
|
|
"mysql": mysql_status,
|
|
"mongodb": mongodb_status,
|
|
"redis": redis_status,
|
|
}
|
|
}
|
|
|
|
|
|
@router.get("/health/ready")
|
|
async def readiness_check() -> Dict[str, str]:
|
|
"""
|
|
就绪检查接口
|
|
|
|
用于 Kubernetes/负载均衡器检查服务是否就绪
|
|
"""
|
|
return {"status": "ready"}
|
|
|
|
|
|
@router.get("/health/live")
|
|
async def liveness_check() -> Dict[str, str]:
|
|
"""
|
|
存活检查接口
|
|
|
|
用于 Kubernetes/负载均衡器检查服务是否存活
|
|
"""
|
|
return {"status": "alive"}
|