
    &`i
C                     .   d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
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mZmZ d d	lmZ e ed
           e j        e          Z ej         d          Z! G d de          Z" G d d          Z#dS )    N)defaultdict)AsyncIterable	AwaitableCallableDictListOptionalTuple)ActorIDNodeIDWorkerID)	BaseModel)ActorTableData)JOB_LOGS_PATH_TEMPLATE)DEFAULT_RPC_TIMEOUTGetLogOptionsprotobuf_to_task_state_dict)StateDataSourceClientz3Please install pydantic via `pip install pydantic`.z0.*worker-([0-9a-f]+)-([0-9a-f]+)-(\d+).(out|err)c                   P    e Zd ZU eed<   eed<   ee         ed<   ee         ed<   dS )ResolvedStreamFileInfonode_idfilenamestart_offset
end_offsetN)__name__
__module____qualname__str__annotations__r	   int     y/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/dashboard/modules/log/log_manager.pyr   r      sJ         LLL MMM 3- r"   r   c                      e Zd ZdefdZedefd            Zdee         dee         fdZ		 d#ded	e
d
edeeee         f         fdZdedeegeee                  f         dee         fdZdedeeef         fdZdedee         dee
         ded	e
dee         fdZdedeegeee                  f         ded	e
fdZdede
ded	e
fdZdddddddeddd
dee         dee         dee         dee         dee
         dee         deeegeee                  f                  d	e
dedee         defd Zd!ee         deeee         f         fd"ZdS )$LogsManagerdata_source_clientc                     || _         d S Nclient)selfr&   s     r#   __init__zLogsManager.__init__+   s    (r"   returnc                     | j         S r(   r)   )r+   s    r#   r&   zLogsManager.data_source_client.   s
    {r"   node_ipc                 F   K   | j                             |           d{V S )zResolve the node id in hex from a given node ip.

        Args:
            node_ip: The node ip.

        Returns:
            node_id if there's a node id that matches the given node ip and is alive.
            None otherwise.
        N)r*   ip_to_node_id)r+   r/   s     r#   r1   zLogsManager.ip_to_node_id2   s0       [..w777777777r"   *r   timeoutglob_filterc                    K   | j                             |||           d{V }|                     |j                  S )a  Return a list of log files on a given node id filtered by the glob.

        Args:
            node_id: The node id where log files present.
            timeout: The timeout of the API.
            glob_filter: The glob filter to filter out log files.

        Returns:
            Dictionary of {component_name -> list of log files}

        Raises:
            ValueError: If a source is unresponsive.
        r3   N)r*   	list_logs_categorize_log_files	log_files)r+   r   r3   r4   replys        r#   r7   zLogsManager.list_logs>   sL        k++G['+RRRRRRRR))%/:::r"   optionsget_actor_fnc                  K   |j         }| |                     |j                   d{V }|                     ||j        |j        |j        |j        |j        ||j	        |j
        |j        
  
         d{V }|j        dk    }| j                            |j         |j        ||j        |j        |s|j	        nd|j        |j                   d{V }|2 3 d{V }|j        W V  6 dS )zGenerate a stream of logs in bytes.

        Args:
            options: The option for streaming logs.

        Return:
            Async generator of streamed logs in bytes.
        N
r   log_filenameactor_idtask_idattempt_numberpidr<   r3   suffixsubmission_idstream)r   log_file_name
keep_alivelinesintervalr3   r   r   )r   r1   r/   resolve_filenamer   r@   rA   rB   rC   r3   rD   rE   
media_typer*   
stream_logrI   rJ   r   r   data)r+   r;   r<   r   resrH   rF   streamed_logs           r#   stream_logszLogsManager.stream_logsQ   si      /? ..w????????G)) )%O"1%O>!/ * 
 
 
 
 
 
 
 
 '83
{--K,!-% ,6?GOO4)~ . 
 
 
 
 
 
 
 
 #) 	$ 	$ 	$ 	$ 	$ 	$ 	$,###### #)&&s   C'
sub_job_idc                 ,  K   | j                             t                     d{V }d}|D ]}|j        |k    r|} n| t                              d| d           dS |j        }|t          d| d          t          j	        |          }||fS )	zReturn the log file name and node id for a given job submission id.

        Args:
            sub_job_id: The job submission id.

        Returns:
            The log file name and node id.
        r6   NzSubmission job ID  not found.)NNzJob zH has no driver node id info. This is likely a bug. Please file an issue.)rE   )
r*   get_job_infor   rE   loggerinfodriver_node_id
ValueErrorr   format)r+   rR   	job_infos
target_jobjob_infor   r?   s          r#   _resolve_job_filenamez!LogsManager._resolve_job_filename   s       +22;N2OOOOOOOO	
! 	 	H%33%
 4 KKDZDDDEEE:)?>z > > >  
 .4:NNN$$r"   node_id_hexworker_id_hexrC   rD   c                   K   ||t          d| d| d          |%|                     ||d| d|            d{V }n$|                     ||d| d|            d{V }g |d         |d         D ]}|8t                              |                              d	          }||k    r|c S <t          t                              |                              d
                    }	|	|k    r|c S dS )zResolve worker log file.NzOnly one of worker id(z	) or pid(z) should beprovided.r2   )r4   
worker_out
worker_err      )rY   r7   WORKER_LOG_PATTERNmatchgroupr    )
r+   r_   r`   rC   rD   r3   r9   r   worker_id_from_filenameworker_pid_from_filenames
             r#   _resolve_worker_filez LogsManager._resolve_worker_file   s      $       
 $"nnW2Nm2N2Nf2N2N -        II #nnW2Dc2D2DF2D2D -        I
 M)L1LIl4KL 	$ 	$H(*<*B*B8*L*L*R*RST*U*U'*m;;#OOO < ,/&,,X66<<Q??, ,( ,s22#OOO 3tr"   r@   c                   K   |t          d           ||           d{V }|t          d| d          |j        j        }|st          d| d          t          |          }|j        j        }|st          d| d          t          |          }	|                     |	                                |                                d||           d{V }
|	                                |
fS )	a  Resolve actor log file.

        Args:
            actor_id: The actor id.
            get_actor_fn: The function to get actor information.
            suffix: The suffix of the log file.
            timeout: Timeout in seconds.

        Returns:
            The log file name and node id.

        Raises:
            ValueError: If actor data is not found or get_actor_fn is not provided.
        Nz/get_actor_fn needs to be specified for actor_idz	Actor ID rT   zWorker ID for Actor ID z' not found. Actor is not scheduled yet.zNode ID for Actor ID r_   r`   rC   rD   r3   )rY   address	worker_idr   r   r   rk   hex)r+   r@   r<   rD   r3   
