o
    i                     @   s   d dl Z d dlmZ d dlmZ 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 eeZG d
d dejZG dd deZdS )    N)Any)Callable)Optional)periodic)ddup)
get_logger)config)Tracerc                	       sp   e Zd ZdZdejejfdee	g df  dee
 deddf fddZd fd	d
ZdddZdddZ  ZS )	Schedulerz!Schedule export of recorded data.Nbefore_flushtracerintervalreturnc                    s8   t t| j|d || _| j| _d| _|| _tj	| _
d S )N)r   r   )superr
   __init__r   r   _configured_interval_last_export_tracerr   code_provenance_enable_code_provenance)selfr   r   r   	__class__ O/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/profiling/scheduler.pyr      s   zScheduler.__init__c                    s0   t d tt|   t | _t d dS )zStart the scheduler.zStarting schedulerzScheduler startedN)LOGdebugr   r
   _start_servicetimetime_nsr   r   r   r   r   r   "   s   

zScheduler._start_servicec                 C   s`   t d | jdur!z|   W n ty    t jddd Y nw t| j| j t	
 | _dS )z(Flush events from recorder to exporters.zFlushing eventsNz"Scheduler before_flush hook failedT)exc_info)r   r   r   	Exceptionerrorr   uploadr   r   r   r   r   r    r   r   r   flush)   s   

zScheduler.flushc                 C   sN   t  }z|   W td| jt  |  | _d S td| jt  |  | _w )Nr   )r   	monotonicr%   maxr   r   )r   
start_timer   r   r   r   6   s   
:zScheduler.periodicr   N)__name__
__module____qualname____doc__ddtracer   r   upload_intervalr   r   r	   floatr   r   r%   r   __classcell__r   r   r   r   r
      s"    
r
   c                       sD   e Zd ZdZdZdZdededdf fdd	Zd fd
dZ  Z	S )ServerlessScheduleraa  Serverless scheduler that works on, e.g., AWS Lambda.

    The idea with this scheduler is to not sleep 60s, but to sleep 1s and flush out profiles after 60 sleeping period.
    As the service can be frozen a few seconds after flushing out a profile, we want to make sure the next flush is not
    > 60s later, but after at least 60 periods of 1s.

    g      ?g      N@argskwargsr   Nc                    s.   | d| j tt| j|i | d| _d S )Nr   r   )
setdefaultFORCED_INTERVALr   r2   r   _profiled_intervals)r   r3   r4   r   r   r   r   K   s   
zServerlessScheduler.__init__c                    sl   | j | jkr-t | j | j| j kr-ztt|   W | j| _	d| _ d S | j| _	d| _ w |  j d7  _ d S )Nr      )
r7   FLUSH_AFTER_INTERVALSr   r   r   r6   r   r2   r   r   r    r   r   r   r   P   s   

zServerlessScheduler.periodicr)   )
r*   r+   r,   r-   r6   r9   r   r   r   r1   r   r   r   r   r2   >   s    	r2   )r   typingr   r   r   r.   ddtrace.internalr   "ddtrace.internal.datadog.profilingr   ddtrace.internal.loggerr   #ddtrace.internal.settings.profilingr   ddtrace.tracer	   r*   r   PeriodicServicer
   r2   r   r   r   r   <module>   s   ,