Cette traduction automatique est fournie pour votre commodité.
En cas d'incohérence entre la version anglaise et la version traduite, la version anglaise prévaudra. Veuillez visiter cette page pour plus d'informations.
Les services de messagerie présentent quelques différences avec les serveurs HTTP qui rendent leur monitoring plus difficile. Ce document décrit ces limitations et les moyens de les contourner avec l'agent New Relic Node.js.
Étant donné qu’un message n’a pas nécessairement de réponse, il peut être difficile de déterminer la fin d’une transaction. Si l'agent Node.js de New Relic ne peut pas déterminer quand un consommateur de message sera terminé, il mettra immédiatement fin à la transaction. Suivez ces conseils de dépannage en fonction de votre application.
Solution
La solution à ce problème dépend de si vous utilisez rappel ou promesses :
rappel
Lorsque vous utilisez une API de messagerie basée sur le rappel telle que amqplib de callback_api, il n'existe aucun moyen simple de déterminer quand votre consommateur a terminé. Voici un exemple.
Dans cet exemple, toutes les transactions créées pour ce service seront immédiatement terminées et n'afficheront aucun travail effectué par 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});
Afin de chronométrer correctement la transaction, vous devez obtenir la transaction et la terminer manuellement, comme indiqué dans la solution suivante.
Pour chronométrer correctement la transaction, récupérez la transaction et terminez-la manuellement. Modifiez le consommateur comme suit :
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});
Promesses
Pour les serveurs basés sur des promesses, le consommateur de messages doit simplement renvoyer une promesse. Lorsque cette promesse est résolue ou rejetée, la transaction sera terminée. Voici un exemple :
Dans cet exemple, doWorkWithMessage renvoie une promesse :
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});
Pour obtenir un timing correct, renvoyez la fin de la chaîne en modifiant le code comme suit :
channel.consume('my.queue',(msg)=>{
returndoWorkWithMessage(msg).catch((err)=>{
if(err){
logger.error(err);
channel.reject(msg,true);// Requeue message on failure.