
    &`i]?                        d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmc m	Z
 d dlmc mZ d dlmZmZ d dlmZmZmZmZmZmZ d dlmZmZmZmZ d dlmZ d dlm Z!  ej"        e#          Z$e$%                    ej&                   dZ'd	Z(d
Z)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7d Z8 G d de9          Z: G d de          Z;dS )    N)quote)!PROMETHEUS_SERVICE_DISCOVERY_FILESESSION_LATEST)generate_data_grafana_dashboard"generate_default_grafana_dashboard+generate_serve_deployment_grafana_dashboard generate_serve_grafana_dashboard$generate_serve_llm_grafana_dashboard generate_train_grafana_dashboard)DASHBOARD_PROVISIONING_TEMPLATEGRAFANA_DATASOURCE_TEMPLATEGRAFANA_INI_TEMPLATEPROMETHEUS_YML_TEMPLATE)SubprocessModule)SubprocessRouteTableRAY_METRICS_OUTPUT_ROOTzhttp://localhost:9090RAY_PROMETHEUS_HOSTz{}RAY_PROMETHEUS_HEADERS
PrometheusRAY_PROMETHEUS_NAMEz	-/healthyzhttp://localhost:3000RAY_GRAFANA_HOSTRAY_GRAFANA_ORG_ID1RAY_GRAFANA_CLUSTER_FILTERDISABLEDRAY_GRAFANA_IFRAME_HOST(RAY_METRICS_GRAFANA_DASHBOARD_OUTPUT_DIRz
api/healthc                 T   t          j        |           }t          |t                    r-t	          d |                                D                       r|S t          |t                    rt	          d |D                       r|S t          t           ddz   dz   dz   dz             )Nc              3   p   K   | ]1\  }}t          |t                    ot          |t                    V  2d S N
isinstancestr).0kvs      ~/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/dashboard/modules/metrics/metrics_head.py	<genexpr>z%parse_prom_headers.<locals>.<genexpr>>   s?      TTTQz!S!!8jC&8&8TTTTTT    c              3   n   K   | ]0}t          |          d k    ot          d |D                       V  1dS )   c              3   @   K   | ]}t          |t                    V  d S r    r!   )r$   r&   s     r'   r(   z/parse_prom_headers.<locals>.<genexpr>.<genexpr>A   s,      "A"A!:a#5#5"A"A"A"A"A"Ar)   N)lenall)r$   es     r'   r(   z%parse_prom_headers.<locals>.<genexpr>A   sH      RRas1vv{As"A"Aq"A"A"AAARRRRRRr)   z0 should be a JSON string in one of the formats:
z11) An object with string keys and string values.
z:2) an array of string arrays with 2 string elements each.
z*For example, {"H1": "V1", "H2": "V2"} and
z5[["H1", "V1"], ["H2", "V2"], ["H2", "V3"]] are valid.)	jsonloadsr"   dictr.   itemslist
ValueErrorPROMETHEUS_HEADERS_ENV_VAR)prometheus_headersparseds     r'   parse_prom_headersr9   ;   s    Z*++F&$ TTV\\^^TTTTT 	M&$ RR6RRRRR 	M
%XXX
>	?
G	H 8	8 B		B  r)   c                        e Zd Z fdZ xZS )PrometheusQueryErrorc                 n    d| d| | _         t                                          | j                    d S )Nz-Error fetching data from prometheus. status: z, message: )messagesuper__init__)selfstatusr=   	__class__s      r'   r?   zPrometheusQueryError.__init__M   sK    44 4*14 4 	 	&&&&&r)   )__name__
__module____qualname__r?   __classcell__rB   s   @r'   r;   r;   L   s8        ' ' ' ' ' ' ' ' 'r)   r;   c                        e Zd Z fdZ ej        d          dej        j        fd            Z	 ej        d          d             Z
d Zd Z fd	Zd
 Z xZS )MetricsHeadc                     t                      j        |i | t          j                            t
          t                    | _        t          j                            t          t                    | _
        t          j                            | j        d          }t          t          j                            t          t                               | _        t          j                            | j        t&          d          }t          j                            t(          |          | _        t          j                            t(          |          | _        t          j                            | j        d          | _        t          j                            | j        d          | _        t          j                            t2          t          j                            | j        d                    | _        t          j                            t6          t8                    | _        t          j                            t<          t>                    | _         t          j                            tB                    | _"        i | _#        d S )Nmetricsgrafana
dashboards)$r>   r?   osenvirongetGRAFANA_HOST_ENV_VARDEFAULT_GRAFANA_HOSTgrafana_hostPROMETHEUS_HOST_ENV_VARDEFAULT_PROMETHEUS_HOSTprometheus_hostpathjoinsession_dirr9   r6   DEFAULT_PROMETHEUS_HEADERSr7   temp_dirr   METRICS_OUTPUT_ROOT_ENV_VAR_metrics_root_metrics_root_session_latest_grafana_config_output_path*_grafana_session_latest_config_output_path$GRAFANA_DASHBOARD_OUTPUT_DIR_ENV_VAR_grafana_dashboard_output_dirPROMETHEUS_NAME_ENV_VARDEFAULT_PROMETHEUS_NAME_prometheus_nameGRAFANA_ORG_ID_ENV_VARDEFAULT_GRAFANA_ORG_ID_grafana_org_idGRAFANA_CLUSTER_FILTER_ENV_VAR_grafana_cluster_filter_dashboard_uids)r@   argskwargsdefault_metrics_rootsession_latest_metrics_rootrB   s        r'   r?   zMetricsHead.__init__V   s   $)&)))JNN+?AUVV!z~~#%< 
  
  "w||D,<iHH"4JNN** #
 #
 ')gllM>9'
 '
#  Z^^')=
 
 -/JNN')D-
 -
) ,.7<<8JI+V+V(:<',,-y;
 ;
7 .0Z^^0GLL9<HH.
 .
*
 !#
#%<!
 !
  "z~~"$: 
  
 (*z~~6T'U'U$  "r)   z/api/grafana_healthreturnc                 ,  K   | j         t          k    r+t          j        t          j        j        dt                    S t          j        	                    t          | j                   }| j          dt           }	 | j        	                    |          4 d{V }|j        dk    r=t          j        t          j        j        d|j                  cddd          d{V  S |                                 d{V }|d         d	k    r>t          j        t          j        j        d
|j        |          cddd          d{V  S t          j        t          j        j        d|| j        | j        | j        | j        | j                  cddd          d{V  S # 1 d{V swxY w Y   dS # t*          $ rY}t,                              d|           t          j        t          j        j        dt1          |                    cY d}~S d}~ww xY w)z<
        Endpoint that checks if Grafana is running
        zGrafana disabled)status_coder=   rS   /N   zGrafana healthcheck failedrr   r=   rA   databaseokz,Grafana healthcheck failed. Database not ok.)rr   r=   rA   r0   zGrafana running)rr   r=   rS   grafana_org_idsession_namedashboard_uidsdashboard_datasourcegrafana_cluster_filterz4Error fetching grafana endpoint. Is grafana running?exc_info)rr   r=   	exception)rS   GRAFANA_HOST_DISABLED_VALUEdashboard_optional_utilsrest_responsedashboard_utilsHTTPStatusCodeOKrN   rO   rP   GRAFANA_IFRAME_HOST_ENV_VARGRAFANA_HEALTHCHECK_PATHhttp_sessionrA   INTERNAL_ERRORr0   rh   ry   rk   re   rj   	Exceptionloggerdebugr#   )r@   reqgrafana_iframe_hostrW   respr0   r/   s          r'   grafana_healthzMetricsHead.grafana_health   s9       ;;;+9+:=*8    !jnn'):
 
 #@@&>@@&	(,,T22       d;#%%3A$3$B$Q <#{                "YY[[((((((
#t++3A$3$B$Q N#{!	               " 0= / > A-!4#'#7!%!2#'#7)-)>+/+G	 	 	#                             8  		 		 		LLFQR     ,9+:I4a&&        		s]   : F0 6FF0 #AF4F0 AF
F0 
F''F0 *F'+F0 0
H:AHHHz/api/prometheus_healthc                 l  K   	 | j          dt           }| j                            || j                  4 d {V 	 }|j        dk    r=t          j        t          j	        j
        d|j                  cd d d           d {V  S t          j        t          j	        j        d          cd d d           d {V  S # 1 d {V swxY w Y   d S # t          $ rY}t                              d|	           t          j        t          j	        j
        dt          |          
          cY d }~S d }~ww xY w)Nrs   headersrt   zprometheus healthcheck failed.ru   zprometheus running)rr   r=   z:Error fetching prometheus endpoint. Is prometheus running?r}   )rr   r=   reason)rV   PROMETHEUS_HEALTHCHECK_PATHr   rP   r7   rA   r   r   r   r   r   r   r   r   r   r#   )r@   r   rW   r   r/   s        r'   prometheus_healthzMetricsHead.prometheus_health   s1     	*JJ-HJJD(,,d5 -          ;#%%3A$3$B$Q @#{  	              0= / > A0                                 	 	 	LLLWX     ,9+:I81vv        		sM   8C 6B=3C $B=*C =
CC 
CC 
D3AD.(D3.D3c                 r   t           j                            | j                  rt	          j        | j                   t          j        | j        d           t           j                            | j        d          }t           j                            | j        d          }t          t           j                            | j        d          d          5 }|
                    t          j        |                     ddd           n# 1 swxY w Y   t           j                            |d          }t          j        |d           t          t           j                            |d	          d          5 }|
                    t          j        | j        
                     ddd           n# 1 swxY w Y   t           j                            t"          t$                    }t'          t           j                            t(          t*                              }g }t-          |t.                    r|}n6t-          |t0                    r!t/          |                                          }t           j                            |d          }t          j        |d           t          j        | j        d           t          t           j                            |d	          d          5 }|
                    t5          || j        d t9          |          D             d t9          |          D                                  ddd           n# 1 swxY w Y   t          t           j                            | j        d          d          5 }t;                      \  }	| j        d<   |
                    |	           ddd           n# 1 swxY w Y   t          t           j                            | j        d          d          5 }t?                      \  }	| j        d<   |
                    |	           ddd           n# 1 swxY w Y   t          t           j                            | j        d          d          5 }tA                      \  }	| j        d<   |
                    |	           ddd           n# 1 swxY w Y   t          t           j                            | j        d          d          5 }tC                      \  }	| j        d<   |
                    |	           ddd           n# 1 swxY w Y   t          t           j                            | j        d          d          5 }tE                      \  }	| j        d<   |
                    |	           ddd           n# 1 swxY w Y   t          t           j                            | j        d          d          5 }tG                      \  }	| j        d<   |
                    |	           ddd           dS # 1 swxY w Y   dS )zY
        Creates the Grafana configurations that are by default provided by Ray.
        Texist_okprovisioningzgrafana.iniw)grafana_provisioning_folderNrM   zdefault.yml)dashboard_output_folderdatasourcesc                 ,    i | ]\  }\  }}d |dz    |S )httpHeaderName    )r$   iheader_s       r'   
<dictcomp>z?MetricsHead._create_default_grafana_configs.<locals>.<dictcomp>,  s>       *A{ /1..  r)   c                 ,    i | ]\  }\  }}d |dz    |S )httpHeaderValuer   r   )r$   r   r   values       r'   r   z?MetricsHead._create_default_grafana_configs.<locals>.<dictcomp>0  s>     $ $ $)Az5 0!A#//$ $ $r)   )rV   prometheus_namejsonDatasecureJsonDatazdefault_grafana_dashboard.jsondefaultzserve_grafana_dashboard.jsonservez'serve_deployment_grafana_dashboard.jsonserve_deploymentz serve_llm_grafana_dashboard.json	serve_llmzdata_grafana_dashboard.jsondataztrain_grafana_dashboard.jsontrain)$rN   rW   existsr_   shutilrmtreemakedirsrX   r`   openwriter   formatr   rb   rO   rP   rT   rU   r9   r6   rZ   r"   r4   r2   r3   r   re   	enumerater   rk   r	   r   r
   r   r   )
