o
    i                     @   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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 g dZer^d dlmZ eeZdedefddZG dd deZG dd deZG dd deZG dd deZ eedZ!dS )    N)TYPE_CHECKING)Any)Optional)config)RLock   )BufferedEncoder)
BufferFull)BufferItemTooLarge)ListStringTable)MsgpackEncoderV04)MsgpackEncoderV05ensure_text)
get_logger)AgentlessTraceJSONEncoderr   r   r   MSGPACK_ENCODERS)Spanobjreturnc                 C   s   t | jdddS )zYSerialize to JSON and return UTF-8 bytes (alternative to json.dumps that returns binary).zutf-8backslashreplaceerrors)jsondumpsencoder    r   M/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/encoding.py_json_dumps_bytes"   s   r   c                   @   sj   e Zd ZdZdeed  defddZdeee  deee	f fdd	Z
ed
ddeeef fddZdS )_EncoderBasezQ
    Encoder interface that provides the logic to encode traces and service.
    tracesr   r   c                 C      t  )aT  
        Encodes a list of traces, expecting a list of items where each items
        is a list of spans. Before dumping the string in a serialized format all
        traces are normalized according to the encoding format. The trace
        nesting is not changed.

        :param traces: A list of traces that should be serialized
        NotImplementedError)selfr!   r   r   r   encode_traces-   s   	z_EncoderBase.encode_tracesr   c                 C   r"   )z
        Defines the underlying format used during traces or services encoding.
        This method must be implemented and should only be used by the internal
        functions.
        r#   r%   r   r   r   r   r   8   s   z_EncoderBase.encodespanc                 C   s   | j | j| j| j| j| j| jd}|d}|r"t|t	kr"d|d< | j
r*| j
|d< | jr2| j|d< | jr:| j|d< | jrB| j|d< | jrJ| j|d< | jrWd	d
 | jD |d< | jrgtjrgdd
 | jD |d< |S )N)trace_id	parent_idspan_idserviceresourcenameerrorr/   r   startdurationmetametricstypec                 S   s   g | ]}|  qS r   )to_dict).0linkr   r   r   
<listcomp>c       z._EncoderBase._span_to_dict.<locals>.<listcomp>
span_linksc                 S   s   g | ]}t |qS r   )dict)r6   eventr   r   r   r8   f   r9   span_events)_trace_id_64bitsr*   r+   r,   r-   r.   r/   getr4   boolstart_nsduration_ns_meta_metrics	span_type_links_eventsagent_configtrace_native_span_events)r(   derrr   r   r   _span_to_dict@   s4   





z_EncoderBase._span_to_dictN)__name__
__module____qualname____doc__liststrr&   r   tupleintr   staticmethodr;   rL   r   r   r   r   r    (   s    " r    c                   @   s8   e Zd ZdZdd Zedd Zedd Zdd	 Zd
S )JSONEncoderapplication/jsonc                 C   s   dd |D }|  |d S )Nc                 S      g | ]	}d d |D qS )c                 S   s   g | ]
}t t |qS r   )rV   _normalize_spanrL   r6   r(   r   r   r   r8   p   s    z8JSONEncoder.encode_traces.<locals>.<listcomp>.<listcomp>r   r6   tracer   r   r   r8   o   s    z-JSONEncoder.encode_traces.<locals>.<listcomp>r   r   r%   r!   normalized_tracesr   r   r   r&   n   s   zJSONEncoder.encode_tracesc                 C   s:   t | d | d< t | d | d< t | d | d< | S )Nr-   r.   r,   )rV   _normalize_str)r(   r   r   r   rY   t   s   zJSONEncoder._normalize_spanc                 C   s   | d u r| S t | ddS )Nr   r   r   r   r   r   r   r`   ~   s   zJSONEncoder._normalize_strc                 C   s   t  |t|fS N)r   rV   r   lenr'   r   r   r   r      s   zJSONEncoder.encodeN)	rM   rN   rO   content_typer&   rU   rY   r`   r   r   r   r   r   rV   k   s    
	
