Descripción
Task #209 — El Local Agent 2.18.0 ahora mide y reporta la telemetría de su propio proceso en el latido de cada 30 segundos. La promesa central del Agent — “máxima ligereza, mínimo impacto” — dejó de ser una declaración de marketing y pasó a ser un dato verificable en pantalla.
Lo que cambia
Agent-side (core/connector.py)
El heartbeat que el Agent envía al SaaS cada 30s ahora incluye un bloque health con cinco métricas del propio proceso:
cpu_percent(0–100): normalizado al total de la máquina (multiplicado por el número de cores si reporta por core).mem_mb(entero): memoria residente (RSS) en MB.db_mb(entero): tamaño demetrics.db, la base de datos SQLite local que acumula métricas antes de subirlas.pending_rows(entero): métricas sin sincronizar hacia el SaaS (indicador temprano de buffers llenos).last_sync_age_s(entero): segundos desde el último sync exitoso a SaaS.
Se calcula en un thread (asyncio.to_thread) y es best-effort: si psutil falla o el acceso al store se bloquea, el heartbeat viaja sin el bloque health — la telemetría jamás puede tumbar el latido. El código es puro (sin I/O sincrónico bloqueante) y viaja como parte del paquete app-2.18.0.zip del auto-update (sin necesidad de recompilar el onedir).
SaaS-side (Django + Consumidor WebSocket)
Modelo: AgentInstance.health (JSONField, nullable)
- Migración terminal 0006 (v1.65.0).
- Snapshot del último heartbeat recibido.
- NULL = Agent < 2.18.0 (aún no envía el bloque).
Consumer (terminal/consumers.py):
- Persiste el bloque saneado — solo claves conocidas (
cpu_percent,mem_mb,db_mb,pending_rows,last_sync_age_s) y valores numéricos. - Rechaza dicts arbitrarios o payloads malformados (defensa contra Agent spoofed o roto).
Endpoint (GET /api/agent/fleet):
- Expone
healthen cadaAgentInstanceOutsi está presente. - Permite que el frontend construya vistas sin retrasos extra.
Frontend
Fleet Manager (static/js/base.js):
- Nueva columna “Footprint” en la tabla de agentes.
- Muestra
0.3% CPU · 48 MBpara agentes online con telemetría (2.18.0+). - Fallback a ”—” si no hay dato (Agent viejo o sin heartbeat reciente).
Observatory (static/js/pages/observatory/ObservatoryAgent.js):
- Variante SaaS-side (HTTPS, sin acceso al Agent local):
- Gana CPU, RAM, DB Size, Pending Sync en la ficha del agente.
- Paridad de visibilidad que antes solo tenía la variante localhost.
Línea marginal del home (static/js/dashboard.js + static/css/pages/dashboard.css):
- Discreta y en tiempo real (refresco cada 30s).
- Formato:
Local Agent · <hostname>: 0.3% CPU · 48 MB RAM · synced- O
... · <N> métricas en búfersi hay sync pendiente.
- O
- Silenciosa por diseño:
- No visible si no hay agentes en la flota.
- No visible si el usuario no tiene permiso
fleet:view(403 en la petición). - No visible si todos los agentes conectados son < 2.18.0 (sin
health).
- Petición explícita de Edu en la sesión de diseño.
Internacionalización
Cuatro strings nuevos en locale/es/LC_MESSAGES/djangojs.po:
synced→sincronizado%s metrics buffered→%s métricas en búferCPU→CPU(no traducir, es etiqueta técnica)RAM→RAM(no traducir, es etiqueta técnica)
Nota: "Local Agent" es nombre de producto (glosario) — no se traduce.
Valor entregado
Para el MSP / vendedor
- Argumento de venta verificable: en el Fleet Manager, el cliente ve en vivo lo que consume la sonda en cada sede.
- Credibilidad: “máxima ligereza” deja de ser eslogan y se convierte en un número en pantalla.
Para operaciones
- Alerta temprana: una
.dbengordando o un buffer acumulándose se ven en el SaaS antes de que el cliente reporte un problema. - Diagnóstico remoto: observar CPU/RAM/DB Size de múltiples agentes de golpe identifica rápidamente si uno está anomaloso.
Descartado en la misma charla
Polling adaptativo (“respiración”): la latencia de reacción al pedir un Observatory y el hecho de que casi siempre hay un dispositivo vigilado hacen que el ahorro energético no compense la complejidad; se reabiría solo con datos de flotas grandes (que esta misma feature aportará en el futuro).
Versiones
- Agent: 2.18.0
- SaaS: 1.65.0
- Fecha: 2026-07-31
Véase también
- [[entity—terminal—model—agentinstance]]
- [[entity—terminal—endpoint—fleet]]
- [[concept—terminal—agent-architecture]]
- [[feature—terminal—auto-update]]
- [[concept—saas—observability]]