
    R"h                     x    d dl mZ d dlZd dlZd dlmZ  ej
                  d      Z G d d      Z G d d      Zy)	    )contextmanagerN)datetimezAmerica/Los_Angelesc                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
EventLogc                 <    || _         d | _        d | _        i | _        y N)
event_name
start_timeend_timechild_eventsselfr	   s     @/var/www/html/sandstorm/storm/knowledge_storm/logging_wrapper.py__init__zEventLog.__init__   s    $    c                 T    t        j                  t        j                        | _        y r   )r   nowpytzutcr
   r   s    r   record_start_timezEventLog.record_start_time   s    ",,HH
r   c                 T    t        j                  t        j                        | _        y r   )r   r   r   r   r   r   s    r   record_end_timezEventLog.record_end_time   s     HH
r   c                     | j                   r3| j                  r'| j                  | j                   z
  j                         S y)Nr   )r
   r   total_secondsr   s    r   get_total_timezEventLog.get_total_time   s.    ??t}}MMDOO3BBDDr   c                 ~    | j                   r1| j                   j                  t              j                  d      d d S y Nz%Y-%m-%d %H:%M:%S.%f)r
   
astimezoneCALIFORNIA_TZstrftimer   s    r   get_start_timezEventLog.get_start_time    s=    ????--m<EE&r  r   c                 ~    | j                   r1| j                   j                  t              j                  d      d d S y r   )r   r    r!   r"   r   s    r   get_end_timezEventLog.get_end_time(   s=    ====++M:CC&r  r   c                 6    || j                   |j                  <   y r   )r   r	   )r   child_events     r   add_child_eventzEventLog.add_child_event0   s    4?+001r   c                     | j                   S r   )r   r   s    r   get_child_eventszEventLog.get_child_events3   s       r   N)__name__
__module____qualname__r   r   r   r   r#   r%   r(   r*    r   r   r   r   
   s+    




@!r   r   c                   j    e Zd Zd ZdefdZdefdZdefdZd Zd Z	e
d	        Ze
d
        ZddZy)LoggingWrapperc                 J    i | _         || _        d | _        g | _        d| _        y )NF)logging_dict	lm_configcurrent_pipeline_stageevent_stackpipeline_stage_active)r   r3   s     r   r   zLoggingWrapper.__init__8   s)    "&*#%*"r   pipeline_stagec                 v    | j                   rt        d      || _        i i g dd| j                  |<   d| _         y )NzTA pipeline stage is already active. End the current stage before starting a new one.r   )
time_usagelm_usage
lm_historyquery_countT)r6   RuntimeErrorr4   r2   )r   r7   s     r   _pipeline_stage_startz$LoggingWrapper._pipeline_stage_start?   sM    %%f  '5#	-
.) &*"r   r	   c                 *   | j                   st        d      | j                  s| j                  r|| j                  | j                     d   vrWt        |      }|j                          || j                  | j                     d   |<   | j                  j                  |       y | j                  | j                     d   |   j                          y | j                  r| j                  d   }||j                         vrht        |      }|j                          |j                  |       || j                  | j                     d   |<   | j                  j                  |       y |j                         |   j                          y t        d      )N&No pipeline stage is currently active.r9   )r	   zGCannot start an event without an active pipeline stage or parent event.)
r6   r=   r5   r4   r2   r   r   appendr*   r(   )r   r	   eventparent_events       r   _event_startzLoggingWrapper._event_startN   s   ))GHHD$?$? (()D)DElST !J7'')  !!$"="=>|L   ''.!!$"="=>|L##%++B/L!>!>!@@ J7''),,U3  !!$"="=>|L   ''.--/
;MMOY r   c                    | j                   st        d      | j                  st        d      | j                  r| j                  d   }||j                         v r"|j                         |   j	                          n[|| j
                  | j                     d   v r.| j
                  | j                     d   |   j	                          nt        d| d      |j                  |k(  r| j                  j                          y y t        d      )Nr@   z$No parent event is currently active.rA   r9   z%Failure to record end time for event z. Start time is not recorded.z3Cannot end an event without an active parent event.)
r6   r=   r5   r*   r   r2   r4   AssertionErrorr	   pop)r   r	   current_event_logs      r   
_event_endzLoggingWrapper._event_endt   s   ))GHHEFF $ 0 0 4.??AA!224Z@PPR$$T%@%@A,OP !!$"="=>|L!/#$;J<Gde  !++z9  $$& : TUUr   c                    | j                   st        d      | j                  j                         | j                  | j
                     d<   | j                  j                         | j                  | j
                     d<   d| _         y )Nz-No pipeline stage is currently active to end.r:   r;   F)r6   r=   r3   collect_and_reset_lm_usager2   r4   collect_and_reset_lm_historyr   s    r   _pipeline_stage_endz"LoggingWrapper._pipeline_stage_end   s    ))NOO NN557 	$556	

 NN779 	$556	
 &+"r   c                 z    | j                   st        d      | j                  | j                     dxx   |z  cc<   y )Nz9No pipeline stage is currently active to add query count.r<   )r6   r=   r2   r4   )r   counts     r   add_query_countzLoggingWrapper.add_query_count   s>    ))K  	$556}ENEr   c              #      K   | j                   st        d      | j                  |       d  | j                  |       y w)Nr@   )r6   r=   rE   rJ   r   s     r   	log_eventzLoggingWrapper.log_event   s8     ))GHH*%
#s   ?Ac              #   
  K   | j                   rt        d       | j                          t        j                         }	 | j	                  |       d  t        j                         |z
  | j                  | j                     d<   | j                          y # t
        $ r}t        d| d|        Y d }~ad }~ww xY w# t        j                         |z
  | j                  | j                     d<   | j                          w xY ww)NzDA pipeline stage is already active, ending the current stage safely.z&Error occurred during pipeline stage 'z': total_wall_time)r6   printrN   timer>   	Exceptionr2   r4   )r   r7   r
   es       r   log_pipeline_stagez!LoggingWrapper.log_pipeline_stage   s     %%V $$&YY[
		'&&~6
 		j( d99:;LM $$&  	S:>:J#aSQRR	S 		j( d99:;LM $$&s<   <DB AD	B:B50B= 5B::B= =AD  Dc           
      h   i }| j                   j                         D ]p  \  }}|d   j                         D ci c]6  \  }}||j                         |j                         |j	                         d8 }}}||d   |d   |d   |d   d||<   r |r| j                   j                          |S c c}}w )Nr9   )total_time_secondsr
   r   r:   r;   r<   rU   )r9   r:   r;   r<   rU   )r2   itemsr   r#   r%   clear)r   reset_logginglog_dumpr7   pipeline_logr	   rC   time_stamp_logs           r   dump_logging_and_resetz%LoggingWrapper.dump_logging_and_reset   s    ,0,=,=,C,C,E 	(NL *6l)C)I)I)K &J */*>*>*@"'"6"6"8 % 2 2 4 N  -(4*<8+M:#/0A#B(H^$	  ##%#s   ;B.N)T)r+   r,   r-   r   strr>   rE   rJ   rN   rQ   r   rS   rZ   rc   r.   r   r   r0   r0   7   sf    +*C *$s $LVS V6
+O $ $ ' '&r   r0   )	
contextlibr   rW   r   r   timezoner!   r   r0   r.   r   r   <module>rg      s;    %    34*! *!Z] ]r   