o
    i                  
   @   s  U 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e$Z%eee	j&Z'ee(d< ej)dej*dej+dej,dej-diZ.e de/e de/ej0 fddZ1ded e2e d!e3e4ef defd"d#Z5e d$e4dee4 fd%d&Z6e d'e4defd(d)Z7d*edefd+d,Z8d*edefd-d.Z9ded e2e d!e3e4ef defd/d0Z:d1eddfd2d3Z;dS )4    N)FunctionType)
ModuleType)Any)Optional)cast)config)Pin)dbapi)_convert_to_string)db)net)sql)
is_wrapted)
get_logger)schematize_service_name)IntegrationConfig)cached)is_wrapped_with)wrap)_DBM_Propagatorconfig_djangoHOSTPORTUSERNAMEcursor_typereturnc                 C   sz   t j}z/| jds| jdkrddlm} |}W |S | jds%| jdkr0ddlm} |}W |S W |S  ty<   Y |S w )Nz	psycopg2.Psycopg2TracedCursorr   )r   zpsycopg.Psycopg3TracedCursor)r   )	r	   TracedCursor
__module__
startswith__name__'ddtrace.contrib.internal.psycopg.cursorr   r   AttributeError)r   traced_cursor_clsr   r    r&   \/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/django/database.pyget_traced_cursor_cls)   s    r(   funcargskwargsc           	      C   s   | |i |}t |jr:|d }t|ddt|ddd}t|j}|r-|j| |S t|d}||j |S |d }t|}|sNt|}|| t	t|dd}t
t|j}||||S )Nr   vendorr   aliasdefaultzdjango.db.vendorzdjango.db.aliastags)r   cursorgetattrr   get_fromr1   updateontoget_conn_pinget_conn_configr(   type)	r)   r*   r+   r2   instancer1   pincfgr%   r&   r&   r'   r2   <   s*   



	

r2   r-   c                 C   s*   t j}|st j}d|| d}t|}|S )z
    Returns the service name for the given database connection.
    If the service name is not set, it will use the default service name
    from the Django configuration.
    z{}{}{}r   )r   database_service_namedatabase_service_name_prefixformatr   )r-   servicedatabase_prefixr&   r&   r'   get_conn_service_named   s   rB   r,   c              	   C   s,   t | }ttjdtjj|tjt	dddS )Nzdjango-databaser   query)_default_service_dbapi_span_name_prefixtrace_fetch_methods_dbm_propagator)
sqlxnormalize_vendorr   r   global_configr   djangorD   rF   r   )r,   prefixr&   r&   r'   r8   s   s   
r8   connc           	   	   C   s   t | dd}t | dd}||d}t | di }t D ](\}}||v rCzt| j|||< W q tyB   t| j|||< Y qw qt|}t	||d}|S )Nr,   r   r-   r.   r/   settings_dictr0   )
r3   DB_CONN_ATTR_BY_TAGitemsr
   rN   get	ExceptionstrrB   r   )	rM   r,   r-   r1   rN   tagattrr@   r;   r&   r&   r'   r7      s"   r7   c                 C   sT   t | jdstd| j | S t| }||  t| jjts(t| jjt d S d S )Nr2   zKConnection class %r does not have a cursor method, skipping instrumentation)	hasattr	__class__logdebugr7   r6   r   r2   r   )rM   r;   r&   r&   r'   
patch_conn   s   
rZ   c                 C   sT   | |i |}zt | W |S  ty)   ttjr&tjd|dd Y |S Y |S w )Nz*Error instrumenting database connection %rT)exc_info)rZ   rR   rX   isEnabledForloggingDEBUGrY   )r)   r*   r+   rM   r&   r&   r'   get_connection   s   
r_   rK   c                 C   s,   t | jjjjtst| jjjjt d S d S )N)r   r   utilsConnectionHandler__getitem__r_   r   )rK   r&   r&   r'   instrument_dbs   s   
rc   )<r]   typesr   r   typingr   r   r   ddtracer   ddtrace._trace.pinr   ddtrace.contribr	   $ddtrace.contrib.internal.trace_utilsr
   ddtrace.extr   r   r   rH   ddtrace.internal.compatr   ddtrace.internal.loggerr   ddtrace.internal.schemar   %ddtrace.internal.settings.integrationr   ddtrace.internal.utils.cacher   ddtrace.internal.wrappingr   r   (ddtrace.propagation._database_monitoringr   r"   rX   rK   r   __annotations__TARGET_HOSTTARGET_PORTSERVER_ADDRESSr   r   rO   r9   r   r(   tupledictrS   r2   rB   r8   r7   rZ   r_   rc   r&   r&   r&   r'   <module>   sP   
 	&(&