
    5j                         % S SK r S SKJrJr  S SKJrJr  S SKJrJ	r	J
r
JrJr  SSKJr  SSKJrJrJr  SSKJr  S	S
KJr   " S S\5      rSq\
\   \S'   S\4S jrg)    N)EmptyQueue)ThreadLock)ListSetOptionalTypeTuple   )AbstractUsageLogger)	LogRecord
RecordDataLoggerConfig)
FilterType   )
get_configc                   ^  ^  \ rS rSrSr   S!S\S\S\SS4U 4S jjjr\S	 5       r	\S
 5       r
\S\\   S\\\      S\\   4S j5       rS"S jrS"S jrS"S jrS"U 4S jjrS\\   S\\   SS4S jrS\SS4S jr    S#S\S\S\S\S\S\\   SS4S jjrS$S\\   SS4U 4S jjjr S r!U =r"$ )%UsageLoggerProxy   a  
This class is a wrapper around a threading.Thread that runs a
logging thread. It is used to log usage data from the LD Library.

Parameters
----------
batch_size : int
    The maximum number of records to send to the loggers at once.
flush_timeout : int
    The maximum time to wait before flushing the batch buffer.
logging_enabled : bool
    Whether to enable logging.

Examples
--------
>>> from lseg.data.usage_collection import get_usage_logger
>>> class UserLogger(AbstractUsageLogger):
>>>     def __init__(self, *args, **kwargs):
>>>         ...
>>>     def log(self, records: List[LogRecord]) -> None:
>>>         ...
>>>     def close(self) -> None:
>>>         ...
>>>
>>> logger = get_usage_logger()
>>> logger.add_logger(UserLogger)
>>> logger.start()
>>> ...
>>> logger.join()

batch_sizeflush_timeoutlogging_enabledreturnNc                    > [         TU ]  SSS9  [        5       U l        / U l        [        5       U l        / U l        / U l        Xl	        X l
        X0l        SU l        g )NUsageLoggerThreadT)namedaemonr   )super__init__r   _queue_loggersr   _lock_logger_instances_batch_buffer_batch_size_flush_timeout_logging_enabled_last_flush)selfr   r   r   	__class__s       a/root/lseg-credit/backend/venv/lib/python3.13/site-packages/lseg/data/usage_collection/_logger.pyr    UsageLoggerProxy.__init__,   s[     	1$?"W,.V
TV.0 *#0 / !    c                     U R                   $ N)r(   r*   s    r,   r    UsageLoggerProxy.logging_enabled=   s    $$$r.   c                     U R                   $ r0   )r!   r1   s    r,   queueUsageLoggerProxy.queueA   s    {{r.   batchlogger_filterc                 h    U  Vs/ s H   o!(       a  XR                   -  (       d  M  UPM"     sn$ s  snf )z
Filter the batch by the given filter.
Parameters
----------
batch : List[LogRecord]
logger_filter : Optional[Set[FilterType]]

Returns
-------

)filter)r6   r7   records      r,   _filter_batchUsageLoggerProxy._filter_batchE   s)     &+cU6-MTaTaDaUcccs   //c                    U R                   (       au  U R                   H0  u  pUR                  U R                  U R                   U5      5        M2     U R                   R	                  5         [
        R                  " 5       U l        gg)z9
Flush the batch buffer to the loggers.
Returns
-------

