すべてのプロダクト
Search
ドキュメントセンター

ApsaraMQ for RabbitMQ:秒単位のメトリクスを生成する方法

最終更新日:Jan 14, 2025

このトピックでは、メッセージログ管理機能を使用して秒単位のメトリクスを生成する方法について説明します。

背景情報

CloudMonitor は、ApsaraMQ for RabbitMQ インスタンスの分単位の統計の平均値を表示するチャートを提供します。 CloudMonitor は、1 秒ごとに計算される統計である 1 秒あたりのトランザクション数(TPS)を表示するチャートは提供していません。 Advanced Message Queuing Protocol(AMQP)メソッドを呼び出すことによってクライアントが 1 秒あたりに開始するリクエストの数は、ApsaraMQ for RabbitMQ インスタンスの TPS を計算するために使用されます。

以下の項目は、TPS 計算に関連する AMQP メソッドについて説明しています。

  • ConnectionOpen および ChannelOpen

  • QueueDeclareQueueDeleteQueueBind、および QueueUnbind

  • ExchangeDeclare および ExchangeDelete

  • ExchangeBind および ExchangeUnBind

  • SendMessageBasicConsumeBasicGetBasicAckBasicRejectBasicNack、および BasicRecover

詳細については、「リクエストメソッド」をご参照ください。

手順

  1. メッセージログ機能を有効化し、インデックスを設定します。

  2. クレンジングされたメトリックデータを保存する Metricstore を作成します。

    1. Simple Log Service コンソールにログオンします。 表示されるページの [プロジェクト] セクションで、管理するプロジェクトの名前をクリックします。 プロジェクト詳細ページで、image アイコンを選択し、[今すぐ作成] をクリックします。image

    2. [metricstore の作成] パネルで、作成する Metricstore に関する基本情報を指定します。image

  3. クレンジングタスクを作成します。

    1. 管理するログストアの [検索と分析] ページに移動し、クエリステートメントを入力します。 次の例では、ApsaraMQ for RabbitMQ インスタンスのエラーコードがクレンジングされます。

      * | SELECT Code, count(*) as num, microtime / 1000 / 1000 as timeSecond group by Code, timeSecond limit 1000000

      上記のステートメントは、検索ステートメント/分析ステートメント 形式です。 この形式では、検索ステートメントはフィルタ条件を指定し、分析ステートメントは標準 SQL ステートメントです。 データは、必要なラベル、各ラベルのメトリック値、および時間がクエリ結果からクレンジングされた場合にのみ Metricstore に書き込むことができます。 上記のステートメントでは、Code はラベル(各リクエストのレスポンスコード)を指定し、num は各ラベルの値を指定し、timeSecond は秒単位の時間を指定します。

      次の図は、クエリの結果の例を示しています。image

    2. クエリ結果で、[グラフ] タブをクリックし、次に [スケジュール済み SQL ジョブとして保存] をクリックします。 表示されるウィザードの [計算設定] ステップで、次のパラメータを設定し、[次へ] をクリックします。image

      説明

      上記のパラメータを設定する際は、[ソースプロジェクト/ログストア] パラメータに作成した Metricstore を指定します。

    3. [スケジューリング設定] ステップで、スケジューリング間隔を指定し、[OK] をクリックします。image

  4. Metricstore 内のメトリック値の分布をクエリします。image

    次の図は、クエリの結果の例を示しています。image

  5. (オプション) Metricstore 内のデータを Grafana または Simple Log Service に統合し、ダッシュボードにデータを表示します。

説明

上記の例では、ApsaraMQ for RabbitMQ インスタンスのエラーコードがクレンジングされます。 各リモートクライアントの各チャネルのメッセージングレート、各キューの 1 秒あたりのワークロードとヘルスステータス、1 秒あたりに送受信されたメッセージの総数、1 秒あたりの各 API 操作の呼び出し数など、他のデータをクレンジングすることもできます。

一般的なステートメント

インスタンスの TPS チャートをクエリする