r@   r   'grafana_prov_folder_with_latest_sessionfdashboard_provisioning_pathrV   r7   prometheus_header_pairsdata_sources_pathcontents
             r'   _create_default_grafana_configsz+MetricsHead._create_default_grafana_configs   s~   
 7>>$:;; 	<M$:;;;
D4tDDDD ')gll,n'
 '
# 35',,;^3
 3
/ GLL0  
 
 	 GG$+0W    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ')gll''
 '
# 	'	
 	
 	
 	
 GLL+  
 
 	 GG/6,0,N    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 *..#%<
 
 0JNN57QRR
 
 #%($// 	G&8##*D11 	G&*+=+C+C+E+E&F&F#GLL)DmTT
	
 	
 	
 	
 	.	
 	
 	
 	
 GLL!  
 
 	 GG+$3$($9 .78O.P.P  $ $-67N-O-O$ $ $    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	* GLL20  
 
 	  344$Y/GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 GLL2.  
 
 	 5U5W5W2GT)'2GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 GLL29  
 
 	  <==$%78GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 GLL22  
 
 	  566$[1GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 GLL2-  
 
 	  011$V,GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 GLL2.  
 
 	  122$W-GGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   )DDD:.F44F8;F8/AMMM/OOO/QQQ/S  SS>/T99T= T=7/V22V69V60/X,,X03X0c                    t           j                            | j        dd          }t           j                            |          rt          j        |           t          j        t           j                            |          d           t           j                            | j        t                    }t          |d          5 }|                    t          j        |                     ddd           dS # 1 swxY w Y   dS )z\
        Creates the Prometheus configurations that are by default provided by Ray.
        
