Módulo 8: Proyecto — Sistema de Alertas Programadas
Paso 3: Categorización y Routing por Severidad
Descripción de la cápsula
Con datos consolidados, categorizar cada métrica según umbrales, después rutear por severidad (cápsula M02-07).
Generar items de alerta
Después del consolidado, crear 1 item por métrica que potencialmente genera alerta.
[Set: split en items]
Generar manualmente 3 items (uno por métrica). Usar Code node o Set con array:
// Code node — output 3 items
return [
{
json: {
metric: 'sales',
value: $('Set Consolidate').first().json.sales.pct,
warning_threshold: $('Set Consolidate').first().json.thresholds.sales_pct_average.warning,
critical_threshold: $('Set Consolidate').first().json.thresholds.sales_pct_average.critical,
comparator: 'less_than', // ventas bajas = problema
details: $('Set Consolidate').first().json.sales
}
},
{
json: {
metric: 'errors',
value: $('Set Consolidate').first().json.errors.total,
warning_threshold: ...,
critical_threshold: ...,
comparator: 'greater_than', // errores altos = problema
details: ...
}
},
{
json: {
metric: 'latency',
value: ...,
...
}
}
];
Resultado: 3 items, cada uno representando una métrica.
Calcular severidad por item
[Set: severidad]
- severity: {{
(() => {
const v = $json.value;
const w = $json.warning_threshold;
const c = $json.critical_threshold;
if ($json.comparator === 'less_than') {
if (v < c) return 'critical';
if (v < w) return 'high';
return 'ok';
} else { // greater_than
if (v > c) return 'critical';
if (v > w) return 'high';
return 'ok';
}
})()
}}
Cada item ahora tiene severity: 'critical' | 'high' | 'ok'.
Filtrar items "ok"
No queremos generar alerta para métricas que están bien.
[Filter: severity !== 'ok']
Solo continúan items con problemas.
SplitInBatches para procesamiento (cápsula M03-03)
Procesar cada alerta secuencialmente para evitar race conditions en notificaciones:
[SplitInBatches batch=1]
│ (loop)
▼
[Switch sobre severidad]
├─→ "critical" → [proceso crítica]
├─→ "high" → [proceso alta]
└─→ default → log raro
Proceso por severidad
Severidad crítica
[Set: preparar mensaje]
- message: {{ "🚨 *ALERTA CRÍTICA* — " + $json.metric + ": " + $json.value + " (threshold: " + $json.critical_threshold + ")" }}
│
├─→ [Slack: #alerts-critical] con Continue on Fail
├─→ [Send Email a oncall] con Continue on Fail
└─→ [Sheet: append 'alerts_pending_ack' para escalation tracking]
3 ramas paralelas (cápsula M04 fan-out). Notificación multi-canal.
Severidad alta
[Set: preparar mensaje]
- message: "⚠️ *Alerta alta* — " + ...
│
[Slack: #alerts] con Continue on Fail
[Sheet: append 'alerts_history']
Default (raro)
[Slack: #monitoring "Severidad inesperada"]
Logging unificado
Al final del loop (después del Switch), antes de loop back, log en alerts_history:
[Sheet append: alerts_history]
- timestamp
- metric
- value
- severity
- channels_notified
Después del loop completo (Done):
[Sheet append: 'system_log']
- timestamp
- alerts_generated: total count
- ok_metrics: count que estaban ok
Test de la cápsula
Test 1: Todo OK
Configurar Sheets con valores que NO disparan alertas.
- Ejecutar
- Filter descarta todas
- Loop no ejecuta nada
- Sheet
system_logregistra "0 alertas"
Test 2: 1 crítica
Modificar daily_sales para que sea muy baja.
- Ejecutar
- 1 item pasa el filter (severidad crítica)
- Slack #alerts-critical recibe
- Email recibido
- Sheet
alerts_pending_acktiene fila
Test 3: Múltiples niveles
Configurar 1 métrica crítica, 1 alta, 1 ok.
- Ejecutar
- Solo 2 alertas se generan (la ok se filtra)
- Notificaciones distintas por nivel
Validación
- Generación de 3 items por métrica
- Cálculo de severidad correcto
- Filter descarta "ok"
- SplitInBatches procesa de a 1
- Switch enrute correctamente
- Múltiples canales paralelos en crítica
- Logging completo
Lo que sigue: Paso 4 — escalación con HITL para críticas sin ack.
Creado: Mayo 11, 2026 Versión: 1.0