5
5
from dataclasses import dataclass
6
6
from logging import getLogger
7
7
8
+ import wrapt
9
+
8
10
from monitored_ioloop .formatting_utils import pretty_format_handle , pretty_callback_name
9
11
10
12
logger = getLogger (__name__ )
@@ -68,39 +70,40 @@ def decrease_handles_count_thread_safe(self, decrease_by: int) -> None:
68
70
self .handles_count -= decrease_by
69
71
70
72
71
- class MonitoredCallbackWrapper :
73
+ class MonitoredCallbackWrapper ( wrapt . ObjectProxy ): # type: ignore
72
74
def __init__ (
73
75
self ,
74
76
callback : typing .Callable [..., typing .Any ],
75
77
monitor_callback : typing .Callable [[IoLoopMonitorState ], None ],
76
78
io_loop_state : IoLoopInnerState ,
77
79
):
78
- self ._original_callback = callback
79
- self ._monitor_callback = monitor_callback
80
- self ._ioloop_state = io_loop_state
81
- self ._added_to_loop_time = time .perf_counter ()
82
- self ._handle : typing .Optional [Handle ] = None
80
+ super ().__init__ (callback )
81
+ self ._self_original_callback = callback
82
+ self ._self_monitor_callback = monitor_callback
83
+ self ._self_ioloop_state = io_loop_state
84
+ self ._self_added_to_loop_time = time .perf_counter ()
85
+ self ._self_handle : typing .Optional [Handle ] = None
83
86
84
87
def set_handle (self , handle : Handle ) -> None :
85
- self ._handle = handle
88
+ self ._self_handle = handle
86
89
87
90
def __call__ (self , * args : typing .Any , ** kwargs : typing .Any ) -> typing .Any :
88
- loop_lag = time .perf_counter () - self ._added_to_loop_time
91
+ loop_lag = time .perf_counter () - self ._self_added_to_loop_time
89
92
start_wall_time = time .perf_counter ()
90
- response = self ._original_callback (* args , ** kwargs )
91
- self ._ioloop_state .decrease_handles_count_thread_safe (1 )
93
+ response = self ._self_original_callback (* args , ** kwargs )
94
+ self ._self_ioloop_state .decrease_handles_count_thread_safe (1 )
92
95
wall_duration = time .perf_counter () - start_wall_time
93
96
94
97
try :
95
98
pretty_name = (
96
- pretty_format_handle (self ._handle )
97
- if self ._handle
98
- else pretty_callback_name (self ._original_callback )
99
+ pretty_format_handle (self ._self_handle )
100
+ if self ._self_handle
101
+ else pretty_callback_name (self ._self_original_callback )
99
102
)
100
- self ._monitor_callback (
103
+ self ._self_monitor_callback (
101
104
IoLoopMonitorState (
102
105
callback_wall_time = wall_duration ,
103
- loop_handles_count = self ._ioloop_state .handles_count ,
106
+ loop_handles_count = self ._self_ioloop_state .handles_count ,
104
107
loop_lag = loop_lag ,
105
108
callback_pretty_name = pretty_name ,
106
109
)
@@ -109,9 +112,6 @@ def __call__(self, *args: typing.Any, **kwargs: typing.Any) -> typing.Any:
109
112
logger .warning ("Monitor callback failed." , exc_info = True )
110
113
return response
111
114
112
- def __getattr__ (self , item : str ) -> typing .Any :
113
- return getattr (self ._original_callback , item )
114
-
115
115
116
116
def wrap_callback_with_monitoring (
117
117
callback : typing .Callable [..., typing .Any ],
0 commit comments