
    \jM                        d 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	m
Z
mZ ddlmZmZmZ ddl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mZ ddlm Z m!Z!m"Z"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-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 dZ4dZ5 edddg      Z6 G d d      Z7 G d d      Z8 G d d      Z9 G d d       Z: G d! d"      Z; ed#d$d%g      Z< G d& d'      Z= G d( d)      Z> G d* d+e3      Z?d, Z@y)-zC
Implementation details of the analytics event delivery component.
    )timegm)
namedtuple)	parsedateN)EventLockThread)AnyListOptional)Config)Context)create_diagnostic_init)EventContextFormatter)EventSummarizerEventSummary)
EventInputEventInputCustomEventInputEvaluationEventInputIdentify)FixedThreadPool)_http_factory)SimpleLRUCache)RepeatingTask)%check_if_error_is_recoverable_and_logcurrent_time_millisis_http_error_recoverablelog_headers)EventProcessor      EventProcessorMessagetypeparamc                       e Zd ZdgZdefdZy)
DebugEventoriginal_inputc                     || _         y N)r'   )selfr'   s     N/root/env/lib/python3.12/site-packages/ldclient/impl/events/event_processor.py__init__zDebugEvent.__init__'   s
    ,    N)__name__
__module____qualname__	__slots__r   r,    r-   r+   r&   r&   $   s    !"I-'; -r-   r&   c                   $    e Zd ZddgZdedefdZy)
IndexEvent	timestampcontextc                      || _         || _        y r)   )r5   r6   )r*   r5   r6   s      r+   r,   zIndexEvent.__init__-   s    "r-   N)r.   r/   r0   r1   intr   r,   r2   r-   r+   r4   r4   *   s    i(I#  r-   r4   c                   t    e Zd ZdefdZdee   defdZdefdZ		 defdZ
d	efd
Zd	efdZdededefdZy)EventOutputFormatterconfigc                 N    t        |j                  |j                        | _        y r)   )r   all_attributes_privateprivate_attributes_context_formatter)r*   r;   s     r+   r,   zEventOutputFormatter.__init__3   s    "78U8UW]WpWp"qr-   eventssummaryc                     |D cg c]  }| j                  |       }}|j                         s |j                  | j                  |             |S c c}w r)   )make_output_eventis_emptyappendmake_summary_event)r*   r@   rA   e
events_outs        r+   make_output_eventsz'EventOutputFormatter.make_output_events6   sQ    :@BQt--a0B
B!d55g>? Cs   ArG   c                    t        |t              r2| j                  |d      }| j                  |j                        |d<   |S t        |t
              rF| j                  |j                  d      }| j                  |j                  j                        |d<   |S t        |t              r)d|j                  | j                  |j                        dS t        |t              r)d|j                  | j                  |j                        dS t        |t              rld|j                  |j                  | j                  |j                        d	}|j                  |j                  |d
<   |j                  |j                  |d<   |S y )NfeaturecontextKeysdebugr6   identify)kindcreationDater6   indexcustom)rO   rP   keyrL   datametricValue)
isinstancer   _base_eval_props_context_keysr6   r&   r'   _process_contextr   r5   r4   r   rS   rT   metric_value)r*   rG   outs      r+   rC   z&EventOutputFormatter.make_output_event<   sW   a-.''95C!%!3!3AII!>CJ:&''(8(8'BC!2213C3C3K3KLC	NJ-." !00; 
 :& !00; 
 +,  !uu#11!))<	C vv!ffF~~)%&^^M"Jr-   c                    t               }|j                  j                         D ]  \  }}|j                  t	        |j
                        d}g }|j                  j                         D ]H  \  }}|\  }	}
