kukuy 1.6.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,9 +9,12 @@ KUKUY es un sistema de balanceo de carga backend desarrollado en Node.js que pe
9
9
  - **Panel de Control Web**: Interfaz gráfica para monitorear el estado del sistema
10
10
  - **Sistema de Plugins**: Arquitectura extensible mediante plugins
11
11
  - **Hooks y Filtros**: Capacidad para interceptar y modificar solicitudes/responses
12
+ - **Sistema de Cache Robusto**: Almacenamiento en memoria con TTL configurable y política LRU
12
13
  - **Rutas Personalizadas**: Configuración flexible de rutas para diferentes grupos de servidores
13
14
  - **Monitoreo en Tiempo Real**: Métricas detalladas sobre rendimiento y estado de servidores
14
15
  - **Reintento Inteligente**: Reenvío automático de solicitudes a servidores alternativos en caso de fallo
16
+ - **Verificación de Salud Periódica**: Sistema automatizado que verifica regularmente la salud de los servidores backend
17
+ - **Monitoreo de Eventos de Salud**: Registro y seguimiento detallado de eventos relacionados con la verificación de salud
15
18
 
16
19
  ## Configuración
17
20
 
@@ -75,7 +78,7 @@ Define las rutas y a qué grupo de servidores deben dirigirse:
75
78
  - `SSL_KEY_PATH`: Ruta a la llave privada SSL
76
79
  - `DASHBOARD_PORT`: Puerto del panel de control web (por defecto 8082)
77
80
  - `WEBSOCKET_PORT`: Puerto del servidor WebSocket (por defecto 8083)
78
- - `HEALTH_CHECK_INTERVAL`: Intervalo de verificación de salud de servidores
81
+ - `HEALTH_CHECK_INTERVAL`: Intervalo de verificación de salud de servidores (en milisegundos, por defecto 30000)
79
82
  - `LOG_LEVEL`: Nivel de logging (por defecto 'info')
80
83
 
81
84
  ## Algoritmos de Balanceo
