o
    i                     @   s   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 G dd deZdd Zdd Zdd ZdS )    N)config)	SpanTypes)core)SpanDirection)schematize_service_name)schematize_url_operation)DDTraceDeprecationWarning)tracer)	deprecatec                   @   s0   e Zd Zd
ddZdd Zdd Zddd	ZdS )TraceMiddlewareNc                 C   sH   |d u rt d}|d urtddtdd || _|d ur"|tjd< d S d S )Nfalconz"The tracer parameter is deprecatedz'The global tracer will be used instead.z5.0.0)messagecategoryremoval_versiondistributed_tracing)r   r
   r   servicer   r   )selfr	   r   r    r   ^/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/falcon/middleware.py__init__   s   zTraceMiddleware.__init__c                 C   s   t dd |j D }tjdtddtjdtj	| j
i |tjddd	0}|j}|d| td	|tjf td
|tj|j|jd |j|jd d df
 W d    d S 1 sVw   Y  d S )Nc                 s   s     | ]\}}|  |fV  qd S N)lower).0kvr   r   r   	<genexpr>    s    z2TraceMiddleware.process_request.<locals>.<genexpr>zfalcon.requesthttp)protocol	directionT)	span_name	span_typer   tagsdistributed_headersintegration_configactivate_distributed_headersheaders_case_sensitivereq_spanzweb.request.startweb.request.finishF)dictheadersitemsr   context_with_datar   r   INBOUNDr   WEBr   r   r   spanset_itemdispatchmethodurlquery_string)r   reqrespr)   ctxr&   r   r   r   process_request   s*   
 "zTraceMiddleware.process_requestc                 C   s(   t  }|sd S d|jt|f |_d S )Nz%s %s)r	   current_spanr1   _nameresource)r   r4   r5   r:   paramsr.   r   r   r   process_resource6   s   z TraceMiddleware.process_resourcec           	      C   s   t  }|sd S |jdd }|d u r/d}d|j |_td|tj	d d |d d d d df
 d S t
 d }|d urL|d u rCt||}n	|du rLt||}|jpSd|j }td|tj	d d |d d |j|df
 d S )	N r   404z%s 404r'   TF )r	   r8   status	partitionr1   r:   r   r0   r   r   sysexc_info_detect_and_set_status_error	root_pathuri_template_headers)	r   r4   r5   r:   req_succeededr.   r@   err_typerouter   r   r   process_response<   s&   "
z TraceMiddleware.process_response)NNNr   )__name__
__module____qualname__r   r7   r<   rK   r   r   r   r   r      s
    
r   c                 C   s
   d| j v S )NHTTPNotFound)rL   )rI   r   r   r   _is_404a   s   
rP   c                 C   s$   t | s
|  dS t | rdS dS )zhDetect the HTTP status code from the current stacktrace and
    set the traceback to the given Span
    500r>   N)rP   set_traceback)rI   r.   r   r   r   rD   e   s   rD   c                 C   s   d| j | jjf S )Nz%s.%s)rM   	__class__rL   )rr   r   r   r9   p   s   r9   )rB   ddtracer   ddtrace.extr   ddtrace.internalr   ddtrace.internal.schemar   r   r   #ddtrace.internal.utils.deprecationsr   ddtrace.tracer	   ddtrace.vendor.debtcollectorr
   objectr   rP   rD   r9   r   r   r   r   <module>   s    S