o
    iH*                  
   @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlZd dl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 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#Z$G dd de%Z&G dd de j'Z(G dd de j'Z)de
dede*e+ef fddZ,d e*e+ef ddfd!d"Z-d#e+d$ed%ee+ de*e+ef fd&d'Z.G d(d) d)Z/G d*d+ d+e(Z0G d,d- d-e0Z1G d.d/ d/e)Z2dS )0    N)	dataclass)heapify)heappop)heappush)Thread)	FrameType)Any)Callable)Iterator)Optional)Union)	di_config)	LogSignal)Snapshot)process_tags)
BufferFull)
get_logger)RLock)format_trace_idc                   @   sN   e Zd Zddee ddfddZdedefddZdd	d
Zde	fddZ
dS )
JsonBufferNmax_sizereturnc                 C   s   || _ |   d S N)r   _reset)selfr    r   O/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/debugging/_encoding.py__init__   s   zJsonBuffer.__init__itemc                 C   s   | j r|   t|}| jd ur| j| | jkrt| j|| jdkr1|  jd7  _|  jd7  _|  j|7  _|  j|7  _|S )N         ,)_flushedr   lenr   sizer   _buffer)r   r   r$   r   r   r   put"   s   
zJsonBuffer.putc                 C   s   d| _ td| _d| _d S )Nr      [F)r$   	bytearrayr%   r"   r   r   r   r   r   1   s   

zJsonBuffer._resetc                 C   s&   |  j d7  _ z| j W d| _S d| _w )N   ]T)r%   r"   r)   r   r   r   flush6   s   zJsonBuffer.flushr   r   N)__name__
__module____qualname__r   intr   bytesr&   r   r(   r+   r   r   r   r   r      s
    
r   c                   @   s$   e Zd ZejdedefddZdS )Encoderr   r   c                 C      dS )zEncode the given snapshot.Nr   r   r   r   r   r   encode?       zEncoder.encodeN)r-   r.   r/   abcabstractmethodr   r1   r5   r   r   r   r   r2   >   s    r2   c                   @   sP   e Zd ZdZejdedefddZejde	e
eeef ef  fddZdS )	BufferedEncoderr   r   r   c                 C   r3   )z4Enqueue the given item and returns its encoded size.Nr   r4   r   r   r   r&   G   r6   zBufferedEncoder.putc                 C   r3   )z-Flush the buffer and return the encoded data.Nr   r)   r   r   r   r+   K   r6   zBufferedEncoder.flushN)r-   r.   r/   countr7   r8   r   r0   r&   r   tupler   r1   r(   r+   r   r   r   r   r9   D   s    (r9   threadframer   c                 C   s*   |j }|j|jd| jt f | jddS )Nz	%s;pid:%dr   )namemethodthread_name	thread_idversion)f_codeco_filenameco_namer>   osgetpidident)r<   r=   coder   r   r   _logs_track_logger_detailsP   s   rJ   payloadc                 C   s"   t jst jrt j| d< d S d S d S )Nddtags)r   _tags_in_qstags)rK   r   r   r   add_tags\   s   rO   servicesignalhostc              	   C   s   |j }| d|ji|t|j|jd|jt|jd d}tj }r$||d< |d ur:|j	d ur:t
|j	t|jd|d< t| |S )Nsnapshotdd_debuggerg     @@)rP   debuggerrR   loggerddsourcemessage	timestampr   )trace_idspan_iddd)trace_contextrS   rJ   r<   r=   rX   r0   rY   r   rZ   r   strr[   rO   )rP   rQ   rR   contextrK   p_tagsr   r   r   _build_log_track_payloada   s"   


