CreaRack-SL

Agente 2.23.0 — restos de la auditoría #261 + sensor "Agente vivo pero mudo"

User value

El Local Agent (el programa que cada organización instala en un PC de su red para vigilarla) pasa a la versión 2.23.0, junto con el SaaS a v1.85.6. Cuatro mejoras que no dependían de tener acceso a la red del CCIB para probarlas:

  • Descubrimiento profundo más rápido: el barrido detallado de una flota de equipos (Deep Data) sondea hasta cinco dispositivos a la vez en vez de uno tras otro — un barrido de cien puntos de acceso pasa de tardar minutos a segundos.
  • Aviso de Agente clonado: si alguien copia la carpeta de un Agente ya emparejado a otra máquina, el Agente lo detecta al arrancar (compara el hostname con el que se emparejó) y el widget Agent Fleet lo marca con “(clone?)”.
  • La base de datos local no engorda sola: se compacta una vez por semana (VACUUM); en un caso real había llegado a 507 MB tras meses de poda sin compactar.
  • Sensor “Agente vivo pero mudo”: el widget Agent Fleet añade “Samples 1h” y “SNMP 1h” — cuántas muestras de ping/SNMP llegaron de verdad a la base de métricas en la última hora frente a las esperadas. Antes, un Agente podía latir cada pocos segundos y llevar horas sin producir un solo dato de monitorización, y figuraba “online” sin más aviso.

Además se corrigió un fallo visto en PROD: cuando el Agente se autoactualiza, el proceso nuevo conecta por WebSocket antes de que el viejo cierre su conexión — y ese cierre tardío marcaba al Agente (el que sigue vivo) como desconectado y le apagaba el Sentinel, aunque los latidos seguían llegando.

Cómo usarla

  • El widget Agent Fleet del Observatory muestra “Samples 1h” (verde / ámbar si <50% / rojo si 0) en el Primary con Sentinel activo. Sin VictoriaMetrics o sin targets, el sensor calla (no rompe el widget).
  • Un Agente marcado “(clone?)” en el widget indica que las credenciales de esa máquina se emparejaron en otra — hay que re-emparejarlo.
  • El resto (paralelismo del deep discovery, VACUUM semanal, logs a DEBUG, fix de la carrera del WS) es transparente: no requiere acción del usuario, solo el auto-update del Agente a 2.23.0.

Implementación

  • terminal/api/fleet.py — sentinel_liveness(org): compara count_over_time de ping_reachable/ping_packet_loss_percent en VictoriaMetrics la última hora contra lo esperado por cadencia de los targets (PING_CAP como tope real), y hace lo mismo para SNMP contra la media horaria de los últimos 7 días del propio Agente (así detecta el caso real: ping seguía llegando pero SNMP caía a 0). Solo se calcula para el Primary con Sentinel activo; se añade a la respuesta de GET /api/agent/fleet vía AgentInstanceOut.
  • terminal/consumers.py (AgentConsumer) — _is_superseded(): en disconnect(), si ACTIVE_AGENTS[agent_id] ya apunta a OTRA conexión (el proceso nuevo ya se registró), la desconexión del proceso viejo no toca el registro ni dispara failover — solo abandona sus grupos de canal. También añade hostname_mismatch a la whitelist de campos de health que acepta del latido.
  • terminal/agent/core/auth.py (AuthManager) — guarda paired_hostname (vía socket.gethostname()) en las credenciales cifradas al emparejar; al cargarlas, compara con el hostname actual y expone hostname_mismatch.
  • terminal/agent/network/deep_discovery.py — nuevo helper run_deep_discover_tasks(handler, tasks, max_concurrent) compartido entre el camino WS y REST: asyncio.Semaphore(max_concurrent) (default 5, el mismo valor que ya usaba el SaaS) en vez de un bucle secuencial; cada resultado devuelve su job_key.
  • terminal/agent/core/store.py (TimeSeriesStore) — maybe_vacuum(): VACUUM de metrics.db una vez por semana tras la poda, con marca last_vacuum_ts en config para no repetirlo cada arranque.
  • terminal/agent/version.py — bump a AGENT_VERSION = "2.23.0" con el changelog detallado de las cinco piezas.
  • Tests nuevos: tests/agent/test_agent_2230.py (paralelismo acotado, job_key, VACUUM) y tests/api/test_fleet_liveness.py.

Límite honesto (del propio CHANGELOG): el “TimeoutError mudo” de la tarea #223 queda sin reproducir, y la parte de A19 que explica motivo por target (“por qué no hay bandwidth” en la ficha de un equipo) se deja para otro ciclo.

Commits relacionados

  • bb3fb7e8 (27-08-2026) — feat(agent): 2.23.0, PR #443.

Véase también

  • [[entity—terminal—service—app-main]]
  • [[entity—terminal—service—sync-throttle]]
  • [[crearack-tech—architecture—sentinel-mode]]
  • [[crearack—terminal—local-agent]]
  • [[local-agent-auto-update-tech]]
  • [[crearack-tech—guides—sentinel-24-7-test]]