Skip to content

Commit af5f629

Browse files
authored
Merge pull request #1161 from tcely/patch-11
Record signal timing for tasks
2 parents ebe13de + e770095 commit af5f629

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

tubesync/common/huey.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,54 @@ def on_interrupted(signal_name, task_obj, exception_obj=None, /, *, huey=None):
180180
assert hasattr(huey, 'enqueue') and callable(huey.enqueue)
181181
huey.enqueue(task_obj)
182182

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+
183226
# Registration of shared signal handlers
184227

185228
def register_huey_signals():
186229
from django_huey import DJANGO_HUEY, signal
187230
for qn in DJANGO_HUEY.get('queues', dict()):
188231
signal(signals.SIGNAL_INTERRUPTED, queue=qn)(on_interrupted)
232+
signal(queue=qn)(historical_task)
189233

0 commit comments

Comments
 (0)