@@ -119,6 +122,32 @@ KUKUY incluye un panel de control web accesible en `http://localhost:8082` (por
119
122
 
120
123
  La arquitectura de KUKUY permite extender su funcionalidad mediante plugins. Los plugins se colocan en el directorio `kukuy-plugins/` y deben incluir un archivo `manifest.json` con la configuración del plugin.
121
124
 
125
+ ## Plugins de Verificación de Salud
126
+
127
+ KUKUY incluye dos plugins especializados para la gestión de la salud de los servidores backend:
128
+
129
+ ### Plugin de Verificación de Salud Periódica (`health-checker`)
130
+
131
+ Este plugin implementa un sistema de verificación de salud proactivo que:
132
+
133
+ - Verifica la salud de todos los servidores backend en intervalos regulares
134
+ - Utiliza la configuración `HEALTH_CHECK_INTERVAL` para determinar la frecuencia de verificación
135
+ - Se comunica con el endpoint `/health` de cada servidor para determinar su estado
136
+ - Actualiza dinámicamente el estado de salud de los servidores en el pool
137
+ - Integra con el sistema de hooks para notificar eventos de salud
138
+
139
+ ### Plugin de Monitoreo de Eventos de Salud (`health-monitor`)
140
+
141
+ Este plugin proporciona monitoreo y registro detallado de los eventos relacionados con la salud de los servidores:
142
+
143
+ - Registra eventos cuando comienza una verificación de salud
144
+ - Muestra el resultado de las verificaciones (saludable/no saludable)
145
+ - Captura y registra errores, timeouts y excepciones durante las verificaciones
146
+ - Proporciona alertas cuando un servidor no está saludable
147
+ - Muestra información detallada sobre el estado de los servidores
148
+
149
+ Ambos plugins trabajan juntos para proporcionar un sistema completo de monitoreo de salud que va más allá de la verificación reactiva (solo cuando un servidor falla) hacia un enfoque proactivo que mantiene un seguimiento constante del estado de los servidores backend.
150
+
122
151
  ### Estructura de un Plugin
123
152
 
124
153
  Un plugin típico incluye:
@@ -147,13 +176,40 @@ Ejemplo de `manifest.json`:
147
176
  Permiten ejecutar código en puntos específicos del ciclo de vida de una solicitud:
148
177
  - `onRequestReceived`: Cuando se recibe una solicitud
149
178
  - `onServerSelected`: Después de seleccionar un servidor destino
150
- - `onResponseSent`: Antes de enviar la respuesta al cliente
179
+ - `onResponseReady`: Antes de enviar la respuesta al cliente (permite interceptar la respuesta del servidor backend)
180
+ - `onResponseSent`: Después de enviar la respuesta al cliente
151
181
  - `onServerError`: Cuando ocurre un error con un servidor backend
152
182
 
153
183
  ### Filtros
154
184
  Permiten interceptar y potencialmente modificar o bloquear solicitudes antes de que sean procesadas:
155
- - Se pueden aplicar filtros de solicitud (`request`)
185
+ - Se pueden aplicar filtros de solicitud (`request_processing`)
156
186
  - Permiten implementar lógica de seguridad, autenticación, etc.
187
+ - Soportan prioridades para controlar el orden de ejecución
188
+
189
+ ### Sistema de Cache Robusto
190
+ KUKUY incluye un sistema avanzado de cache que:
191
+ - Almacena respuestas en memoria con TTL (Time To Live) configurable
192
+ - Implementa política LRU (Least Recently Used) para manejo de espacio
193
+ - Permite configurar métodos HTTP cacheables (por defecto: GET)
194
+ - Soporta códigos de estado cacheables (por defecto: 200, 201, 204)
195
+ - Incluye limpieza automática de entradas expiradas
196
+ - Ofrece estadísticas detalladas sobre el uso de la caché
197
+ - Se integra completamente con el sistema de hooks y filtros
198
+
199
+ Los plugins de cache pueden:
200
+ - Interceptar solicitudes para verificar si están en caché
201
+ - Almacenar respuestas del servidor backend en caché
202
+ - Servir respuestas directamente desde la caché sin contactar al servidor backend
203
+ - Configurar TTL por defecto y reglas de expiración
204
+ - Implementar compresión opcional de contenido cacheado
205
+ - Tienen la máxima prioridad (0) para asegurar que se ejecuten antes que otros plugins
206
+
207
+ ### Jerarquía de Prioridades
208
+ - **Prioridad 0**: Plugin de cache (máxima prioridad)
209
+ - **Prioridad 1-4**: Otros plugins críticos
210
+ - **Prioridad 5**: Plugin de ejemplo y otros plugins estándar
211
+ - **Prioridad 6-9**: Plugins de funcionalidad intermedia
212
+ - **Prioridad 10+**: Manejadores de errores y eventos especiales
157
213
 
158
214
  ## Seguridad
159
215
 
package/balancer.log CHANGED
@@ -1,2 +1,30 @@
1
1
  {"timestamp":"2026-01-30T19:04:05.202Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":631,"statusCode":200}}
2
2
  {"timestamp":"2026-01-30T19:04:34.272Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":56,"statusCode":200}}
3
+ {"timestamp":"2026-01-30T20:17:23.725Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":727,"statusCode":200}}
4
+ {"timestamp":"2026-01-30T20:17:24.900Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":525,"statusCode":200}}
5
+ {"timestamp":"2026-01-30T20:17:38.252Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":663,"statusCode":200}}
6
+ {"timestamp":"2026-01-30T20:17:39.346Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":524,"statusCode":200}}
7
+ {"timestamp":"2026-01-30T20:17:47.856Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":58,"statusCode":200}}
8
+ {"timestamp":"2026-01-30T20:17:48.459Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":55,"statusCode":200}}
9
+ {"timestamp":"2026-01-30T20:17:51.323Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":81,"statusCode":200}}
10
+ {"timestamp":"2026-01-30T20:17:51.938Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":39,"statusCode":200}}
11
+ {"timestamp":"2026-01-30T20:17:57.742Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":73,"statusCode":200}}
12
+ {"timestamp":"2026-01-30T20:17:58.347Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":52,"statusCode":200}}
13
+ {"timestamp":"2026-01-30T20:18:16.831Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":98,"statusCode":200}}
14
+ {"timestamp":"2026-01-30T20:18:17.792Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":400,"statusCode":200}}
15
+ {"timestamp":"2026-01-30T20:21:10.507Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":135,"statusCode":200}}
16
+ {"timestamp":"2026-01-30T20:21:11.101Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":47,"statusCode":200}}
17
+ {"timestamp":"2026-01-30T20:21:27.474Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":35,"statusCode":200}}
18
+ {"timestamp":"2026-01-30T20:21:28.076Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":53,"statusCode":200}}
19
+ {"timestamp":"2026-01-30T20:22:15.368Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":121,"statusCode":200}}
20
+ {"timestamp":"2026-01-30T20:22:16.014Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":58,"statusCode":200}}
21
+ {"timestamp":"2026-01-30T20:22:29.162Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":48,"statusCode":200}}
22
+ {"timestamp":"2026-01-30T20:22:29.742Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":37,"statusCode":200}}
23
+ {"timestamp":"2026-01-30T20:23:10.703Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":123,"statusCode":200}}
24
+ {"timestamp":"2026-01-30T20:23:11.347Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":82,"statusCode":200}}
25
+ {"timestamp":"2026-01-30T20:23:25.118Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":32,"statusCode":200}}
26
+ {"timestamp":"2026-01-30T20:23:25.726Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":29,"statusCode":200}}
27
+ {"timestamp":"2026-01-30T20:26:32.857Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":145,"statusCode":200}}
28
+ {"timestamp":"2026-01-30T20:26:33.445Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":27,"statusCode":200}}
29
+ {"timestamp":"2026-01-30T20:26:36.917Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":73,"statusCode":200}}
30
+ {"timestamp":"2026-01-30T20:26:37.556Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":28,"statusCode":200}}
@@ -1,12 +1,67 @@
1
- # Sistema de Plugins para Kukuy
1
+ # Plugins de Kukuy
2
2
 