* | select microtime/1000/1000 as time, sum(count) as tps 
from 
  (SELECT  microtime, if(Action!='SendMessage', 1, tps) as count 
   from log 
   Where  InstanceId='amqp-xx-xxx' 
     and Action in ('SendMessage', 'ConnectionOpen', 'ChannelOpen', 'ExchangeDeclare', 'QueueBind', 'QueueDeclare', 'QueueDelete', 'ExchangeDelete', 'QueueUnBind', 'ExchangeBind', 'ExchangeUnBind', 'BasicConsume', 'BasicReject', 'BasicRecover', 'BasicAck', 'BasicNAck', 'PullMessage') 
   limit 90000000) 
  
GROUP by time ORDER by time limit 90000000

次の図は、クエリの結果の例を示しています。

image

  • 上記のコードの amqp-xx-xxx を、TPS チャートをクエリするインスタンスの ID に置き換えます。

  • クライアントが multiple=false 設定で BasicNack を呼び出すと、呼び出しごとにリクエストが送信されます。 クライアントが multiple=true 設定で BasicNack を呼び出すと、呼び出しごとに複数のリクエストが送信されます。 ただし、SLS は、複数のリクエストが呼び出しで送信されるかどうかに関係なく、BasicNack 呼び出しに対して 1 つのログエントリのみを作成します。 そのため、TPS チャートに返される TPS は、実際の TPS よりも小さくなります。

  • TPS チャートをクエリする際に、クライアントが大量のトラフィックを受信する場合は、1 時間以下の時間範囲を指定し、TPS チャートをクエリするために実行される SQL ステートメントに limit 90000000 を追加することをお勧めします。 また、limit の 90000000 を可能な限り大きい値に置き換えることもできます。

エクスチェンジとルーティングキー別に送信されたメッセージの総数をクエリする

* and Action : SendMessage and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host, 
  split_part(ResourceName,',',2) as exchange_name, 
  split_part(ResourceName,',',3) as routing_key, 
  count(*) as send_total_num 
group by 
  instance_id,
  virtual_host, 
  exchange_name, 
  routing_key 
order by 
  send_total_num 
limit 10000000

次の図は、クエリの結果の例を示しています。

image

エクスチェンジとルーティングキー別に 1 秒あたりのメッセージ送信レートをクエリする

* and Action : SendMessage and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host, 
  split_part(ResourceName,',',2) as exchange_name, 
  split_part(ResourceName,',',3) as routing_key, 
  microtime / 1000 / 1000 as time_second, 
  count(*) as send_qps 
group by 
  instance_id,
  virtual_host, 
  exchange_name, 
  routing_key,
  time_second 
order by 
  time_second, 
  send_qps 
limit 10000000

次の図は、クエリの結果の例を示しています。

image

1 秒あたりに各キューで消費されたメッセージの数をクエリする

* and Action : PushMessage and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host, 
  Queue as queue_name, 
  count(*) as push_total_num 
group by 
  instance_id,
  virtual_host, 
  queue_name 
order by 
  push_total_num 
limit 10000000

次の図は、クエリの結果の例を示しています。

image

1 秒あたりに各キューのメッセージ消費レートをクエリする

* and Action : PushMessage and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host, 
  Queue as queue_name, 
  microtime / 1000 / 1000 as time_second, 
  count(*) as push_qps 
group by 
  instance_id,
  virtual_host, 
  queue_name, 
  time_second 
order by 
  time_second, 
  push_qps 
limit 10000000

次の図は、クエリの結果の例を示しています。

image

1 秒あたりに各クライアントが送信したメッセージの数をクエリする

* and Action : SendMessage and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host, 
  RemoteAddress as client_ip_port, 
  microtime / 1000 / 1000 as time_second, 
  count(*) as send_qps 
group by 
  instance_id,
  virtual_host, 
  client_ip_port, 
  time_second 
order by 
  time_second, 
  send_qps 
limit 10000000

次の図は、クエリの結果の例を示しています。

image

