InfraGuard

Panel de estado de la infraestructura

Panel de disponibilidad en vivo que muestra en una sola pantalla la carga, la CPU, la memoria y el disco de cada nodo, además del estado de los servicios nginx/php/mysql/mongo.

Resumen: qué hace

Infraestructura ▸ Estado (/infra/health) es el panel de operaciones de disponibilidad que muestra de un vistazo la salud de cada nodo en ejecución mediante una cuadrícula de tarjetas. Reimplementa la pantalla ./server/stat de stats-design y fusiona dos rutas de datos distintas en una sola tarjeta:

  1. Instantánea de métricas: los últimos valores de carga / CPU / memoria / disco que el recolector run_report escribe en server_status (una tabla heredada) cada ~5 minutos. La aplicación los lee de una caché de 20 segundos (sin conexión remota directa).
  2. Sondeo de servicios en vivo: una llamada en tiempo real al agente tlx.php desplegado en cada nodo para comprobar, en el acto, si los demonios nginx / php / mysql / mongo están activos y para listar los contenedores Docker (TlxClient).

La lista de nodos y los alias (ALIAS_MAP) se cargan automáticamente —sin configuración por servidor— desde la configuración del recolector run_report (infr_collector.config) en Administración ▸ Recolectores.

Cada tarjeta muestra información breve del nodo en la cabecera, un indicador circular de CPU (con la carga media en el centro), barras de MEM/DISK debajo y puntos de estado de servicio en la parte inferior.

Esta pantalla es de operación en modo solo lectura. Aquí no se editan los nodos, los alias ni la tlx api_key: todo eso reside en Recolectores.

Cuándo usarlo

Para el análisis de tendencias (series temporales) vaya a Series temporales de servidores; para la salud de la controladora RAID y el mapa físico de discos vaya a Almacenamiento y RAID.

Disposición

Cabecera (barra superior)

Elemento Significado
Insignia del recolector Título del recolector run_report + número de nodos + número de asignaciones ALIAS
Icono de llave Si la tlx api_key está configurada. 🔑 (verde) = configurada · 🔑❗ (gris) = sin configurar, por lo que los sondeos de servicio no están disponibles
Botón de configuración del recolector Lleva a Recolectores (/admin/collectors)
Botón de actualización Vuelve a leer las métricas y relanza los sondeos en vivo en todos los nodos

Si no existe ningún recolector run_report, en lugar de la cuadrícula de tarjetas se muestra un aviso de «No hay ningún recolector run_report registrado» junto con un botón de configuración.

Tarjeta de nodo

┌──────────────────────────────────────┐
│ ⠿ ●  glory                     ⟳(probe)│  ← cabecera: asa · punto de conexión · etiqueta/alias/IP
│      glory · 203.0.113.10              │
│                                        │
│            ╭───────────╮               │
│            │    0.84    │  ← anillo de CPU (color=CPU%), centro=load
│            │    load    │
│            │  CPU 12%   │
│            ╰───────────╯               │
│  🧠 MEM  ▓▓▓▓▓▓░░░░  63%                 │  ← barra MEM
│  💽 DISK ▓▓▓▓▓▓▓▓░░  81%                 │  ← barra DISK
│  ● nginx ● php ● mysql ● mongo          │  ← puntos de servicio (sondeo en vivo)
│  🐳 4                                   │  ← número de contenedores Docker (si el sondeo tiene éxito)
└──────────────────────────────────────┘

Umbrales (reglas de color)

Métrica good (verde) warn (ámbar) crit (rojo)
CPU us % (anillo) < 60 ≥ 60 ≥ 85
MEM % (barra) < 80 ≥ 80 ≥ 92
DISK % (barra) < 80 ≥ 80 ≥ 92

Los valores ausentes (—) se representan en gris (na).

Tonos de los puntos de servicio

Tono Condición
up (verde) Sondeo correcto + el número de procesos de ese demonio es > 0
down (rojo) El sondeo funcionó pero el número de procesos es 0, o el sondeo falló
unknown (gris) Todavía no se ha sondeado, o la respuesta no incluye esa clave de servicio

Cómo usarlo

1. Actualizar las métricas (automático + manual)

2. Sondear un solo nodo en vivo

El botón de pulso (⟐) situado a la derecha de la cabecera de una tarjeta sondea de inmediato únicamente ese nodo (POST /infra/health/probe, con {alias} en el cuerpo). En la primera carga de la página, si la tlx api_key está configurada, todas las tarjetas se sondean automáticamente con una cadencia escalonada de 250 ms (para evitar una ráfaga).

Cuando el sondeo tiene éxito, la tarjeta refleja no solo los puntos de servicio, sino también los valores instantáneos de carga / CPU / MEM / DISK que vienen en la respuesta.

Si todos los puntos de servicio están en gris (unknown), lo habitual es que la tlx api_key no esté configurada. Revise el icono de llave en la cabecera: si aparece 🔑❗, el sondeo no llega a ejecutarse.

3. Reordenar las tarjetas (arrastrar)

Sujete el asa (⠿) a la izquierda de la cabecera de una tarjeta y arrastre para reordenar. El orden se guarda en el localStorage del navegador (infr:order:infra-health) y se conserva entre visitas. Las tarjetas usan una disposición masonry de altura variable y se pagina de 10 en 10.

