feat: Mejorar logging del discovery y agregar endpoint /api/monitored

- Agregar logs detallados en discovery.rs:
  * Mostrar cuántos archivos se escanean
  * Mostrar cuántos servicios siax-app-* se encuentran
  * Mostrar cuántos se parsean exitosamente
  * Logs tanto en logger como en stdout para debugging

- Agregar endpoint GET /api/monitored:
  * Retorna el contenido completo de monitored_apps.json
  * Permite verificar qué apps están siendo monitoreadas
  * Útil para debugging y diagnóstico

- Mejorar mensajes de error con emojis para mejor visibilidad
- Logs en cada paso del proceso de sincronización
This commit is contained in:
2026-01-18 03:40:19 -05:00
parent 8822e9e6b5
commit 246b5c8342
4 changed files with 79 additions and 6 deletions

View File

@@ -357,3 +357,35 @@
[2026-01-18 03:26:07] [INFO] [Monitor] Buscando app fidelizacion en API central...
[2026-01-18 03:26:07] [INFO] [Monitor] App fidelizacion encontrada en cloud (ID: 4)
[2026-01-18 03:26:07] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:27:14] [INFO] [Sistema] Iniciando SIAX Agent
[2026-01-18 03:27:14] [INFO] [Sistema] Escaneando servicios systemd existentes...
[2026-01-18 03:27:14] [INFO] [Discovery] Escaneando servicios systemd existentes...
[2026-01-18 03:27:14] [INFO] [Discovery] ✅ Descubiertos 0 servicios
[2026-01-18 03:27:14] [INFO] [Config] Usando archivo de configuración: config/monitored_apps.json
[2026-01-18 03:27:14] [INFO] [Config] ✅ Configuración cargada: 2 apps desde config/monitored_apps.json
[2026-01-18 03:27:14] [INFO] [Sistema] Servidor detectado: siax-intel
[2026-01-18 03:27:14] [INFO] [Sistema] Iniciando servidor unificado en puerto 8080
[2026-01-18 03:27:14] [INFO] [Sistema] Sistema SIAX completamente operativo en puerto 8080
[2026-01-18 03:27:15] [INFO] [Monitor] Vigilando procesos para siax-intel [SIAX-Agent/0.1.0 (linux/x86_64; Rust-Monitor)]
[2026-01-18 03:27:15] [INFO] [Monitor] Buscando app app_tareas en API central...
[2026-01-18 03:27:15] [INFO] [Monitor] App app_tareas encontrada en cloud (ID: 3)
[2026-01-18 03:27:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:27:15] [INFO] [Monitor] Buscando app fidelizacion en API central...
[2026-01-18 03:27:15] [INFO] [Monitor] App fidelizacion encontrada en cloud (ID: 4)
[2026-01-18 03:27:15] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:28:15] [INFO] [Monitor] App app_tareas ya existe (ID: 3), actualizando...
[2026-01-18 03:28:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:28:15] [INFO] [Monitor] App fidelizacion ya existe (ID: 4), actualizando...
[2026-01-18 03:28:15] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:29:15] [INFO] [Monitor] App app_tareas ya existe (ID: 3), actualizando...
[2026-01-18 03:29:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:29:15] [INFO] [Monitor] App fidelizacion ya existe (ID: 4), actualizando...
[2026-01-18 03:29:15] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:30:15] [INFO] [Monitor] App app_tareas ya existe (ID: 3), actualizando...
[2026-01-18 03:30:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:30:15] [INFO] [Monitor] App fidelizacion ya existe (ID: 4), actualizando...
[2026-01-18 03:30:15] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:31:15] [INFO] [Monitor] App app_tareas ya existe (ID: 3), actualizando...
[2026-01-18 03:31:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}
[2026-01-18 03:31:16] [INFO] [Monitor] App fidelizacion ya existe (ID: 4), actualizando...
[2026-01-18 03:31:16] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"}

View File

@@ -222,3 +222,19 @@ pub async fn health_handler(
version: env!("CARGO_PKG_VERSION").to_string(),
})))
}
/// Endpoint para ver las apps monitoreadas desde el JSON
pub async fn get_monitored_apps_handler() -> Result<Json<serde_json::Value>, StatusCode> {
use crate::config::get_config_manager;
let config_manager = get_config_manager();
let apps = config_manager.get_apps();
let response = serde_json::json!({
"success": true,
"count": apps.len(),
"apps": apps
});
Ok(Json(response))
}

View File

