AppDynamics .NET エージェントは、インストゥルメント化されたティアからのコールに基づいて RabbitMQ バックエンドを自動検出します。RabbitMQ イグジットポイントは、メッセージをキューにパブリッシュまたはプッシュするメソッドです。RabbitMQ エントリポイントは、キュー内の新しいメッセージをリッスンまたはポーリングするメソッドです。

RabbitMQ トランスポート経由で NServiceBus を使用している場合は、「.NETのNServiceBusバックエンド」を参照してください。

イグジットポイントとバックエンドの命名

アプリケーションが BasicPublish() メソッドを使用してメッセージをキューに送信すると、エージェントは RabbitMQ バックエンドのイグジットポイントを検出します。

デフォルトで、エージェントは BasicPublish() メソッドの交換パラメータに RabbitMQ バックエンドを命名します。

例:

model.BasicPublish("MyExchange", "", false, false,
    basicProperties, Encoding.UTF8.GetBytes(message));
CODE

この場合、エージェントはキューを「MyExchange」と命名します。

バックエンド名を変更して、ルーティングキーの一部または全セグメントを含むようにすることもできます。RabbitMQの命名を構成するには、インストゥルメンテーションのRabbitMQ交換およびルーティングキーの実装をよく理解している必要があります。「RabbitMQ 交換と交換の種類」を参照してください。

バックエンド命名の再設定

rmqsegments ノードプロパティを登録します。ノードプロパティの設定方法については「アプリケーションエージェントのノードプロパティ」を参照してください。

Name:rmqsegments
Description:"Configure RabbitMQ naming to include routing key segments."
Type:整数
Value:<integer>
ルーティングキーは文字列です。エージェントはルーティングキーのドット(.)で区切られているサブ文字列をセグメントとして扱います。値を、名前に含めるルーティングキーセグメントの数を表す整数に設定します。

以下の例では、ルーティングキーは "abc.def.ghi" です。rmqsegments の値を「2」に設定し、キューを "MyExchange.abc.def" と命名します。

model.BasicPublish("MyExchange", "abc.def.ghi", false, false,
    basicProperties, Encoding.UTF8.GetBytes(message));
CODE

ノードプロパティを保存すると、コントローラがエージェントに構成を送信します。しばらくすると、RabbitMQバックエンドが新たな名前で表示されます。

エントリポイント

アプリケーションがキューをポーリングすると、エージェントは RabbitMQ バックエンドのエントリポイントを検出します。AppDynamicsは以下のパターンに基づいてRabbitMQを自動検出します。

BasicGetメソッド

エージェントは、アプリケーションが BasicGet() メソッドを使ってメッセージキューを定期的にポーリングする、以下のパターンを検出します。コールのタイミングは、while ループ内でかかる時間に制限されます。BasicGet の結果が行 4 の値を返すときのみ、タイマーが始動します。次の BasicGet が実行されるとタイマーは終了します。この例では、アプリケーションが 5 秒ごとにポーリングするため、実行時間は if ループに 5 秒足した時間と等しくなります。

バージョン 6.x より前の RabbitMQ クライアント:
while (true)
{
       var result = channel.BasicGet("MyExchange", true);
       if (result != null)
       {
                 var body = result.Body;
                 var message = Encoding.UTF8.GetString(body);
                 Console.WriteLine("Received: {0}.", message);
       }

       Thread.Sleep(5000);
}
CODE
バージョン 6.x の RabbitMQ クライアント:
while (true)
{
       var result = channel.BasicGet("MyExchange", true);
       if (result != null)
       {
                 var body = result.Body.ToArray()
                 var message = Encoding.UTF8.GetString(body);
                 Console.WriteLine("Received: {0}.", message);
       }

       Thread.Sleep(5000);
}
CODE

HandleBasicDeliverメソッド

エージェントは、IBasicConsumer インターフェイスのカスタム実装の HandleBasicDeliver() メソッドを検出します。この場合、コールのタイミングは HandleBasicDeliver メソッドの実行時間を反映します。