Ir al contenido

Módulo XV — integraciones de salida y notificaciones

El módulo XV es el enrutador de notificaciones del control plane: cuando cualquier módulo convierte una alerta en un finding en el bus de eventos, este módulo decide a qué ruta del tenant corresponde, construye una notificación expurgada, suprime duplicados y avalanchas, y la despacha en vivo a los canales que la empresa ya tiene en marcha. Es el dueño del decide qué/quién/cuándo; los conectores de salida son los dueños del cómo de la entrega — consume ese transporte, nunca lo reimplementa.

Cada módulo del producto reporta una alerta como un finding de datos mínimos en el bus (finding.reported) con un Kind con espacio de nombres — fiabilidad (health_subject_down), gasto (finops_budget), seguridad (security_guardrail), regresión de eval (eval_regression), residencia (compliance_residency_violation), cadencia de orquestación, voz y más. El módulo XV se suscribe únicamente a ese canal de alertas a nivel de todo el producto y enruta por Kind, severidad, módulo de origen y sujeto. Deliberadamente no se suscribe a telemetría en crudo como cost.sampled o edge.observed: una alerta de gasto llega como un finding finops_budget, no como una muestra de coste. Este es el seam que convierte los findings de todo el producto en notificaciones accionables.

El módulo declara dos entidades con ámbito de tenant en el modelo de datos compartido:

Entidad Modo Qué contiene
route mutable, auditada Una regla de enrutamiento: un predicado sobre tipos de evento, globs de finding-kind (p. ej. health_*), severidad mínima, módulos de origen y tipos de sujeto → un destino con nombre, con ventanas de dedup y throttle por ruta y una prioridad. No contiene ninguna credencial de destino — solo un nombre de destino no secreto.
delivery append-only El audit ledger de cada intento de entrega: ruta, destino, finding kind, severidad, referencia de sujeto, título breve, un hash de correlación y una clase de resultado (delivered, failed, no_dispatcher, unknown_destination).

En cada finding el módulo evalúa las rutas habilitadas del tenant por orden de prioridad; toda dimensión de predicado dejada vacía significa cualquiera, y la coincidencia por glob admite formas exactas o prefix*. La coincidencia ocurre dentro de una vista de lectura, la entrega por red se ejecuta estrictamente fuera de cualquier transacción de almacén, y el resultado se escribe entonces en el ledger append-only. Crear, cambiar o borrar una ruta, y enviar una notificación de prueba, son acciones privilegiadas y autoauditadas atribuidas al principal real. Las rutas route y delivery se publican en la referencia de rutas de módulo beta (referencia de rutas de módulo), no en el contrato estable del núcleo; sus formas a nivel de campo viven en las interfaces tipadas del producto.

  • Consume finding.reported — el único canal de alertas a nivel de todo el producto. Es un enrutador, no una sonda ni un medidor: nunca sondea infraestructura y nunca mide.
  • Produce notificaciones salientes a través de un seam de despacho, respaldado por los conectores de salida (Slack/Teams, PagerDuty/Opsgenie, webhook firmado y un destino SIEM que cubre Splunk/Elastic vía CEF/LEEF/syslog/OTLP). Community incluye destinos Slack, Teams, correo, SMS y webhook firmado; los destinos SIEM, ITSM y PagerDuty/Opsgenie requieren Business, y un servidor Community se niega a abrir uno e indica Business. Una notificación lleva solo los campos de presentación ya seguros del finding — título, kind, severidad, referencia de sujeto y un hash de correlación — nunca un payload, prompt, secreto o PII. Los datos mínimos son una propiedad del cable, no un filtro a posteriori. El secreto del destino vive solo en la configuración del conector, referenciado aquí por un nombre no secreto. Un administrador añade destinos Slack y Microsoft Teams en la consola (Alertas → Destinos): la URL del webhook se sella en el almacén de secretos, se muestra solo como su host y se prueba con un mensaje real antes de guardarse. Cada otro tipo lo aprovisiona el operador en el archivo indicado por OLIVARES_NOTIFY_CONFIG.