+
    €WÝjŒ  ã                  óþ   a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
HtHtHt ]P                  ! ]4      tRtRt ! R R4      tRsR	]R
&   ]P,                  ! 4       tR R ltR R ltRR R llt. ROtR# )u%  Monitoring emitter: fire-and-forget queue + background dispatcher â€” the single seam between
producers (gateway status hooks, diagnostic log handler) and consumers (OTLP streamers).
Hot-path invariant: ``emit()`` MUST return in O(microseconds), MUST NOT block on disk/network, and
MUST NEVER raise into the caller â€” a monitoring failure is logged locally and dropped.  On a full
queue the *oldest* event is dropped.  A daemon thread fans batches out to fail-isolated
subscribers.  Nothing is persisted: monitoring is an egress path, not a store.
)ÚannotationsN)Úsuppress)ÚAnyÚDictÚOptionali'  é   c                  óž   € ] tR t^tRtRR/R R lltR R ltR R	 ltR
 R ltR R lt	R R lt
R R ltRR R lltR R ltR R ltRtR# )ÚMonitoringEmitterz?Owns the queue, the dispatcher thread, and the subscriber list.ÚenabledTc               ó    € V ^8„  d   QhRRRR/# )é   r
   ÚboolÚreturnÚNone© )Úformats   "ÚLC:\Users\johnn\AppData\Local\hermes\hermes-agent\agent\monitoring\emitter.pyÚ__annotate__ÚMonitoringEmitter.__annotate__   s   € ÷ 
%ñ 
% 4ð 
%°4ñ 
%ó    c               	ó   € Wn         \        P                  ! \        R 7      V n        ^ V n        ^ V n        \        P                  ! 4       V n	        RV n
        \        P                  ! 4       V n        RV n        . V n        R# ))ÚmaxsizeFN)Ú_enabledÚqueueÚQueueÚ
