33from __future__ import annotations
44
55import asyncio
6- import contextvars
76import copy
87import json
98import os
@@ -149,10 +148,8 @@ def _is_console_stats_excluded_plugin(plugin: str) -> bool:
149148 return bool (key ) and key in resolve_console_stats_excluded_plugin_names ()
150149
151150
152- _MATCHER_RUN_STARTED : contextvars .ContextVar [float | None ] = contextvars .ContextVar (
153- "matcher_run_started" ,
154- default = None ,
155- )
151+ # NoneBot run_preprocessor 在 task group 子任务内执行,ContextVar 无法回写到父任务。
152+ _MATCHER_RUN_STARTED_ATTR = "_pallas_matcher_run_started_pc"
156153_MATCHER_ERROR_LOG_CAP = 80
157154_MATCHER_DURATION_LOG_CAP = 150
158155_MATCHER_DURATION_LOG_PER_PLUGIN_CAP = 30
@@ -2110,6 +2107,19 @@ def _duration_ms_float(value: object) -> float:
21102107 return 0.0
21112108
21122109
2110+ def mark_matcher_run_started (matcher : object ) -> None :
2111+ setattr (matcher , _MATCHER_RUN_STARTED_ATTR , time .perf_counter ())
2112+
2113+
2114+ def take_matcher_run_started (matcher : object ) -> float | None :
2115+ started = getattr (matcher , _MATCHER_RUN_STARTED_ATTR , None )
2116+ if hasattr (matcher , _MATCHER_RUN_STARTED_ATTR ):
2117+ delattr (matcher , _MATCHER_RUN_STARTED_ATTR )
2118+ if isinstance (started , (int , float )):
2119+ return float (started )
2120+ return None
2121+
2122+
21132123def _matcher_elapsed_ms (started : float | None ) -> float :
21142124 """Matcher 墙钟耗时(毫秒,保留 _MATCHER_DURATION_MS_DECIMALS 位小数)。"""
21152125 if started is None :
@@ -2813,7 +2823,7 @@ async def _mark_plugin_matcher_run_start(
28132823 sid = str (getattr (bot , "self_id" , "" ) or "" ).strip ()
28142824 if not sid :
28152825 return
2816- _MATCHER_RUN_STARTED . set ( time . perf_counter () )
2826+ mark_matcher_run_started ( matcher )
28172827
28182828 @run_postprocessor
28192829 async def _count_plugin_matcher_run (
@@ -2828,7 +2838,7 @@ async def _count_plugin_matcher_run(
28282838 sid = str (getattr (bot , "self_id" , "" ) or "" ).strip ()
28292839 if not sid :
28302840 return
2831- started = _MATCHER_RUN_STARTED . get ( )
2841+ started = take_matcher_run_started ( matcher )
28322842 elapsed_ms = _matcher_elapsed_ms (started )
28332843 try :
28342844 row = _plugin_run_plugin_row (sid , plugin )
@@ -2853,8 +2863,6 @@ async def _count_plugin_matcher_run(
28532863 )
28542864 except Exception : # noqa: BLE001
28552865 pass
2856- finally :
2857- _MATCHER_RUN_STARTED .set (None )
28582866
28592867
28602868def _plugin_run_stats_bot_row (
0 commit comments