o
    iw                     @   s  U 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 eeZeG dd dZeG dd dZdedee fddZdedee fddZeddeeddeedddZeeef ed< d d! e  D Z!ed"Z"ed#Z#ed$Z$ed%Z%ed&Z&ed'Z'ed(Z(ed)Z)ed*Z*ed+Z+ed,Z,ed-Z-d8d.d/Z.d0e	ded1ede	fd2d3Z/dee fd4d5Z0deeef fd6d7Z1dS )9    )	dataclassN)Callable)Optional)config)Span)SpanKind)	SpanTypes)http)	COMPONENT)_extract_header_value)_possible_header)tracerc                   @   s   e Zd ZU eed< eed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed	< ee ed
< ee ed< ee ed< dS )ProxyHeaderContextsystem_namerequest_timemethodpathresource_pathdomain_namestage
account_idapi_idregionuser	useragentN)__name__
__module____qualname__str__annotations__r    r    r    R/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/_trace/_inferred_proxy.pyr      s   
 r   c                   @   s<   e Zd ZU eed< eed< dZeeegee f  ed< dS )	ProxyInfo	span_name	componentNresource_arn_builder)	r   r   r   r   r   r%   r   r   r   r    r    r    r!   r"   $   s   
 "r"   proxy_contextreturnc                 C   $   | j r| jrd| j  d| j S d S )Narn:aws:apigateway:z::/restapis/r   r   r&   r    r    r!   _api_gateway_rest_api_arn+      r,   c                 C   r(   )Nr)   z::/apis/r*   r+   r    r    r!   _api_gateway_http_api_arn1   r-   r.   zaws.apigatewayaws-apigatewayzaws.httpapiaws-httpapiz
azure.apim
azure-apim)r/   r0   r1   supported_proxiesc                 C   s   h | ]}|j qS r    )r#   ).0infor    r    r!   	<setcomp>=   s    r5   z
x-dd-proxyzx-dd-proxy-request-time-mszx-dd-proxy-pathzx-dd-proxy-resource-pathzx-dd-proxy-httpmethodzx-dd-proxy-domain-namezx-dd-proxy-stagezx-dd-proxy-account-idzx-dd-proxy-api-idzx-dd-proxy-regionzx-dd-proxy-userz
user-agentc           	         s   |sd S t |}t|}|sd S t|j }|j}|jp|j}|p!d d|p&d }tj|j	|j
p3t |tjdt d t|jd  _t ||  fdd} rg| d  | d	| | d
| d S d S )N  T)serviceresource	span_typeactivatechild_ofi@B c                    s       d S )N)finish)_spanr    r!   finish_callbackn   s   zDcreate_inferred_proxy_span_if_headers_exist.<locals>.finish_callbackinferred_proxy_spaninferred_proxy_finish_callbackheaders)normalize_headersextract_inferred_proxy_contextr2   r   r   r   r   r   
start_spanr#   r   r   _get_servicer   WEBcurrent_trace_contextintr   start_nsset_inferred_proxy_span_tagsset_item)	ctxrD   normalized_headersr&   
proxy_infor   route_or_pathr9   rA   r    r?   r!   +create_inferred_proxy_span_if_headers_existP   s4   
rS   r@   rQ   c                 C   s  |  t|j |  dtj |  tjd|jpd |jpd  |j	r+|  tj
|j	 |jr6|  tj|j |jrA|  tj|j |jrK|  d|j |jrU|  d|j |jr_|  d|j |jri|  d|j |jrs|  d|j |jr||}|r|  d	| | d
d | S )Nz	span.kindzhttps://r6   r   r   apiidr   aws_userdd_resource_keyz_dd.inferred_span   )_set_tag_strr
   r$   r   SERVERr	   URLr   r   r   METHODr   ROUTEr   
USER_AGENTr   r   r   r   r   r%   
set_metric)r@   r&   rQ   resource_arnr    r    r!   rM   w   s2   $
rM   c                 C   s   t t| }t t| }t t| }t t| }t t| }t t| }t t| }t t| }t t	| }	t t
| }
t t| }t t| }|d u rBd S |rH|tv sPtd|  d S t|||||||||	|
||S )Nz\Received headers to create inferred proxy span but headers include an unsupported proxy type)r   POSSIBLE_PROXY_HEADER_SYSTEM#POSSIBLE_PROXY_HEADER_START_TIME_MSPOSSIBLE_PROXY_HEADER_PATH#POSSIBLE_PROXY_HEADER_RESOURCE_PATH POSSIBLE_PROXY_HEADER_HTTPMETHODPOSSIBLE_PROXY_HEADER_DOMAINPOSSIBLE_PROXY_HEADER_STAGE POSSIBLE_PROXY_HEADER_ACCOUNT_IDPOSSIBLE_PROXY_HEADER_API_IDPOSSIBLE_PROXY_HEADER_REGIONPOSSIBLE_PROXY_HEADER_USERHEADER_USERAGENTr2   logdebugr   )rD   proxy_header_systemproxy_header_start_time_msproxy_header_pathproxy_header_resource_pathproxy_header_httpmethodproxy_header_domainproxy_header_stageproxy_header_account_idproxy_header_api_idproxy_header_regionproxy_header_userheader_user_agentr    r    r!   rF      sB   











rF   c                 C   s   dd |   D S )Nc                 S   s   i | ]	\}}|  |qS r    )lower)r3   keyvaluer    r    r!   
<dictcomp>   s    z%normalize_headers.<locals>.<dictcomp>)items)rD   r    r    r!   rE      s   rE   )r'   N)2dataclassesr   loggingtypingr   r   ddtracer   ddtrace._trace.spanr   ddtrace.extr   r   r	   ddtrace.internal.constantsr
   ddtrace.propagation.httpr   r   ddtrace.tracer   	getLoggerr   rl   r   r"   r   r,   r.   r2   dictr   valuesSUPPORTED_PROXY_SPAN_NAMESr`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rS   rM   rF   rE   r    r    r    r!   <module>   sR    



'',