Skip to content

Diagnóstico de batch, scheduler y bots

Cuándo usar este documento

Cuando algo automático no ocurrió y no está claro por dónde empezar. Es el punto de entrada de los demás playbooks.

Audiencia

Soporte e infraestructura.

Estado documental

  • Estado: Borrador
  • Última actualización: 2026-08-02
  • Owner: Pendiente
  • SME requerido: soporte técnico / infraestructura
  • Fuente resumida: arquitectura de ejecución del sistema y configuración de scheduler y colas.

La regla que resuelve la mitad de los casos

En sy-energy el trabajo se ejecuta por tres caminos, y cada uno falla en silencio de forma distinta:

CaminoCómo falla
Cron → schedulerSi el cron está caído, no hay error: simplemente no hay entradas en el log.
Comando → colaEl comando reporta éxito al encolar. Si el worker está caído, nada se procesa y nadie lo reporta.
Comando → bot → LambdaEl comando reporta éxito al publicar el mensaje. Lo que pase después ocurre fuera de este sistema.

Por eso la primera pregunta nunca es "¿qué error dio?" sino "¿llegó a ejecutarse?".

Diagnóstico en orden

Recorrer de arriba hacia abajo. Cada nivel supone que el anterior está sano.

Nivel 1 — ¿Corrió el motor?

bash
# ¿Existe el cron de esta instancia?
crontab -l

# ¿Están arriba los workers?
sudo supervisorctl status
HallazgoQué significa
Cron ausente o comentadoNinguna tarea programada corrió. Todo lo demás es consecuencia.
Workers en estado distinto de RUNNINGTodo lo asíncrono está detenido: cálculos, facturas, respuestas de bots.

Un log vacío es un síntoma, no una buena noticia.

Nivel 2 — ¿Corrió la tarea?

Revisar en storage/logs de la instancia:

LogTareas que registra
ecd-sync.logReintento de fallidos y sincronización de ECD.
cenace-process.logFacturas, carga a S3, carga al SIM, estatus y REA.
service-process.logSincronización de demanda.
HallazgoQué significa
No hay entrada del díaLa tarea no se ejecutó. Volver al nivel 1.
Hay entrada y termina con errorLa tarea corrió y falló. Ir al nivel 3.
Hay entrada, sin error, pero procesó menos de lo esperadoUna etapa anterior de la cadena no terminó a tiempo.

Nivel 3 — ¿Se procesó el trabajo?

bash
php artisan queue:failed
HallazgoQué significa
Vacío y sin efecto visibleLos trabajos se encolaron pero nadie los procesó. Revisar workers.
Fallidos de hoyLeer el error antes de reintentar.
Fallidos acumulados de varios díasEl reintento automático de las 05:00 no resuelve el problema de fondo. Escalar.

Nivel 4 — ¿Respondió el sistema externo?

Cuando el trabajo sí se procesó y aun así no hay resultado, el problema está fuera:

IntegraciónCómo se ve la falla
API de CENACENo llegan ECD; error en el log de sincronización.
Bots del SIMEl mensaje se publicó pero nunca hubo respuesta.
Factura.comFacturas que no se timbran.
MEMCálculos de precios en cero.

Preguntas para acotar

PreguntaPor qué importa
¿En qué instancia de participante?Cada una tiene su base, colas y logs. Un problema en una no se ve desde la otra.
¿Qué fecha de operación, no qué día de ejecución?Los procesos trabajan con desfase; confundirlas lleva a conclusiones falsas.
¿Cuándo funcionó por última vez?Acota si es un cambio reciente o un problema acumulado.
¿Qué impacto tiene?Facturación y demanda son prioritarios; un reporte puede esperar.
¿Es seguro reintentar?No todos los comandos son idempotentes.

Antes de reintentar

Tres verificaciones obligatorias

  1. Instancia correcta. Confirmar el participante antes de escribir el comando.
  2. Fuera de la ventana automática. Entre 05:00 y 08:30 el scheduler está corriendo la cadena; ejecutar lo mismo a mano puede duplicar procesamiento.
  3. Alcance acotado. Empezar con un día o un centro de carga antes de lanzar un rango completo.

Escalar a desarrollo

Sin intentar corregir por cuenta propia, cuando:

  • se emitieron documentos fiscales incorrectos o duplicados;
  • los mismos trabajos fallan día tras día con el mismo error;
  • un cálculo produce importes que no cuadran y la fuente sí está completa;
  • hay que revertir algo que ya se escribió en base de datos.

Evidencia mínima

  • Fecha y hora del incidente.
  • Instancia del participante.
  • Comando, tarea o bot involucrado.
  • Fragmento de log sanitizado: sin credenciales, RFC ni datos personales.
  • Qué se intentó y qué resultado dio.

Playbooks específicos

Riesgos y gaps

  • No hay alertamiento: todos los diagnósticos empiezan porque alguien notó algo.
  • No existe un tablero de estado de la cadena diaria.
  • No está documentada la idempotencia de los comandos, que es justo lo que hace falta saber para decidir si reintentar.

Próxima revisión

Tras la validación de soporte.