@@ -46,10 +46,18 @@ def __call__(
4646 ) -> None :
4747 ...
4848
49+ class ScalarListenerWithMetadata (Protocol ):
50+
51+ def __call__ (
52+ self , event : str , value : float | int , ** kwargs : str | int ,
53+ ) -> None :
54+ ...
55+
4956
5057_event_listeners : list [EventListenerWithMetadata ] = []
5158_event_duration_secs_listeners : list [EventDurationListenerWithMetadata ] = []
5259_event_time_span_listeners : list [EventTimeSpanListenerWithMetadata ] = []
60+ _scalar_listeners : list [ScalarListenerWithMetadata ] = []
5361
5462
5563def record_event (event : str , ** kwargs : str | int ) -> None :
@@ -81,6 +89,14 @@ def record_event_time_span(
8189 callback (event , start_time , end_time , ** kwargs )
8290
8391
92+ def record_scalar (
93+ event : str , value : float | int , ** kwargs : str | int
94+ ) -> None :
95+ """Record a scalar summary value."""
96+ for callback in _scalar_listeners :
97+ callback (event , value , ** kwargs )
98+
99+
84100def register_event_listener (
85101 callback : EventListenerWithMetadata ,
86102) -> None :
@@ -100,6 +116,14 @@ def register_event_duration_secs_listener(
100116 """Register a callback to be invoked during record_event_duration_secs()."""
101117 _event_duration_secs_listeners .append (callback )
102118
119+
120+ def register_scalar_listener (
121+ callback : ScalarListenerWithMetadata ,
122+ ) -> None :
123+ """Register a callback to be invoked during record_scalar()."""
124+ _scalar_listeners .append (callback )
125+
126+
103127def get_event_duration_listeners () -> list [EventDurationListenerWithMetadata ]:
104128 """Get event duration listeners."""
105129 return list (_event_duration_secs_listeners )
@@ -114,12 +138,20 @@ def get_event_listeners() -> list[EventListenerWithMetadata]:
114138 """Get event listeners."""
115139 return list (_event_listeners )
116140
141+
142+ def get_scalar_listeners () -> list [ScalarListenerWithMetadata ]:
143+ """Get scalar event listeners."""
144+ return list (_scalar_listeners )
145+
146+
117147def clear_event_listeners ():
118148 """Clear event listeners."""
119149 global _event_listeners , _event_duration_secs_listeners , _event_time_span_listeners
120150 _event_listeners = []
121151 _event_duration_secs_listeners = []
122152 _event_time_span_listeners = []
153+ _scalar_listeners = []
154+
123155
124156def _unregister_event_duration_listener_by_callback (
125157 callback : EventDurationListenerWithMetadata ) -> None :
@@ -159,3 +191,14 @@ def _unregister_event_listener_by_callback(
159191 """
160192 assert callback in _event_listeners
161193 _event_listeners .remove (callback )
194+
195+
196+ def _unregister_scalar_listener_by_callback (
197+ callback : ScalarListenerWithMetadata ,
198+ ) -> None :
199+ """Unregister a scalar event listener by callback.
200+
201+ This function is supposed to be called for testing only.
202+ """
203+ assert callback in _scalar_listeners
204+ _scalar_listeners .remove (callback )
0 commit comments