actor_dataworker_id_binaryro   node_id_binaryr   r?   s              r#   _resolve_actor_filenamez#LogsManager._resolve_actor_filename   sb     * NOOO'<11111111
>>>>??? &-7 	.( . . .   -..	#+3 	. . . .   ((!66#--// 7 
 
 
 
 
 
 
 
 {{}}l**r"   rA   rB   c                   K   d}d}d}d}|dvrt          d| d          | j                            dd|fg|           d{V }	t          |	j                  dk    rt          d	| d
| d|           d}
|	j        D ]}|j        |k    r|}
 n|
t          d| d| d          t          |
          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|t          d| d| d          ||t          d| d| d          |t          d| d| d| d| d| 
          |dk    rdnd}|                    |d          }|t          d| d| d |           |                    d!| d"d          }|                    d!| d#d          }||||fS )$a  Resolve log file for a task.

        Args:
            task_id: The task id.
            attempt_number: The attempt number.
            suffix: The suffix of the log file, e.g. out or err.
            timeout: Timeout in seconds.

        Returns:
            The log file name, node id, the start and end offsets of the
            corresponding task log in the file.

        Raises:
            FileNotFoundError: If the log file is not found.
            ValueError: If the suffix is not out or err.
        NouterrSuffix z is not supported.rA   =)filtersr3   r   z"Could not find log file for task: z
 (attempt z) with suffix: z)Could not find log file for task attempt:()ro   r   task_log_infor@   z)Could not find log file for task attempt.z) due to missing node info.z1For actor task, please query actor log for actor(z): e.g. ray logs actor --id z . Or set RAY_ENABLE_RECORD_ACTOR_TASK_LOGGING=1 in actor's runtime env or when starting the cluster. Recording actor task's log could be expensive, so Ray turns it off by default.z).Worker id = z, node id = z,log_info = rw   stdout_filestderr_filezMissing log filename info in z
 for task z	,attempt std_start_end)	rY   r*   get_all_task_infolenevents_by_taskFileNotFoundErrorrB   r   get)r+   rA   rB   rD   r3   r?   r   r   r   r:   
task_eventttaskro   log_infor@   filename_keys                    r#   _resolve_task_filenamez"LogsManager._resolve_task_filename   sT     & 
''AvAAABBBk33g./ 4 
 
 
 
 
 
 
 
 u#$$))#EW E E+E E<BE E   
% 	 	A>11
 2 #// /+/ / /  
 +:66HH[$//	((9d++88OT2288J--?#II I+I I I  
  4 $=!= =?G= = =   #)) )+) )() )6=) ) ') )   )/%}}]||L$77#, , ,G , ,), ,  
  ||$8&$8$8$8$??\\"4"4"4"4d;;
lJ>>r"   Nrw   r>   r?   rE   c       
         Z  K   d}d}|	dvrt          d|	 d          |r4|                     t          j        |          ||	|           d{V \  }}n}|r$|                     |||	|           d{V \  }}}}nW|
