o
    S۷i3                     @   s  U d dl Z d dlZd dlmZmZmZ d dlmZ d dlmZm	Z	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 d dlmZ d dlmZ d dlmZ eeef Zeeeeef geeef f Zeeef Z ee!e"e#fZ$dZ%dZ&dZ'dZ(g Z)de*d< d(ddZ+eegZ,de*d< de-ddfddZ.G d d! d!Z/d)d&d'Z0dS )*    N)MappingSequenceSet)datetime)AnnotatedValuecapture_internal_exceptiondisable_capture_eventformat_timestamp	safe_reprstrip_string)TYPE_CHECKING)TracebackType)Any)Callable)ContextManager)Dict)List)Optional)Type)Union)NotImplementedTypei@B    
   z<cyclic>zList[ReprProcessor]global_repr_processors	processorReprProcessorreturnc                 C      t |  d S N)r   append)r    r    K/home/ubuntu/vllm_env/lib/python3.10/site-packages/sentry_sdk/serializer.pyadd_global_repr_processor=      r"   z
List[type]sequence_typestyc                 C   r   r   )r$   r   )r%   r    r    r!   add_repr_sequence_typeD   r#   r&   c                   @   sL   e Zd ZdZdddZdd	d
ZdefddZ								dddZdS )Memo_ids_objsr   Nc                 C   s   i | _ g | _d S r   r(   )selfr    r    r!   __init__K   s   
zMemo.__init__objr   ContextManager[bool]c                 C   s   | j | | S r   )r*   r   r+   r-   r    r    r!   memoizeO   s   zMemo.memoizec                 C   s.   | j d }t|| jv rdS || jt|< dS )NTF)r*   idr)   r/   r    r    r!   	__enter__S   s
   
zMemo.__enter__r%   Optional[Type[BaseException]]valueOptional[BaseException]tbOptional[TracebackType]c                 C   s   | j t| j d  d S r   )r)   popr2   r*   )r+   r%   r5   r7   r    r    r!   __exit__[   s   zMemo.__exit__)r   N)r-   r   r   r.   )r%   r4   r5   r6   r7   r8   r   N)	__name__
__module____qualname__	__slots__r,   r0   boolr3   r:   r    r    r    r!   r'   H   s    

r'   eventDict[str, Any]kwargsr   c                    sz  t  g g |dddk
|dd|dd	|dddd	d
tffddd*fdd d+	fddd+fddd+fdd						d,															
		d-fd d!d. fd"d#											$		$	
		d/ 	
fd%d&td' z| fi |}	srt|trd( |d)< |W td S td w )0at  
    A very smart serializer that takes a dict and emits a json-friendly dict.
    Currently used for serializing the final Event and also prematurely while fetching the stack
    local variables for each frame in a stacktrace.

    It works internally with 'databags' which are arbitrary data structures like Mapping, Sequence and Set.
    The algorithm itself is a recursive graph walk down the data structures it encounters.

    It has the following responsibilities:
    * Trimming databags and keeping them within MAX_DATABAG_BREADTH and MAX_DATABAG_DEPTH.
    * Calling safe_repr() on objects appropriately to keep them informative and readable in the final payload.
    * Annotating the payload with the _meta field whenever trimming happens.

    :param max_request_body_size: If set to "always", will never trim request bodies.
    :param max_value_length: The max length to strip strings to, defaults to sentry_sdk.consts.DEFAULT_MAX_VALUE_LENGTH
    :param is_vars: If we're serializing vars early, we want to repr() things that are JSON-serializable to make their type more apparent. For example, it's useful to see the difference between a unicode-string and a bytestring when viewing a stacktrace.
    :param custom_repr: A custom repr function that runs before safe_repr on the object to be serialized. If it returns None or throws internally, we will fallback to safe_repr.

    max_request_body_sizeNalwaysmax_value_lengthis_varsFcustom_reprr5   r   r   c                    s>   zd } d ur | }|pt | W S  ty   t |  Y S w r   )r
   	Exception)r5   
repr_value)rG   r    r!   _safe_repr_wrapper   s   z%serialize.<locals>._safe_repr_wrappermetac                     s   t  t kr5zt  d  } d t|i }W n ty'   i }Y nw  | t  t ks d di |  d S )N   r1    )len
setdefaultstr
IndexErrorr   update)rK   segmentnode)
meta_stackpathr    r!   	_annotate   s   
	zserialize.<locals>._annotateOptional[bool]c                     sr   z.rW dS   } | dv r| W S d }|dkr%d dkr%d  W dS |dkr,W dS W d
