
    lh"                     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     u/var/www/pru.catia.catastroantioquia-mas.com/tasa/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    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+   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?$; 	 
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   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(#|LN 0 $$((B7GNN#/%3	
 "!%((K
 NN0+>? )0N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5f55 ..0))+#$(!	>+I~{S $1&11r'   )r6   sentry_sdk.integrations.celeryrU   )r`   already_patchedrT   rU   s   `  @r%   _wrap_beat_schedulerrc      s.     1C8I4JJO  @2  $#r'   c                  H    t        t        j                        t        _        y N)rc   r   apply_entry r'   r%   _patch_beat_apply_entryrh      s    01F1FGIr'   c                  V    t         y t        t         j                        t         _        y re   )r   rc   apply_asyncrg   r'   r%   _patch_redbeat_apply_asyncrk      s     #78H8T8T#U 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    
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 %sr@   rA   rs   rD   rt   	r   rv   r&   r"   r   r   rw   r   ERRORry   s        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_retry %sr@   rA   rs   rD   rt   r}   ry   s        r%   rp   rp     s    
LL'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  	8CH-.A
/#%2 3
6r*0Z$$NH
V-22W  /
-
../
  s    B 8B. B+.B87B8