Ë
    çÞËjó"  ã                   óv  — d dl Z d dlmZmZ d dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZ er+d dlmZ d dlmZmZmZmZ d d	lmZmZmZ  ed
edef   ¬«      Z	 d dlmZmZ d dlmZ d dlmZm Z  d dl!m"Z"m#Z#m$Z$ 	 d dl&m'Z' d„ Z(d„ Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d„ Z/d„ Z0d„ Z1y# e%$ r	  ed«      ‚w xY w# e%$ r dZ'Y Œ9w xY w)é    N)Úcapture_checkinÚMonitorStatus)ÚDidNotEnable)Ú_get_humanized_intervalÚ_now_seconds_since_epoch)ÚloggerÚmatch_regex_list)ÚTYPE_CHECKING)ÚCallable)ÚAnyÚOptionalÚTypeVarÚUnion)ÚMonitorConfigÚMonitorConfigScheduleTypeÚMonitorConfigScheduleUnitÚF.)Úbound)ÚTaskÚCelery)Ú	Scheduler)ÚcrontabÚschedule)Útask_failureÚtask_successÚ
task_retryzCelery not installed)ÚRedBeatSchedulerc                 óÖ   — | j                   j                  d«      xs i }d|v r|j                  |d   «       |d= |j                  | j                   j                  d«      xs i «       |S )NÚheadersÚ
properties)ÚrequestÚgetÚupdate)Útaskr   s     ú`/var/www/photos/backend/venv/lib/python3.12/site-packages/sentry_sdk/integrations/celery/beat.pyÚ_get_headersr&   -   sc   € à�l‰l×Ñ˜yÓ)Ò/¨R€Gð �GÑØ�‰�w˜yÑ)Ô*Ø�IÐà‡N�N�4—<‘<×#Ñ# LÓ1Ò7°RÔ8à€Nó    c                 óþ  — i }d }d }d }t        | t        «      rd}dj                  | «      }nit        | t        «      r8d}t	        | j
                  «      \  }}|dk(  r:t        j                  d||«       i S t        j                  dt        | «      «       i S i |d<   ||d   d<   ||d   d	<   |�||d   d
<   t        | d«      xr% | j                  d uxr t        | j                  «      xs |j                  xs d|d<   |S )Nr   zd{0._orig_minute} {0._orig_hour} {0._orig_day_of_month} {0._orig_month_of_year} {0._orig_day_of_week}ÚintervalÚsecondz½Intervals shorter than one minute are not supported by Sentry Crons. Monitor '%s' has an interval of %s seconds. Use the `exclude_beat_tasks` option in the celery integration to exclude it.z8Celery schedule type '%s' not supported by Sentry Crons.r   ÚtypeÚvalueÚunitÚtzÚUTCÚtimezone)Ú
isinstancer   Úformatr   r   Úsecondsr   Úwarningr+   Úhasattrr.   Ústrr0   )Úcelery_scheduleÚappÚmonitor_nameÚmonitor_configÚschedule_typeÚschedule_valueÚschedule_units          r%   Ú_get_monitor_configr>   ;   sF  € à€NØ€MØ€NØ€Mä�/¤7Ô+Ø!ˆð$÷ %+¡F¨?Ó$;ñ 	ô 
�O¤XÔ	.Ø"ˆÜ*AØ×#Ñ#ó+
Ñ'ˆ˜ð ˜HÒ$Ü�N‰Nð PØØôð
 ˆIô 	�‰ØFÜ�Ó!ô	
ð ˆ	à!#€N�:ÑØ)6€N�:Ñ˜vÑ&Ø*8€N�:Ñ˜wÑ'àÐ Ø-:ˆ�zÑ" 6Ñ*ô �O TÓ*ò (Ø×"Ñ"¨$Ð.ò(ä�O×&Ñ&Ó'ò	ð
 �<‰<ò	ð ð �:Ñð Ðr'   c                 óª  — |j                   sy|j                  }t        ||j                  «      }|ry|j                  }| j
                  }t        |||«      }t        |«      }|sy|j                  j                  di «      }	|	j                  ||dœ«       t        ||t        j                  ¬«      }
|	j                  d|
i«       |	|j                  d<   y)zE
    Add Sentry Crons information to the schedule_entry headers.
    Nr   )úsentry-monitor-slugúsentry-monitor-config)Úmonitor_slugr:   Ústatusúsentry-monitor-check-in-id)Úmonitor_beat_tasksÚnamer	   Úexclude_beat_tasksr   r8   r>   ÚboolÚoptionsÚpopr#   r   r   ÚIN_PROGRESS)Ú	schedulerÚschedule_entryÚintegrationr9   Útask_should_be_excludedr7   r8   r:   Úis_supported_scheduler   Úcheck_in_ids              r%   Ú#_apply_crons_data_to_schedule_entryrR   t   sÜ   € ð
 ×)Ò)Øà!×&Ñ&€Lä.Ø�k×4Ñ4óÐñ Øà$×-Ñ-€OØ
�-‰-€Cä(¨¸#¸|ÓL€Nä  Ó0ÐÙ Øà×$Ñ$×(Ñ(¨°BÓ7€GØ‡N�Nà#/Ø%3ñ	
ôô "Ø!Ø%Ü×(Ñ(ô€Kð
 ‡N�NÐ0°+Ð>Ô?ð )0€N×Ñ˜9Ò%r'   c                 óD   ‡ ‡— dt        ‰ «      v }|r‰ S ddlmŠ ˆˆ fd„}|S )aw  
    Makes sure that:
    - a new Sentry trace is started for each task started by Celery Beat and
      it is propagated to the task.
    - the Sentry Crons information is set in the Celery Beat task's
      headers so that is is monitored with Sentry Crons.

    After the patched function is called,
    Celery Beat will call apply_async to put the task in the queue.
    Úsentry_patched_schedulerr   )ÚCeleryIntegrationc                  óè   •— t        j                  «       j                  ‰«      }|€ ‰| i |¤ŽS t        j                  «       }|j	                  «        d|_        | \  }}t        |||«        ‰| i |¤ŽS )Nzcelery-beat)Ú
sentry_sdkÚ
get_clientÚget_integrationÚget_isolation_scopeÚset_new_propagation_contextÚ_namerR   )ÚargsÚkwargsrN   ÚscoperL   rM   rU   Úoriginal_functions         €€r%   rT   z6_wrap_beat_scheduler.<locals>.sentry_patched_schedulerµ   s|   ø€ ä ×+Ñ+Ó-×=Ñ=Ð>OÓPˆØÐÙ$ dÐ5¨fÑ5Ð5ô ×.Ñ.Ó0ˆØ×)Ñ)Ô+Ø#ˆŒà$(Ñ!ˆ	�>Ü+¨I°~À{ÔSá  $Ð1¨&Ñ1Ð1r'   )r6   Úsentry_sdk.integrations.celeryrU   )r`   Úalready_patchedrT   rU   s   `  @r%   Ú_wrap_beat_schedulerrc   ¡   s.   ù€ ð 1´CÐ8IÓ4JÐJ€OÙØ Ð å@õ2ð  $Ð#r'   c                  óH   — t        t        j                  «      t        _        y ©N)rc   r   Úapply_entry© r'   r%   Ú_patch_beat_apply_entryrh   È   s   € ä0´×1FÑ1FÓG„IÕr'   c                  óV   — t         €y t        t         j                  «      t         _        y re   )r   rc   Ú	maybe_duerg   r'   r%   Ú_patch_redbeat_maybe_duerk   Í   s    € äÐØä!5Ô6F×6PÑ6PÓ!QÔÕr'   c                 ó    — | rLt        j                  t        «       t        j                  t        «       t        j                  t        «       y y re   )r   ÚconnectÚcrons_task_successr   Úcrons_task_failurer   Úcrons_task_retry)rE   s    r%   Ú_setup_celery_beat_signalsrq   Õ   s7   € áÜ×ÑÔ/Ô0Ü×ÑÔ/Ô0Ü×ÑÔ+Õ,ð r'   c           	      ó  — t        j                  d| «       t        | «      }d|vry |j                  di «      }|j                  d«      }t	        |d   ||d   |rt        «       t        |«      z
  nd t        j                  ¬«       y )Nzcelery_task_success %sr@   rA   ú sentry-monitor-start-timestamp-srD   ©rB   r:   rQ   ÚdurationrC   )	r   Údebugr&   r"   r   r   Úfloatr   ÚOK©Úsenderr^   r   r:   Ústart_timestamp_ss        r%   rn   rn   Ý   sˆ   € ä
‡L�LÐ)¨6Ô2Ü˜6Ó"€Gà GÑ+Øà—[‘[Ð!8¸"Ó=€NàŸ™Ð$FÓGÐäØÐ2Ñ3Ø%ØÐ8Ñ9ñ !ô %Ó&¬Ð/@Ó)AÒAàä×Ñö
r'   c           	      ó  — t        j                  d| «       t        | «      }d|vry |j                  di «      }|j                  d«      }t	        |d   ||d   |rt        «       t        |«      z
  nd t        j                  ¬«       y )Nzcelery_task_failure %sr@   rA   rs   rD   rt   ©	r   rv   r&   r"   r   r   rw   r   ÚERRORry   s        r%   ro   ro   ö   sˆ   € ä
‡L�LÐ)¨6Ô2Ü˜6Ó"€Gà GÑ+Øà—[‘[Ð!8¸"Ó=€NàŸ™Ð$FÓGÐäØÐ2Ñ3Ø%ØÐ8Ñ9ñ !ô %Ó&¬Ð/@Ó)AÒAàä×"Ñ"ö
r'   c           	      ó  — t        j                  d| «       t        | «      }d|vry |j                  di «      }|j                  d«      }t	        |d   ||d   |rt        «       t        |«      z
  nd t        j                  ¬«       y )Nzcelery_task_retry %sr@   rA   rs   rD   rt   r}   ry   s        r%   rp   rp     sˆ   € ä
‡L�LÐ'¨Ô0Ü˜6Ó"€Gà GÑ+Øà—[‘[Ð!8¸"Ó=€NàŸ™Ð$FÓGÐäØÐ2Ñ3Ø%ØÐ8Ñ9ñ !ô %Ó&¬Ð/@Ó)AÒAàä×"Ñ"ö
r'   )2rW   Úsentry_sdk.cronsr   r   Úsentry_sdk.integrationsr   Ú$sentry_sdk.integrations.celery.utilsr   r   Úsentry_sdk.utilsr   r	   Útypingr
   Úcollections.abcr   r   r   r   r   Úsentry_sdk._typesr   r   r   r   Úceleryr   r   Úcelery.beatr   Úcelery.schedulesr   r   Úcelery.signalsr   r   r   ÚImportErrorÚredbeat.schedulersr   r&   r>   rR   rc   rh   rk   rq   rn   ro   rp   rg   r'   r%   ú<module>r�      sÕ   ðÛ ß ;Ý 0÷÷õ
 !áÝ(ß4Ó4÷ñ ñ 	�˜8 C¨ HÑ-Ô.€Að
/ß#Ý%ß2÷ñ ðÝ3ò
ò6òr*0òZ$$òNHò
Rò-òò2ó2øðW ò /Ù
Ð-Ó
.Ð.ð/ûð
 ò ØÒðús   Á B Á8B. ÂB+Â.B8Â7B8