rV   c                       sv   e Zd ZdZdZdeed  defddZeddde	ee
f fd	d
Zedee defddZ fddZ  ZS )JSONEncoderV2zD
    JSONEncoderV2 encodes traces to the new intake API format.
    rW   r!   r   r   c                 C   s    dd |D }|  d|id S )Nc                 S   rX   )c                 S   s   g | ]}t |qS r   )rd   _convert_spanrZ   r   r   r   r8      s    z:JSONEncoderV2.encode_traces.<locals>.<listcomp>.<listcomp>r   r[   r   r   r   r8      s    z/JSONEncoderV2.encode_traces.<locals>.<listcomp>r!   r   r]   r^   r   r   r   r&      s   zJSONEncoderV2.encode_tracesr(   c                 C   sT   t | }t |}t |d|d< t |d|d< t |d|d< |S )Nr)   r*   r+   )rd   rL   rY   _encode_id_to_hexr?   )r(   spr   r   r   re      s   

zJSONEncoderV2._convert_spandd_idc                 C   s   | sdS dt |  S )N0000000000000000z%0.16X)rT   )rh   r   r   r   rf      s   zJSONEncoderV2._encode_id_to_hexc                    s$   t  |\}}|t|dg fS )Nr!   )superr   rb   r?   )r%   r   res_	__class__r   r   r      s   zJSONEncoderV2.encode)rM   rN   rO   rP   rc   rQ   rR   r&   rU   r;   r   re   r   rT   rf   r   __classcell__r   r   rm   r   rd      s    rd   c                   @   s   e Zd ZdZdZdededdfddZdefd	d
ZedefddZ	dddZ
deeee ef  fddZdddeeef fddZdS )r   z
    Buffered encoder for the agentless JSON span intake. Buffers traces and
    produces payloads in the {"spans": [...]} format for HTTPWriter.
    rW   max_sizemax_item_sizer   Nc                 C   s$   || _ || _g | _d| _t | _d S Nr   )rp   rq   	_payloads_sizer   _lock)r%   rp   rq   r   r   r   __init__   s
   z"AgentlessTraceJSONEncoder.__init__c                 C   s4   | j  t| jW  d    S 1 sw   Y  d S ra   )ru   rb   rs   r%   r   r   r   __len__   s   $z!AgentlessTraceJSONEncoder.__len__c                 C   s0   | j  | jW  d    S 1 sw   Y  d S ra   )ru   rt   rw   r   r   r   size   s   $zAgentlessTraceJSONEncoder.sizec                 C   s   |sd S | j P g }|D ]}|sd|jd< || | qtd|i}t|}|| jkr1t||| j | j	kr@t
|| j |  j|7  _| j|df W d    d S 1 sZw   Y  d S )N1z_dd.compute_statsspansr   )ru   rC   append_item_to_dictr   rb   rq   r
   rt   rp   r	   rs   )r%   itemr{   r(   encoded	item_sizer   r   r   put   s"   

"zAgentlessTraceJSONEncoder.putc                 C   s@   | j  | j}g | _d| _|W  d    S 1 sw   Y  d S rr   )ru   rs   rt   )r%   payloadsr   r   r   r      s   $z AgentlessTraceJSONEncoder.encoder~   r   c                 C   sh   |j sd|jd< |jrd|jd< t|}|j|d< |d  |d< |d  |d< |d  |d< |S )Nr   _trace_root
_top_levelmeta_structr)   r*   r+   )r*   rD   _is_top_levelrd   re   _meta_structlower)r%   r~   	span_dictr   r   r   r}      s   



z'AgentlessTraceJSONEncoder._item_to_dict)r   N)rM   rN   rO   rP   rc   rT   rv   rx   propertyry   r   rQ   rS   r   bytesr   r;   rR   r   r}   r   r   r   r   r      s    
r   )zv0.4zv0.5)"r   typingr   r   r    ddtrace.internal.settings._agentr   rH   ddtrace.internal.threadsr   	_encodingr   r	   r
   r   r   r   compatr   loggerr   __all__ddtrace._trace.spanr   rM   logobjectr   r   r    rV   rd   r   r   r   r   r   r   <module>   s4    	CG