_MAX_QUEUEÚ_qÚ_droppedÚ_dispatchedÚ	threadingÚEventÚ_stopÚ_startedÚLockÚ_lockÚ_threadÚ_subscribers)Úselfr
   s   &$r   Ú__init__ÚMonitoringEmitter.__init__   sX   € ØŒÜ/4¯{ª{Ä:Ô/NˆŒØˆŒØˆÔÜ—_’_Ó&ˆŒ
ØˆŒÜ—^’^Ó%ˆŒ
Ø37ˆŒà"$ˆÖr   c               ó    € V ^8„  d   QhRRRR/# ©r   Úeventr   r   r   r   )r   s   "r   r   r   (   s   € ÷ Bñ B˜#ð B $ñ Br   c                óà  € V P                   '       g   R#  \        VR4      '       d   VP                  4       M
\        V4      pVP	                  R\
        P                  ! 4       4       V P                  4         V P                  P                  V4       R#   \        P                   dš     T P                  P                  4        T P                  P                  4        T ;P                  ^,          un        T P                  P                  T4        R#   \         d    T ;P                  ^,          un          R# i ; ii ; i  \         d    \         P#                  RRR7        R# i ; i)zSEnqueue a dataclass with ``to_dict()`` or a plain dict. Never blocks, never raises.NÚto_dictÚts_nszmonitoring emit failedT©Úexc_info)r   Úhasattrr.   ÚdictÚ
setdefaultÚtimeÚtime_nsÚ_ensure_startedr   Ú
put_nowaitr   ÚFullÚ
get_nowaitÚ	task_doner   Ú	ExceptionÚloggerÚdebug)r'   r,   Úpayloads   && r   ÚemitÚMonitoringEmitter.emit(   s  € à�}�}ˆ}Ùð	BÜ)0°¸	×)BÒ)B�e—m‘m”oÌÈUËˆGØ×Ñ˜w¬¯ª«Ô7Ø× Ñ Ô"ð
'Ø—‘×"Ñ" 7Ö+øÜ—:‘:ô 'ð'Ø—G‘G×&Ñ&Ô(Ø—G‘G×%Ñ%Ô'Ø—M’M QÕ&•MØ—G‘G×&Ñ& w×/øÜ ô 'Ø—M’M QÕ&—M‘Mð'úð'ûô ô 	BÜ�L‰LÐ1¸DˆL×Að	BúsO   –A"E Á9B ÂEÂ,A(DÄE Ä$E Ä;EÄ<E Ä?E Å EÅE Å"E-Å,E-c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   r   ?   s   € ÷ !ñ ! ñ !r   c                	ó\  € V P                   '       d   R # V P                  ;_uu_ 4        V P                   '       d    R R R 4       R # \        P                  ! V P                  RRR7      V n        V P
                  P                  4        RV n         R R R 4       R #   + '       g   i     R # ; i)Nzhermes-monitoring-dispatchT©ÚtargetÚnameÚdaemon)r"   r$   r   ÚThreadÚ_runr%   Ústart©r'   s   &r   r7   Ú!MonitoringEmitter._ensure_started?   sk   € Ø�=�=ˆ=ÙØ�Z�Z‹ZØ�}�}ˆ}Ø÷ ‰Zô %×+Ò+°4·9±9ÐC_ÐhlÔmˆDŒLØ�L‰L×ÑÔ Ø ˆDŒM÷ �Z�ZŠZús   ©BÁA	BÂB+	c               ó   € V ^8„  d   QhRR/# rC   r   )r   s   "r   r   r   I   s   € ÷ (ñ (�dñ (r   c                	ó4  € V P                   P                  4       '       g˜    V P                  P                  R R7      pT.p\        T4      \        8  d-    TP                  T P                  P                  4       4       K@   T P                  T4       T F  pT P                  P                  4        K  	  K·  R#   \        P
                   d     KÑ  i ; i  \        P
                   d     Km  i ; i  T F  pT P                  P                  4        K  	  i ; i)g      à?©ÚtimeoutN)r!   Úis_setr   Úgetr   ÚEmptyÚlenÚ_DRAIN_BATCHÚappendr:   Ú	_dispatchr;   )r'   ÚfirstÚbatchÚ_s   &   r   rJ   ÚMonitoringEmitter._runI   sÝ   € Ø—*‘*×#Ñ#×%Ò%ðØŸ™Ÿ™¨C˜Ó0�ð �GˆEÜ�e“*œ|Ô+ðØ—L‘L §¡×!3Ñ!3Ó!5Ö6ð(Ø—‘˜uÔ%ã�AØ—G‘G×%Ñ%Ö'ó ñ &øô —;‘;ô Úðûô —{‘{ô Úðûó
 �AØ—G‘G×%Ñ%Ö'ò ús/   ¢B: Á)C ÂC2 Â:CÃCÃC/Ã.C/Ã2%Dc               ó   € V ^8„  d   QhRR/# rC   r   )r   s   "r   r   r   [   s   € ÷ 'ñ ' $ñ 'r   c                	óæ   € \        V P                  4       F  p V! V4       K  	  V ;P
                  \        V4      ,          un        R#   \         d    \        P	                  R RR7        KY  i ; i)zmonitoring subscriber failedTr0   N)Úlistr&   r<   r=   r>   r   rU   )r'   rZ   Úsubs   && r   rX   ÚMonitoringEmitter._dispatch[   s_   € Ü˜×)Ñ)Ö*ˆCðLÙ�E–
ñ +ð
 	×ÒœC ›JÕ&×øô ô LÜ—‘Ð;Àd�×KðLús   šA
Á
"A0Á/A0c               ó   € V ^8„  d   QhRR/# rC   r   )r   s   "r   r   r   c   s   € ÷ ñ  Tñ r   c                ój   € WP                   9  d   V P                   P                  V4       RV n        R# )zJRegister a live batch subscriber; the first subscriber enables collection.TN)r&   rW   r   ©r'   Úcallbacks   &&r   Ú	subscribeÚMonitoringEmitter.subscribec   s)   € à×,Ñ,Ô,Ø×Ñ×$Ñ$ XÔ.ØˆŽr   c               ó   € V ^8„  d   QhRR/# rC   r   )r   s   "r   r   r   i   s   € ÷ "ñ " tñ "r   c                	óØ   € \        \        4      ;_uu_ 4        V P                  P                  V4       R R R 4       V P                  '       g
   RV n        R # R #   + '       g   i     L-; i)NF)r   Ú
ValueErrorr&   Úremover   rd   s   &&r   ÚunsubscribeÚMonitoringEmitter.unsubscribei   sG   € Ü”j×!Õ!Ø×Ñ×$Ñ$ XÔ.÷ "à× × Ð Ø!ˆDŽMñ !÷ "×!ús   ˜AÁA)	c               ó    € V ^8„  d   QhRRRR/# )r   rQ   Úfloatr   r   r   )r   s   "r   r   r   p   s   € ÷ 'ñ '˜Uð '¨Tñ 'r   c                óÌ   a a€ V^ 8:  d   R# \         P                  ! 4       oR VV 3R llp\         P                  ! VRRR7      P                  4        SP	                  VR7       R# )zCWait boundedly for queued and in-flight batches to finish dispatch.Nc               ó   € V ^8„  d   QhRR/# rC   r   )r   s   "r   r   Ú-MonitoringEmitter.flush.<locals>.__annotate__v   s   € ÷ 	ñ 	 dñ 	r   c                 ó\   <€ SP                   P                  4        S P                  4        R # ©N)r   ÚjoinÚset)Úfinishedr'   s   €€r   Ú_wait_for_completionÚ5MonitoringEmitter.flush.<locals>._wait_for_completionv   s   ø€ Ø�G‰G�L‰LŒNØ�L‰LŽNr   zhermes-monitoring-flushTrE   rP   )r   r    rI   rK   Úwait)r'   rQ   rx   rw   s   f& @r   ÚflushÚMonitoringEmitter.flushp   sQ   ù€ à�aŒ<ÙÜ—?’?Ó$ˆ÷	ñ 	ô 	×ÒÐ 4Ð;TÐ]aÔb×hÑhÔjØ�‰˜gˆÖ&r   c               ó   € V ^8„  d   QhRR/# )r   r   zdict[str, int]r   )r   s   "r   r   r   }   s   € ÷ Lñ L�~ñ Lr   c           
     	ó”   € R V P                   P                  4       RV P                  RV P                  R\	        V P
                  4      /# )ÚqueuedÚ
dispatchedÚdroppedÚsubscribers)r   Úqsizer   r   rU   r&   rL   s   &r   ÚstatsÚMonitoringEmitter.stats}   sP   € Ø˜$Ÿ'™'Ÿ-™-›/¨<¸×9IÑ9IÈ9ÐVZ×VcÑVcÐerÔtwÐx|÷  yJñ  yJó  uKð  Lð  	Lr   c               ó   € V ^8„  d   QhRR/# rC   r   )r   s   "r   r   r   €   s   € ÷ ñ �tñ r   c                	óœ   € V P                   P                  4        V P                  e   V P                  P                  RR7       RV n        R # )Nç       @rP   F)r!   rv   r%   ru   r"   rL   s   &r   ÚcloseÚMonitoringEmitter.close€   s6   € Ø�
‰
�‰ÔØ�<‰<Ò#Ø�L‰L×Ñ cÐÔ*ØˆŽr   )	r   r   r   r$   r   r"   r!   r&   r%   N)rˆ   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r(   r@   r7   rJ   rX   rf   rl   r{   r„   r‰   Ú__static_attributes__r   r   r   r	   r	      sE   † ÙIð
%¨$÷ 
%õBõ.!õ(õ$'õõ"÷'õL÷ñ r   r	   úOptional[MonitoringEmitter]Ú_EMITTERc               ó   € V ^8„  d   QhRR/# )r   r   r	   r   )r   s   "r   r   r   Œ   s   € ÷ 	ñ 	Ð&ñ 	r   c                 ó°   € \         e   \         # \        ;_uu_ 4        \         f   \        RR7      s RRR4       \         #   + '       g   i     \         # ; i)z+Return the process-wide monitoring emitter.NF)r
   )r’   Ú_EMITTER_LOCKr	   r   r   r   Úget_emitterr–   Œ   s?   € ô ÒÜˆß	ŽÜÒä(°Ô7ˆH÷ 
ô €O÷	 
Žô €Oús   �A Á A	c               ó    € V ^8„  d   QhRRRR/# r+   r   )r   s   "r   r   r   ˜   s   € ÷ ñ �ð ˜ñ r   c                ó8   € \        4       P                  V 4       R# )z1Module-level convenience: emit via the singleton.N)r–   r@   )r,   s   &r   r@   r@   ˜   s   € äƒM×Ñ�uÖr   c               ó    € V ^8„  d   QhRRRR/# )r   Úemitterr‘   r   r   r   )r   s   "r   r   r   �   s   € ÷ ñ Ð%@ð ÈDñ r   c           	     ó  € \         ;_uu_ 4        \        e?   V \        Jd5   \        \        4      ;_uu_ 4        \        P	                  4        RRR4       V sRRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i)z Swap the singleton (tests only).N)r•   r’   r   r<   r‰   )rš   s   &r   Úreset_emitter_for_testsrœ   �   sM   € ÷ 
ŽÜÒ G´8Ó$;Üœ)×$Õ$Ü—‘Ô ÷ %àˆ÷	 
‰ç$×$ú÷ 
�ˆús"   �*A5¹A"	Á
A5Á"A2Á-A5Á5B	rt   )r	   r@   r–   rœ   )Ú__conditional_annotations__r�   Ú
__future__r   Úloggingr   r   r5   Ú
contextlibr   Útypingr   r   r   Ú	getLoggerr‹   r=   r   rV   r	   r’   Ú__annotations__r#   r•   r–   r@   rœ   Ú__all__)r�   s   @r   Ú<module>r¥      s|   øðôõ #ã Û Û Û Ý ß &Ñ &à	×	Ò	˜8Ó	$€à€
Ø€÷lñ lð` )-€Ð
%Ó ,Ø—’Ó €õ	õ÷
ò R‚r   