S  t y8   Y d	S w )z
        A databag is any value that we need to trim.
        True for stuff like vars, request bodies, breadcrumbs and extra.

        :returns: `True` for "yes", `False` for :"no", `None` for "maybe soon".
        T)TNr   breadcrumbsrL   values   extraNFrQ   )is_request_bodyp0)_is_request_bodyrF   rV   r    r!   _is_databag   s"   zserialize.<locals>._is_databagc                      @   z d dkr d dkrW dS W dS W dS  t y   Y d S w )Nr   spansr[   dataTFr]   r    rV   r    r!   _is_span_attribute      z%serialize.<locals>._is_span_attributec                      rb   )Nr   requestrL   rd   TFr]   r    re   r    r!   r`      rg   z#serialize.<locals>._is_request_bodyr-   
is_databagr^   should_repr_stringsrS   Optional[Segment]remaining_breadthOptional[Union[int, float]]remaining_depthc              	      s  |d ur	 | zzT| E}|r0tW  d    W W |d ur/  td d = S S  | |||||dW  d    W W |d urT  td d = S S 1 sXw   Y  W n= ty   tt  |rY W |d ur  td d = dS dS Y W |d ur  td d = d S d S w W |d ur  td d = d S d S |d urÈ  td d = w )NrL   )ri   r^   rj   rn   rl   z=<failed to serialize, use init(debug=True) to see error logs>)	r   r0   CYCLE_MARKERr9   rN   BaseExceptionr   sysexc_info)r-   ri   r^   rj   rS   rl   rn   result)_serialize_node_implmemorU   rV   r    r!   _serialize_node   s\   	
z"serialize.<locals>._serialize_nodec                    s$   t | tr di | j | j} | S )Nr    )
isinstancer   metadatar5   )r-   )rW   r    r!   _flatten_annotated   s   
z%serialize.<locals>._flatten_annotatedOptional[Union[float, int]]c                    s,  t | trd}|d u r}|d u r }|d u r }|r6|r*r*td}td}n|d u r0t}|d u r6t}| } |d urX|dkrX ddggd |rVt| 	dS d S  }|s_|rztrz
|d}tD ]}|| |}	|	tury|	  S qhtt	| d	d }
| d u st | t
ttfr|st | trt| st| r| S | S t|
r|
| S t | tr|stt| S | S t | tr
t|  } i }d}|  D ]5\}}|d ur||kr t| d
  |S t|}||||||d ur|d nd |d}|||< |d7 }q|S t | tsQt | ttrQg }t| D ]0\}}|d ur6||kr6 t| d
  |S |||||||d urG|d nd |d q|S |rY| } nt | tset | trk| dd} t | tsu| } tdkod dkod dk}|r| S t| 	dS )NFinfr   z!limitx)rem)
max_length)ru   rn   __sentry_repr__)rN   rL   )rS   rj   ri   r^   rn   rl   zutf-8replace   rc   r1   description)rw   r   floatMAX_DATABAG_DEPTHMAX_DATABAG_BREADTHr   r   NotImplementedgetattrtyper?   intmathisinfisnancallabler   rP   r	   r   dictitemsrN   serializable_str_typestupler$   	enumerater   bytes	bytearraydecode)r-   ri   r^   rj   rn   rl   is_span_attributehintsr   rs   sentry_reprrv_dictikvstr_krv_listis_span_description)rW   ry   ra   r`   rf   rJ   rv   rF   keep_request_bodiesrE   ru   rV   r    r!   rt      s   






&z'serialize.<locals>._serialize_node_implTr   _meta)rK   r   r   N)r   rX   )NNNNNN)r-   r   ri   rX   r^   rX   rj   rX   rS   rk   rl   rm   rn   rm   r   r   )r-   r   r   r   )r-   r   ri   rX   r^   rX   rj   rX   rn   rz   rl   rz   r   r   )r'   r9   rP   r   setrw   r   )r@   rB   serialized_eventr    )rW   ry   ra   r`   rf   rJ   rv   rt   rG   rF   r   rE   ru   rU   rV   r!   	serialized   sv   		%$ 
r   )r   r   r   N)r@   rA   rB   r   r   rA   )1rq   r   collections.abcr   r   r   r   sentry_sdk.utilsr   r   r   r	   r
   r   typingr   typesr   r   r   r   r   r   r   r   r   sentry_sdk._typesr   rP   Spanr   r   Segmentr   r   
memoryviewr   MAX_EVENT_BYTESr   r   ro   r   __annotations__r"   r$   r   r&   r'   r   r    r    r    r!   <module>   s>   
  	 
