o
    ir                     @   s   d dl mZ d dlm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 ed
e  g adefddZdeeef fddZdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    )protobuf)builderN)config)Pinunwrap)tracer   )SchemaExtractorr   returnc                   C   s   t tddS )N__version__ )getattrr    r   r   [/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/protobuf/patch.pyget_version   s   r   c                   C   s   ddiS )Nr   *r   r   r   r   r   _supported_versions   s   r   c                  C   s8   t tddrdS dt_tj} | ddt t t dS )zPatch the instrumented methods_datadog_patchFNTzgoogle.protobuf.internalz&builder.BuildTopDescriptorsAndMessages)	r   r   r   wraptwrap_function_wrapper_traced_buildr   ontor   )_wr   r   r   patch   s   r   c                  C   s>   t tddrdt_ttjjd tD ]} t|  qg ad S d S )Nr   FBuildTopDescriptorsAndMessages)r   r   r   r   internalr   _WRAPPED_MESSAGE_CLASSES_unwrap_message)wrapped_message_classr   r   r   unpatch*   s   
r    c                 C   s   t | d t | d d S )NSerializeToStringParseFromStringr   )message_classr   r   r   r   7   s   
r   c                    sP    fdd} fdd}t j}||d| ||d| t| t | d S )Nc                       t | ||| dS N)msg_descriptor)_traced_serialize_messagewrappedinstanceargskwargsmessage_descriptorr   r   serialize_wrapper=      z(_wrap_message.<locals>.serialize_wrapperc                    r$   r%   )_traced_deserialize_messager(   r-   r   r   deserialize_wrapper@   r0   z*_wrap_message.<locals>.deserialize_wrapperr!   r"   )r   r   r   appendr   r   )r.   r#   r/   r2   r   r   r-   r   _wrap_message<   s   
r4   c                 C   s   |d }t |}|r| s| |i | z7| |i | W tjrJ|d }|j }tt|D ]}|| d }	|| d }
||	 }t	|
|d q1d S d S tjry|d }|j }tt|D ]}|| d }	|| d }
||	 }t	|
|d q`w w )Nr      r	   )r.   r#   )
r   get_fromenabledr   _data_streams_enabledmessage_types_by_nameitemsrangelenr4   )funcr*   r+   r,   file_despingenerated_message_classesmessage_descriptorsmessage_idxmessage_class_namer.   r#   r   r   r   r   O   s4   


r   c                 C   s   t |}|r| s| |i | t }z| |i | W tjr.|r0t||tj	 d S d S d S tjr@|rAt||tj	 w w w N)
r   r6   r7   r   current_spanr   r8   r
   attach_schema_on_spanDESERIALIZATIONr=   r*   r+   r,   r&   r?   activer   r   r   r1   c   s   

r1   c                 C   s   t |}|r| r|s| |i |S t }z| |i |W tjr.|r/t||tj	 S S S tjr>|r?t||tj	 w w w rD   )
r   r6   r7   r   rE   r   r8   r
   rF   SERIALIZATIONrH   r   r   r   r'   q   s   

r'   )googler   google.protobuf.internalr   r   ddtracer   ddtrace._trace.pinr   ddtrace.internal.utils.wrappersr   ddtrace.tracer   schema_iteratorr
   _adddictr   strr   r   r   r    r   r4   r   r1   r'   r   r   r   r   <module>   s,    