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.