3
- ## Introducción
3
+ Este directorio contiene plugins para extender la funcionalidad del balanceador Kukuy.
4
4
 
5
- Kukuy incluye un sistema de plugins que permite extender su funcionalidad sin modificar el código base. Los plugins se almacenan en el directorio `kukuy-plugins/` y se cargan automáticamente al iniciar Kukuy.
5
+ ## Plugins Disponibles
6
6
 
7
- ## Estructura de un Plugin
7
+ ### 1. Plugin de Cache Robusto (`cache-plugin`)
8
8
 
9
- Cada plugin debe tener la siguiente estructura:
9
+ Este plugin implementa un sistema de cache robusto que permite almacenar en caché las respuestas del servidor backend para mejorar el rendimiento.
10
+
11
+ #### Características:
12
+ - Soporta diferentes métodos HTTP cacheables (por defecto: GET)
13
+ - Configurable mediante variables de entorno
14
+ - Implementa LRU (Least Recently Used) para manejar el tamaño máximo de caché
15
+ - Soporta TTL (Time To Live) configurable
16
+ - Limpieza automática de entradas expiradas
17
+
18
+ #### Variables de entorno:
19
+ - `CACHE_MAX_SIZE`: Número máximo de entradas en la caché (por defecto: 100)
20
+ - `CACHE_DEFAULT_TTL`: Tiempo de vida por defecto en milisegundos (por defecto: 300000 - 5 minutos)
21
+ - `CACHE_ENABLE_COMPRESSION`: Habilitar compresión (por defecto: false)
22
+ - `CACHEABLE_METHODS`: Métodos HTTP cacheables separados por coma (por defecto: GET)
23
+ - `CACHEABLE_STATUS_CODES`: Códigos de estado cacheables separados por coma (por defecto: 200,201,204)
24
+
25
+ #### Uso:
26
+ El plugin se activa automáticamente si está habilitado en el manifest.json.
27
+
28
+ ### 2. Plugin de Redirección (`redirect-plugin`)
29
+
30
+ Este plugin permite implementar reglas de redirección personalizadas.
31
+
32
+ #### Características:
33
+ - Soporta patrones de URL con expresiones regulares
34
+ - Tipos de redirección: temporal (302) y permanente (301)
35
+ - Configurable mediante variables de entorno
36
+
37
+ #### Variables de entorno:
38
+ - `REDIRECT_RULES`: Reglas de redirección en formato JSON
39
+
40
+ #### Ejemplo de regla de redirección:
41
+ ```json
42
+ [
43
+ {
44
+ "pattern": "/old-page",
45
+ "target": "/new-page",
46
+ "type": "permanent"
47
+ },
48
+ {
49
+ "pattern": "^/api/v1/(.*)$",
50
+ "target": "/api/v2/$1",
51
+ "type": "temporary"
52
+ }
53
+ ]
54
+ ```
55
+
56
+ ## Cómo Crear un Nuevo Plugin
57
+
58
+ Para crear un nuevo plugin, sigue estos pasos:
59
+
60
+ 1. Crea un directorio con el nombre de tu plugin en `kukuy-plugins/`
61
+ 2. Crea un archivo `manifest.json` con la información del plugin
62
+ 3. Crea un archivo `index.js` con la lógica del plugin
63
+
64
+ ### Estructura de un Plugin
10
65
 
