問題
メッセージコンシューマーサービスには、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);