Módulo 8: Proyecto — Sistema de Alertas Programadas

Paso 2: Multi-Source Data Collection

Descripción de la cápsula

Después del IF "should_alert", leer las 3 fuentes en paralelo (cápsula M04-02 fan-out).


Sheets de input

Asegúrate de tener creados (con mock data):

daily_sales

datetotal_dayhistorical_average
2026-05-11850010000

api_errors

timestamperror_count_last_hour
2026-05-11 14:3035

api_latency

timestampp95_ms
2026-05-11 14:301200

thresholds (configuración)

metricwarningcritical
sales_pct_average5020
errors_per_hour1050
latency_p95_ms5002000

Fan-out: 3 ramas

Después del IF should_alert (TRUE branch):

[IF should_alert TRUE]
   │
   ├─→ [Sheet: daily_sales] → [Set: sales_data]
   │
   ├─→ [Sheet: api_errors] → [Set: errors_data]
   │
   ├─→ [Sheet: api_latency] → [Set: latency_data]
   │
   └─→ [Sheet: thresholds] → [Set: thresholds]
        │
        ▼
   [Merge: Wait con 4 inputs]
        │
   [Set: agregar todo en un objeto]

4 ramas paralelas leyendo 4 Sheets. Convergencia con Wait.


Cada rama: read y prepare

Rama 1: ventas

[Sheet daily_sales]
- Operation: Get Rows
- Filter: date === today
   │
[Set: extraer]
- sales_today: {{ $json.total_day || 0 }}
- average: {{ $json.historical_average || 0 }}
- pct_vs_average: {{ ($json.total_day / $json.historical_average) * 100 }}

Rama 2: errors

[Sheet api_errors]
- Operation: Get Rows
- Filter: timestamp últimos 60 min
   │
[Aggregate: sumar errors]
   │
[Set: extraer]
- errors_total: $json.errors_array.reduce((a, b) => a + b.error_count, 0)

Rama 3: latency

[Sheet api_latency]
- Filter: last 60 min
   │
[Set: extraer]
- latency_p95: {{ /* cálculo de p95 */ }}

(Si el cálculo de p95 es complejo, asumir que el Sheet ya tiene una columna "p95" pre-calculada.)

Rama 4: thresholds

[Sheet thresholds]
- Read all rows
   │
[Aggregate: into 'thresholds_array']

Merge Wait

[Merge: mode Wait]
4 inputs conectados

Espera a las 4 ramas.


Set: consolidar

[Set: consolidar todo]
- sales: { today, average, pct }
- errors: { total }
- latency: { p95 }
- thresholds: { ... lookup desde array ... }

Helper para acceder thresholds:

{{
  (() => {
    const map = {};
    $('Sheet thresholds').first().json.thresholds_array.forEach(t => {
      map[t.metric] = { warning: t.warning, critical: t.critical };
    });
    return map;
  })()
}}

Permite después: $json.thresholds.sales_pct_average.critical → 20.


Continue on Fail en cada lectura

Si una fuente falla, el sistema sigue con las otras dos.

Configurar en cada Sheet node:

  • Settings → Continue On Fail: ON

Si una rama produce error, el Merge Wait recibe item con error. Set posterior puede manejar:

sales_today: $json.error ? 0 : $json.total_day

Asume 0 si la lectura falló (que probablemente disparará alerta crítica — correcto si la fuente está caída).


Validación

  • 4 Sheets de input con data mock
  • 4 ramas paralelas configuradas
  • Merge Wait recibe las 4
  • Set consolidado tiene estructura usable
  • Continue on Fail evita que falle todo si 1 Sheet falla

Lo que sigue: Paso 3 — categorizar y rutear por severidad.


Creado: Mayo 11, 2026 Versión: 1.0