Fuentes de datos

Métricas: server_status (heredada, solo lectura)

HealthService::metricsByAlias() lee de la conexión legacy. Para evitar consultas lentas se limita a una ventana reciente de seq en lugar de agregar toda la tabla.

-- 1) solo los 3 seq más recientes (distinct = recorrido de índice)
SELECT DISTINCT seq FROM server_status ORDER BY seq DESC LIMIT 3;

-- 2) solo los part de interés para esos seq
SELECT server_alias, part, value, seq, created_at
  FROM server_status
 WHERE seq IN (:s1, :s2, :s3)
   AND part IN ('loadavg','free','top','df-','df-data','df-home')
 ORDER BY seq;   -- ascendente → las filas posteriores son más recientes

Convención de almacenamiento del recolector run_report:

part Significado Formato Correspondencia en la tarjeta
loadavg Carga (1 minuto) número load (centro del indicador)
top CPU us % "NN%" relleno del anillo de CPU
free Memoria % "NN%" barra MEM
df-data / df- / df-home Disco JSON {p,u,a} barra DISK (p=%, u=usado, a=tamaño)

Resolución de nodos: infr_collector.config

HealthService::resolveNodes() deriva los nodos del recolector run_report (InfrCollector::where('key','run_report')).

Prioridad Origen (node_source) Descripción
1 config Usa config.nodes[] tal cual si existe (cada nodo = url·alias·label·ip)
2 instance Si está vacío, se deriva en tiempo de ejecución del registro de Instancias (infr_instance, caché de 60 s)
— none Si ambos están vacíos, no hay nodos

El número de entradas de config.alias_map se muestra como la insignia «ALIAS» de la cabecera.

Estado de los servicios: sondeo en vivo de tlx.php (TlxClient)

HealthController::probe() localiza el nodo por su alias (lo que impide hacer de proxy hacia un host arbitrario) y llama al tlx.php de ese nodo mediante TlxClient::probe().

Forma normalizada de la respuesta check_all de tlx.php para la tarjeta:

{
  "ok": true,
  "load": 0.84,
  "cpu_us": 12.0,
  "mem_pct": 63,
  "disks": [ { "mount": "/data", "pct": 81, "used": "1.6T", "size": "2.0T" } ],
  "services": { "nginx": {"count":4,"up":true}, "php": {"count":8,"up":true}, "mysql": {"count":1,"up":true}, "mongo": {"count":0,"up":false} },
  "docker": [ "web", "redis", "worker", "cron" ]
}

La tlx api_key se descifra desde infr_collector (con Crypt de Laravel) y se usa solo en el servidor. Nunca se devuelve al navegador ni se escribe de forma fija en el código. Lo único que sale hacia el nodo remoto es el valor q firmado.

Resumen de endpoints

Método · ruta Nombre Propósito
GET /infra/health infra.health Página (con datos de arranque)
GET /infra/health/refresh infra.health.refresh Sondeo periódico de la instantánea de métricas (JSON)
POST /infra/health/probe infra.health.probe Sondeo en vivo de un solo nodo ({alias})

Acceso

Resolución de problemas y preguntas frecuentes

No aparece ninguna tarjeta y dice «No hay ningún recolector run_report registrado»

No existe ningún recolector con la clave run_report. Registre uno en Recolectores con access=web y key=run_report.

Dice «No hay nodos registrados»

El recolector run_report existe, pero config.nodes está vacío y el registro infr_instance también. Rellene el array de nodos del recolector o registre servidores en Instancias (los nodos se derivan automáticamente de las instancias cuando config.nodes está vacío).

Las métricas solo muestran — (guiones)

No hay ninguna instantánea reciente en server_status. Confirme que el recolector run_report se está ejecutando realmente en cron y que los alias de los nodos coinciden con server_status.server_alias. La conexión se determina a partir de los 2 seq más recientes.

Todos los puntos de servicio están en gris

  1. Si el icono de llave de la cabecera es 🔑❗ (sin configurar), configure la tlx api_key en Recolectores: los sondeos no se ejecutan mientras no esté definida.
  2. Pulse el botón de sondeo (⟐) de una tarjeta para ver la respuesta. «Sondeo fallido (inaccesible)» significa que debe revisar la url del nodo, el cortafuegos y el despliegue de tlx.php.

Solo falla el sondeo, pero la carga y la memoria se ven bien

Las métricas (server_status) y el sondeo (tlx.php) son rutas independientes. La ingesta del recolector en la base de datos funciona, pero el endpoint HTTP tlx.php del nodo está bloqueado (cortafuegos o ruta). Revise config.path (por omisión /tlx.php) y la url del nodo.

El porcentaje de disco no es el que espero

El disco mostrado se elige con la prioridad df-data → df- → df-home. Con varios volúmenes, el volumen de datos (df-data) tiene preferencia.

Relacionado

헬스 — 노드별 CPU 링 게이지와 서비스 도트
헬스 — 노드별 CPU 링 게이지와 서비스 도트
노드 카드 한 장
노드 카드 한 장