o
    i                     @   s  d dl Z d dlZd dl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 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'da(dd Z)dd Z*dd Z+e	,de-eddddej.dddededdededeed ddoeed!ddeed!ddd" d#e/fd$d%Z0d#e-e/e/f fd&d'Z1d(d) Z2d*d+ Z3d,d- Z4d.d/ Z5dS )0    N)wrap_function_wrapper)config)Pin)TraceMiddleware)_trace_background_tasks)traced_handler)traced_route_init)
is_wrapted)
get_logger)schematize_service_name)
get_config)asbool)parse_version)unwrap)tracerFc                 C   s   | S )zGIdentity function for pickle reconstruction - returns unwrapped object. )xr   r   Z/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/fastapi/patch.py	_identity    s   r   c                 C   s   t | jffS )zPickle reducer for wrapt proxies.

    Returns (callable, args) tuple for pickle reconstruction.
    Using _identity(proxy.__wrapped__) strips the wrapper.
    )r   __wrapped__)proxyr   r   r   _reduce_wrapt_proxy%   s   r   c                  C   sT   t rdS ttjtdk rda dS tjtjtjfD ]} | tj	vr%t
tj	| < qda dS )zRegister pickle reducers for wrapt proxy types.

    Must be called before FastAPI app is pickled (e.g., by Ray Serve/vLLM).
    Nz0.24.0T)_WRAPT_REDUCERS_REGISTEREDr   	starlette__version__wraptObjectProxyFunctionWrapperBoundFunctionWrappercopyregdispatch_tabler   )clsr   r   r   _register_wrapt_pickle_reducers.   s   

r"   fastapizfastapi.requestTDD_ASGI_OBFUSCATE_404_RESOURCE)default#DD_TRACE_WEBSOCKET_MESSAGES_ENABLEDDD_ASGI_TRACE_WEBSOCKET)r%   modifier,DD_TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING+DD_TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES)_default_servicerequest_span_namedistributed_tracingtrace_query_stringobfuscate_404_resourcetrace_asgi_websocket_messages(asgi_websocket_messages_inherit_sampling"websocket_messages_separate_tracesreturnc                   C   s   t tddS )Nr    )getattrr#   r   r   r   r   get_version[   s   r6   c                   C   s   ddiS )Nr#   z>=0.64.0r   r   r   r   r   _supported_versions_   s   r7   c                 C   s   t | |i |tjdS )N)appintegration_config)r   r   r#   )wrappedinstanceargskwargsr   r   r   wrap_middleware_stackc   s   r>   c                    sn   t t}|r| s| |i |I dH S td | |i |I dH W  d   S 1 s0w   Y  dS )a<  Wrapper for fastapi.routing.serialize_response function.

    This function is called on all non-Response objects to
    convert them to a serializable form.

    This is the wrapper which calls ``jsonable_encoder``.

    This function does not do the actual encoding from
    obj -> json string  (e.g. json.dumps()). That is handled
    by the Response.render function.

    DEV: We do not wrap ``jsonable_encoder`` because it calls
    itself recursively, so there is a chance the overhead
    added by creating spans will be higher than desired for
    the result.
    Nzfastapi.serialize_response)r   get_fromr#   enabledr   trace)r:   r;   r<   r=   pinr   r   r   traced_serialize_responseg   s   
$rC   c                  C   s   t tddrd S t  dt_t t tddt tddt t	tj
js.tdd	tt t	tjjjs;tdd
t t	tjjjsHtddt t	tjjjsUtddt tjrcddlm}  |   d S d S )N_datadog_patchFTzfastapi.applicationszFastAPI.build_middleware_stackzfastapi.routingserialize_responser#   zBackgroundTasks.add_taskzAPIRoute.__init__zAPIRoute.handlezstarlette.routingzMount.handler   _on_iast_fastapi_patch)r5   r#   r"   rD   r   onto_wr>   rC   r	   BackgroundTasksadd_taskr   routingAPIRoute__init__r   handler   Mount
asm_config_iast_enabledddtrace.appsec._iast._handlersrG   rF   r   r   r   patch   s&   
rT   c                   C   s   t tddsd S dt_ttjjd ttjd ttjjj	r&ttjjd ttjj
j	r4ttjj
d ttjjrBttjd d S d S )NrD   Fbuild_middleware_stackrE   rO   rK   )r5   r#   rD   _uapplicationsFastAPIrL   r	   rM   rO   rP   rJ   rK   r   r   r   r   unpatch   s   rY   )6r   osr#   fastapi.routingr   r   r   rI   ddtracer   ddtrace._trace.pinr   (ddtrace.contrib.internal.asgi.middlewarer   (ddtrace.contrib.internal.starlette.patchr   r   r   ddtrace.internal.compatr	   ddtrace.internal.loggerr
   ddtrace.internal.schemar   ddtrace.internal.settings.asmrQ   ddtrace.internal.telemetryr   _get_configddtrace.internal.utils.formatsr   ddtrace.internal.utils.versionr   ddtrace.internal.utils.wrappersr   rV   ddtrace.tracer   __name__logr   r   r   r"   _adddictgetenvstrr6   r7   r>   rC   rT   rY   r   r   r   r   <module>   sn    	

