Appearance
API 层
目标
API 层为 Dashboard 与脚本提供统一入口:
- 管理场景与 runs(完整 CRUD)
- 提供 metrics/traces/artifacts 获取
- 提供 Start/Stop 运行控制
- 提供 WebSocket 实时推送
- 提供健康检查与系统配置查询
当前实现
框架与中间件
- FastAPI + Uvicorn:异步 ASGI 服务器
- CORS 中间件:允许所有来源(开发阶段),支持凭证
- RequestLoggingMiddleware:记录每个请求的方法、路径、状态码与耗时
- 应用工厂:
create_app()支持注入 settings、scenarios_dir、run_executor
依赖注入 (deps.py)
所有路由通过 FastAPI 的 Depends() 机制获取依赖,依赖项在 lifespan 中初始化并绑定到 app.state:
python
# 示例:路由函数声明依赖
@router.get("/runs/{run_id}")
def get_run(
run_id: str,
run_service: RunService = Depends(get_run_service),
) -> RunDetailResponse:
...依赖链:
RuntimeSettings → Database → RunRepository
→ TraceRepository
→ ScenarioRepository
RunService ← (repo, scenarios_dir, executor, location_initializer,
event_publisher, trace_repo, scenario_repo)Pydantic v2 Schemas (schemas.py)
请求与响应模型使用 Pydantic v2 定义,包含:
- 运行相关:
RunCreateRequest、RunItem、RunListResponse、RunDetailResponse、RunStatusResponse、RunMetricsResponse、RunTracesResponse、RunArtifactsResponse、RunEventsResponse - 场景相关:
ScenarioCreateRequest、ScenarioUpdateRequest、ScenarioFullResponse、ScenarioMergedListResponse、ScenarioImportRequest、ScenarioExportResponse - 健康检查:
HealthResponse、HealthDb、HealthAdapter、HealthNodeCheck、NodeHealthResponse - 配置:
ConfigResponse、ConfigNodeEndpoint、LocationInitConfig - 策略:
StrategyItem、StrategyListResponse
WebSocket 广播器 (ws.py)
RunEventBroadcaster 实现多连接广播:
- 每个连接拥有独立的异步队列(默认 128 槽)
- 独立的
_sender_loop异步任务负责发送 - 队列满时丢弃最旧消息(背压策略)
publish_from_sync()提供同步线程安全的发布接口- 连接时自动推送当前 state 和 metrics 快照
WS 推送频率
- 按 step 推送:每步发送 step + schedule + metrics 三条事件
- 状态变更时推送 state 事件