o
    i                     @   s   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dZdd ZG dd deZ dd Z!dd Z"dS )    N)listen)config)Pin)_SPAN_MEASURED_KEY)	SPAN_KIND)SpanKind)	SpanTypes)db)net)sql)	COMPONENT)schematize_database_operation)schematize_service_name)DDTraceDeprecationWarning)tracer)	deprecatec                 C   s&   |durt ddtdd t||  dS )a-  
    Add tracing instrumentation to the given sqlalchemy engine or instance.

    :param sqlalchemy.Engine engine: a SQLAlchemy engine class or instance
    :param ddtrace.trace.Tracer tracer: a tracer instance. will default to the global
    :param str service: the name of the service to trace.
    Nz"The tracer parameter is deprecatedz'The global tracer will be used instead.z5.0.0)messagecategoryremoval_version)r   r   EngineTracer)enginer   service r   ^/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/sqlalchemy/engine.pytrace_engine   s   	r   c                 C   s   | |i |}t d| |S )zTrace the SQLAlchemy engine, creating an `EngineTracer`
    object that will listen to SQLAlchemy events. A PIN object
    is attached to the engine instance so that it can be
    used later.
    N)r   )funcmoduleargskwargsr   r   r   r   _wrap_create_engine*   s   	
r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c                 C   s   || _ t|j| _t|p| j| _td| j | jd| _t| jd}|	| t
|d| j t
|d| j tjd dkr@d}nd	}t
||| j d S )
Nz%s.query)database_provider)r   before_cursor_executeafter_cursor_executer   0handle_errordbapi_error)r   sqlxnormalize_vendornamevendorr   r   r   r   ontor   _before_cur_exec_after_cur_exec
sqlalchemy__version___handle_db_error)selfr   r   pinerror_eventr   r   r   __init__9   s   
zEngineTracer.__init__c                 G   s   t | j}|r| sd S tj| j|jtj	|d}|
ttjj |
ttj |td t||jjs?t|| j| d S d S )N)r   	span_typeresource   )r   get_fromr   enabledr   tracer(   r   r   SQL_set_tag_strr   r   r-   integration_namer   r   CLIENT
set_metricr   _set_tags_from_urlurl_set_tags_from_cursorr)   r0   conncursor	statementr   r1   spanr   r   r   r+   N   s   zEngineTracer._before_cur_execc                 G   s   t | j}|r| sd S t }|sd S z$|r-|jdkr4|tj	|j W |
  d S W |
  d S W |
  d S |
  w )Nr   )r   r7   r   r8   r   current_spanrowcountset_tagr	   ROWCOUNTfinishrB   r   r   r   r,   e   s   zEngineTracer._after_cur_execc                 G   sN   t | j}|r| sd S t }|sd S z|  W |  d S |  w )N)r   r7   r   r8   r   rG   set_tracebackrK   )r0   r   r1   rF   r   r   r   r/   u   s   
zEngineTracer._handle_db_errorN)__name__
__module____qualname__r3   r+   r,   r/   r   r   r   r   r   8   s
    r   c                 C   sb   |j r| tj|j  | tj|j  |jr| tj|j |jr)| t	j
|j t| tjS )z<set connection tags from the url. return true if successful.)hostr;   netxTARGET_HOSTSERVER_ADDRESSportrI   TARGET_PORTdatabaser&   DBboolget_tag)rF   r@   r   r   r   r?      s   r?   c                 C   s   d|krCt |drEt|jdd}|rGt|}| tj|d | tj	|d | tj
|d | tjt|d dS dS dS dS )z>attempt to set db connection tags by introspecting the cursor.postgres
connectiondsnNdbnamerP   rT   )hasattrgetattrr[   r&   parse_pg_dsnr;   rW   getrQ   rR   rS   r>   rU   int)rF   r)   rD   r\   dr   r   r   rA      s   

rA   )NN)#r-   sqlalchemy.eventr   ddtracer   ddtrace._trace.pinr   ddtrace.constantsr   r   ddtrace.extr   r   r	   r
   rQ   r   r&   ddtrace.internal.constantsr   ddtrace.internal.schemar   r   #ddtrace.internal.utils.deprecationsr   ddtrace.tracer   ddtrace.vendor.debtcollectorr   r   r   objectr   r?   rA   r   r   r   r   <module>   s,   
M