Experimental Tracing Messages (ETM)
Experimental Tracing Messages (ETM) es una funcionalidad diseñada para rastrear mensajes que quedan sin respuesta debido a problemas en el sistema, eventos no controlados o causas inesperadas.
Esta característica es experimental y debe ser manejada con cuidado, ya que un mal uso podría ocasionar duplicidad en las respuestas.
Propósito de ETM
ETM busca identificar y procesar mensajes no respondidos mediante un sistema de rastreo programado. Su objetivo principal es garantizar que los mensajes importantes no queden sin atención, incluso si el cliente está en pausa o si ocurre un fallo en el sistema.
Configuración de ETM
A continuación, se muestra un ejemplo de cómo configurar ETM utilizando un GlobalRouter:
const router = new GlobalRouter({
restorePreviousCheckpoint: false,
database,
provider: provider as any,
openai_assistant: {
apiKey: process.env.OPENAI_API_KEY,
functions: [asesor]
},
experimental_tracing_messages: {
crontab_schema: "*/15 * * * *", // Se evalúa cada 15 minutos
cb: async (messages) => {
if (!messages.length) return;
for (const message of messages) {
console.log("RESTORED MESSAGES", { message });
try {
if (!message.ctx) continue;
const client = await database.getClient(message.ctx.from);
if (client.is_paused) {
// Si el cliente está en pausa, se registra el mensaje como enviado
try {
await database.logging({
msg_id: message.msg_id,
phone: message.ctx.from,
ctx: message.ctx,
delivered: true,
is_paused: client.is_paused
});
} catch (error) {
console.error(error);
}
continue;
}
// Si no está en pausa, actualizamos el timestamp y reenviamos el mensaje
message.ctx.timestamp = new Date().getTime();
provider.emit("message", message.ctx);
} catch (error) {
console.error(error?.message);
}
}
}
},
pauseFn: {
pause: async (ctx: Context) => await pause(ctx, database),
is_pause: async (ctx: Context) => {
if (!ctx.body) return true; // Si no hay contenido, asumimos que el cliente está pausado
// Todo: manejar otras casuísticas
}
}
});
Sistema de Logueo de Mensajes
El logueo de mensajes es un proceso automático del sistema que almacena información de cada mensaje que entra y sale. Dependiendo de tu configuración, puedes usar dos tablas principales:
1. Tabla message
- Propósito: Almacenar mensajes que han sido recibidos y respondidos .
- Relación: Para cada mensaje recibido (X), debe existir una respuesta correspondiente (Y).
2. Tabla logging
- Propósito: Almacenar todos los mensajes que entran , independientemente de si han sido respondidos o no.
- Uso: Se utiliza como una herramienta de validación para determinar si los mensajes han sido gestionados.
Diferencia clave:
- La tabla
messagese usa para comparar mensajes recibidos y respondidos.- La tabla
loggingse usa para validar si un mensaje ha sido procesado.
Validaciones Importantes
La funcionalidad de ETM incluye diversas validaciones que el desarrollador debe implementar para cubrir la mayoría de los escenarios posibles. Estas validaciones incluyen, pero no se limitan a:
- Mensajes de clientes pausados: Asegurarse de que los mensajes se marquen como enviados si el cliente está pausado.
- Duplicidad de mensajes: Evitar que un mensaje se procese más de una vez.
- Errores de contexto:
Manejar situaciones donde el mensaje no contiene un contexto (
ctx) válido. - Evaluación periódica:
Configurar el
crontab_schemapara una frecuencia que equilibre rendimiento y efectividad (por ejemplo, cada 15 minutos).
Consideraciones Finales
- Uso experimental: Dado que ETM es experimental, se recomienda realizar pruebas exhaustivas antes de implementarlo en producción.
- Monitoreo constante: Implementa un sistema de logs detallados para rastrear cualquier problema que pueda surgir.
- Optimización:
Ajusta la frecuencia de evaluación (
crontab_schema) y otros parámetros según las necesidades de tu sistema.