Saltar al contenido principal

Monitoreo de Nodos

En el vasto universo de KodeChain, donde nodos operan las 24 horas del día produciendo bloques y procesando transacciones, el monitoreo no es un lujo opcional sino la columna vertebral que garantiza la estabilidad y confiabilidad del sistema. Implementado a través de Nginx como proxy reverso y un dashboard HTML moderno, el sistema de monitoreo transforma datos técnicos en información accionable para operadores y desarrolladores.

La Arquitectura del Monitoreo

Nginx como Guardián de Puertas

# Configuración de upstream para los nodos
upstream bootstrap {
server bootstrap:8080;
}

upstream dpos {
server dpos:8081;
}

upstream pbft {
server pbft:8082;
}

Nginx actúa como el guardián principal, distribuyendo el tráfico entrante hacia los diferentes nodos según su rol en la red.

Dashboard: La Ventana al Sistema

El dashboard HTML, alojado en monitoring/html/index.html, representa la interfaz visual que transforma datos técnicos en información comprensible:

<div class="nodes-grid">
<!-- Nodo Bootstrap -->
<div class="node-card" id="bootstrap-card">
<div class="node-header">
<div class="node-icon bootstrap">🚀</div>
<div class="node-info">
<h3>Nodo Bootstrap</h3>
<p><span class="status-indicator status-unknown" id="bootstrap-status"></span>Estado: <span id="bootstrap-status-text">Verificando...</span></p>
</div>
</div>
<!-- ... -->
</div>
</div>

Cada tarjeta de nodo muestra el estado vital del sistema: conectividad, altura de blockchain, tipo de consenso.

El Pulso del Sistema

Verificación de Estado en Tiempo Real

async function checkNodeStatus(nodeName) {
const response = await fetch(`/api/status`, {
headers: {
'X-Consensus-Type': nodeConfigs[nodeName].consensus
}
});

if (response.ok) {
const data = await response.json();
// Actualizar UI con datos frescos
}
}

La función checkNodeStatus realiza verificaciones HTTP periódicas, consultando endpoints específicos de cada nodo para determinar su salud.

Métricas Clave por Nodo

Bootstrap Node

  • Altura de Blockchain: Último bloque conocido
  • Estado de Conectividad: Disponibilidad del servicio
  • Tipo de Consenso: NONE (no participa en validación)

DPOS Node

  • Altura de Blockchain: Bloques producidos por consenso DPoS
  • Delegados Activos: Número de validadores y delegadores
  • Estado de Consenso: Funcionamiento del algoritmo DPoS

PBFT Node

  • Altura de Blockchain: Bloques validados por consenso PBFT
  • Estado de Consenso: Funcionamiento del algoritmo PBFT
  • Latencia de Red: Tiempo de respuesta entre nodos

Proxy Reverso Inteligente

Rutas de API Organizadas

# Proxy para Bootstrap
location /bootstrap/ {
proxy_pass http://bootstrap/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# Proxy para DPOS
location /dpos/ {
proxy_pass http://dpos/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

Cada ruta está cuidadosamente configurada para preservar headers importantes y permitir el seguimiento de solicitudes.

Endpoint Unificado de Estado

# API de monitoreo
location /api/status {
proxy_pass http://bootstrap/api/sync/height;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

Un endpoint centralizado que permite verificar el estado general del sistema desde un solo punto.

Interfaz de Usuario Moderna

Diseño Responsive

.nodes-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 20px;
margin-bottom: 30px;
}

@media (max-width: 768px) {
.nodes-grid {
grid-template-columns: 1fr;
}
}

El diseño se adapta automáticamente a diferentes tamaños de pantalla, desde monitores de escritorio hasta dispositivos móviles.

Estados Visuales Claros

.status-online { background: #4CAF50; }
.status-offline { background: #f44336; }
.status-unknown { background: #ff9800; }

Indicadores de color intuitivos permiten identificar rápidamente el estado de cada nodo.

Actualización Automática

// Actualizar automáticamente cada 30 segundos
setInterval(refreshAllNodes, 30000);

El dashboard se actualiza automáticamente cada 30 segundos, proporcionando información en tiempo real sin intervención del usuario.

Monitoreo de Salud del Sistema

Verificación de Conectividad

try {
const response = await fetch(`/api/status`, {
headers: {
'X-Consensus-Type': nodeConfigs[nodeName].consensus
}
});

if (response.ok) {
// Nodo operativo
statusIndicator.className = 'status-indicator status-online';
statusText.textContent = 'En línea';
} else {
throw new Error(`HTTP ${response.status}`);
}
} catch (error) {
// Nodo fuera de línea
statusIndicator.className = 'status-indicator status-offline';
statusText.textContent = 'Fuera de línea';
}

Manejo robusto de errores que diferencia entre problemas de red y fallos del servicio.

Métricas de Rendimiento

Cada tarjeta de nodo muestra métricas críticas:

  • Altura de Blockchain: Progreso de sincronización
  • Tipo de Consenso: Identificación del rol del nodo
  • Estado de Conectividad: Disponibilidad del servicio

Logging y Auditoría

Registros de Acceso

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;

Todos los accesos al dashboard quedan registrados para auditoría y troubleshooting.

Manejo de Errores

} catch (error) {
console.error(`Error verificando ${nodeName}:`, error);
// Actualizar UI para mostrar error
}

Errores se registran en consola y se reflejan en la interfaz de usuario.

Escalabilidad y Mantenimiento

Configuración por Entorno

La configuración de Nginx permite diferentes setups:

  • Desarrollo: Un solo contenedor con todos los servicios
  • Producción: Contenedores separados para cada nodo
  • Monitoreo: Instancia dedicada de Nginx para observabilidad

Actualización Continua

async function refreshAllNodes() {
for (const node of nodes) {
await checkNodeStatus(node);
await new Promise(resolve => setTimeout(resolve, 500));
}
}

Actualizaciones secuenciales con delays controlados para evitar sobrecarga del sistema.

El Rol en la Operación

Detección Temprana de Problemas

El monitoreo continuo permite identificar:

  • Nodos caídos: Conectividad perdida
  • Desincronización: Alturas de blockchain divergentes
  • Problemas de consenso: Fallos en la producción de bloques

Toma de Decisiones Informada

Los operadores pueden:

  • Reiniciar servicios: Cuando se detectan nodos offline
  • Rebalancear carga: Basado en métricas de rendimiento
  • Planificar mantenimiento: Durante periodos de baja actividad

Transparencia del Sistema

El dashboard proporciona una vista unificada que permite a stakeholders entender:

  • Estado actual: Todos los componentes funcionando
  • Historial de rendimiento: Tendencias de uptime
  • Alertas proactivas: Problemas antes de que afecten usuarios

El Arte de la Vigilancia

Cada actualización del dashboard, cada verificación de estado, cada métrica mostrada es un latido en el corazón de KodeChain. El sistema de monitoreo no solo observa; participa activamente en mantener la salud del sistema.

Desde el primer checkNodeStatus() hasta la actualización automática cada 30 segundos, el monitoreo transforma datos técnicos en conocimiento accionable, permitiendo que operadores mantengan el sistema funcionando con confianza y precisión.

En KodeChain, el monitoreo no es reactivo; es proactivo, preventivo y predictivo, asegurando que la red blockchain mantenga su promesa de confiabilidad las 24 horas del día, los 7 días de la semana.