11
66
  ```
12
67
  kukuy-plugins/
@@ -15,16 +70,14 @@ kukuy-plugins/
15
70
  └── index.js
16
71
  ```
17
72
 
18
- ## Manifest
19
-
20
- El archivo `manifest.json` debe contener:
73
+ ### Ejemplo de `manifest.json`:
21
74
 
22
75
  ```json
23
76
  {
24
- "name": "Nombre del Plugin",
77
+ "name": "Mi Plugin",
25
78
  "version": "1.0.0",
26
- "description": "Descripción del plugin",
27
- "author": "Autor del plugin",
79
+ "description": "Descripción de mi plugin",
80
+ "author": "Autor",
28
81
  "main": "index.js",
29
82
  "kukuyVersion": "^1.6.0",
30
83
  "hooks": ["onRequestReceived", "onResponseSent"],
@@ -33,59 +86,40 @@ El archivo `manifest.json` debe contener:
33
86
  }
34
87
  ```
35
88
 
36
- Campos obligatorios:
37
- - `name`: Nombre del plugin
38
- - `version`: Versión del plugin
39
- - `description`: Descripción del plugin
40
- - `main`: Archivo principal del plugin
41
- - `enabled`: Si el plugin está habilitado o no
42
-
43
- Campos opcionales:
44
- - `author`: Autor del plugin
45
- - `kukuyVersion`: Versión de Kukuy requerida
46
- - `hooks`: Lista de hooks que el plugin usa
47
- - `filters`: Lista de filtros que el plugin usa
48
- - `dependencies`: Dependencias del plugin
49
-
50
- ## Archivo Principal
51
-
52
- El archivo principal (por defecto `index.js`) debe exportar las funciones:
53
-
54
- - `init(balancer)`: Se llama cuando se carga el plugin
55
- - `deinit(balancer)`: Se llama cuando se descarga el plugin (opcional)
56
-
57
- ## API de Extensión
58
-
59
- Dentro del plugin, puedes usar la API de extensión para registrar filtros y hooks:
89
+ ### Ejemplo de `index.js`:
60
90
 
61
91
  ```javascript
62
92
  async function init(balancer) {
93
+ console.log('Inicializando mi plugin...');
94
+
63
95
  const extension = balancer.getPostStartupExtension();
64
96
 
65
- // Registrar un filtro
97
+ // Registrar filtros y hooks
66
98
  extension.registerFilter('request_processing', async (data) => {
67
99
  // Lógica del filtro
68
100
  return { allowed: true };
69
101
  });
70
102
 
71
- // Registrar un hook
72
103
  extension.registerHook('onRequestReceived', async ({ req, res }) => {
73
104
  // Lógica del hook
74
105
  });
75
106
  }
107
+
108
+ async function deinit(balancer) {
109
+ console.log('Desactivando mi plugin...');
110
+ }
111
+
112
+ module.exports = { init, deinit };
76
113
  ```
77
114
 
78
115
  ## Hooks Disponibles
79
116
 
80
117
  - `onRequestReceived`: Se ejecuta cuando se recibe una solicitud
81
118
  - `onServerSelected`: Se ejecuta después de seleccionar el servidor
82
- - `onResponseSent`: Se ejecuta antes de enviar la respuesta
119
+ - `onResponseReady`: Se ejecuta cuando la respuesta del servidor backend está lista
120
+ - `onResponseSent`: Se ejecuta antes de enviar la respuesta al cliente
83
121
  - `onServerError`: Se ejecuta cuando ocurre un error
84
122
 
85
123
  ## Filtros Disponibles
86
124
 
87
- - `request_processing`: Se aplica al procesamiento de solicitudes
88
-
89
- ## Variables de Entorno
90
-
91
- - `PLUGINS_DIR`: Directorio donde buscar plugins (por defecto: `./kukuy-plugins`)
125
+ - `request_processing`: Se aplica al procesamiento de solicitudes