|j                  |j                  d}|	|	|d<   |
d|d<   n|
|d<   |j                  |       J ||d<   |||<    d|j                  |j                  |d	S )
N)defaultcontextKinds)countvalue	variationTunknownversioncountersrA   )rO   	startDateendDatefeatures)dictflagsitemsr]   listcontext_kindsrd   r_   r`   rE   
start_dateend_date)r*   rA   	flags_outrS   	flag_dataflag_data_outrd   ckeycvalra   rc   counters               r+   rF   z'EventOutputFormatter.make_summary_eventb   s    F	%mm113 	+NC(1(9(94PYPgPgKhiMH'00668 )
d%)"	7!ZZ!ZZ (+4GK(?)-GI&)0GI&() )1M*%*IcN#	+&  ++''!	
 	
r-   r6   c                 8    | j                   j                  |      S r)   )r?   format_context)r*   r6   s     r+   rY   z%EventOutputFormatter._process_context}   s    &&55g>>r-   c                     i }t        |j                        D ]/  }|j                  |      }||j                  ||j                  <   1 |S r)   )rangeindividual_context_countget_individual_contextrS   rO   )r*   r6   r[   ics        r+   rX   z"EventOutputFormatter._context_keys   sN    w778 	$A..q1A}eeAFF	$ 
r-   rO   returnc                 f   ||j                   |j                  |j                  |j                  d}|j                  |j                  j
                  |d<   |j                  |j                  |d<   |j                  |j                  |d<   |j                  |j                  j                  |d<   |S )N)rO   rP   rS   r`   r]   rc   ra   reasonprereqOf)	r5   rS   r`   default_valueflagrc   ra   r   	prereq_of)r*   rG   rO   r[   s       r+   rW   z%EventOutputFormatter._base_eval_props   s    KK55WW
 66VV^^C	N;;" {{C88HHCM;;"kkooC
O
r-   N)r.   r/   r0   r   r,   r
   r	   r   rI   rC   rF   r   rY   rX   r   strrh   rW   r2   r-   r+   r:   r:   2   sx    rv rc \ !3 !F
, 
6? ?W "6 c d r-   r:   c                       e Zd Zd Zd Zd Zy)EventPayloadSendTaskc                 J    || _         || _        || _        || _        || _        y r)   )_http_config
_formatter_payload_response_fn)r*   httpr;   	formatterpayloadresponse_fns         r+   r,   zEventPayloadSendTask.__init__   s&    
#'r-   c                 
   	 | j                   j                  | j                  j                  | j                  j                        }| j                  |      }y # t        $ r!}t        j                  dd       Y d }~y d }~ww xY w)NzLUnhandled exception in event processor. Analytics events were not processed.Texc_info)	r   rI   r   r@   rA   _do_send	Exceptionr   warning)r*   output_eventsresprG   s       r+   runzEventPayloadSendTask.run   si    	 OO>>t}}?S?SUYUbUbUjUjkM==/D 	KK^ 	s   AA 	B!A==Bc                    	 t        j                  |d      }t        j                  d|z          t	        t        j                               }t        | j                  | j                  | j                  j                  ||dt        | j                  j                        z        }|r| j                  |       |S # t        $ r }t        j                   d|       Y d }~y d }~ww xY w)N),:)
separatorszSending events payload: z	%d eventszQUnhandled exception in event processor. Analytics events were not processed. [%s])jsondumpsr   rM   r   uuiduuid4_post_events_with_retryr   r   
events_urilenr   r@   r   r   r   )r*   r   	json_body
payload_idrrG   s         r+   r   zEventPayloadSendTask._do_send   s    	h

=YGIII09<=TZZ\*J'

''c$--"6"677A !!!$H 	hKKcefh h	hs   B8B; ;	C$CC$N)r.   r/   r0   r,   r   r   r2   r-   r+   r   r      s    (hr-   r   c                       e Zd Zd Zd Zy)DiagnosticEventSendTaskc                 .    || _         || _        || _        y r)   )r   r   _event_body)r*   r   r;   
event_bodys       r+   r,   z DiagnosticEventSendTask.__init__   s    
%r-   c                 B   	 t        j                  | j                        }t        j                  d|z          t        | j                  | j                  | j                  j                  dz   d |d       y # t        $ r }t        j                  d|       Y d }~y d }~ww xY w)NzSending diagnostic event: z/diagnosticzdiagnostic eventzKUnhandled exception in event processor. Diagnostic event was not sent. [%s])r   r   r   r   rM   r   r   r   events_base_urir   r   )r*   r   rG   s      r+   r   zDiagnosticEventSendTask.run   s    	b

4#3#34III2Y>?#

,,}<"  	bKK]_`b b	bs   A2A5 5	B>BBN)r.   r/   r0   r,   r   r2   r-   r+   r   r      s    &
br-   r   FlushPayloadr@   rA   c                   <    e Zd Zd ZdefdZdefdZd Zd Z	d Z
y)	EventBufferc                 Z    || _         g | _        t               | _        d| _        d| _        y )NFr   )	_capacity_eventsr   _summarizer_exceeded_capacity_dropped_events)r*   capacitys     r+   r,   zEventBuffer.__init__   s+    !*,"' r-   eventc                 
   t        | j                        | j                  k\  r?| xj                  dz  c_        | j                  st        j                  d       d| _        y y | j                  j                  |       d| _        y )N   zJExceeded event queue capacity. Increase capacity to avoid dropping events.TF)r   r   r   r   r   r   r   rE   r*   r   s     r+   	add_eventzEventBuffer.add_event   sg    t||.  A% **hi*.' + LL&&+D#r-   c                 :    | j                   j                  |       y r)   )r   summarize_eventr   s     r+   add_to_summaryzEventBuffer.add_to_summary   s    ((/r-   c                 ,    | j                   }d| _         |S Nr   )r   )r*   dropped_counts     r+   get_and_clear_dropped_countz'EventBuffer.get_and_clear_dropped_count   s    ,, r-   c                 ^    t        | j                  | j                  j                               S r)   )r   r   r   snapshotr*   s    r+   get_payloadzEventBuffer.get_payload   s"    DLL$*:*:*C*C*EFFr-   c                 F    g | _         | j                  j                          y r)   )r   r   clearr   s    r+   r   zEventBuffer.clear   s     r-   N)r.   r/   r0   r,   r	   r   r   r   r   r   r   r2   r-   r+   r   r      s0    !,s ,0$8 0
