
    &`i9                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
Zd dl
m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mZmZ d dlmZ d dlmZ d dlmZ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, d dl-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5  ej6        e7          Z8 edd          Z9 ej:        d          Z; G d de$e,          Z<dS )    N)ThreadPoolExecutor)asdict)datetime)Optional)Response)ActorID)TagKeyrecord_extra_usage_tag)env_integer)ActorTableData)!RAY_STATE_SERVER_MAX_HTTP_REQUEST)RAY_STATE_SERVER_MAX_HTTP_REQUEST_ALLOWED*RAY_STATE_SERVER_MAX_HTTP_REQUEST_ENV_NAME)LogsManager)StateAPIManager)do_replyhandle_list_apihandle_summary_apioptions_from_req)SubprocessModule)SubprocessRouteTable)ResponseType)HTTPStatusCodeRateLimitedModule)DEFAULT_DOWNLOAD_FILENAMEDEFAULT_LOG_LIMITDEFAULT_RPC_TIMEOUTGetLogOptions)DataSourceUnavailable)StateDataSourceClient(RAY_DASHBOARD_STATE_HEAD_TPE_MAX_WORKERS   s   \x5b[(0-9);]+mc                   b   e Zd ZdZd Zd Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd	                        Z ej        d
          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        dej                  ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                        Z ej        d          ej	        de
j        j        de
j        j        fd                         Z ej        d!          ej	        de
j        j        de
j        j        fd"                        Z ej        d#          de
j        j        fd$            Zd% Zd&S )'	StateHeadzModule to obtain state information from the Ray cluster.

    It is responsible for state observability APIs such as
    ray.list_actors(), ray.get_actor(), ray.summary_actors().
    c                 F   t          j        | g|R i | t          j        | t          t          t
                               d| _        d| _        d| _        t          t          d          | _        | j        J t          j        j                                        sJ dS )z>Initialize for handling RESTful requests from State API ClientNstate_head_executor)max_workersthread_name_prefix)r   __init__r   minr   r   _state_api_data_source_client
_state_api_log_apir   r!   	_executor
gcs_clientrayexperimentalinternal_kv_internal_kv_initialized)selfargskwargss      z/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/dashboard/modules/state/state_head.pyr)   zStateHead.__init__?   s    !$8888888"19 	
 	
 	
 .2*+@4
 
 
 ***+DDFFFFFFF    c           	      n   K   t          t          j        d| j         dt           dt
           d           S )Nz#Max number of in-progress requests=zB reached. To set a higher limit, set environment variable: export z='xxx'. Max allowed = status_codeerror_messageresult)r   r   TOO_MANY_REQUESTSmax_num_call_r   r   )r4   s    r7   limit_handler_zStateHead.limit_handler_W   sd      &8M%M M EM M "K	M M 

 

 

 
	
r8   z/api/v0/actorsreqreturnc                 z   K   t          t          j        d           t          | j        j        |           d {V S N1)r
   r	   CORE_STATE_API_LIST_ACTORSr   r,   list_actorsr4   rA   s     r7   rG   zStateHead.list_actorsd   sB       	v@#FFF$T_%@#FFFFFFFFFr8   z/api/v0/jobsc                 j  K   t          t          j        d           	 | j                            t          |                     d {V }t          t          j        dt          |                    S # t          $ r3}t          t          j        t          |          d           cY d }~S d }~ww xY w)NrE   )option r:   )r
   r	   CORE_STATE_API_LIST_JOBSr,   	list_jobsr   r   r   OKr   r   INTERNAL_ERRORstr)r4   rA   r=   es       r7   rM   zStateHead.list_jobsj   s       	v>DDD	?44<LS<Q<Q4RRRRRRRRF*- f~~   
 % 	 	 	*9!!ff        	s   AA5 5
B2?(B-'B2-B2z/api/v0/nodesc                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	   CORE_STATE_API_LIST_NODESr   r,   
list_nodesrH   s     r7   rT   zStateHead.list_nodes|   B       	v?EEE$T_%?EEEEEEEEEr8   z/api/v0/placement_groupsc                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	   $CORE_STATE_API_LIST_PLACEMENT_GROUPSr   r,   list_placement_groupsrH   s     r7   rX   zStateHead.list_placement_groups   sB      
 	vJCPPP$T_%JCPPPPPPPPPr8   z/api/v0/workersc                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	   CORE_STATE_API_LIST_WORKERSr   r,   list_workersrH   s     r7   r[   zStateHead.list_workers   B       	vA3GGG$T_%A3GGGGGGGGGr8   z/api/v0/tasksc                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	   CORE_STATE_API_LIST_TASKSr   r,   
list_tasksrH   s     r7   r_   zStateHead.list_tasks   rU   r8   z/api/v0/objectsc                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	   CORE_STATE_API_LIST_OBJECTSr   r,   list_objectsrH   s     r7   rb   zStateHead.list_objects   r\   r8   z/api/v0/runtime_envsc                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	    CORE_STATE_API_LIST_RUNTIME_ENVSr   r,   list_runtime_envsrH   s     r7   re   zStateHead.list_runtime_envs   sB       	vFLLL$T_%FLLLLLLLLLr8   z/api/v0/logsc                   K   t          t          j        d           |j                            dd          }|j                            dd          }|j                            dd          }t          |j                            dt                              }|s|st          t          j	        dd	          S |s | j
                            |           d{V }|st          t          j        d
| d	          S 	 | j
                            |||           d{V }n@# t          $ r3}t          t          j        t!          |          d	          cY d}~S d}~ww xY wt          t          j        d|	          S )zReturn a list of log files on a given node id.

        Unlike other list APIs that display all existing resources in the cluster,
        this API always require to specify node id and node ip.
        rE   glob*node_idNnode_iptimeoutzOBoth node id and node ip are not provided. Please provide at least one of them.r:   z1Cannot find matching node_id for a given node ip )glob_filterrK   )r
   r	   CORE_STATE_API_LIST_LOGSquerygetintr   r   r   BAD_REQUESTr-   ip_to_node_id	NOT_FOUND	list_logsr   rO   rP   rN   )r4   rA   rl   ri   rj   rk   r=   rQ   s           r7   rt   zStateHead.list_logs   s      	v>DDDimmFC00)--	400)--	400cimmI/BCCDD 	w 	*6;      	A M77@@@@@@@@G 	*4QQQ   		=22k 3        FF % 	 	 	*9!!ff        	 &)
 
 
 	
s   ?#D# #
E -(EE E z/api/v0/logs/{media_type})	resp_typec                 n   K   t          t          j        d           t          t	          |j                            dt                              |j                            dd          |j                            dd          |j                            dd          |j                            dd          |j                            d	t                    |j                            d
d          |j                            dd          |j                            dd          |j                            dd          |j                            dt                    |j                            dd          |j                            dd          |j                            dd                    }|j                            dd          }t          |t                    r|                                dk    }t                              d|            t                              d|            d
t           dt"          t$                   f fd}t&          j                            dd|j         di          }d |_         j                            ||          }	 |                                 d{V }|rt6                              d!|          }|                    |           d{V  |                    |           d{V  n# t>          $ r Y n{t@          j!        $ r |"                                  tF          $ rL}t          $                    d"           t&          j        %                    t          |          #          d}~ww xY w	 |2 3 d{V }	|rt6                              d!|	          }	|                    |	           d{V  @6 n=# tF          $ r0 t          $                    d"           |"                                  w xY w|&                                 d{V  |S )$z7
        Fetches logs from the given criteria.
        rE   rk   ri   Nrj   
media_typefilefilenamedownload_filenameactor_idtask_idsubmission_idpidlinesintervalsuffixoutattempt_numberr   )rk   ri   rj   rw   ry   rz   r{   r|   r}   r~   r   r   r   r   filter_ansi_codeFtruezStreaming logs with options: zFiltering ANSI escape codes: rB   c                    K   j                             |            d {V }t          |          dk    rd S ||          S )N)r{   r   )r/   async_get_all_actor_infolen)r{   actor_info_dictr4   s     r7   get_actor_fnz(StateHead.get_logs.<locals>.get_actor_fn   sj      $(O$L$L! %M % %      O ?##q((t"8,,r8   Content-Dispositionzattachment; filename="")headersz
text/plainr8   zError while streaming logs)text)'r
   r	   CORE_STATE_API_GET_LOGr   rp   rn   ro   r   
match_infor   r   
isinstancerP   lowerloggerinfor   r   r   aiohttpwebStreamResponserz   content_typer-   stream_logs	__anext__ANSI_ESC_PATTERNsubpreparewriteStopAsyncIterationasyncioCancelledErrorforce_close	Exception	exceptionHTTPInternalServerError	write_eof)
r4   rA   optionsfiltering_ansi_coder   responselogs_genfirst_chunkrQ   logss
   `         r7   get_logszStateHead.get_logs   sk      	v<cBBB	i1DEEFFIMM)T22IMM)T22~)),??Y]]:t44!imm#%>  Y]]:t44IMM)T22)-->>	eT**)--):;;Y]]:t449==5119==)91==%
 
 
