Skip to main content
Has pasado por primeras comprobaciones y la razón de rechazo es maxAttempts. Ese es el único valor que genuinamente significa enrutamiento.

El log nombra la causa

Cada una de estas está a WARN o ERROR y no necesita activar ningún flag de debug.
routing.rule.broken se registra una vez por regla, no una vez por mensaje, y el contador se reinicia solo cuando se publica una nueva tabla de enrutamiento.Así que tras arreglar una regla, mira si la línea reaparece en lugar de si se mantiene ausente. Un log silencioso no prueba nada. routing_rules_broken en /ops/health es el mismo hecho como un número, y es la forma fiable de distinguir “arreglado” de “ya reportado”.

Dos cosas que descartar antes de editar cualquier regla

Un catch-all perfecto apuntando a un proveedor desconectado no entrega nada y parece exactamente un bug de enrutamiento.
Responde en palabras: “N vendor(s) configured, none bound — nothing can be sent yet.”
Una regla que hace referencia a uno se omite por completo en lugar de cargarse con menos condiciones. Porque descartar condiciones silenciosamente ampliaría la regla.Busca Skipping … filter '…' is missing or disabled. Si eso vació la tabla default, toda la configuración de enrutamiento es rechazada y estás en el caso de ERROR anterior.

Por qué una regla no coincidió

Seis causas, y las últimas dos son la mayoría de las sorpresas:
  • Las reglas se evalúan de arriba a abajo; una tabla NORMAL se detiene en la primera coincidencia.
  • El fallback debe estar al final. Un catch-all por encima de otras reglas hace que todo debajo sea inalcanzable. La página de enrutamiento del panel advierte sobre ambos casos.
  • Los nombres de atributos deben coincidir con los de la referencia de enrutamiento.
  • Las comparaciones de cadenas distinguen mayúsculas y minúsculas a menos que se use equalsIgnoreCase.
  • startsWith compara texto literal. Una expresión regular escrita en él nunca puede ser verdadera. Usa matches. El panel avisa; un archivo editado a mano no.
  • Un campo sin valor no coincide con ningún operador positivo, isNull exceptuado. product:equals:premium no coincide con un mensaje que no lleva producto. Pero product:!equals:premium sí.

Rastrear un mensaje

Establece outSms.routing.trace a un solo serial de mensaje o id de cuenta. Cada regla contra la que ese mensaje se prueba entonces registra qué condición falló y qué llevaba realmente el mensaje:
Se aplica en vivo. Establécelo durante el incidente, límpialo después. Dejado vacío cuesta una lectura volátil por regla.
No recurras a outSms.routing.debug. Registra cada regla de cada mensaje y renderiza todo el objeto mensaje para hacerlo. Treinta llamadas String.replace encadenadas por línea. Así que es inusable a las tasas donde realmente se hacen las preguntas de enrutamiento. Es útil solo en una pasarela ociosa reproduciendo un solo envío.

Los dos números de cola

Relacionado

Cómo funciona el enrutamiento

Tablas, reglas y el orden en que resuelven.

Rechazos del proveedor

Cuando el proveedor está conectado y rechaza cada envío.