N)r%   r$   logr;   cleartime	monotonicr)   )r*   _logger_filters      r,   flushUsageLoggerProxy.flushT   se     $($:$: D..t/A/A7KL %;$$&#~~/D r.   c           	         U R                      U R                   HN  nU R                  R                  UR                  " UR
                  0 UR                  D6UR                  45        MP     / U l        SSS5        g! , (       d  f       g= f)z7
Update the list of logger instances.
Returns
-------

N)r#   r"   r$   appendlogger_typeargskwargsfilters)r*   logger_configs     r,   _update_loggers UsageLoggerProxy._update_loggersb   sm     ZZ!%&&--%11=3E3E^I]I]^%-- "/ DM ZZs   A&A<<
B
c                    [         R                  " 5       U l         [        U R                  5      S:  a  U R                  5          U R                  R                  [        SU R                  [         R                  " 5       U R                  -
  -
  5      S9nUc  OPU R                  R                  U5        [        U R                  5      U R                  :  a  U R                  5         M  U R                  5         U R                   H  u  p#UR!                  5         M     g ! [         a    U R                  5          GM#  f = f)Nr   g?)timeout)r@   rA   r)   lenr"   rM   r!   getmaxr'   r   rD   r%   rG   r&   r$   close)r*   r:   logger_s       r,   runUsageLoggerProxy.runs   s    >>+4==!A%$$&S$:M:MQUQ_Q_QadhdtdtQt:u1vw ~%%f-4%%&$*:*::

  	

//IFLLN 0  

s   AD   D?>D?c                 F   > U R                   (       a  [        TU ]	  5         g g r0   )r(   r   start)r*   r+   s    r,   rZ   UsageLoggerProxy.start   s      GMO !r.   rU   rC   c           	         U R                   (       a[  [        U[        5      (       d  [        S5      eU R                     U R
                  R                  [        XXB5      5        SSS5        g[        S5      e! , (       d  f       g= f)z%
Add a logger to the logging thread.
z(Logger must be a subclass of UsageLoggerNzGTried to add a logger to a disabled logger thread. Check session config)	r(   
issubclassr   
ValueErrorr#   r"   rG   r   RuntimeError)r*   rU   rC   rI   rJ   s        r,   
add_loggerUsageLoggerProxy.add_logger   sd       f&9:: !KLL$$\&%PQ  hii s   &A88
Br:   c                 ^    U R                   (       a  U R                  R                  U5        g g r0   )r(   r4   put)r*   r:   s     r,   r>   UsageLoggerProxy.log   s       JJNN6" !r.   r   	func_pathrI   rJ   resultdescc                     U R                   (       a>  Uc  SnUc  0 nUc
  [        5       nU R                  [        X[	        X4U5      U5      5        g g )N )r(   setr>   r   r   )r*   r   re   rI   rJ   rf   rg   s          r,   log_funcUsageLoggerProxy.log_func   sQ       |~|uHH$:dF+KTR !r.   rP   c                    > U R                   (       a3  U R                  R                  S5         [        TU ]  U5        SU l         gg! [
         a     Nf = f)z[
Stop the logger thread.
Parameters
----------
timeout : Optional[float]

Returns
-------

NF)r(   r4   rc   r   joinr_   )r*   rP   r+   s     r,   rn   UsageLoggerProxy.join   sR       JJNN4 W% %*D! !   s   A 
AA)	r%   r&   r'   r)   r#   r$   r"   r(   r!   )d   
   T)r   N)NNNNr0   )#__name__
__module____qualname____firstlineno____doc__intboolr    propertyr   r4   staticmethodr   r   r	   r   r   r;   rD   rM   rW   rZ   r
   r   r`   r>   strtupledictobjectrk   floatrn   __static_attributes____classcell__)r+   s   @r,   r   r      s{   B  $	"" " 	"
 
" "" % %   dT)_ dXc*o=V d[_`i[j d d0"(j()j Zj 
j$#) # #  $  	
   *o 
(*HUO *t * *r.   r   usage_loggerr   c                      [         c6  [        5       R                  S5      n [        U S9q [         R	                  5         [         $ )Nzusage_logger.enabledr   )r   r   get_boolr   rZ   r   s    r,   get_usage_loggerr      s7    $,//0FG'Hr.   )r@   r4   r   r   	threadingr   r   typingr   r   r	   r
   r   _abstract_loggerr   _utilsr   r   r   _filter_typesr   
_configurer   r   r   __annotations__r   ri   r.   r,   <module>r      sQ      " 3 3 1 7 7 % #z*v z*z ,0h'( /* r.   