Te ofrecemos esta traducción automática para facilitar la lectura.
En caso de que haya discrepancias entre la versión en inglés y la versión traducida, se entiende que prevalece la versión en inglés. Visita esta página para obtener más información.
Los servicios de consumidor de mensajes tienen algunas diferencias con los servidores HTTP que dificultan su monitoreo. Este documento analiza esas limitaciones y las formas de solucionarlas con el agente New Relic Node.js.
Debido a que un mensaje no necesariamente tiene una respuesta, puede resultar difícil determinar el final de una transacción. Si el agente Node.js de New Relic no puede determinar cuándo finalizará el consumidor de mensajes, finalizará la transacción inmediatamente. Siga estos consejos de resolución de problemas según su aplicación.
Solución
La solución a este problema depende de si estás utilizando devolución de llamada o promesas:
Devolución de llamada
Cuando se utiliza una API de mensajería basada en devolución de llamada, como la callback_api de amqplib, no existe una forma sencilla de determinar cuándo el consumidor ha terminado. Aquí hay un ejemplo.
En este ejemplo, todas las transacciones creadas para este servicio finalizarán inmediatamente y no mostrarán nada del trabajo realizado por doWorkWithMessage.
const newrelic =require('newrelic');
const amqp =require('amqplib/callback_api');
// Connect, make a channel, and assert required queues...
channel.consume('my.queue',(msg)=>{
doWorkWithMessage(msg,(err)=>{
if(err){
logger.error(err);
channel.reject(msg,true);// Requeue message on failure.
}
});
},{noAck:true});
Para cronometrar correctamente la transacción, debe obtenerla y finalizarla manualmente, como se muestra en la siguiente solución.
Para programar correctamente la transacción, obtenga la transacción y finalícela manualmente. Modifique el consumidor a esto:
channel.consume('my.queue',(msg)=>{
var transaction = newrelic.getTransaction();
doWorkWithMessage(msg,(err)=>{
if(err){
logger.error(err);
channel.reject(msg,true);// Requeue message on failure.
}
transaction.end();
});
},{noAck:true});
Promesas
Para los servidores basados en promesas, el consumidor del mensaje simplemente necesita devolver una promesa. Cuando esa promesa se resuelva o rechace, la transacción finalizará. Aquí hay un ejemplo:
En este ejemplo, doWorkWithMessage devuelve una promesa:
const newrelic =require('newrelic');
const amqp =require('amqplib');
// Connect, make a channel, and assert required queues...
channel.consume('my.queue',(msg)=>{
doWorkWithMessage(msg).catch((err)=>{
if(err){
logger.error(err);
channel.reject(msg,true);// Requeue message on failure.
}
});
},{noAck:true});
Para obtener la sincronización correcta, devuelva el final de la cadena modificando el código a:
channel.consume('my.queue',(msg)=>{
returndoWorkWithMessage(msg).catch((err)=>{
if(err){
logger.error(err);
channel.reject(msg,true);// Requeue message on failure.