2525from ..settings import settings
2626from ..utils .datetime import utc_now
2727from .redis import (
28+ append_dead_letter_audit ,
2829 clear_dead_letter ,
2930 count_dead_letters ,
31+ delete_retry_policy ,
3032 enqueue_task as redis_enqueue_task ,
33+ fetch_dead_letter_audit ,
3134 fetch_dead_letters ,
3235 get_dead_letter ,
3336 get_redis_client ,
37+ get_retry_policy ,
3438 list_heartbeats ,
39+ list_retry_policies ,
3540 pop_task ,
3641 purge_dead_letters ,
3742 record_dead_letter ,
43+ set_retry_policy ,
3844 set_task_result ,
3945 write_heartbeat ,
4046)
@@ -217,6 +223,21 @@ async def list_dead_letters(
217223 ) -> tuple [list [dict [str , Any ]], int ]:
218224 return [], 0
219225
226+ async def list_dead_letter_audit (self , limit : int = 100 ) -> list [dict [str , Any ]]:
227+ return []
228+
229+ async def get_retry_policy (self , task_name : str ) -> dict [str , Any ] | None :
230+ return None
231+
232+ async def set_retry_policy (self , task_name : str , policy : dict [str , Any ]) -> None :
233+ return None
234+
235+ async def delete_retry_policy (self , task_name : str ) -> None :
236+ return None
237+
238+ async def list_retry_policies (self ) -> dict [str , dict [str , Any ]]:
239+ return {}
240+
220241 async def delete_dead_letter (self , task_id : str ) -> None :
221242 return None
222243
@@ -314,23 +335,23 @@ async def _worker(self, worker_id: int):
314335 await record_dead_letter (self ._redis , payload )
315336 dead_letter_recorded_total .labels (
316337 queue = self .queue_name ,
317- error_type = "TimeoutError" ,
318- ).inc ()
319- dead_letter_recorded_total .labels (
320- queue = self .queue_name ,
321- error_type = payload .get ("error_type" , payload .get ("last_error" , "unknown" )),
338+ error_type = payload .get ("error_type" , "MissingCallable" ),
322339 ).inc ()
323340 record_task_completion (self .queue_name , TaskStatus .FAILED .value )
324341 continue
325342
326343 retries = payload .get ("retry_count" , 0 )
327- max_retries = payload .get ("max_retries" , 3 )
344+ base_max_retries = payload .get ("max_retries" , 3 )
345+
346+ policy = await get_retry_policy (self ._redis , name ) or {}
347+ timeout = float (policy .get ("timeout" , self ._task_timeout ))
348+ max_retries = int (policy .get ("max_retries" , base_max_retries ))
328349
329350 start = utc_now ()
330351 try :
331352 result = await asyncio .wait_for (
332353 coro_fn (* payload .get ("args" , ()), ** payload .get ("kwargs" , {})),
333- timeout = self . _task_timeout ,
354+ timeout = timeout ,
334355 )
335356 except TimeoutError :
336357 payload .setdefault ("metadata" , {})
@@ -343,6 +364,10 @@ async def _worker(self, worker_id: int):
343364 payload ["stack_trace" ] = None
344365 payload ["worker_id" ] = worker_id
345366 await record_dead_letter (self ._redis , payload )
367+ dead_letter_recorded_total .labels (
368+ queue = self .queue_name ,
369+ error_type = "TimeoutError" ,
370+ ).inc ()
346371 record_task_completion (self .queue_name , TaskStatus .FAILED .value )
347372 record_task_latency (self .queue_name , (utc_now () - start ).total_seconds ())
348373 continue
@@ -365,7 +390,10 @@ async def _worker(self, worker_id: int):
365390 record_task_latency (self .queue_name , (utc_now () - start ).total_seconds ())
366391 continue
367392
368- backoff = min (self ._backoff_base ** retries , self ._backoff_max )
393+ backoff = min (
394+ float (policy .get ("backoff_base" , self ._backoff_base )) ** retries ,
395+ float (policy .get ("backoff_max" , self ._backoff_max )),
396+ )
369397 await asyncio .sleep (backoff )
370398 await redis_enqueue_task (self ._redis , name , payload )
371399 continue
@@ -404,6 +432,21 @@ async def list_dead_letters(
404432 dead_letter_active_gauge .labels (queue = self .queue_name ).set (total_filtered )
405433 return window , total_filtered
406434
435+ async def list_dead_letter_audit (self , limit : int = 100 ) -> list [dict [str , Any ]]:
436+ return await fetch_dead_letter_audit (self ._redis , limit )
437+
438+ async def get_retry_policy (self , task_name : str ) -> dict [str , Any ] | None :
439+ return await get_retry_policy (self ._redis , task_name )
440+
441+ async def set_retry_policy (self , task_name : str , policy : dict [str , Any ]) -> None :
442+ await set_retry_policy (self ._redis , task_name , policy )
443+
444+ async def delete_retry_policy (self , task_name : str ) -> None :
445+ await delete_retry_policy (self ._redis , task_name )
446+
447+ async def list_retry_policies (self ) -> dict [str , dict [str , Any ]]:
448+ return await list_retry_policies (self ._redis )
449+
407450 async def delete_dead_letter (self , task_id : str ) -> None :
408451 await clear_dead_letter (self ._redis , task_id )
409452
0 commit comments