1 秒あたりに各クライアントが消費したメッセージの数をクエリする

* and Action : PushMessage and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host, 
  RemoteAddress as client_ip_port, 
  microtime / 1000 / 1000 as time_second, 
  count(*) as push_qps 
group by 
  instance_id,
  virtual_host, 
  client_ip_port, 
  time_second 
order by 
  time_second, 
  push_qps 
limit 10000000

次の図は、クエリの結果の例を示しています。

image

1 秒あたりに各クライアントで実行される操作のレートをクエリする

特定のクライアントで実行された操作の 1 秒あたりのクエリ数(QPS)をクエリする場合は、次のステートメントをコピーし、{action_name} を操作名に置き換えます。 次の操作を使用できます。

  • ConnectionOpen および ChannelOpen

  • QueueDeclare、QueueDelete、QueueBind、および QueueUnbind

  • ExchangeDeclare および ExchangeDelete

  • ExchangeBind および ExchangeUnBind

  • SendMessage、BasicConsume、BasicGet、BasicAck、BasicReject、BasicNack、および BasicRecover

* and Action : {action_name} and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host, 
  RemoteAddress as client_ip_port, 
  microtime / 1000 / 1000 as time_second, 
  count(*) as {action_name}_qps 
group by 
  instance_id,
  virtual_host, 
  client_ip_port, 
  time_second 
order by 
  time_second, 
  {action_name}_qps 
limit 10000000

たとえば、次のステートメントを使用して、接続確立の QPS をクエリできます。

* and Action : ConnectionOpen and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host, 
  RemoteAddress as client_ip_port, 
  microtime / 1000 / 1000 as time_second, 
  count(*) as connection_open_qps 
group by 
  instance_id,
  virtual_host, 
  client_ip_port, 
  time_second 
order by 
  time_second, 
  connection_open_qps 
limit 10000000

次の図は、クエリの結果の例を示しています。

image

各操作の QPS をクエリする

次のステートメントを使用して、すべての操作の QPS を一度にクエリできます。

* and Code : 200 | 
select 
  InstanceId as instance_id,
  VHost as virtual_host,
  Action as action_type,
  RemoteAddress as client_ip_port, 
  microtime / 1000 / 1000 as time_second, 
  count(*) as action_qps
group by 
  instance_id,
  virtual_host,
  client_ip_port,
  action_type,
  time_second 
order by
  time_second, 
  action_qps
limit 10000000

次の図は、クエリの結果の例を示しています。

image

各エラーの発生頻度をクエリする

* and not Code = 200 | 
select 
  Code as error_code,
  VHost as virtual_host,
  split_part(split_part(Info, '[', 1), 'Req', 1) as error_info,
  microtime / 1000 / 1000 as time_second,
  count(*) as error_num
group by 
  virtual_host,
  error_code,
  time_second,
  error_info
order by
  time_second, 
  error_num
limit 10000000

次の図は、クエリの結果の例を示しています。

image

メッセージ本文の平均サイズをクエリする

* and Action : SendMessage and Code: 200 | 
select 
  InstanceId as instance_id, 
  VHost as virtual_host, 
  split_part(Queue, ';', 1) as queue_name, 
  microtime / 1000 / 1000 as time_second, 
  avg(cast(split_part(ResourceName, 'bodySize=', 2) as bigint)) as avg_body_size 
group by 
  instance_id, 
  virtual_host, 
  queue_name, 
  time_second 
order by 
  time_second, 
  avg_body_size 
limit 10000000

次の図は、クエリの結果の例を示しています。

image

各メッセージがプッシュされた回数をクエリする

* and Action : PushMessage and Code : 200 | 
select 
  InstanceId as instance_id, 
  VHost as virtual_host, 
  split_part(split_part(ResourceName, ',', 1), '=', 2) as msg_id, 
  count(*) as push_times 
group by 
  instance_id, 
  virtual_host, 
  msg_id 
order by 
  push_times desc 
limit 1000000

次の図は、クエリの結果の例を示しています。

image