o
    i&                     @   sH  d dl Z d dl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 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l0m1Z1 d dl2m3Z4 d dl5m6Z6 d dl5m7Z7 d dl8m9Z: e$e;Z<e=de>e&dddej?d d!d"e1e+d#e+d$dd"e1e+d%dd"oe1e+d&dd"e1e+d&dd"d' d(e@fd)d*ZAe:eA ZBeBe:d+kZCd(e>e@e@f fd,d-ZDd.d/ ZEd0d1 ZFd2d3 ZGd4d5 ZHd6d7 ZIed8d9 ZJdS ):    N)Any)Optional)requests)run_in_threadpool)
Middleware)wrap_function_wrapper)config)Pin)trace_utils)TraceMiddleware)with_traced_module)http)core)BlockingException)
is_wrapted)endpoint_collection)
get_logger)schematize_service_name)
get_config)get_argument_value)get_blocked)set_argument_value)asbool)unwrap)Span)tracer)parse	starlettezstarlette.requestTDD_ASGI_OBFUSCATE_404_RESOURCEF)default#DD_TRACE_WEBSOCKET_MESSAGES_ENABLEDDD_ASGI_TRACE_WEBSOCKET,DD_TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING+DD_TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES)_default_servicerequest_span_namedistributed_tracingobfuscate_404_resourcetrace_asgi_websocket_messages(asgi_websocket_messages_inherit_sampling"websocket_messages_separate_tracesreturnc                   C   s   t tddS )N__version__ )getattrr    r/   r/   \/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/starlette/patch.pyget_version;   s   r1   z0.33.0c                   C   s   ddiS )Nr   z>=0.14.0r/   r/   r/   r/   r0   _supported_versionsC   s   r2   c                 C   sB   | dg }|dtttjd |d|i | |i | d S )N
middlewarer   )integration_config)popinsertr   r   r   r   update)wrappedinstanceargskwargsmwr/   r/   r0   traced_initG   s   r=   c           	      C   s   |r|d nd }|d urEt |dd dd }t|tr|gng }|dd }t|tr.|gng }|dd p7g D ]}tj||d||d q8t||dd	}t	d
t
|f | |i |S )Nr   response_class
media_typestatus_codemethodszfastapi.request)operation_nameresponse_body_typeresponse_code   endpointzservice_entrypoint.patch)r.   get
isinstancestrintr   add_endpointr   r   dispatchinspectr   )	r8   	_instancer:   r;   routerC   rD   mhandlerr/   r/   r0   traced_route_initO   s"   rR   c                   C   s   t tddrd S dt_tddt t t ttjj	j
s$tddt ttjj	js1tddt ttjjjs>tdd	t ttjjjsOtd
dtt d S d S )N_datadog_patchFTzstarlette.applicationszStarlette.__init__zstarlette.routingzRoute.__init__zRoute.handlezMount.handlezstarlette.backgroundzBackgroundTasks.add_task)r.   r   rS   _wr=   r	   ontor   routingRoute__init__rR   handletraced_handlerMount
backgroundBackgroundTasksadd_task_trace_background_tasksr/   r/   r/   r0   patchc   s   r`   c                   C   s   t tddsd S dt_ttjjd ttjjj	r ttjjd ttjj
j	r.ttjj
d ttjjjr>ttjjd d S d S )NrS   FrX   rY   r^   )r.   r   rS   _uapplications	Starletter   rV   rW   rY   r[   r\   r]   r^   r/   r/   r/   r0   unpatchx   s   rd   c                 C   sR  t ||dd}|s| |i |S d|vr td | |i |S d|d vr/|jg|d d< n
|d d |j |d dg }|d dg }t|t|krt|D ]*\}}d||d  }	|drqd		|d |	|_
n|	|_
|dkr|tj|	 qUn0|r|rd|}
|drd		|d |
|d _
n|
|d _
|d tj|
 ntd
|| d}|dg D ]\}}|dkr|jddd} nq|rtjrddlm} |||d tj tj|d d|dt||d tjd tdd t }|r	t|tr"t|dkr"|d tj|d tj | |i |S )Nr   scopedatadogzRdatadog context not present in ASGI request scope, trace middleware may be missingresource_pathsrequest_spansr-   methodz{} {}zTunable to update the request span resource name, request_spans:%r, resource_paths:%rheaderss   cookiezutf-8ignore)errors) _iast_instrument_starlette_scoper   path_params)request_path_paramsrequest_cookiesrO   zasgi.start_request)r   rE   ) r   logwarningpathappendrG   len	enumeratejoinformatresource_set_tag_strr   ROUTEdebugdecode
asm_config_iast_enabledddtrace.appsec._iast._handlersrm   get_tagr
   set_http_metastarlette_requestscookie_parserr   rL   r   r   _STARLETTE_VERSION_LTE_0_33_0set_tagURL)r8   r9   r:   r;   re   rh   rg   indexspanrt   rO   rp   namevaluerm   blockedr/   r/   r0   rZ      sp   




rZ   c                    sf   t ||ddt  t| ddtdd fdd}t||dd|\}}||i | d S )Nr   func__name__z	<unknown>c                     s   t j dd dd7} r| j tr&| i |I d H  ntg| R i |I d H  W d    d S W d    d S 1 sGw   Y  d S )Nz.background_taskT)rz   child_ofactivate)r   
start_span	link_spancontextrM   iscoroutinefunctionr   )r:   r;   r   current_spanmodule_nametask	task_namer/   r0   traced_task   s   
"z,_trace_background_tasks.<locals>.traced_task)r   r   r   r.   r   )modulepinr8   r9   r:   r;   r   r/   r   r0   r_      s   r_   )KrM   ostypingr   r   r   r   r   starlette.concurrencyr   starlette.middlewarer   wraptr   rT   ddtracer   ddtrace._trace.pinr	   ddtrace.contribr
   ddtrace.contrib.asgir   $ddtrace.contrib.internal.trace_utilsr   ddtrace.extr   ddtrace.internalr   ddtrace.internal._exceptionsr   ddtrace.internal.compatr   ddtrace.internal.endpointsr   ddtrace.internal.loggerr   ddtrace.internal.schemar   ddtrace.internal.settings.asmr   ddtrace.internal.telemetryr   _get_configddtrace.internal.utilsr   r   r   ddtrace.internal.utils.formatsr   ddtrace.internal.utils.wrappersr   ra   ddtrace.tracer   r    ddtrace.vendor.packaging.versionr   parse_versionr   rr   _adddictgetenvrI   r1   _STARLETTE_VERSIONr   r2   r=   rR   r`   rd   rZ   r_   r/   r/   r/   r0   <module>   s|    


T