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_log registra "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_ack tiene 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