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:
@@ -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"}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user