G!r-   r   c                   J    e Zd ZddZd ZdefdZdefdZd Z	d Z
d	 Zd
 Zy)EventDispatcherNc                 l   || _         || _        |%t        |      j                  d|j                        n|| _        |d u | _        d| _        t        |j                        | _
        t        |j                        | _        t        |      | _        d| _        d| _        |j$                  rd n|| _        t)        t*        d      | _        | j&                  d nt)        dd      | _        | j&                  {t1        | j&                  j2                  | j&                  j4                  |      }t7        | j
                  | j                  |      }| j.                  j9                  |j:                         t=        | j>                        | _         d| j@                  _!        | j@                  jE                          y )Nr   Fr   zldclient.flushzldclient.diag_flush)targetT)#_inboxr   r   create_pool_managerr   r   _close_http	_disabledr   events_max_pending_outboxr   context_keys_capacityrX   r:   r   _last_known_past_time_deduplicated_contextsdiagnostic_opt_out_diagnostic_accumulatorr   __MAX_FLUSH_THREADS___flush_workers_diagnostic_flush_workersr   data_since_datediagnostic_idr   executer   r   _run_main_loop_main_threaddaemonstart)r*   inboxr;   http_clientdiagnostic_accumulator
init_eventtasks          r+   r,   zEventDispatcher.__init__   sp   XcXk]6*>>q&BSBSTq|
'4/"6#<#<=+F,H,HI.v6%&"&'#/5/H/HtNd$-.CEUV151M1M1U[jkl  oD  \E&''3/0L0L0\0\040L0L0Z0Z068J +4::t||ZPD**22488<"$*=*=>#' !r-   c                 :   t        j                  d       	 	 | j                  j                  d      }|j                  dk(  r| j                  |j                         n|j                  dk(  r| j                          n|j                  dk(  r| j                  j                          n|j                  dk(  r| j                          n|j                  dk(  r[| j                  j                          | j                  | j                  j                          |j                  j                          n:|j                  d	k(  r+| j!                          |j                  j                          y Y# t"        $ r!}t        j$                  d
d       Y d }~'d }~ww xY w)NzStarting event processorTblockr   flushflush_contexts
diagnostic	test_syncstopz&Unhandled exception in event processorr   )r   infor   getr#   _process_eventr$   _trigger_flushrX   r   _send_and_reset_diagnosticsr   waitr   r   set_do_shutdownr   error)r*   messagerG   s      r+   r   zEventDispatcher._run_main_loop  s;   +,S++///5<<7*''6\\W,'')\\%55&&,,.\\\1446\\[0'',,.33?66;;=MM%%'\\V+%%'MM%%'' (  S		BTRRSs   EE0 0	F9FFr   c                    | j                   ry d }d}d }d }t        |t              rR|j                  }| j                  j                  |       |j                  r|}| j                  |      rKt        |      }n?t        |t              r|j                  }|}d}nt        |t              r|j                  }|}|o| j                  j                  |j                  d      }|rG|r| xj                  dz  c_        n/| j                  j                  t!        |j"                  |             |r| j                  j                  |       |r| j                  j                  |       y y )NTFr   )r   rV   r   r6   r   r   track_events_should_debug_eventr&   r   r   rX   putfully_qualified_keyr   r   r4   r5   )r*   r   r6   can_add_index
full_eventdebug_eventalready_seens          r+   r   zEventDispatcher._process_event3  s.   >> 
e12mmGLL''.!!"
''.(/12mmGJ!M/0mmGJ --11'2M2MtTL//14/LL**:eoow+OPLL"":.LL"";/ r-   c                     |j                   y|j                   j                  }|| j                  }||kD  r|t               kD  ryy)NFT)r   debug_events_until_dater   r   )r*   r   debug_until	last_pasts       r+   r   z#EventDispatcher._should_debug_event]  sH    ::jj88"22IY&;9L9N+Nr-   c                    | j                   ry | j                  j                         }| j                  r.| j                  j	                  t        |j                               t        |j                        dkD  s|j                  j                         sxt        | j                  | j                  | j                  || j                        }| j                  j                  |j                         r| j                  j#                          y y y r   )r   r   r   r   record_events_in_batchr   r@   rA   rD   r   r   r   r   _handle_responser   r   r   r   )r*   r   r   s      r+   r   zEventDispatcher._trigger_flushg  s    >>,,**,''((??GNN@STw~~"'//*B*B*D'

DLL$//SZ%%'D""**4884""$  +Er-   c                     |j                   j                  d      }|+t        |      }|t        t	        |      dz        }|| _        |j                  dkD  rt        |j                        sd| _        y y y )NDatei  i+  T)	headersr   r   r8   r   r   statusr   r   )r*   r   server_date_strserver_dater5   s        r+   r
  z EventDispatcher._handle_responsew  so    ))--/&#O4K&{ 3d :;	-6*88c>";AHH"E!DN #F>r-   c                 8   | j                   | j                  j                         }| j                   j                  || j                        }d| _        t        | j                  | j                  |      }| j                  j                  |j                         y y r   )r   r   r   create_event_and_resetr   r   r   r   r   r   r   )r*   dropped_event_countstats_eventr   s       r+   r   z+EventDispatcher._send_and_reset_diagnostics  s|    ''3"&,,"J"J"L66MMNacgc~c~K*+D'*4::t||[QD**22488< 4r-   c                     | j                   j                          | j                   j                          | j                  r| j                  j                          y y r)   )r   r   r   r   r   r   r   s    r+   r   zEventDispatcher._do_shutdown  sD      "  "JJ r-   r)   )r.   r/   r0   r,   r   r   r   r   r   r   r
  r   r   r2   r-   r+   r   r      s;    "4S2(0J (0T)=  	=r-   r   c                   V    e Zd ZddZdefdZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zy)DefaultEventProcessorNc                    t        j                  |j                        | _        d| _        t        |j                  |j                  | j                        | _        t        |j                  |j                  | j                        | _        | j                  j                          | j                  j                          |Kt        |j                  |j                  | j                        | _        | j                  j                          nd | _        t!               | _        d| _         |xs t&        | j                  |||       y )NF)queueQueuer   r   _inbox_fullr   flush_intervalr   _flush_timercontext_keys_flush_interval_flush_contexts_contexts_flush_timerr   diagnostic_recording_interval_send_diagnostic_diagnostic_event_timerr   _close_lock_closedr   )r*   r;   r   dispatcher_classr   s        r+   r,   zDefaultEventProcessor.__init__  s   kk&";";< )&*?*?AVAVX\XbXbc%263U3UW]WyWy{  |P  |P  &Q"!""((*!-+89]9]44d6K6K,MD(((..0+/D(6	,		,_dkk64I_`r-   r   c                 :    | j                  t        d|             y )Nr   _post_to_inboxr"   r   s     r+   
send_eventz DefaultEventProcessor.send_event  s    1'5ABr-   c                 :    | j                  t        dd              y )Nr   r(  r   s    r+   r   zDefaultEventProcessor.flush  s    1'4@Ar-   c                 v   | j                   5  | j                  r
	 d d d        y d| _        d d d        | j                  j                          | j                  j                          | j
                  r| j
                  j                          | j                          | j                  d       y # 1 sw Y   xY w)NTr   )r$  r%  r  r   r   r#  r   _post_message_and_waitr   s    r+   r   zDefaultEventProcessor.stop  s     	 ||	  	   DL	  	 ""'')''((--/

 	##F+	  	 s   B/B//B8c                     	 | j                   j                  |d       y # t        j                  $ r- | j                  sd| _        t        j                  d       Y y Y y w xY w)NFr   TzXEvents are being produced faster than they can be processed; some events will be dropped)r   r   r  Fullr  r   r   )r*   r   s     r+   r)  z$DefaultEventProcessor._post_to_inbox  sT    	xKKOOG5O1zz 	x###' vw $	xs     ;A A c                 N    | j                   j                  t        dd              y )Nr   r   r   r"   r   s    r+   r  z%DefaultEventProcessor._flush_contexts  s    -.>EFr-   c                 N    | j                   j                  t        dd              y )Nr   r1  r   s    r+   r"  z&DefaultEventProcessor._send_diagnostic  s    -lDABr-   c                 &    | j                  d       y )Nr   )r-  r   s    r+   _wait_until_inactivez*DefaultEventProcessor._wait_until_inactive  s    ##K0r-   c                     t               }| j                  j                  t        ||             |j	                          y r)   )r   r   r   r"   r   )r*   r#   replys      r+   r-  z,DefaultEventProcessor._post_message_and_wait  s*    -dE:;

r-   c                     | S r)   r2   r   s    r+   	__enter__zDefaultEventProcessor.__enter__  s    r-   c                 $    | j                          y r)   )r   )r*   r#   r`   	tracebacks       r+   __exit__zDefaultEventProcessor.__exit__  s    		r-   )NNN)r.   r/   r0   r,   r   r*  r   r   r)  r  r"  r4  r-  r8  r;  r2   r-   r+   r  r    sG    a&C
 CB,xGC1r-   r  c           
         t        |      }d|d<   |rt        t              |d<   ||d<   d}d|z  }	 |rdnd}		 | j                  d	|||t	        j
                  |j                  j                  |j                  j                  
      d      }
