AppDynamics .NET エージェントは、インストゥルメント化されたティアからのコールに基づいて RabbitMQ バックエンドを自動検出します。RabbitMQ イグジットポイントは、メッセージをキューにパブリッシュまたはプッシュするメソッドです。RabbitMQ エントリポイントは、キュー内の新しいメッセージをリッスンまたはポーリングするメソッドです。
.NET は、RabbitMQ クライアント 6.0.0 以上で BasicPublish
および BasicConsume
のサポートを拡張します。
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
メソッドの実行時間を反映します。