o
    i                     @   s  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 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rd dl(m)Z) dZ*e+de,e!de%d dd ee-Z.de/fd d!Z0de,e/e/f fd"d#Z1d$ej2de,e/e/f fd%d&Z3G d'd( d(ej4Z5ed)d* Z6d+d, Z7ed-d. Z8deddfd/d0Z9d7d1d2Z:deddfd3d4Z;d7d5d6Z<dS )8    )
ModuleType)TYPE_CHECKING)UnionN)config)Pin)_SPAN_MEASURED_KEY)	SPAN_KIND)ext_service)unwrap)wrap)with_traced_module)SpanKind)	SpanTypes)db)net)core)	COMPONENT)
get_logger)schematize_database_operation)schematize_service_name)get_argument_value)_DBM_Propagator)tracer)PreparedStatement
postgresqlasyncpgpostgresquery)_default_service_dbm_propagatorreturnc                   C   s   t tddS )N__version__ )getattrr    r$   r$   Z/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/asyncpg/patch.pyget_version1      r&   c                   C   s   ddiS )Nr   z>=0.23.0r$   r$   r$   r$   r%   _supported_versions5   s   r(   connc              
   C   sX   | j }| j}d }}t|trt|dkr|\}}tj|tj|tj|t	j
|jt	j|jiS )Nr"      )_addr_params
isinstancetuplelenr   TARGET_HOSTTARGET_PORTSERVER_ADDRESSr   USERuserNAMEdatabase)r)   addrparamshostportr$   r$   r%   _get_connection_tags9   s   r;   c                       s,   e Zd Z fddZdd Zdd Z  ZS )_TracedConnectionc                    s>   t t| | t|}t|tj< |j|d}|| j	 d S )Ntags)
superr<   __init__r;   	DBMS_NAMEr   SYSTEMcloneonto	_protocol)selfr)   pinr>   conn_pin	__class__r$   r%   r@   I   s
   
z_TracedConnection.__init__c                 C   s   | | j d S N)rD   rE   )rF   rG   r$   r$   r%   __setddpin__Q   s   z_TracedConnection.__setddpin__c                 C   s   t | jS rK   )r   get_fromrE   )rF   r$   r$   r%   __getddpin__T   r'   z_TracedConnection.__getddpin__)__name__
__module____qualname__r@   rL   rN   __classcell__r$   r$   rI   r%   r<   H   s    r<   c                    s   d|v }t jdtjt|tjd[}|ttjj	 |t
jt |ttj ||i |I dH }|rXt|}	t|	t
j< |j|	d}
|
|j ||	 |W  d   S t||}|t| |W  d   S 1 spw   Y  dS )zgTraced asyncpg.connect().

    connect() is instrumented and patched to return a connection proxy.
    connection_classzpostgres.connect)	span_typeserviceNr=   )r   tracer   SQLr	   r   r   _set_tag_strr   integration_namer   rB   rA   r   r   CLIENTr;   rC   rD   rE   set_tagsr<   )r   rG   funcinstanceargskwargsis_pool_contextspanraw_connconnection_tagsrH   r)   r$   r$   r%   _traced_connectX   s&   


$rd   c              	      s   t jtddd|t| tjtjdI}|t	tjj
 |tjt |ttj |td || j tdtj||||fj}|rK|j\}}}||i |I d H W  d    S 1 s_w   Y  d S )Nzpostgres.queryr   )database_provider)resourcerU   rT      zasyncpg.execute)r   rV   r   r	   r   r   r   rW   rX   r   rY   r   rB   rA   r   r   rZ   
set_metricr   r[   r>   r   dispatch_with_resultsresultvalue)rG   methodr   r^   r_   ra   rj   r$   r$   r%   _traced_query{   s,   

$rm   c                    sD   t ||dd}t|tst|tr|n|j}t|||||I d H S )Nr   state)r   r-   strbytesr   rm   )r   rG   r\   r]   r^   r_   rn   r   r$   r$   r%   _traced_protocol_execute   s   rq   c                 C   s4   t | dt|  dD ]}t | jd| t|  q
d S )Nconnectexecutebind_executer   bind_execute_manyzProtocol.%s)r   rd   protocolrq   r   rl   r$   r$   r%   _patch   s   ry   c                  C   s6   dd l } t| ddrd S t |  t|  d| _d S )Nr   _datadog_patchFT)r   r#   r   rD   ry   rz   r   r$   r$   r%   patch   s   
r|   c                 C   s&   t | d dD ]	}t | jj| qd S )Nrr   rs   )r
   rw   Protocolrx   r$   r$   r%   _unpatch   s   
r~   c                  C   s*   dd l } t| ddsd S t|  d| _d S )Nr   rz   F)r   r#   r~   rz   r{   r$   r$   r%   unpatch   s
   
r   )r    N)=typesr   typingr   r   r   wraptddtracer   ddtrace._trace.pinr   ddtrace.constantsr   r   $ddtrace.contrib.internal.trace_utilsr	   r
   r   *ddtrace.contrib.internal.trace_utils_asyncr   ddtrace.extr   r   r   r   ddtrace.internalr   ddtrace.internal.constantsr   ddtrace.internal.loggerr   ddtrace.internal.schemar   r   ddtrace.internal.utilsr   (ddtrace.propagation._database_monitoringr   ddtrace.tracer   asyncpg.prepared_stmtr   rA   _adddictrO   logro   r&   r(   
Connectionr;   ObjectProxyr<   rd   rm   rq   ry   r|   r~   r   r$   r$   r$   r%   <module>   sb    	
"