* "imm,>FF)3// 	H"5";";"="="G=G==>>>I4GIIJJJ	- 	-Xn5M 	- 	- 	- 	- 	- 	- ;--%IW-FIII . 
 
 !-=,,WlCC	C ( 2 2 4 4444444K" E.223DD""3'''''''''..----------! 	 	 	D% 	 	 	   """ 	C 	C 	C9:::+553q665BBB	C		& + + + + + + +d& ;+//T::DnnT**********	 'h
  	 	 	9:::  """	
   """""""""s8   $A-L 
N,N
ANNO O";O :Pz/api/v0/tasks/summarizec                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	   CORE_STATE_API_SUMMARIZE_TASKSr   r,   summarize_tasksrH   s     r7   r   zStateHead.summarize_tasks,  sB       	vDcJJJ'(GMMMMMMMMMr8   z/api/v0/actors/summarizec                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	   CORE_STATE_API_SUMMARIZE_ACTORSr   r,   summarize_actorsrH   s     r7   r   zStateHead.summarize_actors2  sB       	vEsKKK'(H#NNNNNNNNNr8   z/api/v0/objects/summarizec                 z   K   t          t          j        d           t          | j        j        |           d {V S rD   )r
   r	    CORE_STATE_API_SUMMARIZE_OBJECTSr   r,   summarize_objectsrH   s     r7   r   zStateHead.summarize_objects8  sB       	vFLLL'(I3OOOOOOOOOr8   z/api/v0/tasks/timelinec                 J  K   |j                             d          }|j                             d          }| j                            |           d {V }|dk    r4t	          j                                        d          }d| d| d}d|i}nd }t          |d	|
          S )Njob_iddownloadrE   z%Y-%m-%d_%H-%M-%Szattachment; filename="timeline--z.json"r   zapplication/json)r   r   r   )rn   ro   r,   generate_task_timeliner   nowstrftimer   )r4   rA   r   r   r=   now_strcontent_dispositionr   s           r7   tasks_timelinezStateHead.tasks_timeline>  s       x((9==,,==fEEEEEEEEs??lnn--.ABBGJ&JJ7JJJ   -.ABGGGV2DgVVVVr8   z/api/v0/delay/{delay_s}c                    K   t          |j                            dd                    }t          j        |           d{V  t          t          j        di d          S )z/Testing only. Response after a specified delay.delay_s
   NrK   )r;   r<   r=   partial_failure_warning)rp   r   ro   r   sleepr   r   rN   )r4   rA   delays      r7   delayed_responsezStateHead.delayed_responseO  so       CN&&y"5566mE"""""""""&)$(	
 
 
 	
r8   c                    K   t          j        |            d {V  | j        }t          || j                  | _        t          | j        | j                  | _        t          | j                  | _
        d S )N)r   runaiogrpc_gcs_channelr    r/   r+   r   r.   r,   r   r-   )r4   gcs_channels     r7   r   zStateHead.run[  s      "4(((((((((.-B.
 .
* *.N
 
 $D$FGGr8   N) __name__
