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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	Zd
Ze Zejeej< e	eZedZe Zeeee f ed< ddiZeeef ed< dedejdefddZG dd deZ dedede!eef fddZ"dejdedee dededdfdd Z#defd!d"Z$deeef fd#d$Z%d)d%d&Z&d'd( Z'dS )*    N)Any)Optional)TypeVar)
get_logger)telemetry_writer)TELEMETRY_NAMESPACE)WrappingContextzdd.hookTracerT
_FN_PARAMSfinish_with_ancestors_finish_with_ancestors_API_TO_IMPL_NAMEwrapping_contextinstancefn_namec                 C   s<   |j j d| }|tvrtt| jj t|< t| S )N.)		__class____name__r   listinspect	signature__wrapped__
parameterskeys)r   r   r   key r   ^/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/ddtrace_api/patch.py_params_for_fn   s   r   c                   @   s(   e Zd ZdddZdedefddZdS )	DDTraceAPIWrappingContextBasereturnNc                    sP     d} jjj}t|t||  dfi  fddt ||D  d S )Nselfretvalc                    s    i | ]}|d kr|  |qS r!   )	get_local).0paramr#   r   r   
<dictcomp>,   s     z@DDTraceAPIWrappingContextBase._handle_return.<locals>.<dictcomp>)r$   	__frame__f_codeco_name_call_on_real_instancer   getr   )r!   stubr   r   r#   r   _handle_return%   s   



z,DDTraceAPIWrappingContextBase._handle_returnvaluec                 C   s2   z|    W |S  ty   tjddd Y |S w )zHAlways return the original value no matter what our instrumentation doesz%Error handling instrumentation returnT)exc_info)r.   	Exceptionlogdebug)r!   r/   r   r   r   
__return__/   s   
z(DDTraceAPIWrappingContextBase.__return__)r    N)r   
__module____qualname__r.   r
   r4   r   r   r   r   r   $   s    

r   argskwargsr    c                    s0   dd   fdd| D  fdd|  D fS )zfConvert all ddtrace_api.Span objects in the args/kwargs collections to their held ddtrace.Span objectsc                 S   s   t | tjr
t|  S | S N)
isinstanceddtrace_apiSpan_STUB_TO_REAL)argr   r   r   convert<   s   z&_proxy_span_arguments.<locals>.convertc                    s   g | ]} |qS r   r   )r%   r>   r?   r   r   
<listcomp>?   s    z)_proxy_span_arguments.<locals>.<listcomp>c                    s   i | ]	\}}| |qS r   r   )r%   namekwargr@   r   r   r'   ?   s    z)_proxy_span_arguments.<locals>.<dictcomp>)items)r7   r8   r   r@   r   _proxy_span_arguments9   s   (rE   operand_stubmethod_nameretval_from_apic                 O   s^   t ||\}}tt|  ||i |}|dur|t|< | jj d| }tjtj|dd dS )a  
    Call `method_name` on the real object corresponding to `operand_stub` with `args` and `kwargs` as arguments.

    Store the value that will be returned from the API call we're in the middle of, for the purpose
    of mapping from those Stub objects to their real counterparts.
    Nr      )	namespacerB   r/   )	rE   getattrr=   r   r   r   add_count_metricr   DD_TRACE_API)rF   rG   rH   r7   r8   retval_from_implmetric_namer   r   r   r+   B   s   	r+   c                   C   s   t tddS )N__version__ )rK   r;   r   r   r   r   get_versionT   s   rR   c                   C   s   ddiS )Nr;   *r   r   r   r   r   _supported_versionsX   s   rT   c                 C   s   t tddrd S | d ur| ttj< ttjj  ttjj  ttjj	  ttjj
  ttjj  ttjj  ttjj  ttjj  ttjj	  ttjj  ttjj  ttjj  dt_d S )N__datadog_patchFT)rK   r;   r=   tracerr   r	   
start_spanwraptraceset_tagscurrent_spancurrent_root_spanr<   finishset_exc_infor   set_traceback	__enter____exit__rU   )rV   r   r   r   patch\   s"   

rb   c                   C   s   t tddsd S dt_ttjj  ttjj  ttjj	  ttjj
  ttjj  ttjj  ttjj  ttjj  ttjj	  ttjj  ttjj  ttjj  dt_d S )NrU   F)rK   r;   rU   r   extractr	   rW   unwraprY   rZ   r[   r\   r<   r]   r^   r   r_   r`   ra   r   r   r   r   unpatchr   s    
re   r9   )(r   typingr   r   r   weakrefr;   ddtraceddtrace.internal.loggerr   ddtrace.internal.telemetryr   $ddtrace.internal.telemetry.constantsr   !ddtrace.internal.wrapping.contextr   _DD_HOOK_NAME_TRACER_KEYWeakKeyDictionaryr=   rV   r   r2   r
   dictr   strr   __annotations__r   _Stubr   r   tuplerE   r+   rR   rT   rb   re   r   r   r   r   <module>   sN   
 	

