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
| date | total_day | historical_average |
|---|---|---|
| 2026-05-11 | 8500 | 10000 |
api_errors
| timestamp | error_count_last_hour |
|---|---|
| 2026-05-11 14:30 | 35 |
api_latency
| timestamp | p95_ms |
|---|---|
| 2026-05-11 14:30 | 1200 |
thresholds (configuración)
| metric | warning | critical |
|---|---|---|
| sales_pct_average | 50 | 20 |
| errors_per_hour | 10 | 50 |
| latency_p95_ms | 500 | 2000 |
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