|
j                  dk  r|
S t        ||
j                  d |	      }|s|
S 	 |sy d}t        j                  d       # t        $ r!}t        |d t        |      |	       Y d }~@d }~ww xY w)Nzapplication/jsonzContent-TypezX-LaunchDarkly-Event-SchemazX-LaunchDarkly-Payload-IDTz
posting %sz
will retryzsome events were droppedPOST)connectreadr   )r  bodytimeoutretriesi,  Fr   )r   r   __CURRENT_EVENT_SCHEMA__requesturllib3Timeoutr   connect_timeoutread_timeoutr  r   r   timesleep)r   r;   urir   r@  events_descriptionhdrs	can_retryr6   next_action_messager   recoverablerG   s                r+   r   r     s     FD-D.12J.K*+,6()I//G
.7l=W	^##0K0KRXR]R]RjRjk $ A xx#~?SWYlmK  	

1-    	^1'4QI\]]	^s   A$C C 	D C;;D )A__doc__calendarr   collectionsr   email.utilsr   r   	threadingr   r   r   typingr	   r
   r   rI  r   r  rE  ldclient.configr   ldclient.contextr    ldclient.impl.events.diagnosticsr   ,ldclient.impl.events.event_context_formatterr   %ldclient.impl.events.event_summarizerr   r   ldclient.impl.events.typesr   r   r   r   ldclient.impl.fixed_thread_poolr   ldclient.impl.httpr   ldclient.impl.lru_cacher   ldclient.impl.repeating_taskr   ldclient.impl.utilr   r   r   r   r   ldclient.interfacesr   r   rC  r"   r&   r4   r:   r   r   r   r   r   r  r   r2   r-   r+   <module>rc     s     " !  ) ) & &     " $ C N O m m ; , 2 6 D  D .   ##:VW<MN - - f fR$h $hNb b0 .8Y*?@! !DO OdEN EP%r-   