@ -1,17 +1,20 @@ 
			
		
	
		
		
			
				
					#![ allow(dead_code, unused_imports) ]  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					use   rocket ::{ use   rocket ::{  
			
		
	
		
		
			
				
					     http ::{ ContentType ,   Status } ,      http ::{ ContentType ,   Status } ,  
			
		
	
		
		
			
				
					     request ::{ FromRequest ,   Outcome ,   Request } ,      request ::{ FromRequest ,   Outcome ,   Request } ,  
			
		
	
		
		
			
				
					
					     response ::{ Content ,   Resul t} ,      response ::{ self ,   content ::RawTex t} ,  
			
				
				
			
		
	
		
		
	
		
		
			
				
					     Route ,      Route ,  
			
		
	
		
		
			
				
					} ; } ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					use   crate ::{ use   crate ::{  
			
		
	
		
		
			
				
					     auth ::ClientIp ,      auth ::ClientIp ,  
			
		
	
		
		
			
				
					     db ::DbConn ,      db ::DbConn ,  
			
		
	
		
		
			
				
					     error ::Error ,  
			
		
	
		
		
			
				
					     CONFIG ,      CONFIG ,  
			
		
	
		
		
			
				
					} ; } ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					use   log ::error ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					// Metrics endpoint routes
 // Metrics endpoint routes
  
			
		
	
		
		
			
				
					pub   fn  routes ( )   -> Vec < Route >   { pub   fn  routes ( )   -> Vec < Route >   {  
			
		
	
		
		
			
				
					     if   CONFIG . enable_metrics ( )   {      if   CONFIG . enable_metrics ( )   {  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -46,7 +49,11 @@ impl<'r> FromRequest<'r> for MetricsToken { 
			
		
	
		
		
			
				
					             . headers ( )              . headers ( )  
			
		
	
		
		
			
				
					             . get_one ( "Authorization" )              . get_one ( "Authorization" )  
			
		
	
		
		
			
				
					             . and_then ( | auth |   auth . strip_prefix ( "Bearer " ) )              . and_then ( | auth |   auth . strip_prefix ( "Bearer " ) )  
			
		
	
		
		
			
				
					
					             . or_else ( | |   request . query_value ::< & str > ( "token" ) . and_then ( Result ::ok ) ) ;              . or_else ( | |   {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					                 request  
			
		
	
		
		
			
				
					                     . query_value ::< & str > ( "token" )  
			
		
	
		
		
			
				
					                     . and_then ( | result |   result . ok ( ) )  
			
		
	
		
		
			
				
					             } ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					         match   provided_token   {          match   provided_token   {  
			
		
	
		
		
			
				
					             Some ( token )   = >   {              Some ( token )   = >   {  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -84,7 +91,7 @@ fn validate_metrics_token(provided: &str, configured: &str) -> bool { 
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					/// Prometheus metrics endpoint
 /// Prometheus metrics endpoint
  
			
		
	
		
		
			
				
					#[ get( " / " ) ] #[ get( " / " ) ]  
			
		
	
		
		
			
				
					
					async   fn  get_metrics ( _token : MetricsToken ,   mut   conn : DbConn )   -> Result < Conten t< String > ,   Status >   { async   fn  get_metrics ( _token : MetricsToken ,   mut   conn : DbConn )   -> Result < RawTex t< String > ,   Status >   {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					     // Update business metrics from database
      // Update business metrics from database
  
			
		
	
		
		
			
				
					     if   let   Err ( e )   =   crate ::metrics ::update_business_metrics ( & mut   conn ) . await   {      if   let   Err ( e )   =   crate ::metrics ::update_business_metrics ( & mut   conn ) . await   {  
			
		
	
		
		
			
				
					         error ! ( "Failed to update business metrics: {e}" ) ;          error ! ( "Failed to update business metrics: {e}" ) ;  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -93,7 +100,7 @@ async fn get_metrics(_token: MetricsToken, mut conn: DbConn) -> Result<Content<S 
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     // Gather all Prometheus metrics
      // Gather all Prometheus metrics
  
			
		
	
		
		
			
				
					     match   crate ::metrics ::gather_metrics ( )   {      match   crate ::metrics ::gather_metrics ( )   {  
			
		
	
		
		
			
				
					
					         Ok ( metrics )   = >   Ok ( Content ( ContentType ::Plain ,   metrics ) ) ,          Ok ( metrics )   = >   Ok ( RawText ( metrics ) ) ,  
			
				
				
			
		
	
		
		
	
		
		
			
				
					         Err ( e )   = >   {          Err ( e )   = >   {  
			
		
	
		
		
			
				
					             error ! ( "Failed to gather metrics: {e}" ) ;              error ! ( "Failed to gather metrics: {e}" ) ;  
			
		
	
		
		
			
				
					             Err ( Status ::InternalServerError )              Err ( Status ::InternalServerError )  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -103,7 +110,7 @@ async fn get_metrics(_token: MetricsToken, mut conn: DbConn) -> Result<Content<S 
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					/// Health check endpoint that also updates some basic metrics
 /// Health check endpoint that also updates some basic metrics
  
			
		
	
		
		
			
				
					#[ cfg(feature =  " enable_metrics " ) ] #[ cfg(feature =  " enable_metrics " ) ]  
			
		
	
		
		
			
				
					
					pub   async   fn  update_health_metrics ( conn : & mut   DbConn )   -> Result < ( ) ,   Error >   { pub   async   fn  update_health_metrics ( _ conn& mut   DbConn )   {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					     // Update basic system metrics
      // Update basic system metrics
  
			
		
	
		
		
			
				
					     use   std ::time ::SystemTime ;      use   std ::time ::SystemTime ;  
			
		
	
		
		
			
				
					     static   START_TIME : std ::sync ::OnceLock < SystemTime >   =   std ::sync ::OnceLock ::new ( ) ;      static   START_TIME : std ::sync ::OnceLock < SystemTime >   =   std ::sync ::OnceLock ::new ( ) ;  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -114,11 +121,7 @@ pub async fn update_health_metrics(conn: &mut DbConn) -> Result<(), Error> { 
			
		
	
		
		
			
				
					     // Update database connection metrics
      // Update database connection metrics
  
			
		
	
		
		
			
				
					     // Note: This is a simplified version - in production you'd want to get actual pool stats
      // Note: This is a simplified version - in production you'd want to get actual pool stats
  
			
		
	
		
		
			
				
					     crate ::metrics ::update_db_connections ( "main" ,   1 ,   0 ) ;      crate ::metrics ::update_db_connections ( "main" ,   1 ,   0 ) ;  
			
		
	
		
		
			
				
					    
  
			
		
	
		
		
			
				
					     Ok ( ( ) )  
			
		
	
		
		
			
				
					} }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					#[ cfg(not(feature =  " enable_metrics " )) ] #[ cfg(not(feature =  " enable_metrics " )) ]  
			
		
	
		
		
			
				
					
					pub   async   fn  update_health_metrics ( _conn : & mut   DbConn )   -> Result < ( ) ,   Error >   { pub   async   fn  update_health_metrics ( _conn : & mut   DbConn )   { }  
			
				
				
			
		
	
		
		
			
				
					     Ok ( ( ) )  
			
		
	
		
		
			
				
					}