o
    i                     @   s   d dl Z d dlm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 eeZG dd dZeddde	ed ef dee fddZdeddfddZdS )    N)	lru_cache)Any)Literal)Optional)Union)CONTAINER_ID_HEADER_NAME)ENTITY_ID_HEADER_NAME)!EXTERNAL_ENV_ENVIRONMENT_VARIABLE)EXTERNAL_ENV_HEADER_NAME)
get_loggerc                   @   s   e Zd ZU eed< eed< eed< eed< eed< eed< eed< dZd	Zd
ZdZe	
dZe	
deZe	
deeeZ							dddZdd Zededed  fddZdS )
CGroupInfoidgroupspathcontainer_idcontrollerspod_id
node_inoder   r   r   r   r   r   r   zh[0-9a-f]{8}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{12}|([0-9a-f]{8}(-[0-9a-f]{4}){4}$)z[0-9a-f]{64}z[0-9a-f]{32}-\d+z^(\d+):([^:]*):(.+)$zpod({0})(?:\.slice)?$z!(?:.+)?({0}|{1}|{2})(?:\.scope)?$Nc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S Nr   )selfr   r   r   r   r   r   r    r   V/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/runtime/container.py__init__,   s   

zCGroupInfo.__init__c                 C   s^   t |to.| j|jko.| j|jko.| j|jko.| j|jko.| j|jko.| j|jko.| j|jkS r   )	
isinstancer   r   r   r   r   r   r   r   )r   otherr   r   r   __eq__>   s   







zCGroupInfo.__eq__linereturnc              	   C   s   |  }| j|}|sdS | \}}}dd |dD }dd |dD }d}t|r>| j| }|r>|d}d}	t|rS| j	| }|rS|d}	zt
d| d j}
W n tyr   td	| d}
Y nw | ||||||	|
d
S )a[  
        Parse a new :class:`CGroupInfo` from the provided line

        :param line: A line from a cgroup file (e.g. /proc/self/cgroup) to parse information from
        :type line: str
        :returns: A :class:`CGroupInfo` object with all parsed data, if the line is valid, otherwise `None`
        :rtype: :class:`CGroupInfo` | None

        Nc                 S   s   g | ]
}|  r|  qS r   )strip).0cr   r   r   
<listcomp>`   s    z(CGroupInfo.from_line.<locals>.<listcomp>,c                 S   s   g | ]}|qS r   r   )r    pr   r   r   r"   e   s    /   z/sys/fs/cgroup/z+Failed to stat cgroup node file for path %rr   )r   LINE_REmatchr   splitlenCONTAINER_REpopgroupPOD_REosstatst_ino	Exceptionlogdebug)clsr   r(   id_r   r   r   partsr   r   r   r   r   r   	from_lineJ   s@   

zCGroupInfo.from_line)NNNNNNN)__name__
__module____qualname__r   __annotations__	__slots__UUID_SOURCE_PATTERNCONTAINER_SOURCE_PATTERNTASK_PATTERNrecompiler'   formatr.   r+   r   r   classmethodstrr   r8   r   r   r   r   r      s:   
 

r   @   r   pidr   c              
   C   s   z=t d|  ddd(}|D ]}t|}|r)|js|jr)|  W  d   W S qW d   W dS 1 s6w   Y  W dS  tye } z|jtjkrZtj	d| dd W Y d}~dS W Y d}~dS d}~w t
yv   tj	d	| dd Y dS w )
z
    Helper to fetch the current container id, if we are running in a container.

    We will parse `/proc/{pid}/cgroup` to determine our container id.

    The results of calling this function are cached.
    z/proc/z/cgroupr)modeNz%Failed to open cgroup file for pid %rT)exc_infoz&Failed to parse cgroup file for pid %r)openr   r8   r   r   IOErrorerrnoENOENTr3   r4   r2   )rG   fpr   infoer   r   r   get_container_info   s0   	



rR   headersc                 C   st   t  }|dur'|jr| t|jtd|j i n|jr'| td|j i tjt	}|r8| t
|i dS dS )z_Get the container info (either the container ID or the cgroup inode) and add it to the headers.Nzci-zin-)rR   r   updater   r   r   r/   environgetr	   r
   )rS   container_infoexternal_infor   r   r   update_headers   s(   rY   )r   )rM   	functoolsr   r/   rA   typingr   r   r   r   ddtrace.internal.constantsr   r   r	   r
   ddtrace.internal.loggerr   r9   r3   r   intrR   dictrY   r   r   r   r   <module>   s$    r&