
     /i9-                     ~   U d Z ddlZddlZddlZddlZddlmZmZmZm	Z	 ddl
m
Z
 ddlmZmZ 	 ddlmZmZ dZ ej&                  d	      Z ej*                  ej,                  
       e G d d             Z G d d	      Zdae	e   ed<   defdZedk(  r e       Zej=                           ed        edejA                                  edejC                                 ddl"Z" ed e"jF                  ejI                         d               edejK                                 yy# e$ r dZY w xY w)z
Genesis Health Check API
=========================
System health check endpoint for monitoring.

PM-049: Health Check API
- Checks system component health
- Returns status and metrics
- Supports liveness and readiness probes
    N)DictAnyListOptional)datetime)	dataclassasdict)FlaskjsonifyTFHealthCheckAPI)levelc                   d    e Zd ZU dZeed<   eed<   eed<   eed<   eeef   ed<   deeef   fdZ	y	)
ComponentHealthzHealth status of a component.namestatus
latency_ms
last_checkdetailsreturnc                     t        |       S N)r	   selfs    )/mnt/e/genesis-system/api/health_check.pyto_dictzComponentHealth.to_dict)   s    d|    N)
__name__
__module____qualname____doc__str__annotations__floatr   r   r    r   r   r   r       s<    '
IKO#s(^c3h r   r   c                   R   e Zd ZdZddeeef   fdZdedefdZ	deddfdZ
deeef   fd	Zdeeef   fd
Zdeeef   fdZdeeef   fdZdeeef   fdZddZdeeef   fdZdeeef   fdZdeeef   fdZdedefdZdedeeef   fdZdeeef   fdZdee   fdZy)r   z{
    Health check API for Genesis system monitoring.
    Provides liveness, readiness, and component health endpoints.
    N
componentsc                     |xs i | _         t        j                         | _        g | _        t
        j                  d       y)z
        Initialize health check API.

        Args:
            components: Dict of component name to health check function
        zHealth Check API initializedN)r&   r   utcnow
start_timehealth_historyloggerinfo)r   r&   s     r   __init__zHealthCheckAPI.__init__3   s3     %*"//+4623r   r   r   c                 x   t        j                         }	  |       }|j                  dd      rdnd}|}t        j                         |z
  j                         dz  }t        ||t        |d      t        j                         j                         |      S # t        $ r}d}dt	        |      i}Y d}~d}~ww xY w)	z!Run health check for a component.healthyT	unhealthyerrorNi     )r   r   r   r   r   )	r   r(   get	Exceptionr!   total_secondsr   round	isoformat)	r   r   check_fnstartresultr   r   elatencys	            r   _check_componentzHealthCheckAPI._check_component@   s    !	(ZF"(**Y"=Y;FG
 ??$u,;;=DWa((224
 	
  	( FA'G	(s   B 	B9 B44B9c                 R    || j                   |<   t        j                  d|        y)z+Register a component health check function.zRegistered health check for: N)r&   r+   r,   )r   r   r8   s      r   register_componentz!HealthCheckAPI.register_componentV   s$     (3D6:;r   c           	         	 t        j                  d      }t        j                         }t        j                  d      }|dk  xr |j                  dk  ||j                  t        |j                  dz  d      |j                  t        |j                  dz  d      dS # t        $ r}dt        |      d	cY d
}~S d
}~ww xY w)zCheck system resources.g?)interval/Z   i   @r2   )r/   cpu_percentmemory_percentmemory_available_gbdisk_percentdisk_free_gbFr/   r1   N)
psutilrD   virtual_memory
disk_usagepercentr6   	availablefreer4   r!   )r   rD   memorydiskr;   s        r   check_systemzHealthCheckAPI.check_system]   s    	7 ,,c:K**,F$$S)D '+C0C*"(..',V-=-=-I1'M $ %dii7&;Q ?   	7$s1v66	7s   BB   	C)B<6C<Cc                 (   	 t        j                  d       t        j                   t         j                  t         j                        }|j	                  d       |j                          ddddS # t        $ r}dt        |      dcY d}~S d}~ww xY w)zCheck network connectivity.zapi.anthropic.com   T)r/   dns_ok	socket_okFrI   N)socketgethostbynameAF_INETSOCK_STREAM
settimeoutcloser4   r!   )r   sr;   s      r   check_networkzHealthCheckAPI.check_networko   sr    	7  !45 fnnf.@.@AALLOGGI#t$GG 	7$s1v66	7s   A-A0 0	B9BBBc           	      (   	 ddl }|j                  t        j                  dd      t	        t        j                  dd            d      }|j                          d	d	d
S # t        $ r	 d	dddcY S t        $ r}dt        |      dcY d}~S d}~ww xY w)zCheck Redis connectivity.r   N
REDIS_HOST	localhost
REDIS_PORTi  r2   )hostportsocket_timeoutTr/   	connectedFzRedis client not installedr/   rN   messagerI   )	redisRedisosgetenvintpingImportErrorr4   r!   )r   rj   rr;   s       r   check_rediszHealthCheckAPI.check_redis~   s    	7YY|[9<67   A
 FFH#$77 	b#%D`aa 	7$s1v66	7s$   AA   B1B9BBBc           
         	 ddl }|j                  t        j                  dd      t	        t        j                  dd            t        j                  dd      t        j                  d	d
      t        j                  dd      d      }|j                          dddS # t        $ r	 ddddcY S t        $ r}dt        |      dcY d}~S d}~ww xY w)zCheck PostgreSQL connectivity.r   NPOSTGRES_HOSTra   POSTGRES_PORTi8  POSTGRES_USERpostgresPOSTGRES_PASSWORD POSTGRES_DBgenesis   )rc   rd   userpassworddatabaseconnect_timeoutTrf   Fzpsycopg2 not installedrh   rI   )	psycopg2connectrl   rm   rn   r\   rp   r4   r!   )r   r   connr;   s       r   check_postgreszHealthCheckAPI.check_postgres   s    	7##YY<?D9:YY
