o
    bi*                     @   s   d dl Z d dlmZ d dl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 d d	lmZmZ e eZG d
d dZdS )    N)defaultdict)DictListOptional)EventLoggerAdapter)NodeTypeConfig)NodeType)ResourceRequestUtil)ClusterResourceConstraintGangResourceRequestResourceRequest)LaunchRequestTerminationRequestc                   @   s   e Zd ZdZdefddZ					ddeeef deee	f de
ee  d	e
ee  d
e
ee  de
ee  de
ee  ddfddZdS )AutoscalerEventLoggerz
    Logs events related to the autoscaler.

    # TODO:
    - Add more logging for other events.
    - Rate limit the events if too spammy.
    loggerc                 C   s
   || _ d S )N)_logger)selfr    r   R/home/ubuntu/.local/lib/python3.10/site-packages/ray/autoscaler/v2/event_logger.py__init__   s   
zAutoscalerEventLogger.__init__Nnode_type_configscluster_shapelaunch_requeststerminate_requestsinfeasible_requestsinfeasible_gang_requests'infeasible_cluster_resource_constraintsreturnc                 C   sv  |r8t t}|D ]}	||	j  |	j7  < qt| D ]\}
\}}d| d| d}| j|  t|  q|rt t}|D ]}	||	j	|	jf  d7  < q@t
jjdt
jjdt
jjdt
jjdi}t| D ]#\}
\\}}}d	| d
| d||  d}| j|  t|  qg|s|rt t}| D ]\}}|| }|j D ]\}}||  || 7  < qq|dd}dt| d}d|v r|dt|d  d7 }d|v r|dt|d  d7 }| j| d | jdt| d |r2t|}d}t|D ]"\}
}t|j}|| d|j 7 }|
t|d k r&|d7 }q|d7 }| j| |ry|D ]A}dj|jd}t|j}t|D ]"\}
}t|j}|| d|j 7 }|
t|d k rk|d7 }qJ|d7 }| j| q7|r|D ]:}d}t|jD ]#\}}t|j}|| d|j 7 }|t|jd k r|d7 }q|d7 }| j| q~dS dS )zA
        Log any update of the cluster scheduling state.
        zAdding z node(s) of type .   outdatedz"max number of worker nodes reachedz+max number of worker nodes per type reachedidlez	Removing z nodes of type z (z).CPUr   zResized to z CPUsGPUz, z GPUsTPUz TPUszCurrent cluster shape: z6No available node types can fulfill resource requests *z@. Add suitable node types to this cluster to resolve this issue.zQNo available node types can fulfill placement group requests (detail={details}): )detailsz8No available node types can fulfill cluster constraint: N)r   intinstance_typecount	enumerateitemsr   infor   causer   CauseOUTDATEDMAX_NUM_NODESMAX_NUM_NODE_PER_TYPEIDLEfloat	resourcesgetdebugdictr	   group_by_countto_resource_maprequestlenwarningformatr&   requestsresource_requests)r   r   r   r   r   r   r   r   launch_type_countreqidxr(   r)   log_strtermination_by_causes_and_typecause_reason_mapr-   total_resources	node_typenode_configresource_nameresource_quantitynum_cpusrequests_by_count	req_countresource_mapgang_requestinfeasible_constraintir   r   r   log_cluster_scheduling_update   s   
z3AutoscalerEventLogger.log_cluster_scheduling_update)NNNNN)__name__
__module____qualname____doc__r   r   r   r   r   r'   r   r   r   r   r   r   r
   rR   r   r   r   r   r      s6    





r   )loggingcollectionsr   typingr   r   r   ray._private.event.event_loggerr   )ray.autoscaler.v2.instance_manager.configr   ray.autoscaler.v2.schemar   ray.autoscaler.v2.utilsr	   !ray.core.generated.autoscaler_pb2r
   r   r   'ray.core.generated.instance_manager_pb2r   r   	getLoggerrS   r   r   r   r   r   r   <module>   s    
