o
    i"                     @   s   d dl Z d dlZd dlm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ZedZdZdZedZdZeeZG dd deZ G dd dZ!dS )    N)RotatingFileHandler)Optional)config)_add_file_handler) _configure_ddtrace_native_logger)StructuredJSONFormatter)
get_logger)logger)native_flaretracer_flareztracer_flare.zipz/tracer_flare/v1tracer_flare_file_handlerztracer_flare.lock   c                   @   s   e Zd ZdS )TracerFlareSendErrorN)__name__
__module____qualname__ r   r   P/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/flare/flare.pyr      s    r   c                   @   s   e Zd Zdeefdededee dedef
ddZ	d	ed
ede
jfddZdedefddZde
jfddZdd ZdefddZdedefddZdedefddZde
jfdd Zd!d" ZdS )#FlareNtrace_agent_urlddconfigapi_keytimeout_sec	flare_dirc                 C   sF   t j| _|| _t|| _d | _|| _|| _	|| _
tj| jd| _d S )N)	agent_url)loggingNOTSEToriginal_log_leveltimeoutpathlibPathr   file_handlerurl_api_keyr   r
   TracerFlareManager_native_manager)selfr   r   r   r   r   r   r   r   __init__!   s   zFlare.__init__config_dataproduct_typereturnc              
   C   s^   t |d}z| j||W S  ty. } ztd|| tj	
 W  Y d}~S d}~ww )z4Return the flare action for a remote-config payload.zutf-8z4Error handling remote config data for product %s: %sN)jsondumpsencoder%   handle_remote_config_data	Exceptionlogerrorr
   FlareActionnone_action)r&   r(   r)   json_config_dataer   r   r   r.   2   s   zFlare.handle_remote_config_data	log_levelc              
   C   s   z	| j jdd W n ty$ } ztd| j | W Y d}~dS d}~ww t|ts2td| dS tt|	 d}|du sCt|t
sKtd| dS | j| | |}| | dS )zs
        Update configurations to start sending tracer logs to a file
        to be sent in a flare later.
        T)exist_okz0Flare prepare: failed to create %s directory: %sNFz@Flare prepare: Invalid log level provided: %s (must be a string)z-Flare prepare: Invalid log level provided: %s)r   mkdirr/   r0   r1   
isinstancestrgetattrr   upperintr%   set_current_log_level_setup_flare_logging_generate_config_file)r&   r6   r5   flare_log_level_intpidr   r   r   prepare=   s$   


zFlare.prepareflare_actionc              
   C   s   z>z|  sW W |   dS |   | | W n ty0 } ztd| W Y d}~nd}~ww W |   dS W |   dS |   w )zm
        Revert tracer flare configurations back to original state
        before sending the flare.
        NzError sending tracer flare: %s)is_sendclean_up_filesrevert_configs_send_flare_requestr/   r0   r1   )r&   rD   r5   r   r   r   sendX   s   z
Flare.sendc                 C   s   t d}| jr|| j tdt ntdt || j tj	r>zt
d W n ty8   td Y nw t  d S d S )Nddtracez>ddtrace logs will not be routed to the %s file handler anymorezCould not find %s to removefilez!Native file logger is not enabled)r   r!   removeHandlerr0   debugTRACER_FLARE_FILE_HANDLER_NAMEsetLevelr   r   _trace_writer_nativenative_loggerdisable
ValueErrorr   )r&   ddloggerr   r   r   rG   i   s   
zFlare.revert_configsrB   c              
   C   s   | j d| d }zCt|d3}| jd}|r)dt|d  |dd   | jd< d| ji}tj||d	d
 dd W d    W d S 1 sEw   Y  W d S  tyx } z t	d|| t
j|rmt
| W Y d }~d S W Y d }~d S d }~ww )Ntracer_config_z.jsonw_dd_api_key*   configsc                 S   s   t | dr	|  S | jS )N__repr__)hasattrr\   __dict__)objr   r   r   <lambda>   s    z-Flare._generate_config_file.<locals>.<lambda>)defaultindentzFailed to generate %s: %s)r   openr   getlenr+   dumpr/   r0   warningospathexistsremove)r&   rB   config_filefr   tracer_configsr5   r   r   r   r@   z   s,   "&zFlare._generate_config_filerA   c           	      C   s   t d}t }| jd| d }|j| _| jtjkrtjn| j}t	||}|
| t }t|| |t|d| _tjrW| jd| d }tjdt|d tt| |S )zT
        Setup flare logging configuration.
        Returns the process ID.
        rJ   tracer_python_z.log)	formattertracer_native_rK   )outputri   )r   rh   getpidr   levelr   r   r   CRITICALminrO   r   r   __str__rN   r!   r   rP   rQ   	configurer:   set_log_levelgetLevelName)	r&   rA   rT   rB   flare_file_pathvalid_original_levellogger_leveljson_formatternative_flare_pathr   r   r   r?      s*   

zFlare._setup_flare_loggingflare_log_levelc                 C   s   | j dkrdn| j }t||S )Nr   d   )r   rv   )r&   r   r|   r   r   r   _get_valid_logger_level   s   
zFlare._get_valid_logger_levelc              
   C   s   zt t| jt d  W n
 ty   Y dS w tt	
| jdkr-td dS td z!z| jt| j | W n tyI    w W t	| jt  n	t	| jt  w td|j dS )z6
        Send the flare request to the agent.
        xN   z+Flare directory is empty, not sending flarezSending tracer flarez0Successfully sent the flare to Zendesk ticket %s)r   r    r:   r   TRACER_FLARE_LOCKrc   closeFileExistsErrorre   rh   listdirr0   inforM   r%   zip_and_sendabsoluter/   rk   case_id)r&   rD   r   r   r   rH      s"   "

$zFlare._send_flare_requestc              
   C   sb   | j t  rtd dS z	t| j  W dS  ty0 } ztd| W Y d}~dS d}~ww )z3Clean up the flare directory using Python's shutil.z(Flare lock file exists, skipping cleanupNz)Failed to clean up tracer flare files: %s)	r   r   rj   r0   rM   shutilrmtreer/   rg   )r&   r5   r   r   r   rF      s   
zFlare.clean_up_files)r   r   r   DEFAULT_TIMEOUT_SECONDSTRACER_FLARE_DIRECTORYr:   dictr   r=   r'   r
   r2   r.   boolrC   rI   rG   r@   r?   r   rH   rF   r   r   r   r   r       s0    
%r   )"r+   r   logging.handlersr   rh   r   r   typingr   rJ   r   ddtrace._loggerr   r   %ddtrace.internal.flare.json_formatterr   ddtrace.internal.loggerr   ddtrace.internal.native._nativer	   rQ   r
   r   r    TRACER_FLARE_ZIPTRACER_FLARE_ENDPOINTrN   r   r   r   r0   r/   r   r   r   r   r   r   <module>   s.    

