o
    ٰiAH                     @   s  d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
mZmZ d dlmZmZmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlmZmZ d dlmZ d dlmZm Z m!Z!m"Z" d dl#m$Z$ e$rd dl#m%Z% d dl#m&Z& d dl#m'Z' d dl#m(Z( d dl#m)Z) d dl#m*Z* d dl+m,Z,m-Z-m.Z.m/Z/ d dlm0Z0 e)de&de%f dZ1z&d dl2m3Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? W n e@y   edw e<e:e;fZAG d d! d!eZBd"eCd#dfd$d%ZDdQd*d+ZE	dR	'	,	'	-	'	.	'	/	0	#	1dSd2d3ZFd4d5d6d7d8eGd#d5fd9d:ZHG d;d< d<ZIdTd>d?ZJdUd@dAZKdVdCdDZLdUdEdFZMdWdGdHZNdWdIdJZOdWdKdLZPdWdMdNZQdWdOdPZRdS )X    N)Mappingwraps)isolation_scope)continue_trace)OP
SPANSTATUSSPANDATA)_check_minimum_versionIntegrationDidNotEnable)_patch_beat_apply_entry_patch_redbeat_apply_async_setup_celery_beat_signals)_now_seconds_since_epoch)ignore_logger)BAGGAGE_HEADER_NAMETransactionSource)Baggage)capture_internal_exceptionsensure_integration_enabledevent_from_exceptionreraise)TYPE_CHECKING)Any)Callable)List)Optional)TypeVar)Union)EventProcessorEventHintExcInfo)SpanF.)bound)VERSION)Task)task_has_custom)IgnoreRejectRetrySoftTimeLimitExceeded)ProducerzCelery not installedc                	   @   sJ   e Zd ZdZde Z			ddededd	d
dfddZedddZdS )CeleryIntegrationceleryzauto.queue.TFNpropagate_tracesmonitor_beat_tasksexclude_beat_taskszOptional[List[str]]returnc                 C   s*   || _ || _|| _t  t  t| d S N)r1   r2   r3   r   r   r   )selfr1   r2   r3    r7   [/home/ubuntu/.local/lib/python3.10/site-packages/sentry_sdk/integrations/celery/__init__.py__init__@   s   zCeleryIntegration.__init__c                   C   sD   t tt t  t  t  t  t  td td td d S )Nzcelery.worker.jobzcelery.app.tracezcelery.redirected)	r
   r/   CELERY_VERSION_patch_build_tracer_patch_task_apply_async_patch_celery_send_task_patch_worker_exit_patch_producer_publishr   r7   r7   r7   r8   
setup_onceN   s   
zCeleryIntegration.setup_once)TFNr4   N)	__name__
__module____qualname__
identifieroriginboolr9   staticmethodr@   r7   r7   r7   r8   r/   <   s"    

r/   statusr4   c                 C   sZ   t    t }|jd ur|j|  W d    d S W d    d S 1 s&w   Y  d S r5   )r   
sentry_sdkget_current_scopespan
set_status)rI   scoper7   r7   r8   _set_statusc   s   
"rO   taskr   exc_infor#   c                 C   s   t  }|td u rd S t|d trtd d S td t| dr-t|d | jr-d S t	||j
dddd\}}t j||d	 d S )
N   abortedinternal_errorthrowsr0   F)typehandled)client_options	mechanism)hint)rJ   
get_clientget_integrationr/   
isinstanceCELERY_CONTROL_FLOW_EXCEPTIONSrO   hasattrrU   r   optionscapture_event)rP   rQ   clienteventrZ   r7   r7   r8   _capture_exceptionj   s   
rd   uuidargskwargsrequestOptional[Any]r    c                    s   d	 fdd}|S )
Nrc   r!   rZ   r"   r4   Optional[Event]c                    s   t  ! | di }|d< | di }j d|d< W d    n1 s'w   Y  d|v r`t  % t|d d trPdd	td
g| d< W d    | S W d    | S 1 s[w   Y  | S )Ntagscelery_task_idextra)	task_namerf   rg   z
celery-jobrQ   r   r0   r-   namefingerprint)r   
setdefaultro   
issubclassr-   getattr)rc   rZ   rk   rm   rf   rg   rP   re   r7   r8   event_processor   s.   




