33
44import sys
55import json
6+ import time
67import signal
78import atexit
89from functools import lru_cache
@@ -88,8 +89,24 @@ def _log_event(self, lineno: int, event_type: EventType, message: str, call_dept
8889 call_depth (int): Current depth of the call stack.
8990 index_info (str): Information about the index to track in a multi-process environment.
9091 """
92+ # For backward compatibility, still format the message for direct logging
9193 prefix = self ._generate_prefix (lineno , call_depth )
92- log_debug (f"{ index_info } { prefix } { event_type .label } { message } " )
94+ formatted_msg = f"{ index_info } { prefix } { event_type .label } { message } "
95+
96+ # But also include raw event data for lazy serialization in sinks like ZeroMQSink
97+ log_debug (
98+ formatted_msg ,
99+ extra = {
100+ 'raw_event' : {
101+ 'event_type' : event_type .label ,
102+ 'lineno' : lineno ,
103+ 'call_depth' : call_depth ,
104+ 'index_info' : index_info ,
105+ 'message' : message ,
106+ 'timestamp' : time .time (),
107+ }
108+ },
109+ )
93110
94111 def _add_json_event (self , event_type : str , data : Dict [str , Any ]) -> Dict [str , Any ]:
95112 """
@@ -137,7 +154,26 @@ def _handle_collection_change(
137154 diff_msg = f" ({ value_type .__name__ } )(len){ old_value_len } -> { current_value_len } "
138155 logger_msg = f"{ class_name } .{ key } { diff_msg } "
139156
140- self ._log_event (lineno , event_type , logger_msg , call_depth , index_info )
157+ # Log with raw event data for lazy serialization
158+ import time
159+
160+ raw_event = {
161+ 'event_type' : event_type .label ,
162+ 'lineno' : lineno ,
163+ 'call_depth' : call_depth ,
164+ 'index_info' : index_info ,
165+ 'class_name' : class_name ,
166+ 'key' : key ,
167+ 'value_type' : value_type ,
168+ 'old_value_len' : old_value_len ,
169+ 'current_value_len' : current_value_len ,
170+ 'timestamp' : time .time (),
171+ }
172+
173+ # For backward compatibility, still format the message for direct logging
174+ prefix = self ._generate_prefix (lineno , call_depth )
175+ formatted_msg = f"{ index_info } { prefix } { event_type .label } { logger_msg } "
176+ log_debug (formatted_msg , extra = {'raw_event' : raw_event })
141177
142178 if self .output_json :
143179 self ._add_json_event (
@@ -173,21 +209,33 @@ def handle_run(
173209 func_data ['call_msg' ] = call_msg
174210 logger_msg += ' <- ' + call_msg
175211
176- self ._log_event (lineno , EventType .RUN , logger_msg , call_depth , index_info )
212+ # Log with raw event data for lazy serialization
213+ import time
214+
215+ raw_event = {
216+ 'event_type' : EventType .RUN .label ,
217+ 'lineno' : lineno ,
218+ 'call_depth' : call_depth ,
219+ 'index_info' : index_info ,
220+ 'func_info' : func_info ,
221+ 'timestamp' : time .time (),
222+ }
223+
224+ # For backward compatibility, still format the message for direct logging
225+ prefix = self ._generate_prefix (lineno , call_depth )
226+ formatted_msg = f"{ index_info } { prefix } { EventType .RUN .label } { logger_msg } "
227+ log_debug (formatted_msg , extra = {'raw_event' : raw_event })
177228
178229 if self .output_json :
179- function_event = self ._add_json_event ('Function' , func_data )
230+ function_event = self ._add_json_event (
231+ 'Function' ,
232+ func_data ,
233+ )
180234 # Push the function's events list to the stack to maintain hierarchy
181235 self .current_node .append (function_event ['events' ])
182236
183237 def handle_end (
184- self ,
185- lineno : int ,
186- func_info : dict ,
187- abc_wrapper : Optional [Any ],
188- call_depth : int ,
189- index_info : str ,
190- result : Any ,
238+ self , lineno : int , func_info : dict , abc_wrapper : Optional [Any ], call_depth : int , index_info : str , result : Any
191239 ) -> None :
192240 """
193241 Handle the 'end' event indicating the end of a function or method execution.
@@ -199,7 +247,22 @@ def handle_end(
199247 return_msg = abc_wrapper .wrap_return (func_info ['symbol' ], result )
200248 logger_msg += ' -> ' + return_msg
201249
202- self ._log_event (lineno , EventType .END , logger_msg , call_depth , index_info )
250+ # Log with raw event data for lazy serialization
251+ import time
252+
253+ raw_event = {
254+ 'event_type' : EventType .END .label ,
255+ 'lineno' : lineno ,
256+ 'call_depth' : call_depth ,
257+ 'index_info' : index_info ,
258+ 'func_info' : func_info ,
259+ 'timestamp' : time .time (),
260+ }
261+
262+ # For backward compatibility, still format the message for direct logging
263+ prefix = self ._generate_prefix (lineno , call_depth )
264+ formatted_msg = f"{ index_info } { prefix } { EventType .END .label } { logger_msg } "
265+ log_debug (formatted_msg , extra = {'raw_event' : raw_event })
203266
204267 if self .output_json and len (self .current_node ) > 1 :
205268 # Find the corresponding function event in the parent node
@@ -248,7 +311,25 @@ def handle_upd(
248311 diff_msg = f" { old_msg } -> { current_msg } "
249312 logger_msg = f"{ class_name } .{ key } { diff_msg } "
250313
251- self ._log_event (lineno , EventType .UPD , logger_msg , call_depth , index_info )
314+ # Log with raw event data for lazy serialization
315+ import time
316+
317+ raw_event = {
318+ 'event_type' : EventType .UPD .label ,
319+ 'lineno' : lineno ,
320+ 'call_depth' : call_depth ,
321+ 'index_info' : index_info ,
322+ 'class_name' : class_name ,
323+ 'key' : key ,
324+ 'old_value' : old_value ,
325+ 'current_value' : current_value ,
326+ 'timestamp' : time .time (),
327+ }
328+
329+ # For backward compatibility, still format the message for direct logging
330+ prefix = self ._generate_prefix (lineno , call_depth )
331+ formatted_msg = f"{ index_info } { prefix } { EventType .UPD .label } { logger_msg } "
332+ log_debug (formatted_msg , extra = {'raw_event' : raw_event })
252333
253334 if self .output_json :
254335 self ._add_json_event (
0 commit comments