r|                     |
           d{V \  }}n6|r4|t          d|           |                     |d||	|           d{V }|(t          d| d| d	| d
| d| d|	 d|
 d| d          t          ||||          }t          
                    d|            |S )a  Return the file name given all options.

        Args:
            node_id: The node's id from which logs are resolved.
            log_filename: Filename of the log file.
            actor_id: Id of the actor that generates the log file.
            task_id: Id of the task that generates the log file.
            pid: Id of the worker process that generates the log file.
            get_actor_fn: Callback to get the actor's data by id.
            timeout: Timeout for the gRPC to listing logs on the node
                specified by `node_id`.
            suffix: Log suffix if no `log_filename` is provided, when
                resolving by other ids'. Default to "out".
            submission_id: The submission id for a submission job.
        Nrv   ry   z is not supported. z=Node id needs to be specified for resolving filenames of pid rm   z^Could not find a log file. Please make sure the given option exists in the cluster.
	node_id: z
	filename: z
	actor_id: z
	task_id: z
	pid: z

	suffix: z
	submission_id: z
	attempt_number: 
)r   r   r   r   zResolved log file: )rY   rt   r   from_hexr   r^   rk   r   r   rV   rW   )r+   r   r?   r@   rA   rB   rC   r<   r3   rD   rE   r   r   rO   s                 r#   rK   zLogsManager.resolve_filenameV  sv     > 
''BvBBBCCC  	*.*F*F **L&'+ + % % % % % %!G\\  	 11       

  	*.*D*D]*S*S$S$S$S$S$S$S!G\\ 	 /),/ /   "&!:!:#" "; " "      L #	8%	8 	8  ,	8 	8  (		8 	8
 &	8 	8 	8 	8 $	8 	8 %2	8 	8 &4	8 	8 	8   %!%!	
 
 
 	/#//000
r"   r9   c                    t          t                    }|D ]}d|v r1|                    d          r|d                             |           8d|v r1|                    d          r|d                             |           md|v r1|                    d          r|d                             |           d	|v r1|                    d          r|d
                             |           d|v r|d                             |           d|v r|d                             |           d|v r|d                             |           9d|v r|d                             |           Zd|v r|d                             |           {d|v r|d                             |           |d                             |           |S )zCategorize the given log files after filterieng them out using a given glob.

        Returns:
            Dictionary of {component_name -> list of log files}
        workerz.outrb   z.errrc   zcore-workerz.logcore_workerzcore-driverdriverzraylet.rayletzgcs_server.
gcs_serverlog_monitorinternalmonitor
autoscalerzagent.agentz
dashboard.	dashboard)r   listendswithappend)r+   r9   resultlog_files       r#   r8   z!LogsManager._categorize_log_files  s    T""! 	4 	4H8##):):6)B)B#|$++H5555X%%8+<+<V+D+D%|$++H5555(**x/@/@/H/H*}%,,X6666(**x/@/@/H/H*x ''1111h&&x ''1111(**|$++H5555(**z"))(3333h&&|$++H5555X%%w&&x0000)){#**84444z"))(3333r"   )r2   )r   r   r   r   r,   propertyr&   r	   r   r1   r    r   r   r7   r   r   r   r   r   r   bytesrQ   r
   r^   rk   rt   r   r   r   rK   r8   r!   r"   r#   r%   r%   *   sZ       )+@ ) ) ) ) $9    X
88C= 
8Xc] 
8 
8 
8 
8 >A; ;;%(;7:;	c49n	; ; ; ;&.$.$ y)H^4L*MMN.$ 
u		.$ .$ .$ .$`%c %eCHo % % % %:%%  }% c]	%
 % % 
#% % % %N3+3+ y)H^4L*MMN3+ 	3+
 3+ 3+ 3+ 3+jZ?Z?,/Z?9<Z?GJZ? Z? Z? Z?~ "&&*"&!%(,! *'+[ [ [ #[ sm	[
 3-[ #[ ![ c][ gY	(>*B CCD
[ [ [  }[ 
 [ [ [ [ztCy T#tCy.=Q      r"   r%   )$loggingrecollectionsr   typingr   r   r   r   r   r	   r
   rayr   r   r   ray._common.pydantic_compatr   ray.core.generated.gcs_pb2r    ray.dashboard.modules.job.commonr   ray.util.state.commonr   r   r   ray.util.state.state_managerr   ModuleNotFoundError	getLoggerr   rV   compilerf   r   r%   r!   r"   r#   <module>r      s    				 # # # # # # R R R R R R R R R R R R R R R R R R ) ) ) ) ) ) ) ) ) ) 1 1 1 1 1 1 5 5 5 5 5 5 C C C C C C         
 ? > > > > >

S
T
TT 
	8	$	$RZ STT     Y    h h h h h h h h h hr"   