diff --git a/plugins/message_summary/main.py b/plugins/message_summary/main.py index 06b08eb..0aa5030 100644 --- a/plugins/message_summary/main.py +++ b/plugins/message_summary/main.py @@ -40,6 +40,8 @@ class MessageSummaryPlugin(MessagePluginInterface): def __init__(self): super().__init__() + # 在初始化时动态应用装饰器 + self.process_message = plugin_stats_decorator(plugin_name=self.name)(self.process_message) def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" diff --git a/plugins/music/main.py b/plugins/music/main.py index 876876a..2c1add0 100644 --- a/plugins/music/main.py +++ b/plugins/music/main.py @@ -7,6 +7,7 @@ from wcferry import Wcf from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus +from plugins.stats_collector.decorators import plugin_stats_decorator from robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager @@ -39,6 +40,8 @@ class MusicPlugin(MessagePluginInterface): def __init__(self): super().__init__() + # 在初始化时动态应用装饰器 + self.process_message = plugin_stats_decorator(plugin_name=self.name)(self.process_message) def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" diff --git a/plugins/stats_collector/decorators.py b/plugins/stats_collector/decorators.py index dccaa74..842461b 100644 --- a/plugins/stats_collector/decorators.py +++ b/plugins/stats_collector/decorators.py @@ -1,10 +1,11 @@ import functools +import time import traceback from datetime import datetime from typing import Callable, Dict, Any, Tuple -from event_system.event_manager import EventManager -from event_system.events.plugin_events import PluginCallStartEvent, PluginCallEndEvent, PluginCallErrorEvent +from db.stats_db import StatsDBOperator +from db.connection import DBConnectionManager def plugin_stats_decorator(plugin_name: str) -> Callable: @@ -19,53 +20,66 @@ def plugin_stats_decorator(plugin_name: str) -> Callable: def decorator(func: Callable) -> Callable: @functools.wraps(func) def wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: - # 获取事件管理器 - event_manager = EventManager.get_instance() + # 获取数据库连接 + db_manager = DBConnectionManager.get_instance() + stats_db = StatsDBOperator(db_manager) # 提取消息信息 content = message.get("content", "") sender = message.get("sender", "") roomid = message.get("roomid", "") - # 发布插件调用开始事件 - start_time = datetime.now() - event_manager.publish(PluginCallStartEvent, { - "plugin_name": plugin_name, - "command": content, - "user_id": sender, - "group_id": roomid, - "start_time": start_time - }) + # 记录开始时间 + start_time = time.time() try: # 调用原始方法 success, response = func(self, message) - # 发布插件调用结束事件 - end_time = datetime.now() - event_manager.publish(PluginCallEndEvent, { - "plugin_name": plugin_name, - "command": content, - "user_id": sender, - "group_id": roomid, - "start_time": start_time, - "end_time": end_time, - "success": success, - "response": response - }) + # 计算执行时间(毫秒) + process_time_ms = (time.time() - start_time) * 1000 + + # 记录插件调用 + stats_db.record_plugin_call( + plugin_name=plugin_name, + command=content, + user_id=sender, + group_id=roomid, + success=success, + process_time_ms=process_time_ms + ) return success, response except Exception as e: - # 发布插件调用错误事件 - event_manager.publish(PluginCallErrorEvent, { - "plugin_name": plugin_name, - "command": content, - "user_id": sender, - "group_id": roomid, - "start_time": start_time, - "error_message": str(e), - "stack_trace": traceback.format_exc() - }) + # 计算执行时间(毫秒) + process_time_ms = (time.time() - start_time) * 1000 + + # 记录错误 + error_message = str(e) + stack_trace = traceback.format_exc() + + try: + # 记录插件调用(失败) + stats_db.record_plugin_call( + plugin_name=plugin_name, + command=content, + user_id=sender, + group_id=roomid, + success=False, + process_time_ms=process_time_ms + ) + + # 记录错误详情 + stats_db.record_error( + plugin_name=plugin_name, + command=content, + user_id=sender, + group_id=roomid, + error_message=error_message, + stack_trace=stack_trace + ) + except Exception as db_error: + print(f"记录插件统计数据失败: {db_error}") # 重新抛出异常,让上层处理 raise