ra   c                   @   s   e Zd ZeG dd dZdeddfddZded	edefd
dZ	ded	edefddZ
ded	edefddZded	edefddZded	edefddZded	edefddZdddZeded fddZdS )JSONTreec                   @   s   e Zd ZU eed< eed< eed< ed  ed< ed  ed< dZeed< dZe	ed	< dZ
e	ed
< edee	ee	ef fddZdefddZdede	fddZeded  fddZdS )JSONTree.Nodestartendlevelparentchildrenr   prunedFnot_captured_depthnot_capturedr   c                 C   s   | j | j| jt| fS r   )rj   rf   rk   r#   r)   r   r   r   key   s   zJSONTree.Node.keyc                 C   s   | j | j S r   )re   rd   r)   r   r   r   __len__   s   zJSONTree.Node.__len__otherc                 C   s   | j |j kS r   rl   )r   rn   r   r   r   __lt__   s   zJSONTree.Node.__lt__c                 c   s8    | j s	| V  d S | j d d d D ]}|jE d H  qd S )N)rh   leaves)r   childr   r   r   rr      s   
zJSONTree.Node.leavesN)r-   r.   r/   r0   __annotations__r   listri   rj   boolrk   propertyr;   rl   rm   r   rp   r
   rr   r   r   r   r   Node   s   
 rx   datar   Nc                 C   s>   t || _g | _d | _d| _d | _| j| _| j| _	| 
  d S )Nr   )	enumerate_iter_stackrootrf   _string_iter_object_state_not_captured_on_string_match_parse)r   ry   r   r   r   r      s   
zJSONTree.__init__icc                 C      d| j d _| jS NTrq   )r|   rj   r   r   r   r   r   r   r   _depth_string      zJSONTree._depth_stringc                 C   s4   |dkrt d| _| j| _| jS |dvr| jS | jS )N"depthz :
	)iterr~   r   r   _stringr   r   r   r   r   r   r      s   
zJSONTree._not_capturedc                 C   r   r   )r|   rk   r   r   r   r   r   _not_captured_string   r   zJSONTree._not_captured_stringc                 C      | j S r   )r   r   r   r   r   _escape   s   zJSONTree._escapec                 C   sl   |dkr| j d urt| j d d u r| ||S | jS |dkr$d | _ | jS | j d ur4|t| j d kr4d | _ d S )Nr   \)r~   nextr   r   r   r   r   r   r   r      s   
zJSONTree._stringc                 C   s   |dkr| j  }|d |_|  jd8  _| j s|| _d S |dkr-td| _| j| _| j	S |dkrX| 
|d| jd g }|  jd7  _| j rR| j d |_|jj| | j | d S )N}r    r   notCapturedReason{r   rq   )r|   popre   rf   r}   r   r~   r   r   r   rx   rg   rh   append)r   r   r   or   r   r   r      s&   


zJSONTree._objectc                 C   s8   | j D ]\}}| ||p| j| _| jd ur d S qd S r   )r{   r   r}   r   r   r   r   r      s   
zJSONTree._parserc   c                 C   s   | j d urt| j jS g S r   )r}   ru   rr   r)   r   r   r   rr      s   zJSONTree.leavesr,   )r-   r.   r/   r   rx   r^   r   r0   r   r   r   r   r   r   r   r   rw   ru   rr   r   r   r   r   rb      s    
rb   c                   @   sT   e Zd ZdZdZddedee ddfddZd	edefd
dZ	d	ede
fddZdS )LogSignalJsonEncoderi    NrP   rR   r   c                 C   s   || _ || _d S r   )_service_host)r   rP   rR   r   r   r   r      s   
zLogSignalJsonEncoder.__init__r   c                 C   s   t t| j|| jS r   )jsondumpsra   r   r   r4   r   r   r   _encode     zLogSignalJsonEncoder._encodec                 C   s   |  |dS Nzutf-8)r   r5   r4   r   r   r   r5     s   zLogSignalJsonEncoder.encoder   )r-   r.   r/   MAX_SIGNAL_SIZE	MIN_LEVELr^   r   r   r   r   r1   r5   r   r   r   r   r      s    r   c                   @   s4   e Zd ZdZdedefddZdedefddZd	S )
SnapshotJsonEncoderzHEncoder for snapshot signals, with automatic pruning of large snapshots.r   r   c                 C   s   |  | |dS r   )ri   r   r5   r4   r   r   r   r5     r   zSnapshotJsonEncoder.encodelog_signal_jsonc                    s  t | jkr	|S d}t |}t|}|jd u r|S t |j j }i d}} fdd|jD }t| |rt|}	|	||	j< |t |	| 7 }||krMn6|	j}
|
d u rUq5|
 j	d7  _	|
