o
    $i(                     @   s  d dl Z d dlZd dlZd dl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
mZ d dlmZ d dlmZ d dlmZ eeZdd ZG d	d
 d
ZdejdefddZe Zi adejdefddZdedee fddZdededefddZ dS )    N)datetime)DictOptional)Parse)message_to_dict)Eventc                   C   s   d dd tdD S )N c                 S   s   g | ]}t tjqS  )randomchoicestring	hexdigits).0_r	   r	   \/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/ray/_private/event/event_logger.py
<listcomp>   s    z get_event_id.<locals>.<listcomp>$   )joinranger	   r	   r	   r   get_event_id   s   r   c                   @   s   e Zd ZdejdejfddZddee	e	f fddZ
d	e	fd
dZd	e	fddZd	e	fddZd	e	fddZd	e	fddZd	e	fddZdejd	e	fddZdS )EventLoggerAdaptersourceloggerc                 C   s4   || _ || _t | _t | _t	 | _
i | _dS )zAdapter for the Python logger that's used to emit events.

        When events are emitted, they are aggregated and available via
        state API and dashboard.

        This class is thread-safe.
        N)r   r   socketgethostnamesource_hostnameosgetpid
source_pid	threadingLocklockglobal_context)selfr   r   r	   r	   r   __init__   s   



zEventLoggerAdapter.__init__Nr"   c                 C   s:   | j  |si n|| _W d   dS 1 sw   Y  dS )zuSet the global metadata.

        This method overwrites the global metadata if it is called more than once.
        N)r!   r"   )r#   r"   r	   r	   r   set_global_context,   s   "z%EventLoggerAdapter.set_global_contextmessagec                 K      | j tjj|fi | d S N)_emitr   SeverityTRACEr#   r&   kwargsr	   r	   r   trace4      zEventLoggerAdapter.tracec                 K   r'   r(   )r)   r   r*   DEBUGr,   r	   r	   r   debug7   r/   zEventLoggerAdapter.debugc                 K   r'   r(   )r)   r   r*   INFOr,   r	   r	   r   info:   r/   zEventLoggerAdapter.infoc                 K   r'   r(   )r)   r   r*   WARNINGr,   r	   r	   r   warning=   r/   zEventLoggerAdapter.warningc                 K   r'   r(   )r)   r   r*   ERRORr,   r	   r	   r   error@   r/   zEventLoggerAdapter.errorc                 K   r'   r(   )r)   r   r*   FATALr,   r	   r	   r   fatalC   r/   zEventLoggerAdapter.fatalseverityc              
   K   s   t  }t |_tt  |_||_||_d|_	| j
|_| j|_| j|_|j}| j | j D ]\}}|d urA|d urA|||< q1W d    n1 sLw   Y  | D ]\}}|d ure|d ure|||< qU| jtt|dddd | jjd   d S )Nr   TF)$always_print_fields_with_no_presencepreserving_proto_field_nameuse_integers_for_enumsr   )r   r   event_idintr   now	timestampr&   r:   labelr   source_typer   r   custom_fieldsr!   r"   itemsr   r3   jsondumpsr   handlersflush)r#   r:   r&   r-   eventrD   kvr	   r	   r   r)   F   s@   zEventLoggerAdapter._emitr(   )__name__
__module____qualname__r   
SourceTypeloggingLoggerr$   r   strr%   r.   r1   r3   r5   r7   r9   r*   r)   r	   r	   r	   r   r      s    r   r   sink_dirc                 C   s~   t d}|t j t|d }|d|  d }|jdd |jdd t |}t 	d}|
| || d|_|S )	N_ray_event_loggereventsevent_z.logT)exist_okz%(message)sF)rQ   	getLoggersetLevelr2   pathlibPathmkdirtouchFileHandler	FormattersetFormatter
addHandler	propagate)r   rT   r   dir_pathfilepathhandler	formatterr	   r	   r   _build_event_file_loggerk   s   




rh   c                 C   s\   t " tj| }|tvrt||}t| |t|< t| W  d   S 1 s'w   Y  dS )ap  Get the event logger of the current process.

    There's only 1 event logger per (process, source).

    TODO(sang): Support more impl than file-based logging.
                Currently, the interface also ties to the
                file-based logging impl.

    Args:
        source: The source of the event.
        sink_dir: The directory to sink event logs.
    N)_event_logger_lockr   rP   Name_event_loggerrh   r   )r   rT   source_namer   r	   r	   r   get_event_logger   s   
$rm   	event_strreturnc                 C   s4   zt | t W S  ty   td|   Y dS w )zParse an event from a string.

    Args:
        event_str: The string to parse. Expect to be a JSON serialized
            Event protobuf.

    Returns:
        The parsed event if parsable, else None
    zFailed to parse event: N)r   r   	Exceptionglobal_logger	exception)rn   r	   r	   r   parse_event   s   
rs   rJ   filter_event_levelc                 C   sb   t jjdt jjdt jjdt jjdt jjdt jjdi}| }t j	|}|| j
 || k r/dS dS )	a*  Filter an event based on event level.

    Args:
        event: The event to filter.
        filter_event_level: The event level string to filter by. Any events
            that are lower than this level will be filtered.

    Returns:
        True if the event should be filtered, else False.
    r                  TF)r   r*   r+   r0   r2   r4   r6   r8   upperValuer:   )rJ   rt   event_levelsr	   r	   r   filter_event_by_level   s   	r}   )!rF   rQ   r   r[   r
   r   r   r   r   typingr   r   google.protobuf.json_formatr   ray._private.protobuf_compatr   ray.core.generated.event_pb2r   rY   rM   rq   r   r   rP   rS   rh   r    ri   rk   rm   rs   boolr}   r	   r	   r	   r   <module>   s,    
S