o
    i$                     @   s  U d dl mZ d dl m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 ergd dl mZ d dlmZ dZed ed< dZed ed< dZ ed ed< dZ!ed ed< dZ"ed ed< dZ#ed ed< dZ$ed ed < d!Z%ed! ed"< d#Z&ed# ed$< d%Z'ed% ed&< ee(Z)d'd( Z*G d)d* d*e+Z,d+d, Z-d-d. Z.h d/Z/d0d1 Z0d2d3 Z1e0  dS )4    )TYPE_CHECKING)Literal)UnionN)config)core)process_tags)PROPAGATED_HASH)
get_logger)PeerServiceConfig)generate_sql_comment   )compat)
dbm_config)get_argument_value)set_argument_value)Optional)SpanddpsDBM_PARENT_SERVICE_NAME_KEYdddbsDBM_DATABASE_SERVICE_NAME_KEYddhDBM_PEER_HOSTNAME_KEYdddbDBM_PEER_DB_NAME_KEYddprsDBM_PEER_SERVICE_KEYddeDBM_ENVIRONMENT_KEYddpvDBM_VERSION_KEYddshDBM_SERVICE_HASHtraceparentDBM_TRACE_PARENT_KEYz_dd.dbm_trace_injectedDBM_TRACE_INJECTED_TAGc              	   C   sR   zt |tr| jddd| W S | | W S  ttfy(   tdt| Y |S w )Nzutf-8strict)errorszLinking Database Monitoring profiles to spans is not supported for the following query type: %s. To disable this feature please set the following environment variable: DD_DBM_PROPAGATION_MODE=disabled)
isinstancebytesencode	TypeError
ValueErrorlogwarningtype)dbm_commentsql_statement r2   \/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/propagation/_database_monitoring.pydefault_sql_injector(   s   

r4   c                   @   s0   e Zd ZeedddfddZdd Zdd	 Zd
S )_DBM_Propagatorzout.hostdb.namezpeer.servicec                 C   s.   || _ || _|| _|| _|| _|| _|| _d S N)sql_possql_kwcomment_injectorcomment_generatorpeer_hostname_tagpeer_db_name_tagpeer_service_tag)selfr8   r9   r:   r;   r<   r=   r>   r2   r2   r3   __init__9   s   

z_DBM_Propagator.__init__c                 C   s   |j jd u rtj|j | |}|d u r||fS tjr*t	j
 }r*|tt| t||| j| j}| ||}t||| j| j|\}}||fS r7   )contextsampling_priorityddtracetracersample_local_root_get_dbm_commentr   inject_sql_basehashr   	base_hash_set_tag_strr   strr   r8   r9   r:   r   )r?   dbspanargskwargsr0   rI   original_sql_statementsql_with_dbm_tagsr2   r2   r3   injectK   s   
z_DBM_Propagator.injectc                 C   s  t jdkrdS t j}|j}|r!| d}|rt|n|j}t	t
jtt
jtt
jt|i}|| j}|r:||t< || j}|rF||t< || j}|rR||t< t jdkrc|td |jj|t< t jrqtj }	rqt|	|t < | j!di |}
|
r|
" d S dS )	zGenerate DBM trace injection comment and updates span tags
        This method will set the ``_dd.dbm_trace_injected: "true"`` tag
        on ``db_span`` if the configured injection mode is ``"full"``.
        disabledNr6   fulltrue  r2   )#r   propagation_moder
   set_defaults_enabledserviceget_tagsgetr   ensure_textr   	dd_configr   envr    versionr   get_tagr=   r   r<   r   r>   r   rJ   r%   rA   _traceparentr$   rH   r   rI   rK   r"   r;   strip)r?   db_spanpeer_service_enabledservice_name_keydb_namedbm_tagspeer_db_namepeer_hostnamepeer_servicerI   sql_commentr2   r2   r3   rG   `   s<   

z _DBM_Propagator._get_dbm_commentN)__name__
__module____qualname__r4   _generate_sql_commentr@   rQ   rG   r2   r2   r2   r3   r5   8   s    
r5   c                 C   s,   t | dd }|r||||\}}|||fS )N_dbm_propagator)getattrrQ   )
int_configspanrM   rN   dbm_propagatorr2   r2   r3   handle_dbm_injection   s   
ru   c                 C   s"   |j dkrt| |||S |||fS )Nbind_execute_many)rl   ru   )rr   methodrs   rM   rN   r2   r2   r3   handle_dbm_injection_asyncpg   s   

rx   >   dbapi.executemysql.executemysqldb.executepsycopg.executepymongo.executepymysql.executeaiomysql.executedjango-database.executec                  C   s8   t jdv rtD ]	} t| td qtdtd d S d S )N)rS   rY   resultasyncpg.execute)r   rW   _DBM_STANDARD_EVENTSr   onru   rx   eventr2   r2   r3   listen   s
   
r   c                  C   s&   t D ]} t| t qtdt d S )Nr   )r   r   reset_listenersru   rx   r   r2   r2   r3   unlisten   s   r   )2typingr   r   r   rC   r   r]   ddtrace.internalr   r   ddtrace.internal.constantsr   ddtrace.internal.loggerr	   &ddtrace.internal.settings.peer_servicer
   ddtrace.vendor.sqlcommenterr   ro   internalr   &internal.settings._database_monitoringr   internal.utilsr   r   r   ddtrace.tracer   r   __annotations__r   r   r   r   r   r    r"   r$   r%   rl   r-   r4   objectr5   ru   rx   r   r   r   r2   r2   r2   r3   <module>   sJ    Y
