o
    i                     @   sj  d dl Z d dlZd dlmZmZ d dlmZmZmZ d dl	m
Z
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 ed	Zzd d
lmZ d dlmZmZ d dlmZ d dl m!Z! W n e"ym   edw d dlm#Z# e#rd dlm$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+ G dd de
Z,d!ddZ-G dd deZ.						d"ddZ/G dd  d Z0dS )#    N)OP
SPANSTATUS)continue_traceget_baggageget_traceparent)IntegrationDidNotEnable)request_body_within_bounds)BAGGAGE_HEADER_NAMESENTRY_TRACE_HEADER_NAMETransactionSource)AnnotatedValuecapture_internal_exceptionsevent_from_exception)TypeVarR)Broker)
Middlewaredefault_middleware)Retry)MessagezDramatiq is not installed)TYPE_CHECKING)AnyCallableDictOptionalUnion)EventHintc                   @   s,   e Zd ZdZdZde ZedddZdS )	DramatiqIntegrationa?  
    Dramatiq integration for Sentry

    Please make sure that you call `sentry_sdk.init` *before* initializing
    your broker, as it monkey patches `Broker.__init__`.

    This integration was originally developed and maintained
    by https://github.com/jacobsvante and later donated to the Sentry
    project.
    dramatiqzauto.queue.returnNc                   C   s
   t   d S N)_patch_dramatiq_broker r$   r$   ]/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/sentry_sdk/integrations/dramatiq.py
setup_once4   s   
zDramatiqIntegration.setup_oncer!   N)__name__
__module____qualname____doc__
identifieroriginstaticmethodr&   r$   r$   r$   r%   r   %   s    
r   r!   c                     s.   t j 								 d	 fdd} | t _d S )
Nselfr   argsr   kwr!   c                    s   t  t}z|d}W n ty&   t|dkr"|d }g }nd }Y nw |d u r5tdd tD }nt|}|d urKdd |D }|	dt
  ||d<  | g|R i | d S )N
middleware   r   c                 s   s    | ]}| V  qd S r"   r$   .0mr$   r$   r%   	<genexpr>N   s    zP_patch_dramatiq_broker.<locals>.sentry_patched_broker__init__.<locals>.<genexpr>c                 S   s   g | ]	}t |ts|qS r$   )
isinstanceSentryMiddlewarer4   r$   r$   r%   
<listcomp>S   s    zQ_patch_dramatiq_broker.<locals>.sentry_patched_broker__init__.<locals>.<listcomp>)
sentry_sdk
get_clientget_integrationr   popKeyErrorlenlistr   insertr9   )r/   r0   r1   integrationr2   original_broker__init__r$   r%   sentry_patched_broker__init__<   s$   
z=_patch_dramatiq_broker.<locals>.sentry_patched_broker__init__)r/   r   r0   r   r1   r   r!   N)r   __init__)rF   r$   rD   r%   r#   9   s   
r#   c                   @   s`   e Zd ZdZdZdddddedd	fd
dZdddZd	d	d										dddZeZ	d	S )r9   z
    A Dramatiq middleware that automatically captures and sends
    exceptions to Sentry.

    This is automatically added to every instantiated broker via the
    DramatiqIntegration.
    _sentry_headersbrokerr   message
Message[R]delayr!   Nc                 C   s6   t  t}|d u rd S tt tt i|j| j	< d S r"   )
r;   r<   r=   r   r
   r   r   r   optionsSENTRY_HEADERS_NAME)r/   rI   rJ   rL   rC   r$   r$   r%   before_enqueueg   s   zSentryMiddleware.before_enqueuec                 C   s   t  t}|d u rd S t  |_|j }|  |d|j	 |
t|| |j| jp2i }d|jv r:i }t||jtjtjtjd}|tj t j||jtjtjd |  d S )Ndramatiq_message_idretries)nameopsourcer-   )rR   rS   rT   )r;   r<   r=   r   isolation_scope_scope_manager	__enter__clear_breadcrumbs	set_extra
message_idadd_event_processor_make_message_event_processorrM   getrN   r   
actor_namer   QUEUE_TASK_DRAMATIQr   TASKr-   
set_statusr   OKstart_transaction)r/   rI   rJ   rC   scopesentry_headerstransactionr$   r$   r%   before_process_messages   s4   


z'SentryMiddleware.before_process_message)result	exceptionrh   Optional[Any]ri   Optional[Exception]c                C   s   t  t}|d u rd S ||j}|jdp|jd}|j}t 	 j
}	|	s+d S |d uo<|o5t|| o<t|t }
|
sO|	d d d  |d d d  d S t|t  jtjddd\}}t j||d |	t||d  |t||d  d S )NthrowsF)typehandled)client_options	mechanism)hint)r;   r<   r=   r   	get_actorr^   rM   r]   rV   get_current_scoperf   r8   r   __exit__r   r,   capture_eventrm   )r/   rI   rJ   rh   ri   rC   actorrl   scope_managerrf   is_event_capture_requiredeventrq   r$   r$   r%   after_process_message   s8   


z&SentryMiddleware.after_process_message)rI   r   rJ   rK   r!   N)
rI   r   rJ   rK   rh   rj   ri   rk   r!   N)
r(   r)   r*   r+   rN   intrO   rg   rz   after_skip_messager$   r$   r$   r%   r9   \   s6    

%
,r9   rJ   rK   rC   (Callable[[Event, Hint], Optional[Event]]c                    s   d	 fdd}|S )
Nry   r   rq   r   r!   Optional[Event]c                    s:   t   t |  W d    | S 1 sw   Y  | S r"   )r   DramatiqMessageExtractorextract_into_event)ry   rq   rJ   r$   r%   inner   s   
z,_make_message_event_processor.<locals>.inner)ry   r   rq   r   r!   r~   r$   )rJ   rC   r   r$   r   r%   r\      s   r\   c                   @   s.   e Zd ZdddZdefddZdddZdS )r   rJ   rK   r!   Nc                 C   s   t | | _d S r"   )dictasdictmessage_data)r/   rJ   r$   r$   r%   rG      s   z!DramatiqMessageExtractor.__init__c                 C   s   t t| jS r"   )r@   jsondumpsr   )r/   r$   r$   r%   content_length   s   z'DramatiqMessageExtractor.content_lengthry   r   c                 C   sb   t  }| s
d S |di }|di }d|d< d }t||  s(t }n| j}||d< d S )Ncontextsr    rm   data)	r;   r<   	is_active
setdefaultr	   r   r   removed_because_over_size_limitr   )r/   ry   clientr   request_infor   r$   r$   r%   r      s   
z+DramatiqMessageExtractor.extract_into_event)rJ   rK   r!   N)ry   r   r!   N)r(   r)   r*   rG   r{   r   r   r$   r$   r$   r%   r      s    
r   r'   )rJ   rK   rC   r   r!   r}   )1r   r;   sentry_sdk.constsr   r   sentry_sdk.apir   r   r   sentry_sdk.integrationsr   r   $sentry_sdk.integrations._wsgi_commonr	   sentry_sdk.tracingr
   r   r   sentry_sdk.utilsr   r   r   typingr   r   dramatiq.brokerr   dramatiq.middlewarer   r   dramatiq.errorsr   dramatiq.messager   ImportErrorr   r   r   r   r   r   sentry_sdk._typesr   r   r   r#   r9   r\   r   r$   r$   r$   r%   <module>   sB    
#f
