Files
RuoYi-Vue3-FastAPI/ruoyi-fastapi-backend/module_plugin/controller/plugin_metrics_controller.py
T
insistence 4bd83bc7cd feat: 支持 v2 插件、独立前端和签名制品发布 (#130)
* feat: 支持 v2 插件、原生扩展与签名发布

* fix: 修复测试

* feat: 增强宿主 SDK、运行观测与制品维护能力

* feat: 增强文件传输、配置观测与本地开发能力

* feat: 支持 SSE 实时事件流并完善开发脚手架

* feat: 完善长连接鉴权复核与关闭回收

* feat: 增强生命周期与任务关闭可靠性

* feat: 收紧健康检查契约并补齐前端与真实网络验收

* feat: 增加SDK溯源与离线更新工具并验证跨版本兼容

* feat: 增加持久化业务示例与受控 Python 交付

* feat: 增加统一运行诊断与多worker状态观测

* feat: 增加固定目标发布等待与自动验收

* fix: 修复多环境插件部署前缀与代理配置不一致

* fix: 修复测试
2026-10-09 23:49:45 +08:00

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))