API de alarmas y salud
dtvsold revisa el router cada minuto y mantiene un registro de alarmas en su base de datos: una fila
por cada condición en falla, identificada por una clave estable (por ejemplo bond0/eno2/link). Una alarma se
activa después de 2 revisiones fallidas seguidas (un servicio crítico caído y el servicio DHCP se activan
de inmediato) y se borra después de 2 revisiones correctas. Cada activación y borrado también se registra como un evento del historial.
Las alarmas borradas y los eventos con más de 90 días de antigüedad se eliminan.
Qué se revisa: todo lo que informa GET /alerts (DHCP, VLAN,
pools de direcciones, clientes desconocidos, CGNAT, anti-spoofing, el recolector de OLT y las advertencias de fibra, la
licencia) además del propio router: miembros del bond sin enlace o fuera del agregador LACP, el
enlace de subida caído o sin ruta predeterminada, puertos con direcciones o VLAN sin portadora, enlaces inestables (flapping),
servicios y temporizadores del router fallidos o detenidos, discos llenándose (advertencia al 90 %, crítico al 95 %),
CPU, memoria, procesos terminados por falta de memoria (OOM), temperaturas, seguimiento de conexiones (conntrack) y errores de puertos.
Ambos endpoints son de solo lectura y no tienen forma /api?action=. El equivalente en la CLI es dtvsol alarms.
Autenticación y errores: consulte la descripción general de la API.
Campos de una alarma
Sección titulada «Campos de una alarma»| Campo | Significado |
|---|---|
area |
olt, onu, network, server o services (derivado de source). |
key |
Identificador estable de la condición. |
source |
La revisión: p. ej. link, uplink, bond, interface, nic, cpu, memory, temp, conntrack, disk, service, timer, dhcp, dhcp-pool, stranger, cgnat, spoof, olt, fiber, licence. |
level |
critical, warning o info. |
text |
Descripción legible por personas. |
detail |
Datos adicionales de la revisión (objeto o null). |
first_seen, last_seen |
YYYY-MM-DD HH:MM:SS. |
cleared |
Cuándo se borró, o null mientras está activa. |
count |
Entero que se guarda con la fila de la alarma. |
Alarmas
Sección titulada «Alarmas»GET /alarms
Sección titulada «GET /alarms»Las alarmas activas, primero las críticas y luego las más antiguas. Con all=1, las alarmas borradas en los últimos
7 días se muestran después de las activas. Con history=N, en su lugar se devuelven las últimas N activaciones y borrados (los más recientes primero).
| Nombre | En | Tipo | Notas |
|---|---|---|---|
all |
query | boolean | 1 agrega las alarmas borradas en los últimos 7 días. |
history |
query | integer | Devuelve los últimos N eventos de activación/borrado (1–1000; 50 cuando no es un número positivo). Tiene prioridad sobre all. |
curl -s "http://ROUTER-IP:8880/alarms?all=1" -H "X-API-Key: YOUR_API_KEY"{ "count": 1, "generated": "2026-09-28 10:40:00", "checked": { "at": "2026-09-28 10:39:58", "took_ms": 412, "errors": [], "health": {"cpu": {"…": "…"}, "memory": {"…": "…"}, "ports": ["…"]} }, "alarms": [ { "area": "network", "key": "bond0/eno2/link", "source": "link", "level": "warning", "text": "bond0: member eno2 has no link", "detail": null, "first_seen": "2026-09-28 09:12:00", "last_seen": "2026-09-28 10:39:58", "cleared": null, "count": 1 } ]}count es el número de alarmas activas (las borradas que devuelve all=1 no se cuentan).
checked describe la última revisión ejecutada (null antes de la primera); checked.errors enumera lo que
no pudo revisar.
Forma de historial:
curl -s "http://ROUTER-IP:8880/alarms?history=20" -H "X-API-Key: YOUR_API_KEY"{ "count": 2, "generated": "2026-09-28 10:40:00", "events": [ {"area": "services", "at": "2026-09-28 10:05:00", "kind": "clear", "level": "warning", "key": "dhcp-pool/vlan100", "source": "dhcp-pool", "text": "…"}, {"area": "services", "at": "2026-09-28 09:30:00", "kind": "raise", "level": "warning", "key": "dhcp-pool/vlan100", "source": "dhcp-pool", "text": "…"} ]}Errores: 405 para cualquier método distinto de GET; 500 con {"ok": false, "code": 500, "error": …}
cuando no se puede leer la base de datos.
GET /health
Sección titulada «GET /health»Las lecturas actuales de cada área, que se muestran junto a las alarmas de esa área en la pestaña Alarms del monitor. Todo se lee de datos que el demonio ya conserva; nada de esto consulta a una OLT.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
area |
query | string | olt, onu, network, server o services. Omítalo para obtener todas las áreas. |
Qué contiene cada área:
- server: de la última revisión de alarmas:
cpu,load,memory,temps,disks,conntrack,uptime_s,units(los servicios del router) ymeasured(cuándo). - network:
ports(tasas y errores de la última revisión),bonds(modo, miembros, estado del enlace, pertenencia al agregador LACP, fallos de enlace),uplinks(activo / portadora) ydefault_routes. - olt: por cada OLT registrada: estado del recolector (
ok,at,age_s,took_ms,error), número de puertos PON, puertos en uso,ports_dark(puertos PON cuyas ONT están todas fuera de línea), tarjetas, ONT y ONT en línea, errores. - onu: por OLT: total de ONT, conteos por estado, causas de desconexión, luz recibida por bandas
(
goodde −8 a −25 dBm,weakde −25 a −27 dBm,too_weakpor debajo de −27 dBm,too_strongpor encima de −8 dBm) y las cinco ONT más débiles. - services: interfaces servidas por DHCP, número de clientes heredados, servicios por estado, CGNAT
(
enabled,iface,assigned,capacity,free) y anti-spoofing (enabled,mode, paquetes IPv4/IPv6/ARP descartados,last_hour).
curl -s "http://ROUTER-IP:8880/health?area=onu" -H "X-API-Key: YOUR_API_KEY"{ "ok": true, "generated": "2026-09-28 10:41:00", "area": "onu", "health": { "olts": [ { "olt": "olt-1", "at": "2026-09-28 10:40:12", "total": 412, "states": {"online": 398, "offline": 14}, "offline_causes": {"power off": 9, "fiber cut": 5}, "light": {"good": 390, "weak": 6, "too_weak": 2, "too_strong": 0}, "weakest": [{"fsp": "0/1/3", "ont_id": 12, "rx_dbm": -28.4, "description": "…"}] } ] }}Sin area, la respuesta es {"ok": true, "generated": …, "areas": {"olt": …, "onu": …, "network": …, "server": …, "services": …}}.
Errores: 400 ("area is one of olt, onu, network, server, services", es decir, el área debe ser una de esas) para un área desconocida; 405
para cualquier método distinto de GET.
Este sitio fue escrito con ayuda de IA y revisado por nuestro equipo.