@@ -180,10 +180,54 @@ def on_interrupted(signal_name, task_obj, exception_obj=None, /, *, huey=None):
180
180
assert hasattr (huey , 'enqueue' ) and callable (huey .enqueue )
181
181
huey .enqueue (task_obj )
182
182
183
+ def historical_task (signal_name , task_obj , exception_obj = None , / , * , huey = None ):
184
+ signal_time = utils .time_clock ()
185
+
186
+ add_to_elapsed_signals = frozenset ((
187
+ signals .SIGNAL_INTERRUPTED ,
188
+ signals .SIGNAL_ERROR ,
189
+ signals .SIGNAL_CANCELED ,
190
+ signals .SIGNAL_COMPLETE ,
191
+ ))
192
+ recorded_signals = frozenset ((
193
+ signals .SIGNAL_REVOKED ,
194
+ signals .SIGNAL_EXPIRED ,
195
+ signals .SIGNAL_LOCKED ,
196
+ signals .SIGNAL_EXECUTING ,
197
+ signals .SIGNAL_RETRYING ,
198
+ )) | add_to_elapsed_signals
199
+ storage_key = f'task_history:{ task_obj .id } '
200
+ task_obj_attr = '_signals_history'
201
+
202
+ history = getattr (task_obj , task_obj_attr , None )
203
+ if history is None :
204
+ # pull it from storage, or initialize it
205
+ history = huey .get (
206
+ key = storage_key ,
207
+ peek = True ,
208
+ ) or dict (
209
+ data = task_obj .data ,
210
+ elapsed = 0 ,
211
+ module = task_obj .__module__ ,
212
+ name = task_obj .name ,
213
+ )
214
+ setattr (task_obj , task_obj_attr , history )
215
+ assert history is not None
216
+
217
+ if signal_name in recorded_signals :
218
+ history [signal_name ] = signal_time
219
+ if signal_name in add_to_elapsed_signals and signals .SIGNAL_EXECUTING in history :
220
+ history ['elapsed' ] += signal_time - history [signals .SIGNAL_EXECUTING ]
221
+ if signals .SIGNAL_COMPLETE in history :
222
+ huey .get (key = storage_key )
223
+ else :
224
+ huey .put (key = storage_key , data = history )
225
+
183
226
# Registration of shared signal handlers
184
227
185
228
def register_huey_signals ():
186
229
from django_huey import DJANGO_HUEY , signal
187
230
for qn in DJANGO_HUEY .get ('queues' , dict ()):
188
231
signal (signals .SIGNAL_INTERRUPTED , queue = qn )(on_interrupted )
232
+ signal (queue = qn )(historical_task )
189
233
0 commit comments