@@ -10,28 +10,40 @@ const SERVICE_PREFIX: &str = "siax-app-";
/// Descubre servicios systemd existentes con prefijo siax-app-*
pub fn discover_services() -> Vec<DiscoveredService> {
let logger = get_logger();
logger.info("Discovery", "Escaneando servicios systemd existentes...");
logger.info("Discovery", &format!("🔍 Escaneando servicios systemd en: {}", SYSTEMD_DIR));
println!("🔍 Discovery: Buscando servicios en {}", SYSTEMD_DIR);
let mut services = Vec::new();
// Leer directorio de systemd
let entries = match fs::read_dir(SYSTEMD_DIR) {
Ok(entries) => entries,
Ok(entries) => {
logger.info("Discovery", &format!("✅ Directorio {} accesible", SYSTEMD_DIR));
println!("✅ Discovery: Directorio {} accesible", SYSTEMD_DIR);
entries
},
Err(e) => {
logger.error("Discovery", "No se pudo leer directorio systemd", Some(&e.to_string()));
logger.error("Discovery", &format!("No se pudo leer directorio {}", SYSTEMD_DIR), Some(&e.to_string()));
println!("❌ Discovery: ERROR - No se pudo leer {}: {}", SYSTEMD_DIR, e);
return services;
}
};
// Buscar archivos siax-app-*.service
let mut total_files = 0;
let mut siax_files = 0;
for entry in entries.flatten() {
total_files += 1;
let path = entry.path();
if let Some(filename) = path.file_name() {
let filename_str = filename.to_string_lossy();
// Verificar que sea un archivo .service con nuestro prefijo
if filename_str.starts_with(SERVICE_PREFIX) && filename_str.ends_with(".service") {
logger.info("Discovery", &format!("Encontrado: {}", filename_str));
siax_files += 1;
logger.info("Discovery", &format!("✅ Encontrado: {}", filename_str));
println!("✅ Discovery: Servicio detectado: {}", filename_str);
// Extraer nombre de la app
let app_name = extract_app_name(&filename_str);
@@ -39,12 +51,19 @@ pub fn discover_services() -> Vec<DiscoveredService> {
// Leer configuración del servicio
if let Some(service) = parse_service_file(&path, &app_name) {
services.push(service);
} else {
logger.warning("Discovery", &format!("⚠️ No se pudo parsear: {}", filename_str), None);
println!("⚠️ Discovery: No se pudo parsear {}", filename_str);
}
}
}
}
logger.info("Discovery", &format!("✅ Descubiertos {} servicios", services.len()));
logger.info("Discovery", &format!("📊 Escaneados {} archivos, {} con prefijo '{}', {} parseados exitosamente",
total_files, siax_files, SERVICE_PREFIX, services.len()));
println!("📊 Discovery: Archivos totales: {}, siax-app-*: {}, parseados: {}",
total_files, siax_files, services.len());
services
}
@@ -201,7 +220,8 @@ pub fn sync_discovered_services(services: Vec<DiscoveredService>) {
let logger = get_logger();
let config_manager = get_config_manager();
logger.info("Discovery", "Sincronizando servicios descubiertos con configuración...");
logger.info("Discovery", &format!("🔄 Sincronizando {} servicios descubiertos...", services.len()));
println!("🔄 Discovery: Sincronizando {} servicios con monitored_apps.json", services.len());
let mut added_count = 0;
let mut skipped_count = 0;
@@ -218,6 +238,7 @@ pub fn sync_discovered_services(services: Vec<DiscoveredService>) {
if already_exists {
logger.info("Discovery", &format!("⏭️ {} ya existe en configuración", service.app_name));
println!("⏭️ Discovery: {} ya existe, omitiendo", service.app_name);
skipped_count += 1;
continue;
}
@@ -247,15 +268,18 @@ pub fn sync_discovered_services(services: Vec<DiscoveredService>) {
match config_manager.add_app_full(app) {
Ok(_) => {
logger.info("Discovery", &format!("{} agregado exitosamente", service.app_name));
println!("✅ Discovery: {} agregado a monitored_apps.json", service.app_name);
added_count += 1;
}
Err(e) => {
logger.error("Discovery", &format!("Error agregando {}", service.app_name), Some(&e));
println!("❌ Discovery: Error agregando {}: {}", service.app_name, e);
}
}
}
logger.info("Discovery", &format!("📊 Resumen: {} agregadas, {} ya existían", added_count, skipped_count));
println!("📊 Discovery: Resumen final - {} apps nuevas, {} existentes", added_count, skipped_count);
}
/// Intenta detectar el puerto desde el nombre de la app

View File

@@ -67,6 +67,7 @@ async fn main() {
// Router para la API REST
let api_router = Router::new()
.route("/api/health", get(api::health_handler))
.route("/api/monitored", get(api::get_monitored_apps_handler))
.route("/api/apps", get(api::list_apps_handler).post(api::register_app_handler))
.route("/api/apps/:name", delete(api::unregister_app_handler))
.route("/api/apps/:name/status", get(api::get_app_status_handler))