
    \j"                        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%dZ(ddddde)ddfdZ*	 	 	 	 	 	 	 	 d&dZ+	 	 	 	 d'dZ,d(dZ-d(dZ.d e/ddfd!Z0d)d"Z1d)d#Z2d)d$Z3y# e%$ r	  ed      w xY w# e%$ r dZ'Y [w 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)RedBeatSchedulerreturnc                     | 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     M/root/env/lib/python3.12/site-packages/sentry_sdk/integrations/celery/beat.py_get_headersr'   -   sc    lly)/RG Gwy)*INN4<<##L17R8N    celery_scheduler   appr   monitor_namer   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secondzIntervals 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/   hasattrr2   strr4   )r)   r*   r+   monitor_configschedule_typeschedule_valueschedule_units          r&   _get_monitor_configr?   :   sH    ')N;?M26N;?M/7+!$ %+F?$; 	 
OX	."*A##+
' H$NN P
 I 	F!	
 	!#N:)6N:v&*8N:w' -:z"6* OT* (""$.(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   r*   r?   booloptionspopr$   r   r   IN_PROGRESS)	schedulerschedule_entryintegrationr+   task_should_be_excludedr)   r*   r;   is_supported_scheduler    check_in_ids              r&   #_apply_crons_data_to_schedule_entryrS   t   s     ))!&&L.k44 $--O
--C(#|LN 0 $$((B7GNN#/%3	
 "!%((K
 NN0+>? )0N9%r(   c                 F     dt               v }|r S ddlm d 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_namerS   )argskwargsrO   scoperM   rN   rV   original_functions         r&   rU   z6_wrap_beat_scheduler.<locals>.sentry_patched_scheduler   s|     ++-==>OP$d5f55 ..0))+#$(!	>+I~{S $1&11r(   )r^   r   r_   r   r   N)r:   sentry_sdk.integrations.celeryrV   )ra   already_patchedrU   rV   s   `  @r&   _wrap_beat_schedulerrd      s.     1C8I4JJO  @2 $#r(   c                  H    t        t        j                        t        _        y N)rd   r   apply_entry r(   r&   _patch_beat_apply_entryri      s    01F1FGIr(   c                  V    t         y t        t         j                        t         _        y rf   )r   rd   apply_asyncrh   r(   r&   _patch_redbeat_apply_asyncrl      s     #78H8T8T#U r(   rF   c                     | rLt        j                  t               t        j                  t               t        j                  t               y y rf   )r   connectcrons_task_successr   crons_task_failurer   crons_task_retry)rF   s    r&   _setup_celery_beat_signalsrr      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 %srA   rB    sentry-monitor-start-timestamp-srE   rC   r;   rR   durationrD   )	r   debugr'   r#   r   r   floatr   OKsenderr_   r    r;   start_timestamp_ss        r&   ro   ro      s    
LL)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 %srA   rB   rt   rE   ru   	r   rw   r'   r#   r   r   rx   r   ERRORrz   s        r&   rp   rp      s    
LL)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 %srA   rB   rt   rE   ru   r~   rz   s        r&   rq   rq     s    
LL'06"GG+[[!8"=N$FG23%89 ! %&/@)AA""
r(   )r%   r   r   zdict[str, Any])rM   r   rN   r   rO   z0sentry_sdk.integrations.celery.CeleryIntegrationr   N)ra   Callable[..., Any]r   r   )r   N)r{   r   r_   zdict[Any, Any]r   N)4rX   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:   r?   rS   rd   ri   rl   rI   rr   ro   rp   rq   rh   r(   r&   <module>r      s8    ; 0
 !(44  	8CH-.A
/#%2 3

77!)79<77t-0-0-0 D-0 
	-0`$$+$$$$NHV-4 -D -00S  /
-
../
  s    B? 8C ?CCC