prometheuszprometheus.ymlTr   r   )(prom_metrics_service_discovery_file_pathN)rN   rW   rX   r]   r   remover   dirnamer[   r   r   r   r   r   )r@   prometheus_config_output_pathprom_discovery_file_pathr   s       r'   "_create_default_prometheus_configsz.MetricsHead._create_default_prometheus_configs|  s5    )+.>)
 )
%
 7>>788 	5I3444
BGOO$ABBTRRRR $&7<<M<$
 $
  /55 	GG'.=U    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   )C==DDc                    K   t                                                       d {V  |                                  |                                  d S r    )r>   runr   r   )r@   rB   s    r'   r   zMetricsHead.run  sU      ggkkmm,,...//11111r)   c                 |  K   | j                             | j         dt          |           | j                  4 d {V 	 }|j        dk    r.|                                 d {V }|cd d d           d {V  S |                                 d {V }t          |j        |          # 1 d {V swxY w Y   d S )Nz/api/v1/query?query=r   rt   )	r   rP   rV   r   r7   rA   r0   textr;   )r@   queryr   	prom_datar=   s        r'   _query_prometheuszMetricsHead._query_prometheus  si     $((#GGuGG+ ) 
 
 		= 		= 		= 		= 		= 		= 		= 		= {c!!"&))++------	 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= !IIKK''''''G&t{G<<<		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		=s   'B+</B++
B58B5)rC   rD   rE   r?   routesrP   aiohttpwebResponser   r   r   r   r   r   rF   rG   s   @r'   rI   rI   U   s        (" (" (" (" ("T VZ%&&67;+? 6 6 6 '&6p VZ())  *)8d d dL  :2 2 2 2 2

= 
= 
= 
= 
= 
= 
=r)   rI   )<r0   loggingrN   r   urllib.parser   r   ray.dashboard.optional_utils	dashboardoptional_utilsr   ray.dashboard.utilsutilsr   ray._private.ray_constantsr   r   7ray.dashboard.modules.metrics.grafana_dashboard_factoryr   r   r   r	   r
   r   'ray.dashboard.modules.metrics.templatesr   r   r   r   !ray.dashboard.subprocesses.moduler   !ray.dashboard.subprocesses.routesr   r   	getLoggerrC   r   setLevelINFOr\   rU   rT   rZ   r6   rd   rc   r   rR   rQ   rf   rg   ri   r   r   ra   r   r9   r   r;   rI   r   r)   r'   <module>r      sX     				         ? ? ? ? ? ? ? ? ? - - - - - - - - -                                  ? > > > > > L L L L L L		8	$	$    7 1 / ! 5 & / ) . ) -  != ( 7 'Q $'   "' ' ' ' '9 ' ' 'S= S= S= S= S=" S= S= S= S= S=r)   