o
    i                     @   sn  d dl 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 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ZejZ ejdk rtdndZ!e dk rd dl"m#Z# ee$Z%dd Z&dd Z'dd Z(dd Z)d d! Z*d0d"d#Z+d$d% Z,d&d' Z-d(d) Z.d*d+ Z/d,d- Z0d.d/ Z1dS )1    N)Iterable)_GetMore)_Query)config)_SPAN_MEASURED_KEY)	SPAN_KIND)trace_utils)SpanKind)	SpanTypes)db)mongo)net)core)	COMPONENT)
get_logger)tracerBatch)      
get_socketcheckout      r   )_unpack_responsec                 C   s
   t | dS )z=Check if operation is a query. Shared between sync and async.spec)hasattr)op r   Z/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/pymongo/utils.pyis_query'   s   
r    c                  C   sT   t jdt tdtjtjd} | 	t
tjj | 	tjtj | 	ttj | S )zACreate a span for socket checkout. Shared between sync and async.zpymongo.N)service	span_type)r   trace_CHECKOUT_FN_NAMEr   ext_servicer   pymongor
   MONGODB_set_tag_strr   integration_namer   SYSTEMmongoxSERVICEr   r	   CLIENT)spanr   r   r   create_checkout_span-   s   r/   c                 C   s   t | |j | td dS )zISet up tags and metrics for checkout span. Shared between sync and async.   N)set_address_tagsaddress
set_metricr   )r.   	sock_infoinstancer   r   r   setup_checkout_span_tags:   s   r6   c                 C   s>   |rt |drt| |j t|rt |drt|j| d |S )zYProcess server operation result and set span tags/metrics. Shared between sync and async.r2   docsr7   r.   )r   r1   r2   r    set_query_rowcountr7   )r.   	operationresultr   r   r   process_server_operation_result@   s   
r<   c                 C   s   |r`t |drt| |j t|r`t |dr`tdkr+t |jdr+t|j | d |S t|jd}tdk rG|	dd	rG| 
tj|	d |S dt  krQdk r`n |S |	dd	}t|| d |S )
z{
    Process server message result and set span tags/metrics in synchronous clients.
    Only used in pymongo < 3.9.0.
    r2   datar   unpack_responser8   )response)r      r   number_returnedN)r   r1   r2   r    VERSIONr=   r9   r>   r   getr3   r   ROWCOUNT)r.   r:   r;   r=   r7   r   r   r   process_server_message_resultJ   s"   

rE   c                 C   s   | du ri S t | trdd | D S t | trCi }|  D ]#\}}|dks)|dkr.d||< qt |ttfr<t|||< qd||< q|S i S )z8Normalize filter queries. Shared between sync and async.Nc                 S   s   g | ]}t |qS r   )normalize_filter).0sr   r   r   
<listcomp>e   s    z$normalize_filter.<locals>.<listcomp>z$inz$nin?)
isinstancelistdictitemsrF   )foutkvr   r   r   rF   `   s   



rF   c                 C   sB   |r|  tj|d  |  tj|d  | tj|d  dS dS )z8Set address tags on span. Shared between sync and async.r   r0   N)r(   netxTARGET_HOSTSERVER_ADDRESSset_tagTARGET_PORT)r.   r2   r   r   r   r1   s   s
   r1   c                 C   sT   |j rt|j }t|}| d| d|j|j|| _dS d|j|j| _dS )z]Set span `mongodb.query` tag and resource given command query. Shared between sync and async.zmongodb.queryz{} {} {}z{} {}N)	queryrF   jsondumpsrV   formatnamecollresource)r.   cmdnqqr   r   r   set_query_metadata{   s   

rb   c              	   C   s   d}t | tr7z$t | ttfst| n| }t|dkr*t |d tr*|d dd}W n ttfy6   Y nw |rRt |trTt	dd |
 D }|tj| dS dS dS )zBSet query row count metric on span. Shared between sync and async.Nr   cursorc                 s   s$    | ]\}}t |v rt|V  qd S N)BATCH_PARTIAL_KEYlen)rG   	batch_key	documentsr   r   r   	<genexpr>   s   " z%set_query_rowcount.<locals>.<genexpr>)rK   r   rL   tuplerf   rM   rC   	TypeError
ValueErrorsumrN   r3   r   rD   )r7   r.   rc   	docs_listrowcountr   r   r   r9      s   
r9   c                 C   s2   t dtj| ||fj}|r|j\} }}| ||fS )zBDispatch DBM (Database Monitoring). Shared between sync and async.zpymongo.execute)r   dispatch_with_resultsr   r&   r;   value)r.   argskwargsr;   r   r   r   dbm_dispatch   s   
rt   c              	   C   s   zet dk rtd |W S | dur|  } t|tr3t|r0d|jvr)d|ji|_t| |j|_|W S t|t	rGt
|drDt|j| |_|W S d}dD ]}||v r\t|| | ||< d}qK|sc| |d< |W S  ttfyy   td	t| Y |S w )
z?Inject DBM comment into command. Shared between sync and async.)r   	   z8DBM propagation not supported for PyMongo versions < 3.9Nz$querycommentF)rv   z$commentTzLinking Database Monitoring profiles to spans is not supported for query type: %s. To disable this feature, set DD_DBM_PROPAGATION_MODE=disabled)rB   logdebugstriprK   r   r    r   dbm_comment_injectorr   r   dbm_merge_commentrv   rk   rl   warningtype)dbm_commentcommandcomment_existscomment_keyr   r   r   rz      s@   




	rz   c                 C   s>   | du r|S t | tr| d | S t | tr| | | S | S )zGMerge DBM comment with existing comment. Shared between sync and async.N,)rK   strrL   append)existing_commentr~   r   r   r   r{      s   


r{   rd   )2rY   typingr   r&   pymongo.messager   r   ddtracer   ddtrace.constantsr   r   ddtrace.contribr   ddtrace.extr	   r
   r   r   r+   r   rS   ddtrace.internalr   ddtrace.internal.constantsr   ddtrace.internal.loggerr   ddtrace.tracer   re   version_tuplerB   r$   pymongo.helpersr   __name__rw   r    r/   r6   r<   rE   rF   r1   rb   r9   rt   rz   r{   r   r   r   r   <module>   sH   


#