o
    0 i                     @   sZ  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 Z-G dd deZ.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 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.c                   C   s
   t   d S N)_patch_dramatiq_broker r#   r#   l/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/sentry_sdk/integrations/dramatiq.py
setup_once4   s   
zDramatiqIntegration.setup_onceN)__name__
__module____qualname____doc__
identifieroriginstaticmethodr%   r#   r#   r#   r$   r   %   s    
r   c                     s   t j  fdd} | t _d S )Nc                    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>P   s    zP_patch_dramatiq_broker.<locals>.sentry_patched_broker__init__.<locals>.<genexpr>c                 S   s   g | ]	}t |ts|qS r#   )
isinstanceSentryMiddlewarer/   r#   r#   r$   
<listcomp>U   s    zQ_patch_dramatiq_broker.<locals>.sentry_patched_broker__init__.<locals>.<listcomp>)
sentry_sdk
get_clientget_integrationr   popKeyErrorlenlistr   insertr4   )selfargskwintegrationr-   Zoriginal_broker__init__r#   r$   sentry_patched_broker__init__?   s$   
z=_patch_dramatiq_broker.<locals>.sentry_patched_broker__init__)r   __init__)rC   r#   rB   r$   r"   ;   s   
r"   c                   @   s4   e Zd ZdZdZdd Zdd Zdddd	d
ZdS )r4   z
    A Dramatiq middleware that automatically captures and sends
    exceptions to Sentry.

    This is automatically added to every instantiated broker via the
    DramatiqIntegration.
    Z_sentry_headersc                 C   s6   t  t}|d u rd S tt tt i|j| j	< d S r!   )
r6   r7   r8   r   r
   r   r   r   optionsSENTRY_HEADERS_NAME)r>   brokermessagedelayrA   r#   r#   r$   before_enqueuei   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 )NZdramatiq_message_idretries)nameopsourcer+   )rL   rM   rN   )r6   r7   r8   r   Zisolation_scope_scope_manager	__enter__Zclear_breadcrumbsZ	set_extraZ
message_idZadd_event_processor_make_message_event_processorrE   getrF   r   
actor_namer   ZQUEUE_TASK_DRAMATIQr   ZTASKr+   Z
set_statusr   OKZstart_transaction)r>   rG   rH   rA   scopeZsentry_headerstransactionr#   r#   r$   before_process_messaget   s4   


z'SentryMiddleware.before_process_messageN)result	exceptionc                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)typeZhandled)Zclient_optionsZ	mechanism)hint)r6   r7   r8   r   Z	get_actorrS   rE   rR   rO   Zget_current_scoperV   r3   r   __exit__r   r*   Zcapture_eventr[   )r>   rG   rH   rX   rY   rA   ZactorrZ   Zscope_managerrV   Zis_event_capture_requiredeventr\   r#   r#   r$   after_process_message   s8   


z&SentryMiddleware.after_process_message)r&   r'   r(   r)   rF   rJ   rW   r_   r#   r#   r#   r$   r4   ^   s    !r4   c                    s    fdd}|S )Nc                    s:   t   t |  W d    | S 1 sw   Y  | S r!   )r   DramatiqMessageExtractorextract_into_event)r^   r\   rH   r#   r$   inner   s   
z,_make_message_event_processor.<locals>.innerr#   )rH   rA   rc   r#   rb   r$   rQ      s   rQ   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r`   c                 C   s   t | | _d S r!   )dictasdictmessage_data)r>   rH   r#   r#   r$   rD      s   z!DramatiqMessageExtractor.__init__c                 C   s   t t| jS r!   )r;   jsondumpsrf   )r>   r#   r#   r$   content_length   s   z'DramatiqMessageExtractor.content_lengthc                 C   sb   t  }| s
d S |di }|di }d|d< d }t||  s(t }n| j}||d< d S )Ncontextsr    r[   data)	r6   r7   	is_active
setdefaultr	   ri   r   Zremoved_because_over_size_limitrf   )r>   r^   clientrj   Zrequest_infork   r#   r#   r$   ra      s   
z+DramatiqMessageExtractor.extract_into_eventN)r&   r'   r(   rD   ri   ra   r#   r#   r#   r$   r`      s    r`   )1rg   r6   Zsentry_sdk.constsr   r   Zsentry_sdk.apir   r   r   Zsentry_sdk.integrationsr   r   Z$sentry_sdk.integrations._wsgi_commonr	   Zsentry_sdk.tracingr
   r   r   Zsentry_sdk.utilsr   r   r   typingr   r   Zdramatiq.brokerr   Zdramatiq.middlewarer   r   Zdramatiq.errorsr   Zdramatiq.messager   ImportErrorr   r   r   r   r   r   Zsentry_sdk._typesr   r   r   r"   r4   rQ   r`   r#   r#   r#   r$   <module>   s6    #^