j	t |
j
krd |
_|
_t||
 |
j
D ]}||j= |t || 8 }qr|s7t| dd d	}|d |d j g}t||dd  D ]\}}|| |||j|j  q|| |||d
 jd   d|S )Nz{"pruned":true}r   c                    s   g | ]
}|j  jkr|qS r   )rf   r   ).0_r)   r   r   
<listcomp>  s    z.SnapshotJsonEncoder.pruned.<locals>.<listcomp>r    Tc                 S   r   r   )rd   )nr   r   r   <lambda>4  s    z,SnapshotJsonEncoder.pruned.<locals>.<lambda>ro   rq    )r#   r   rb   r}   rr   r   r   rd   rg   ri   rh   rj   rk   r   sortedvalueszipr   re   join)r   r   PRUNED_PROPERTY
PRUNED_LENtreedeltanodessrr   leafrg   r   pruned_nodessegmentsr   mr   r)   r   ri     sH   







zSnapshotJsonEncoder.prunedN)	r-   r.   r/   __doc__r   r1   r5   r^   ri   r   r   r   r   r   	  s    r   c                
   @   s   e Zd Z		ddededeeeegdf  ddfddZ	d	e
defd
dZd	e
dedefddZdeeeeef ef  fddZdefddZdS )SignalQueue  @ Nencoderbuffer_sizeon_fullr   c                 C   s<   || _ t|| _t | _|| _d| _|| jj | _d| _	d S Nr   F)
_encoderr   r%   r   _lock_on_fullr:   r$   r   _full)r   r   r   r   r   r   r   r   A  s   

zSignalQueue.__init__r   c                 C   s   |  || j|S r   )put_encodedr   r5   r4   r   r   r   r&   O  s   zSignalQueue.putencodedc              	   C   sx   | j / z| j|}|  jd7  _|W W  d    S  ty1   d| _| jd ur0| ||  w 1 s5w   Y  d S )Nr    T)r   r%   r&   r:   r   r   r   )r   r   r   r$   r   r   r   r   R  s   
zSignalQueue.put_encodedc                 C   st   | j - | jdkr| j  	 W d    d S | j }| j}d| _d| _||fW  d    S 1 s3w   Y  d S r   )r   r:   r%   r   r+   r   )r   r   r:   r   r   r   r+   ^  s   


$zSignalQueue.flushc                 C   s0   | j  | jW  d    S 1 sw   Y  d S r   )r   r   r)   r   r   r   is_fullk  s   $zSignalQueue.is_full)r   N)r-   r.   r/   r2   r0   r   r	   r   r1   r   r   r&   r   r;   r   r(   r+   rv   r   r   r   r   r   r   @  s     
"r   )3r7   dataclassesr   heapqr   r   r   r   rF   	threadingr   typesr   typingr   r	   r
   r   r   ddtrace.debugging._configr   ddtrace.debugging._signal.logr   "ddtrace.debugging._signal.snapshotr   ddtrace.internalr   ddtrace.internal._encodingr   ddtrace.internal.loggerr   ddtrace.internal.threadsr   ddtrace.internal.utils.formatsr   r-   logobjectr   ABCr2   r9   dictr^   rJ   rO   ra   rb   r   r   r   r   r   r   r   <module>   sR    !

 y7