o
    i0                  	   @   sH  d 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 eeZede eej!dddd de"fddZ#de e"e"f fddZ$eddej%dZ&G dd dej'Z(G d d! d!e)Z*dS )"z"
Datadog trace code for cherrypy.
    N)valid_status)config)	ERROR_MSG)ERROR_STACK)
ERROR_TYPE)trace_utils)	SpanTypes)core)SpanDirection)schematize_service_name)schematize_url_operation)DDTraceDeprecationWarning)asbool)	deprecatecherrypyDD_CHERRYPY_DISTRIBUTED_TRACINGTdefault)distributed_tracingreturnc                   C   s   t tddS )N__version__ )getattrr    r   r   [/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/cherrypy/patch.pyget_version&   s   r   c                   C   s   ddiS )Nr   z>=17.0.0r   r   r   r   r   _supported_versions*   s   r   cherrypy.requesthttp)protocol	directionc                   @   sr   e Zd ZdddZedd Zejdd Zedd Zejd	d Zd
d Zdd Z	dd Z
dd Zdd ZdS )	TraceToolNc                 C   s4   || _ || _|d ur|| _tjj| d| jdd d S )Non_start_resource_   priority)appserviceuse_distributed_tracingr   Tool__init___on_start_resource)selfr&   r'   r(   r   r   r   r*   2   s
   zTraceTool.__init__c                 C   s   t jjS N)r   r   r   r,   r   r   r   r(   <   s   z!TraceTool.use_distributed_tracingc                 C      t |tjd< d S )Nr   )r   r   r   )r,   r(   r   r   r   r(   @      c                 C   s   t jddS )Nr'   r   )r   r   getr.   r   r   r   r'   D   s   zTraceTool.servicec                 C   r/   )Nr'   )r   r   r   )r,   r'   r   r   r   r'   H   r0   c                 C   s<   t j|  t jjjd| jdd t jjjd| jdd d S )Non_end_request   r$   after_error_response)r   r)   _setuprequesthooksattach_on_end_request_after_error_responser.   r   r   r   r5   L   s   zTraceTool._setupc                 C   s   t jdttjtjd tjddi tj	j
tjddd	}|j}|d| t d|tjf |tj	_W d    d S 1 s;w   Y  d S )Nr   r   r   T)	span_name	span_typer'   tagsdistributed_headersintegration_configactivate_distributed_headersheaders_case_sensitivereq_spanzweb.request.start)r	   context_with_data	SPAN_NAMEr   WEBr   int_servicer   r   r6   headersspanset_itemdispatch_datadog_span)r,   ctxrB   r   r   r   r+   Q   s"   

"zTraceTool._on_start_resourcec                 C   sz   t tjdd }|std d S d|_|tttj	
 d  |tttj	
 d  |ttj	  | | d S )NrK   zQcherrypy: tracing tool after_error_response hook called, but no active span found   r   )r   r   r6   logwarningerror_set_tag_strr   str_cperror	_exc_infor   r   
format_exc_close_spanr,   rH   r   r   r   r:   d   s   
zTraceTool._after_error_responsec                 C   s.   t tjdd }|std d S | | d S )NrK   zKcherrypy: tracing tool on_end_request hook called, but no active span found)r   r   r6   rN   rO   rV   rW   r   r   r   r9   r   s
   
zTraceTool._on_end_requestc                 C   s   |j tkrdtjjtjj}t||_ ttjjtjj }t	tj
j\}}}td|tjtjj||d tjjtj
jd df
 d tj_d S )Nz{} {}zweb.request.finishT)resourcerD   formatr   r6   method	path_inforR   baser   responsestatusr	   rJ   r   rG   rK   )r,   rH   rX   urlstatus_code_r   r   r   rV   {   s(   

zTraceTool._close_spanr-   )__name__
__module____qualname__r*   propertyr(   setterr'   r5   r+   r:   r9   rV   r   r   r   r   r!   1   s    





	r!   c                   @   s   e Zd ZdddZdS )TraceMiddlewareNr   c                 C   s4   || _ |d urtddtdd t|||| j j_d S )Nz"The tracer parameter is deprecatedz'The global tracer will be used instead.z5.0.0)messagecategoryremoval_version)r&   r   r   r!   toolstracer)r,   r&   rl   r'   r   r   r   r   r*      s   zTraceMiddleware.__init__)Nr   N)rb   rc   rd   r*   r   r   r   r   rg      s    rg   )+__doc__loggingosr   cherrypy.lib.httputilr   ddtracer   ddtrace.constantsr   r   r   ddtrace.contribr   ddtrace.extr   ddtrace.internalr	   ddtrace.internal.schemar
   r   r   #ddtrace.internal.utils.deprecationsr   ddtrace.internal.utils.formatsr   ddtrace.vendor.debtcollectorr   	getLoggerrb   rN   _adddictgetenvrR   r   r   INBOUNDrD   r)   r!   objectrg   r   r   r   r   <module>   s<    
r