VWED_server/routes/storage_queue_api.py
2025-07-30 15:11:59 +08:00

125 lines
4.9 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
库位队列管理API
提供队列状态监控和管理接口
"""
from fastapi import APIRouter, HTTPException, Query
from typing import Dict, Any, Optional
from services.execution.handlers.storage_queue_manager import storage_queue_manager
from utils.api_response import success_response, error_response
from utils.logger import get_logger
logger = get_logger("routes.storage_queue_api")
router = APIRouter(prefix="/api/storage-queue", tags=["库位队列管理"])
@router.get("/stats", summary="获取队列统计信息")
async def get_queue_stats() -> Dict[str, Any]:
"""获取队列统计信息"""
try:
stats = storage_queue_manager.get_queue_stats()
return success_response(data=stats, message="获取队列统计信息成功")
except Exception as e:
logger.error(f"获取队列统计信息失败: {str(e)}")
return error_response(f"获取队列统计信息失败: {str(e)}")
@router.get("/status/{request_id}", summary="获取请求状态")
async def get_request_status(request_id: str) -> Dict[str, Any]:
"""获取特定请求的状态"""
try:
status = await storage_queue_manager.get_request_status(request_id)
if status:
return success_response(data=status, message="获取请求状态成功")
else:
return error_response("请求不存在")
except Exception as e:
logger.error(f"获取请求状态失败: {str(e)}")
return error_response(f"获取请求状态失败: {str(e)}")
@router.post("/cancel/{request_id}", summary="取消请求")
async def cancel_request(request_id: str) -> Dict[str, Any]:
"""取消指定的请求"""
try:
success = await storage_queue_manager.cancel_request(request_id)
if success:
return success_response(message=f"取消请求成功: {request_id}")
else:
return error_response("请求不存在或无法取消")
except Exception as e:
logger.error(f"取消请求失败: {str(e)}")
return error_response(f"取消请求失败: {str(e)}")
@router.get("/health", summary="队列健康检查")
async def queue_health_check() -> Dict[str, Any]:
"""检查队列管理器的健康状态"""
try:
stats = storage_queue_manager.get_queue_stats()
# 判断健康状态
health_status = "healthy"
issues = []
# 检查队列大小
if stats.get('queue_size', 0) > 800: # 队列接近满载
health_status = "warning"
issues.append("队列接近满载")
# 检查活跃工作者数量
if stats.get('active_workers', 0) == 0:
health_status = "critical"
issues.append("没有活跃的工作者")
# 检查失败率
total_requests = stats.get('requests_total', 0)
if total_requests > 0:
failure_rate = stats.get('requests_failed', 0) / total_requests
if failure_rate > 0.1: # 失败率超过10%
health_status = "warning"
issues.append(f"失败率过高: {failure_rate:.2%}")
return success_response(data={
"status": health_status,
"issues": issues,
"stats": stats
}, message="队列健康检查完成")
except Exception as e:
logger.error(f"队列健康检查失败: {str(e)}")
return error_response(f"队列健康检查失败: {str(e)}")
@router.post("/start", summary="启动队列管理器")
async def start_queue_manager() -> Dict[str, Any]:
"""启动队列管理器"""
try:
await storage_queue_manager.start()
return success_response(message="队列管理器启动成功")
except Exception as e:
logger.error(f"启动队列管理器失败: {str(e)}")
return error_response(f"启动队列管理器失败: {str(e)}")
@router.post("/stop", summary="停止队列管理器")
async def stop_queue_manager() -> Dict[str, Any]:
"""停止队列管理器"""
try:
await storage_queue_manager.stop()
return success_response(message="队列管理器停止成功")
except Exception as e:
logger.error(f"停止队列管理器失败: {str(e)}")
return error_response(f"停止队列管理器失败: {str(e)}")
@router.get("/config", summary="获取队列配置")
async def get_queue_config() -> Dict[str, Any]:
"""获取队列管理器配置"""
try:
config = {
"max_workers": storage_queue_manager.max_workers,
"max_queue_size": storage_queue_manager.max_queue_size,
"handlers_registered": list(storage_queue_manager.handlers.keys())
}
return success_response(data=config, message="获取队列配置成功")
except Exception as e:
logger.error(f"获取队列配置失败: {str(e)}")
return error_response(f"获取队列配置失败: {str(e)}")