;#6;=)< ! $ D JJL#$77 	^#%D\]] 	7$s1v66	7s$   BB C0C8CCCc           	      B   	 ddl m}  |t        j                  dd      t	        t        j                  dd            d      }|j                         }d	d	t        |j                        d
S # t        $ r	 d	dddcY S t        $ r}dt        |      dcY d}~S d}~ww xY w)z$Check Qdrant vector DB connectivity.r   )QdrantClientQDRANT_HOSTra   QDRANT_PORTi  r|   )rc   rd   timeoutT)r/   rg   collectionsFzqdrant-client not installedrh   rI   N)qdrant_clientr   rl   rm   rn   get_collectionslenr   rp   r4   r!   )r   r   clientr   r;   s        r   check_qdrantzHealthCheckAPI.check_qdrant   s    	72!YY}k:=$78F
 !002K!";#:#:; 
  	c#%Dabb 	7$s1v66	7s$   A*A- -B>BBBBc                    | j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  d| j
                         y)zRegister default health checks.systemnetworkrj   rw   qdrantN)r?   rR   r^   rr   r   r   r   s    r   setup_default_checksz#HealthCheckAPI.setup_default_checks   sp    $*;*;<	4+=+=>)9)9:
D,?,?@$*;*;<r   c                 L    dt        j                         j                         dS )z
        Liveness probe - basic check if service is running.

        Returns:
            Dict with status (always healthy if service is running)
        r/   )r   	timestamp)r   r(   r7   r   s    r   livenesszHealthCheckAPI.liveness   s$      !*446
 	
r   c                 \   i }d}| j                   j                         D ]<  \  }}| j                  ||      }|j                         ||<   |j                  dk7  s;d}> |rdndt        j                         j                         |d}| j                  j                  |d   |d   d	       |S )
z
        Readiness probe - check if service can handle requests.

        Returns:
            Dict with status and component health
        Tr/   Fready	not_ready)r   r   r&   r   r   )r   r   )
r&   itemsr=   r   r   r   r(   r7   r*   append)r   component_healthall_healthyr   r8   healthr:   s          r   	readinesszHealthCheckAPI.readiness   s     "oo335 	$ND(**4:F%+^^%5T"}}	)#	$ "-g+!*446*
 	"",X&$
 	
 r   c           
      D   | j                         }t        j                         | j                  z
  j	                         }|d   |d   t        |d      | j                  |      t        j                  dd      t        j                  dd      |d   | j                  d	d
 dS )zo
        Full health check with all details.

        Returns:
            Comprehensive health status
        r   r   r2   GENESIS_VERSIONz1.0.0GENESIS_ENVdevelopmentr&   iN)r   r   uptime_secondsuptime_formattedversionenvironmentr&   recent_checks)
r   r   r(   r)   r5   r6   _format_uptimerl   rm   r*   )r   r   uptimes      r   full_healthzHealthCheckAPI.full_health   s     NN$	//#doo5DDF  )";/#FA. $ 3 3F ;yy!2G<99]MB#L1!006	
 		
