o
    i[                     @   s   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 eeZdZG dd dZdededeje
 ddfddZG dd deZG dd deZdS )    )datetimeN)Callable)Optional)Flare)
get_logger)Payload)
RCCallback)PublisherSubscriberConnector)RemoteConfigSubscriber   c                   @   s   e Zd ZdZdddZdS )TracerFlareStatez:Shared state between the callback and stale check service.returnNc                 C   s
   d | _ d S N)current_request_startself r   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/flare/_subscribers.py__init__   s   
zTracerFlareState.__init__r   N)__name__
__module____qualname____doc__r   r   r   r   r   r      s    r   flarestatepayloadsr   c           	      C   st  |D ]}|j d u rtd q|j j}t|jtr|jn|jg}|D ]}t|ts4tdtt	| q"| 
||}| rj|jd urMtdt|j q"td |j}|d u r_td q"| |rit |_q"| r|jd u rtd | drt |_ntd q"td	 |   | | d |_q"| rtd
 |   |   d |_q"td| q"qd S )Nz$No metadata for tracer flare payloadzCConfig item is not type dict, received type %s instead. Skipping...zHThere is already a tracer flare job started at %s. Skipping new request.zPreparing tracer flarez+Received set flare action without log levelzCStarting tracer flare job for AGENT_TASK without prior AGENT_CONFIGDEBUGz5Failed to prepare tracer flare. Skipping new request.z#Generating and sending tracer flarezIReverting tracer flare configurations and cleaning up any generated filesz5Received unexpected product type for tracer flare: %s)metadatalogdebugproduct_name
isinstancecontentlistdictstrtypehandle_remote_config_datais_setr   warninginfolevelpreparer   nowis_sendrevert_configssendis_unsetclean_up_files)	r   r   r   payloadproduct_typeitemsitemflare_action	log_levelr   r   r   _process_payloads   sZ   














r:   c                   @   sp   e Zd ZdZefdeeeegdf dede	de
ddf
dd	Zdefd
dZdddZdeje ddfddZdS )TracerFlareCallbackzRemote config callback for tracer flare requests.

    The periodic() method performs stale flare checks at every polling operation.
    The __call__() method processes tracer flare payloads when present.
    callbackNr   r   stale_duration_minsr   c                 C   s    || _ || _|| _|d | _dS )aA  Initialize the tracer flare callback.

        Args:
            callback: Handler function for flare operations
            flare: Flare instance for generating flares
            state: Shared state for tracking flare requests
            stale_duration_mins: Minutes before a flare request is considered stale
        <   N)	_callback_flare_state_stale_duration_secs)r   r<   r   r   r=   r   r   r   r   T   s   zTracerFlareCallback.__init__c                 C   s.   | j jrt }|| j j  }|| jkS dS )z,Check if the current flare request is stale.F)rA   r   r   r.   total_secondsrB   )r   curr	flare_ager   r   r   _has_stale_flareh   s
   
z$TracerFlareCallback._has_stale_flarec                 C   s8   |   rtd| jj d| j_| | ji d dS dS )zPeriodic method called at every polling operation.

        Checks for stale flare requests and cleans them up if necessary.
        jTracer flare request started at %s is stale, reverting logger configurations and cleaning up resources nowNT)rF   r   r+   rA   r   r?   r@   r   r   r   r   periodicp   s   zTracerFlareCallback.periodicr   c                 C   s   |sdS t | j| j| dS )zProcess tracer flare configuration payloads.

        Args:
            payloads: Sequence of configuration payloads to process
        N)r:   r@   rA   )r   r   r   r   r   __call__~   s   zTracerFlareCallback.__call__r   )r   r   r   r   !DEFAULT_STALE_FLARE_DURATION_MINSr   r   r%   boolr   intr   rF   rH   tSequencer   rI   r   r   r   r   r;   M   s"    

r;   c                       sJ   e Zd ZdZefdededef fddZde	fdd	Z
dddZ  ZS )TracerFlareSubscriberz%Subscriber for tracer flare requests.data_connectorr   stale_flare_agec                    s*   t  |dd d d | _|| _|| _d S )Nc                 S   s   d S r   r   )_datar   r   r   <lambda>   s    z0TracerFlareSubscriber.__init__.<locals>.<lambda>TracerFlareConfig)superr   r   stale_tracer_flare_num_minsr   )r   rP   r   rQ   	__class__r   r   r      s   
zTracerFlareSubscriber.__init__r   c                 C   s2   | j rt }|| j   }| jd }||kS dS )Nr>   F)r   r   r.   rC   rV   )r   rD   rE   	stale_ager   r   r   has_stale_flare   s   
z%TracerFlareSubscriber.has_stale_flareNc                 C   sx   |   rtd| j d | _| j  | j  d S | j }|s(t	d d S t
 }| j|_t| j|| |j| _d S )NrG   z$No data received from data connector)rZ   r   r+   r   r   r0   r3   _data_connectorreadr    r   r:   )r   _datar   r   r   r   !_get_data_from_connector_and_exec   s"   



z7TracerFlareSubscriber._get_data_from_connector_and_execr   )r   r   r   r   rJ   r	   r   rL   r   rK   rZ   r_   __classcell__r   r   rW   r   rO      s    rO   )r   typingrM   r   r   ddtrace.internal.flare.flarer   ddtrace.internal.loggerr   ddtrace.internal.remoteconfigr   r   )ddtrace.internal.remoteconfig._connectorsr	   *ddtrace.internal.remoteconfig._subscribersr
   r   r   rJ   r   rN   r:   r;   rO   r   r   r   r   <module>   s      3=