__module____qualname____doc__r)   r@   routesro   r   enforce_max_concurrent_callsr   r   Requestr   rG   rM   rT   rX   r[   r_   rb   re   rt   r   STREAMr   r   r   r   r   r   r    r8   r7   r$   r$   8   sv        G G G0
 
 
 VZ !!3GW[%8 GW[=Q G G G 43 "!G VZ37;#6 7;;O    43    VZ  3FGK$7 FGK<P F F F 43 ! F VZ*++3Q;&Q		Q Q Q 43 ,+Q VZ!""3Hgk&9 Hgk>R H H H 43 #"H VZ  3FGK$7 FGK<P F F F 43 ! F VZ!""3Hgk&9 Hgk>R H H H 43 #"H VZ&''3M7;+> M7;CW M M M 43 ('M VZ3/
7;#6 /
7;;O /
 /
 /
 43  /
b VZ+|7JKKK3S'+"5 S'+:N S S S 43 LKSj VZ)**3N)< NAU N N N 43 +*N VZ*++3O'+*= O'+BV O O O 43 ,+O VZ+,,3P7;+> P7;CW P P P 43 -,P VZ())3W(; W@T W W W 43 *)W VZ)**	
'+*= 	
 	
 	
 +*	

H 
H 
H 
H 
Hr8   r$   )=r   loggingreconcurrent.futuresr   dataclassesr   r   typingr   aiohttp.webr   r   r0   r   ray._common.usage.usage_libr	   r
   ray._private.ray_constantsr   ray.core.generated.gcs_pb2r   ray.dashboard.constsr   r   r   %ray.dashboard.modules.log.log_managerr   ray.dashboard.state_aggregatorr   ray.dashboard.state_api_utilsr   r   r   r   !ray.dashboard.subprocesses.moduler   !ray.dashboard.subprocesses.routesr   r    ray.dashboard.subprocesses.utilsr   ray.dashboard.utilsr   r   ray.util.state.commonr   r   r   r   ray.util.state.exceptionr   ray.util.state.state_managerr    	getLoggerr   r   r!   compiler   r$   r   r8   r7   <module>r      s     				 1 1 1 1 1 1                                   



       F F F F F F F F 2 2 2 2 2 2 5 5 5 5 5 5         
 > = = = = = : : : : : :            ? > > > > > L L L L L L 9 9 9 9 9 9 A A A A A A A A            ; : : : : : > > > > > >		8	$	$
 ,7;., , (
 2:@AA mH mH mH mH mH "3 mH mH mH mH mHr8   