r   secondsc                 &   t        |dz        }t        |dz  dz        }t        |dz  dz        }g }|dkD  r|j                  | d       |dkD  r|j                  | d       |dkD  r|j                  | d       dj                  |      xs d	S )
z'Format uptime in human-readable format.iQ i  <   r   dhm z< 1m)rn   r   join)r   r   dayshoursminutespartss         r   r   zHealthCheckAPI._format_uptime   s    7e#$Wu_-.w~",-!8LLD6$19LLE7!%Q;LLG9A'xx(&(r   	componentc                     || j                   vrdd| iS | j                  || j                   |         }|j                         S )z*Get health status of a specific component.r1   zUnknown component: )r&   r=   r   )r   r   r   s      r   get_component_healthz#HealthCheckAPI.get_component_health  sI    DOO+29+>??&&y$//)2LM~~r   c                    t        d | j                  D              }t        | j                        }|||dkD  rt        ||z  dz  d      ndt        | j                        | j                  r| j                  d   dS ddS )zGet health check metrics.c              3   .   K   | ]  }|d    dv rd  yw)r   )r   r/   rT   Nr$   ).0r   s     r   	<genexpr>z-HealthCheckAPI.get_metrics.<locals>.<genexpr>  s%      
{22 
s   r   d   r2   N)total_checkshealthy_checksuptime_percentcomponents_registeredr   )sumr*   r   r6   r&   )r   healthy_counttotals      r   get_metricszHealthCheckAPI.get_metrics  s     
**
 
 D''( "+GLqyeME$9C$?CVY%(%9595H5H$--b1
 	

 OS
 	
r   c                    t         st        j                  d       yt        t              }| |j                  ddg      |j                  ddg      fd              }|j                  ddg      fd	       }|j                  d
dg      fd       }|j                  ddg      fd       }|j                  ddg      fd       }|S )z'Create Flask app with health endpoints.zFlask not available.Nz/healthGET)methodsz/health/livec                  6    t         j                               S r   )r   r   r   s   r   r   z1HealthCheckAPI.create_flask_app.<locals>.liveness2  s     6??,--r   z/health/readyc                  V    j                         } | d   dk(  rdnd}t        |       |fS )Nr   r      i  )r   r   )r:   status_coder   s     r   r   z2HealthCheckAPI.create_flask_app.<locals>.readiness7  s3    %%'F!'!1W!<##K6?K//r   z/health/fullc                  6    t         j                               S r   )r   r   r   s   r   fullz-HealthCheckAPI.create_flask_app.<locals>.full=      6--/00r   z/health/component/<name>c                 8    t        j                  |             S r   )r   r   )r   r   s    r   r   z2HealthCheckAPI.create_flask_app.<locals>.componentA  s    666t<==r   z/health/metricsc                  6    t         j                               S r   )r   r   r   s   r   metricsz0HealthCheckAPI.create_flask_app.<locals>.metricsE  r   r   )FLASK_AVAILABLEr+   warningr
   r   route)r   appr   r   r   r   r   r   s          @r   create_flask_appzHealthCheckAPI.create_flask_app)  s    NN12Ho	9ug	.	>E7	3	. 
4 
/	. 
?UG	4	0 
5	0
 
>E7	3	1 
4	1 
-w	?	> 
@	> 
$ug	6	1 
7	1 
r   r   )r   N)r   r   r   r    r   r!   r   r-   r   r=   r?   rR   r^   rr   r   r   r   r   r   r   r#   r   r   r   r   r   r$   r   r   r   r   -   s8   
44S> 4
S 
 
,<s < <7d38n 7$7tCH~ 77T#s(^ 7 7S#X 7&7d38n 7(=

$sCx. 

4S> >
T#s(^ 
*)e ) )  c  d38n  
T#s(^ 
$ (3-  r   _health_apir   c                  V    t         t               a t         j                          t         S )z&Get or create global health check API.)r   r   r   r$   r   r   get_health_apir   P  s$     $&((*r   __main__z
=== Health Check API Test ===z
Liveness: z
Readiness: z
Full Health: r2   )indentz

Metrics: )&r    rl   loggingrW   rJ   typingr   r   r   r   r   dataclassesr   r	   flaskr
   r   r   rp   	getLoggerr+   basicConfigINFOr   r   r   r"   r   r   apir   printr   r   jsondumpsr   r   r$   r   r   <module>r      sR  	 
    , ,  )$O 
		+	,   ',, ' 	 	 	\ \@	 )-Xn% ,  z

C	
+, 
L(
)* 
M#--/*
+, 	OJDJJs'8CD
EF 
K)*
+,% A
  Os   
D1 1D<;D<