z._make_event_processor.<locals>.event_processor)rc   r!   rZ   r"   r4   rj   r7   )rP   re   rf   rg   rh   ru   r7   rt   r8   _make_event_processor   s   rv   original_headerszdict[str, Any]rL   zOptional[Span]r2   c                 C   sT  |   }t  tt j|d}|r|ddt  i |dt i |r|t	}|t	}|p5|}|r`|r`t
|}t
|}	|	j|j ddd |	j|jfD |	_|	jdd	}|| |rk||t	< |d
i | |r|||d
 t	< | D ]\}
}|
dr||d
 |
< qW d   |S W d   |S 1 sw   Y  |S )z
    Updates the headers of the Celery task with the tracing information
    and eventually Sentry Crons monitoring information for beat tasks.
    )rL   z sentry-monitor-start-timestamp-sz%.9fsentry-task-enqueued-time,c                 S   s    g | ]}|d ur|dkr|qS )N r7   ).0xr7   r7   r8   
<listcomp>   s
    z/_update_celery_task_headers.<locals>.<listcomp>T)include_third_partyheaderszsentry-N)copyr   dictrJ   get_isolation_scopeiter_trace_propagation_headersupdater   getr   r   from_incoming_headersentry_itemsjointhird_party_items	serializerq   items
startswith)rw   rL   r2   updated_headersr   existing_baggagesentry_baggagecombined_baggageincomingcombinedkeyvaluer7   r7   r8   _update_celery_task_headers   sb   	







@
@@r   c                   @   s    e Zd ZdddZdd	d
ZdS )NoOpMgrr4   Nc                 C      d S r5   r7   )r6   r7   r7   r8   	__enter__      zNoOpMgr.__enter__exc_typer   	exc_value	tracebackc                 C   r   r5   r7   )r6   r   r   r   r7   r7   r8   __exit__   r   zNoOpMgr.__exit__rA   )r   r   r   r   r   r   r4   N)rB   rC   rD   r   r   r7   r7   r7   r8   r      s    
r   fc                    s   t  d fdd}|S )Nrf   r   rg   r4   c            	         s  t  t}|d u r | i |S |dpi }|d|j}|s) | i |S t| d tr6| d j	}nt
| dkrHt| d trH| d }nd}t  jdk}|s]t jtj|tjdnt }|}t|||j|d<  | i |W  d    S 1 s}w   Y  d S )Nr   zsentry-propagate-tracesr   rR   z<unknown Celery task>zcelery-beatopro   rF   )rJ   r[   r\   r/   r   popr1   r]   r(   ro   lenstrr   _name
start_spanr   QUEUE_SUBMIT_CELERYrF   r   r   r2   )	rf   rg   integrationkwarg_headersr1   rn   task_started_from_beatspan_mgrrL   r   r7   r8   apply_async   s:   

$z#_wrap_task_run.<locals>.apply_asyncrf   r   rg   r   r4   r   r   )r   r   r7   r   r8   _wrap_task_run   s   (r   c                    s&   t  tt d fdd}|S )Nrf   r   rg   r4   c               	      sF  t  }d|_|  |tg| R i | d }t ' | d dp'i }t|tj	dt
jtjd}j|_|tj W d    n1 sHw   Y  |d u r_ | i |W  d    S tj|djt| d | d d	id
  | i |W  d    W  d    S 1 sw   Y  W d    d S 1 sw   Y  d S )Nr0      r   zunknown celery task)r   ro   sourcerF   
celery_jobrR      )rP   rf   rg   )custom_sampling_context)r   r   clear_breadcrumbsadd_event_processorrv   r   r   r   r   QUEUE_TASK_CELERYr   TASKr/   rF   ro   rM   r   OKrJ   start_transactionlist)rf   rg   rN   transactionr   r   rP   r7   r8   _inner)  sD   
"z_wrap_tracer.<locals>._innerr   )r   r   r/   rP   r   r   r7   r   r8   _wrap_tracer"  s   'r   r$   c                 C   s   t  > | jj}|r)|d}|ddkr1|dur9|tj| W d   dS W d   dS W d   dS W d   dS 1 sDw   Y  dS )z-Set "messaging.destination.name" tag for spanrouting_keyexchangerz   N)r   rh   delivery_infor   set_datar	   MESSAGING_DESTINATION_NAME)rP   rL   r   r   r7   r7   r8   _set_messaging_destination_nameU  s   
"r   c                    s   t t d fdd}|S )Nrf   r   rg   r4   c                     s  zt jtjjtjd}t| d }t  j	j
d ur.dj	j
v r.t j	j
d }W d    n1 s8w   Y  |d urL|d9 }|tj| t  |tjj	j W d    n1 scw   Y  t  |tjj	j W d    n1 sw   Y  t & j }|tj|jj W d    n1 sw   Y  W d    n1 sw   Y   | i |W  d    W S 1 sw   Y  W d S  ty   t }t  t| W d    n1 sw   Y  t|  Y d S w )Nr   rx   i  )rJ   r   r   QUEUE_PROCESSro   r/   rF   r   r   rh   r   r   r   r   r	   !MESSAGING_MESSAGE_RECEIVE_LATENCYMESSAGING_MESSAGE_IDidMESSAGING_MESSAGE_RETRY_COUNTretriesapp
connectionMESSAGING_SYSTEM	transportdriver_type	ExceptionsysrQ   rd   r   )rf   rg   rL   latencyconnrQ   r   r7   r8   r   j  s\   
	
