問題 メッセージコンシューマーサービスには、HTTPサーバーとは異なるいくつかの点があり、それらをモニタリングすることが難しくなっています。このドキュメントでは、そのような制限と、New Relic Node.js エージェントを使って制限を回避する方法について説明します。
メッセージには必ずしも返信があるとは限らないため、トランザクションの終了を判断するのが難しい場合があります。New Relic の Node.js エージェントは、メッセージ・コンシューマーがいつ終了するかを判断できない場合、直ちにトランザクションを終了します。アプリケーションに応じて、以下のトラブルシューティングのヒントに従ってください。
解決 この問題を解決するには、コールバックとプロミスのどちらを使用するかによって異なります。
コールバック amqplib
の callback_api
などのコールバック ベースのメッセージング API を使用する場合、コンシューマーがいつ完了したかを判断する簡単な方法はありません。ここに例があります。
コールバック問題 この例では、このサービス用に作成されたすべてのトランザクションがすぐに終了し、 doWorkWithMessage
によって行われた作業は表示されません。
const newrelic = require ( 'newrelic' ) ;
const amqp = require ( 'amqplib/callback_api' ) ;
channel . consume ( 'my.queue' , ( msg ) => {
doWorkWithMessage ( msg , ( err ) => {
channel . reject ( msg , true ) ;
トランザクションの時間を適切に計るためには、次のソリューションに示すように、トランザクションを取得して手動で終了させる必要があります。
解決 トランザクションの時間を適切に設定するには、トランザクションを取得し、手動で終了させます。コンシューマーをこのように修正します。
channel . consume ( 'my.queue' , ( msg ) => {
var transaction = newrelic . getTransaction ( ) ;
doWorkWithMessage ( msg , ( err ) => {
channel . reject ( msg , true ) ;
約束 プロミス・ベースのサーバーでは、メッセージ・コンシューマーは単にプロミスを返す必要があります。そのプロミスが解決または拒否されると、トランザクションが終了します。以下はその例です。
プロミス問題 この例では、 doWorkWithMessage
promise を返します。
const newrelic = require ( 'newrelic' ) ;
const amqp = require ( 'amqplib' ) ;
channel . consume ( 'my.queue' , ( msg ) => {
doWorkWithMessage ( msg ) . catch ( ( err ) => {
channel . reject ( msg , true ) ;
解決 正しいタイミングを得るためには、コードを変更してチェーンの端を戻す。
channel . consume ( 'my.queue' , ( msg ) => {
return doWorkWithMessage ( msg ) . catch ( ( err ) => {
channel . reject ( msg , true ) ;