o
    iO&                     @   sl  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 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deeddd dade fddZ!dee e f fddZ"dd Z#dd Z$dd Z%dd Z&dd  Z'd!d" Z(d#d$ Z)d%d& Z*d'd( Z+d)d* Z,d+d, Z-d-d. Z.d/d0 Z/d1d2 Z0d3d4 Z1dS )5    N)wrap_function_wrapper)config)Pin)trace_utils)	SpanTypes)core)
get_logger)schematize_service_name)schematize_url_operation)SpanDirection)unwrap)tracersanicT)_default_servicedistributed_tracing)r   r   r   returnc                   C   s   t tddS )N__version__ )getattrr    r   r   X/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/sanic/patch.pyget_version      r   c                   C   s   ddiS )Nr   z	>=20.12.0r   r   r   r   r   _supported_versions   s   r   c                 C   s$   t | j}|r| sd S t S N)r   _findctxenabledr   current_span)requestpinr   r   r   _get_current_span#   s   r!   c                 C   s>   t |dd}t |dd }td| tjd d |d d |d df
 d S )Nstatusi  headersweb.request.finishF)r   r   dispatchr   r   )spanresponsestatus_coderesponse_headersr   r   r   update_span+   s
   r*   c                    s>   t j fdd}t j fdd}t|r||S ||S )Nc                    s$   | |i |}|d }t  | |S Nr   r*   wrappedinstanceargskwargsrr'   r&   r   r   	wrap_sync=   s   
z*_wrap_response_callback.<locals>.wrap_syncc                    s,   | |i |I d H }|d }t  | |S r+   r,   r-   r3   r   r   
wrap_asyncD   s
   
z+_wrap_response_callback.<locals>.wrap_async)wraptfunction_wrapperasyncioiscoroutinefunction)r&   callbackr4   r5   r   r3   r   _wrap_response_callback8   s   
r;   c                    sd   | |i |I d H }t |}|s|S t|| dt  kr"dk r0n |S t|jddr0|  |S )N   	   r   r=      r   __dd_span_call_finishF)r!   r*   SANIC_VERSIONr   r   finish)r.   r/   r0   r1   r'   r&   r   r   r   patch_request_respondQ   s   
rD   c              	   C   s   | j }z| j}W n tjjy   | Y S w | D ]%\}}zt|}W n ty4   tj	ddd Y qw |
|d| d}q|S )zFGet path and replace path parameter values with names if route exists.z0Failed to convert path parameter value to stringT)exc_info<>)path
match_infor   
exceptionsSanicExceptionitemsstr	Exceptionlogdebugreplace)r   rH   rI   keyvaluer   r   r   	_get_pathb   s   
rT   c                    sB   |d }t |}|d urd|jt||_| |i |I d H S )Nr   {} {})r!   formatmethodrT   resource)r.   r/   r0   r1   r   r&   r   r   r   patch_run_request_middlewares   s   rY   c                   C   s   t tddrdS dt_ttttjdatdkr)t	ddt
 t	tjd	t dS t	dd
t tdkrBt	ddt t	tjd	t dS dS )zPatch the instrumented methods.__datadog_patchFNT.r<   r   zSanic.__init__zRequest.respondzSanic.handle_requestr=   r   r   zSanic._run_request_middleware)r   r   rZ   tuplemapintr   splitrB   _wpatch_sanic_initr   rD   patch_handle_requestrY   r   r   r   r   patch|   s   rd   c                   C   sl   t tddsdS tdkrttjd ttjjd nttjd tdkr1ttjd	 ttjjd dt_dS )
z!Unpatch the instrumented methods.rZ   FNr<   __init__respondhandle_requestr\   _run_request_middleware)r   r   rB   _uSanicr   RequestrZ   r   r   r   r   unpatch   s   
rl   c                 C   sB   | |i | | td | td | td | td dS )zHWrapper for creating sanic apps to automatically add our signal handlerszhttp.lifecycle.handlezhttp.routing.afterzhttp.lifecycle.exceptionzhttp.lifecycle.responseN)
add_signalsanic_http_lifecycle_handlesanic_http_routing_aftersanic_http_lifecycle_exceptionsanic_http_lifecycle_response)r.   r/   r0   r1   r   r   r   rb      s
   rb   c           
         s   ddd}||i |\}}}}|j dvr | |i |I dH S t|)}	|dur0t|	||d< |dur;t|	||d< | |fi |I dH W  d   S 1 sPw   Y  dS )z Wrapper for Sanic.handle_requestNc                 [   s   | |||fS r   r   )r   write_callbackstream_callbackr1   r   r   r   r      r   z$patch_handle_request.<locals>.unwrap)httphttpsrr   rs   )NN)scheme_create_sanic_request_spanr;   )
r.   r/   r0   r1   r   r   rr   rs   
new_kwargsr&   r   r   r   rc      s   


$rc   c           	      C   s  t  }|| j tdk rd| jt| }nd}| j }t	j
dtddtjdtjtdtj|i ||tjdddG}|j}|d	| t	d
|tjf | j}dj| j| j| jd}| j}t|trh| }t	d|tj||d||dddf
 |W  d   S 1 sw   Y  dS )zCHelper to create sanic.request span and attach a pin to request.ctxr\   rU   Nzsanic.requestrt   )protocol	directionT)
	span_name	span_typeservicerX   tagsr    distributed_headersintegration_configactivate_distributed_headersheaders_case_sensitivereq_spanzweb.request.startz{scheme}://{host}{path})rv   hostrH   r$   F)r   ontor   rB   rV   rW   rT   r#   copyr   context_with_datar
   r   INBOUNDr   WEBr   int_servicer   r   r&   set_itemr%   rv   r   rH   query_string
isinstancebytesdecode)	r   r    rX   r#   r   r   rW   urlr   r   r   r   rw      sB   

$rw   c                    s   t |  dS )z6Lifecycle signal called when a new request is started.N)rw   )r   r   r   r   rn      s   rn   c                    sZ   t | }|s	dS |j}|dsd|}|jr|j}d| j||_|d|j	 dS )z8Lifecycle signal called after routing has been resolved.N/z/{}rU   zsanic.route.name)
r!   raw_path
startswithrV   regexpatternrW   rX   _set_tag_strname)r   router1   handlerr&   r   r   r   r   ro      s   

ro   c                    s6   t | }|s	dS zt|| W |  dS |  w )zLifecycle signal called when a response is starting.

    Note: This signal does not get called when exceptions occur
          in 21.9.x. The issue was resolved in 21.12.x
    N)r!   r*   rC   )r   r'   r&   r   r   r   rq     s   rq   c                    sv   t | }|s	dS t|drtj|jr&t|}t|dd}|||| dt	  kr0dk r9n dS d| j
_dS dS )z1Lifecycle signal called when an exception occurs.Nr(   __traceback__r<   r?   T)r!   hasattrr   _http_serveris_error_coder(   typer   set_exc_inforB   r   rA   )r   	exceptionr&   ex_typeex_tbr   r   r   rp     s   rp   )2r8   r   r6   r   ra   ddtracer   ddtrace._trace.pinr   ddtrace.contribr   ddtrace.extr   ddtrace.internalr   ddtrace.internal.loggerr   ddtrace.internal.schemar	   r
   -ddtrace.internal.schema.span_attribute_schemar   ddtrace.internal.utils.wrappersr   ri   ddtrace.tracer   __name__rO   _adddictrB   rM   r   r   r!   r*   r;   rD   rT   rY   rd   rl   rb   rc   rw   rn   ro   rq   rp   r   r   r   r   <module>   sF    	
.