(%z_wrap_task_call.<locals>._innerr   )r   r/   r   r7   r   r8   _wrap_task_calla  s   	-r   c                     sD   dd l m  m}  | j 										d
 fdd	}|| _d S )Nr   ro   r   rP   rf   rg   r4   c                    s`   t |dds!t|drt|t|jt|_nt||j|_d|_t| | |g|R i |S )N_sentry_is_patchedF__call__T)rs   r)   r   rV   r   runr   r   )ro   rP   rf   rg   original_build_tracerr7   r8   sentry_build_tracer  s   
z0_patch_build_tracer.<locals>.sentry_build_tracer)
ro   r   rP   r   rf   r   rg   r   r4   r   )celery.app.tracer   tracebuild_tracer)r   r   r7   r   r8   r;     s   
r;   c                   C   s   t tjt_d S r5   )r   r(   r   r7   r7   r7   r8   r<     s   r<   c                  C   s   ddl m}  t| j| _d S )Nr   Celery)r0   r   r   	send_taskr   r7   r7   r8   r=     s   r=   c                     s*   ddl m}  | j d	 fdd}|| _d S )
Nr   )Workerrf   r   rg   r4   c                     s   z/ | i |W t   t td ur t  W d    S W d    S 1 s*w   Y  S t   t td urHt  W d    w W d    w 1 sRw   Y  w r5   )r   rJ   r[   r\   r/   flush)rf   rg   original_workloopr7   r8   sentry_workloop  s"   
&
z+_patch_worker_exit.<locals>.sentry_workloopr   )billiard.poolr   workloop)r   r   r7   r   r8   r>     s   
r>   c                     s(   t j tt d	 fdd} | t _d S )
Nr6   r.   rf   r   rg   r4   c           
   	      s  | di }t|tsi }| d}| d}| d}| d}| d}tjtj|tjdU}	|d ur<|		t
j| |dkrK|d urK|		t
j| |d urV|		t
j| t  |		t
j| jjj W d    n1 snw   Y   | g|R i |W  d    S 1 sw   Y  d S )	Nr   rP   r   r   r   r   r   rz   )r   r]   r   rJ   r   r   QUEUE_PUBLISHr/   rF   r   r	   r   r   r   r   r   r   r   r   )
r6   rf   rg   kwargs_headersrn   task_idr   r   r   rL   original_publishr7   r8   sentry_publish  s6   





$z/_patch_producer_publish.<locals>.sentry_publish)r6   r.   rf   r   rg   r   r4   r   )r.   publishr   r/   )r   r7   r   r8   r?     s   
(r?   )rP   r   rQ   r#   r4   Nr5   )rP   r   re   r   rf   r   rg   r   rh   ri   r4   r    )r   r%   r4   r%   )rP   r   r   r%   r4   r%   )rP   r   rL   r$   r4   NrA   )Sr   collections.abcr   	functoolsr   rJ   r   sentry_sdk.apir   sentry_sdk.constsr   r   r	   sentry_sdk.integrationsr
   r   r   #sentry_sdk.integrations.celery.beatr   r   r   $sentry_sdk.integrations.celery.utilsr   sentry_sdk.integrations.loggingr   sentry_sdk.tracingr   r   sentry_sdk.tracing_utilsr   sentry_sdk.utilsr   r   r   r   typingr   r   r   r   r   r   r   sentry_sdk._typesr    r!   r"   r#   r$   r%   r0   r'   r:   celery.app.taskr(   r   r)   celery.exceptionsr*   r+   r,   r-   kombur.   ImportErrorr^   r/   r   rO   rd   rv   rG   r   r   r   r   r   r   r;   r<   r=   r>   r?   r7   r7   r7   r8   <module>   s    
'

 
K

-
3

:


