mirror of
https://github.com/insistence/RuoYi-Vue3-FastAPI.git
synced 2026-10-14 13:06:46 +00:00
* feat: 支持 v2 插件、原生扩展与签名发布 * fix: 修复测试 * feat: 增强宿主 SDK、运行观测与制品维护能力 * feat: 增强文件传输、配置观测与本地开发能力 * feat: 支持 SSE 实时事件流并完善开发脚手架 * feat: 完善长连接鉴权复核与关闭回收 * feat: 增强生命周期与任务关闭可靠性 * feat: 收紧健康检查契约并补齐前端与真实网络验收 * feat: 增加SDK溯源与离线更新工具并验证跨版本兼容 * feat: 增加持久化业务示例与受控 Python 交付 * feat: 增加统一运行诊断与多worker状态观测 * feat: 增加固定目标发布等待与自动验收 * fix: 修复多环境插件部署前缀与代理配置不一致 * fix: 修复测试
59 lines
2.6 KiB
Python
59 lines
2.6 KiB
Python
from typing import Annotated
|
|
|
|
from fastapi import Path, Query, Request, Response
|
|
|
|
from common.aspect.interface_auth import UserInterfaceAuthDependency
|
|
from common.aspect.pre_auth import PreAuthDependency
|
|
from common.router import APIRouterPro
|
|
from common.vo import DataResponseModel
|
|
from module_plugin.service.plugin_service import get_plugin_runtime_service
|
|
from plugins.core.runtime.configuration import build_config_status, config_revision
|
|
from plugins.core.runtime.metrics_store import PluginMetricsReporter
|
|
from utils.response_util import ResponseUtil
|
|
|
|
plugin_metrics_controller = APIRouterPro(
|
|
prefix='/system/plugin',
|
|
order_num=6,
|
|
tags=['系统管理-插件运行观测'],
|
|
dependencies=[PreAuthDependency(), UserInterfaceAuthDependency('system:plugin:query')],
|
|
)
|
|
|
|
|
|
@plugin_metrics_controller.get(
|
|
'/runtime/metrics',
|
|
summary='获取插件运行指标接口',
|
|
description='用于查询显式插件的请求与任务累计指标,按实际加载版本和可观测worker分组',
|
|
response_model=DataResponseModel[dict],
|
|
)
|
|
async def get_plugin_runtime_metrics(
|
|
request: Request,
|
|
plugin_id: Annotated[
|
|
str | None, Query(alias='pluginId', description='插件ID', pattern=r'^[a-z][a-z0-9_]{1,63}$')
|
|
] = None,
|
|
) -> Response:
|
|
reporter = getattr(request.app.state, 'plugin_metrics_reporter', None)
|
|
if not isinstance(reporter, PluginMetricsReporter):
|
|
return ResponseUtil.success(
|
|
data={'ok': True, 'supported': False, 'scope': 'unavailable', 'workers': [], 'series': []}
|
|
)
|
|
return ResponseUtil.success(data=await reporter.read(plugin_id))
|
|
|
|
|
|
@plugin_metrics_controller.get(
|
|
'/{plugin_id}/config/status',
|
|
summary='获取插件配置生效状态接口',
|
|
description='比较数据库配置与已观测进程的启动快照;按需读取版本仅表示读取完成,不代表业务设置已经应用',
|
|
response_model=DataResponseModel[dict],
|
|
)
|
|
async def get_plugin_config_status(
|
|
request: Request,
|
|
plugin_id: Annotated[str, Path(description='插件ID', pattern=r'^[a-z][a-z0-9_]{1,63}$')],
|
|
) -> Response:
|
|
payload = await get_plugin_runtime_service().get_plugin_config(plugin_id, reveal_secret=True)
|
|
if not payload.get('ok'):
|
|
return ResponseUtil.failure(msg='插件配置状态读取失败')
|
|
values = {item['key']: item.get('value') for item in payload.get('configs', [])}
|
|
reporter = getattr(request.app.state, 'plugin_metrics_reporter', None)
|
|
report = await reporter.read(plugin_id) if isinstance(reporter, PluginMetricsReporter) else {'scope': 'unavailable'}
|
|
return ResponseUtil.success(data=build_config_status(plugin_id, config_revision(plugin_id, values), report))
|