o
    i!                     @   sD  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 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j.Z/e/dkrd d l0m1Z1 d d!l2m3Z3 ne/d"krd d l4m1Z1 d d!l5m3Z3 nd d#l4m6Z1 d d!l5m3Z3 ee7Z8ed$Z9G d%d& d&eZ:d'd( Z;d)d* Z<d+d, Z=d-d. Z>d/d0 Z?d1d2 Z@d3d4 ZAd5d6 ZBd7d8 ZCd9d: ZDe jEd;d< ZFdS )=    N)ObjectProxy)config)_SPAN_MEASURED_KEY)	SPAN_KIND)trace_utils)SpanKind)	SpanTypes)db)mongo)	COMPONENT)
get_logger)schematize_database_operation)schematize_service_name)get_argument_value)unwrap)wrap)tracer   )	parse_msg)parse_query)
parse_spec)create_checkout_span)dbm_dispatch)is_query)process_server_message_result)process_server_operation_result)set_address_tags)set_query_metadata)setup_checkout_span_tags)   	   )
Connection)Serverr      )
SocketInfopymongoc                   @   s   e Zd ZdS )TracedMongoClientN)__name__
__module____qualname__ r+   r+   [/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/pymongo/client.pyr'   ;   s    r'   c                   C   v   t dkrttjt nt dkrttjt nttjt t dkr'ttjt	 nttj
t	 ttjt ttjt dS )z"Patch synchronous pymongo modules.      r/   r    r#   N)VERSION_wr"   run_operation-_trace_server_run_operation_and_with_responserun_operation_with_responsesend_message_with_response(_trace_server_send_message_with_responsecheckouttraced_get_socket
get_socketr!   command_trace_socket_commandwrite_command_trace_socket_write_commandr+   r+   r+   r,   patch_pymongo_sync_modules?      r@   c                   C   r-   )z$Unpatch synchronous pymongo modules.r.   r1   r#   N)r2   _ur"   r4   r5   r6   r7   r8   r9   r:   r;   r!   r<   r=   r>   r?   r+   r+   r+   r,   unpatch_pymongo_sync_modulesP   rA   rC   c                 C   s   d }t | rzt| }W n ty   td Y nw |r tjs"d S tjtdddt	j
td tjd}|ttjj |ttj |td |tj|j |tj|j |tjtj ||j t || |S )Nzerror parsing querypymongo.cmdmongodbdatabase_provider	span_typeservicer   )!r   r   	Exceptionlog	exceptionr   enabledtracer   r   MONGODBr   ext_servicer   r&   _set_tag_strr   integration_namer   r   CLIENT
set_metricr   mongoxDBr	   
COLLECTIONcollSYSTEMSERVICEset_tagstagsr   )	operationwrappedcmdspanr+   r+   r,   datadog_trace_operationa   s.   


rb   c                 C   s   t ||dd}t ||dd}t||}|d u r| |i |S | t|||\}}}| |i |}t|||W  d    S 1 sAw   Y  d S )Nr   self   r^   )r   rb   r   r   funcargskwargsserver_instancer^   ra   resultr+   r+   r,   r5      s   

$r5   c                 C   s~   t ||dd}t ||dd}t||}|d u r| |i |S | | |i |}t|||W  d    S 1 s8w   Y  d S )Nr   rc   r   r^   )r   rb   r   re   r+   r+   r,   r8      s   

$r8   c                 C   s|   t | |dd}t | |dd}t | |dd}d}zt||}W n ty,   td Y nw |r4|r4tjs6dS ||_|||fS )	z
    Parse socket command spec.

    Returns:
        tuple: (socket_instance, dbname, cmd) if parsing succeeds and tracing should proceed
        None: if parsing fails or tracing should be skipped
    r   rc   r   dbnamerd   specNz"error parsing spec. skipping trace)r   r   rK   rL   rM   r   rN   r	   )rg   rh   socket_instancerk   rl   r`   r+   r+   r,   parse_socket_command_spec   s   
rn   c                 C   s|   t ||}|d u r| |i |S |\}}}t|||j}t|||\}}}| |i |W  d    S 1 s7w   Y  d S )N)rn   	trace_cmdaddressr   )rf   rg   rh   parsedrm   rk   r`   sr+   r+   r,   r=      s   

$r=   c                 C   s`   t | |dd}t | |dd}d}zt|}W n ty$   td Y nw |r*tjs,dS ||fS )z
    Parse socket write command msg.

    Returns:
        tuple: (socket_instance, cmd) if parsing succeeds and tracing should proceed
        None: if parsing fails or tracing should be skipped
    r   rc   rd   msgNzerror parsing msg)r   r   rK   rL   rM   r   rN   )rg   rh   rm   rs   r`   r+   r+   r,   parse_socket_write_command_msg   s   
rt   c                 C   s   t ||}|d u r| |i |S |\}}t|||j}| |i |}|r0|tj|dd |W  d    S 1 s<w   Y  d S )Nn)rt   ro   rp   rU   r	   ROWCOUNTget)rf   rg   rh   rq   rm   r`   rr   rj   r+   r+   r,   r?      s   
$r?   c                 C   s   t jtdddtjtd tjd}|	t
tjj |	tjtj |	ttj |td | jr:|	tj| j | rP|tj| j || j || j t||  |r\t|| |S )NrD   rE   rF   rH   r   )r   rO   r   r   rP   r   rQ   r   r&   rR   r   rS   r	   rZ   rV   r[   r   r   rT   rU   r   rW   set_tagrX   rY   r\   r]   set_metricsmetricsr   r   )r`   rm   rp   rr   r+   r+   r,   ro      s&   


ro   c              	   c   s    t ||dd}tjs'| |i |}|V  	 W d    d S 1 s"w   Y  t 1}| |i |}t||| |V  W d    n1 sFw   Y  W d    d S W d    d S 1 s^w   Y  d S )Nr   rc   )r   r   rN   r   r   )rf   rg   rh   instance	sock_infora   r+   r+   r,   r:      s    "r:   )G
contextlibr&   wraptr   ddtracer   ddtrace.constantsr   r   ddtrace.contribr   ddtrace.extr   r   r	   r
   rV   ddtrace.internal.constantsr   ddtrace.internal.loggerr   ddtrace.internal.schemar   r   ddtrace.internal.utilsr   ddtrace.internal.wrappingr   rB   r   r3   ddtrace.tracer   parser   r   r   utilsr   r   r   r   r   r   r   r   version_tupler2   pymongo.synchronous.poolr!   pymongo.synchronous.serverr"   pymongo.poolpymongo.serverr%   r(   rL   _DEFAULT_SERVICEr'   r@   rC   rb   r5   r8   rn   r=   rt   r?   ro   contextmanagerr:   r+   r+   r+   r,   <module>   sl   %