"""平台服务入口""" import logging from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from .config import get_settings from .routers import stats_router, logs_router, config_router, health_router from .routers.auth import router as auth_router from .routers.tenants import router as tenants_router from .routers.tenant_apps import router as tenant_apps_router from .routers.tenant_wechat_apps import router as tenant_wechat_apps_router from .routers.apps import router as apps_router from .routers.wechat import router as wechat_router from .routers.alerts import router as alerts_router from .routers.cost import router as cost_router from .routers.quota import router as quota_router from .routers.tool_configs import router as tool_configs_router from .routers.tasks import router as tasks_router from .middleware import TraceMiddleware, setup_exception_handlers, RequestLoggerMiddleware from .middleware.trace import setup_logging from .services.scheduler import start_scheduler, shutdown_scheduler # 配置日志(包含 TraceID) setup_logging(level=logging.INFO, include_trace=True) settings = get_settings() app = FastAPI( title=settings.APP_NAME, version=settings.APP_VERSION, description="平台基础设施服务 - 统计/日志/配置管理" ) # 配置统一异常处理 setup_exception_handlers(app) # 中间件按添加的反序执行,所以: # 1. CORS 最后添加,最先执行 # 2. TraceMiddleware 在 RequestLoggerMiddleware 之后添加,这样先执行 # 3. RequestLoggerMiddleware 最先添加,最后执行(此时 trace_id 已设置) # 请求日志中间件(自动记录到数据库) app.add_middleware(RequestLoggerMiddleware, app_code="000-platform") # TraceID 追踪中间件 app.add_middleware(TraceMiddleware, log_requests=True) # CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], expose_headers=["X-Trace-ID", "X-Response-Time"] ) # 注册路由 app.include_router(health_router, prefix="/api") app.include_router(auth_router, prefix="/api") app.include_router(tenants_router, prefix="/api") app.include_router(tenant_apps_router, prefix="/api") app.include_router(tenant_wechat_apps_router, prefix="/api") app.include_router(apps_router, prefix="/api") app.include_router(stats_router, prefix="/api") app.include_router(logs_router, prefix="/api") app.include_router(config_router, prefix="/api") app.include_router(wechat_router, prefix="/api") app.include_router(alerts_router, prefix="/api") app.include_router(cost_router, prefix="/api") app.include_router(quota_router, prefix="/api") app.include_router(tool_configs_router, prefix="/api") app.include_router(tasks_router, prefix="/api") @app.on_event("startup") async def startup_event(): """应用启动时初始化调度器""" try: start_scheduler() logging.info("Scheduler started successfully") except Exception as e: logging.error(f"Failed to start scheduler: {e}") @app.on_event("shutdown") async def shutdown_event(): """应用关闭时停止调度器""" try: shutdown_scheduler() logging.info("Scheduler shutdown successfully") except Exception as e: logging.error(f"Failed to shutdown scheduler: {e}") @app.get("/") async def root(): return { "service": settings.APP_NAME, "version": settings.APP_VERSION, "docs": "/docs" }