diff --git a/app/api/endpoints/plugin.py b/app/api/endpoints/plugin.py index 80a1192b..50fa36bf 100644 --- a/app/api/endpoints/plugin.py +++ b/app/api/endpoints/plugin.py @@ -13,7 +13,7 @@ from app import schemas from app.command import Command from app.core.config import settings from app.core.plugin import PluginManager -from app.core.security import verify_apikey, verify_token, verify_apitoken +from app.core.security import verify_apikey, verify_token from app.db.models import User from app.db.systemconfig_oper import SystemConfigOper from app.db.user_oper import get_current_active_superuser, get_current_active_superuser_async @@ -21,7 +21,6 @@ from app.factory import app from app.helper.plugin import PluginHelper from app.log import logger from app.scheduler import Scheduler -from app.schemas.plugin import PluginMemoryInfo from app.schemas.types import SystemConfigKey PROTECTED_ROUTES = {"/api/v1/openapi.json", "/docs", "/docs/oauth2-redirect", "/redoc"} @@ -494,57 +493,6 @@ def clone_plugin(plugin_id: str, return schemas.Response(success=False, message=f"创建插件分身失败:{str(e)}") -@router.get("/memory", summary="插件内存使用统计", response_model=List[PluginMemoryInfo]) -def plugin_memory_stats(_: Annotated[str, Depends(verify_apitoken)]) -> Any: - """ - 获取所有插件的内存使用统计信息 - """ - try: - plugin_manager = PluginManager() - memory_stats = plugin_manager.get_plugin_memory_stats() - return memory_stats - except Exception as e: - logger.error(f"获取插件内存统计失败:{str(e)}") - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail=f"获取插件内存统计失败:{str(e)}") - - -@router.get("/memory/{plugin_id}", summary="单个插件内存使用统计", response_model=PluginMemoryInfo) -def plugin_memory_stat(plugin_id: str, _: Annotated[str, Depends(verify_apitoken)]) -> Any: - """ - 获取指定插件的内存使用统计信息 - """ - try: - plugin_manager = PluginManager() - memory_stats = plugin_manager.get_plugin_memory_stats(plugin_id) - if not memory_stats: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, - detail=f"插件 {plugin_id} 不存在或未运行") - return memory_stats[0] - except HTTPException: - raise - except Exception as e: - logger.error(f"获取插件 {plugin_id} 内存统计失败:{str(e)}") - raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail=f"获取插件内存统计失败:{str(e)}") - - -@router.delete("/memory/cache", summary="清除插件内存统计缓存") -def clear_plugin_memory_cache(_: Annotated[str, Depends(verify_apitoken)], - plugin_id: Optional[str] = None) -> Any: - """ - 清除插件内存统计缓存 - """ - try: - plugin_manager = PluginManager() - plugin_manager.clear_plugin_memory_cache(plugin_id) - message = f"已清除插件 {plugin_id} 的内存统计缓存" if plugin_id else "已清除所有插件的内存统计缓存" - return schemas.Response(success=True, message=message) - except Exception as e: - logger.error(f"清除插件内存统计缓存失败:{str(e)}") - return schemas.Response(success=False, message=f"清除缓存失败:{str(e)}") - - @router.get("/{plugin_id}", summary="获取插件配置") async def plugin_config(plugin_id: str, _: User = Depends(get_current_active_superuser_async)) -> dict: diff --git a/app/core/plugin.py b/app/core/plugin.py index 5fc4cbd6..1c41dee0 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -17,6 +17,7 @@ from watchdog.events import FileSystemEventHandler from watchdog.observers import Observer from app import schemas +from app.core.cache import cached from app.core.config import settings from app.core.event import eventmanager, Event from app.db.plugindata_oper import PluginDataOper @@ -863,10 +864,14 @@ class PluginManager(metaclass=Singleton): """ return list(self._running_plugins.keys()) + @cached(maxsize=1, ttl=1800) def get_online_plugins(self, force: bool = False) -> List[schemas.Plugin]: """ 获取所有在线插件信息 """ + if force: + self.get_online_plugins.cache_clear() + if not settings.PLUGIN_MARKET: return [] @@ -1162,11 +1167,15 @@ class PluginManager(metaclass=Singleton): return plugin + @cached(maxsize=1, ttl=1800) async def async_get_online_plugins(self, force: bool = False) -> List[schemas.Plugin]: """ 异步获取所有在线插件信息 :param force: 是否强制刷新(忽略缓存) """ + if force: + await self.async_get_online_plugins.cache_clear() + if not settings.PLUGIN_MARKET: return [] diff --git a/app/helper/plugin.py b/app/helper/plugin.py index 59896b04..37c52aa4 100644 --- a/app/helper/plugin.py +++ b/app/helper/plugin.py @@ -58,21 +58,22 @@ class PluginHelper(metaclass=WeakSingleton): """ # 如果强制刷新,直接调用不带缓存的版本 if force: - return self._get_plugins_uncached(repo_url, package_version) + return self._request_plugins(repo_url, package_version) + else: + return self._request_plugins_cached(repo_url, package_version) - # 正常情况下调用带缓存的版本 - return self._get_plugins_cached(repo_url, package_version) - - @cached(maxsize=64, ttl=1800) - def _get_plugins_cached(self, repo_url: str, package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: + @cached(maxsize=128, ttl=1800) + def _request_plugins_cached(self, repo_url: str, + package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: """ 获取Github所有最新插件列表(使用缓存) :param repo_url: Github仓库地址 :param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本 """ - return self._get_plugins_uncached(repo_url, package_version) + return self._request_plugins(repo_url, package_version) - def _get_plugins_uncached(self, repo_url: str, package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: + def _request_plugins(self, repo_url: str, + package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: """ 获取Github所有最新插件列表(不使用缓存) :param repo_url: Github仓库地址 @@ -923,23 +924,23 @@ class PluginHelper(metaclass=WeakSingleton): :param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本 :param force: 是否强制刷新,忽略缓存 """ - # 异步版本直接调用不带缓存的版本(缓存在异步环境下可能有并发问题) if force: - await self._async_get_plugins_cached.cache_clear() - return await self._async_get_plugins_cached(repo_url, package_version) + return await self._async_request_plugins(repo_url, package_version) + else: + return await self._async_request_plugins_cached(repo_url, package_version) @cached(maxsize=128, ttl=1800) - async def _async_get_plugins_cached(self, repo_url: str, - package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: + async def _async_request_plugins_cached(self, repo_url: str, + package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: """ 获取Github所有最新插件列表(使用缓存) :param repo_url: Github仓库地址 :param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本 """ - return await self._async_get_plugins_uncached(repo_url, package_version) + return await self._async_request_plugins(repo_url, package_version) - async def _async_get_plugins_uncached(self, repo_url: str, - package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: + async def _async_request_plugins(self, repo_url: str, + package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: """ 异步获取Github所有最新插件列表(不使用缓存) :param repo_url: Github仓库地址