RabbitMQインスタンスを最適なパフォーマンスのために監視する方法

管理UI、Prometheus、Grafana、rabbitmqctlを使用してRabbitMQを監視し、キュー、コンシューマ、メモリ、ディスクの問題を把握します。

RabbitMQインスタンスを最適なパフォーマンスで監視する方法

RabbitMQはプロデューサーとコンシューマーの間に位置するため、小さなブローカーの問題がすぐにアプリケーションの問題に発展する可能性があります。キューの深さが増加したり、確認応答が停止したり、ノードがメモリまたはディスクアラームに達したりすると、ブローカーが完全に障害を起こすずっと前に、ユーザーは遅延した処理を目にするかもしれません。

適切なRabbitMQ監視では、メッセージフロー、コンシューマーの健全性、ノードリソース、クラスター状態を追跡します。このガイドでは、組み込みの管理プラグイン、PrometheusとGrafana、およびインシデント発生時に使用できるrabbitmqctlコマンドについて説明します。

追跡すべき重要なRabbitMQメトリクス

RabbitMQの監視には、キューの健全性、接続/チャネルアクティビティ、システムリソースの3つの主要なカテゴリのメトリクスを追跡することが含まれます。

キューの健全性メトリクス

キューメトリクスは、メッセージ処理の効率と潜在的なバックログの最も重要な指標です。

  • メッセージレート(パブリッシュ/デリバー/確認応答): メッセージの流入、流出、およびコンシューマーによる確認を追跡します。低い配信レートと高いパブリッシュレートは、多くの場合、コンシューマーの遅延またはボトルネックを示します。
  • キュー長(messages_ready): 配信を待機しているメッセージの総数。急速に増加する長さは、コンシューマーがプロデューサーの負荷に追いついていないことを示します。
  • 未確認メッセージ(messages_unacknowledged): 配信されたがまだ確認応答を待っているメッセージ。ここでの高いカウントは、コンシューマーの障害、長い処理時間、またはデッドロック状態のコンシューマーを示す可能性があります。
  • コンシューマー数: キューにアタッチされているアクティブなコンシューマーの数。負荷が高いがコンシューマーがゼロのキューは、明らかな障害ポイントです。
  • 永続キューと永続メッセージの使用: ブローカーの再起動後も存続する必要があるキューとメッセージが永続性のために設定されていることを確認します。永続性は設計上の設定であり、ディスク書き込み動作はパブリッシャー確認とストレージの健全性にも依存します。

接続とチャネルアクティビティ

これらのメトリクスは、リークや不適切なリソースクリーンアップを特定するのに役立ちます。

  • 接続数: 開いているTCP接続の総数。接続が多すぎると、基盤となるOSまたはErlang VMを圧倒する可能性があります。
  • チャネル数: 接続内のアクティブなチャネル。チャネルは接続よりも安価ですが、過剰な数は依然としてリソースの負担を示します。
  • クライアント接続状態: 一時的な状態でスタックしている接続や、高い接続チャーン率を探します。

システムおよびErlang VMリソース

RabbitMQはErlang VM上で動作するため、その内部リソース使用量は標準のOSプロセスとは異なります。

  • メモリ使用量: Erlang VMによって消費されるメモリの総量。RabbitMQはウォーターマークシステムを使用します。メモリが高ウォーターマークに達すると、プロデューサーをスロットルします。
  • Erlangプロセス: VM内で実行されている軽量プロセスの総数。制御不能なプロセス数は、プラグイン内のリソースリークまたは無限ループの可能性を示します。
  • ファイル記述子: 接続、キュー、および永続ストレージに重要なファイルハンドルの可用性を監視します。
  • ディスク空き容量制限: 空きディスク容量が設定されたしきい値を下回ると、RabbitMQはディスクアラームを発生させ、パブリッシャーをブロックします。デフォルトは小さなテストシステムでは一般的に低いため、本番ノードは明示的な値を設定して監視する必要があります。

RabbitMQ管理プラグインを使用した監視

RabbitMQ管理プラグインは、可視化とリアルタイムの運用チェックのための主要な組み込みツールです。Web UIと強力なHTTP APIの両方を提供します。

プラグインの有効化

プラグインは通常RabbitMQと一緒にインストールされますが、明示的に有効にする必要があります。

sudo rabbitmq-plugins enable rabbitmq_management

有効にすると、Webインターフェースは通常ポート15672でアクセス可能になります(例:http://localhost:15672)。

Web UIの主要ビュー

  1. 概要ページ: メッセージフローレート(グローバルパブリッシュ/デリバー)、メモリ使用量、接続数など、高レベルの統計情報を提供します。これは初期の健全性ダッシュボードです。
  2. キュータブ: すべてのキューに関する詳細なメトリクスを提供します。これには、瞬間的および集計されたメッセージレート、コンシューマー使用率、キュー長が含まれます。並べ替え機能を使用して、最も長いまたは最もビジーなキューをすばやく見つけます。
  3. 接続およびチャネルタブ: 個々のクライアント接続を検査し、そのステータス、プロトコルの詳細、帯域幅使用量を表示できます。

HTTP APIの使用

自動チェックやカスタムダッシュボードへの統合のために、管理プラグインは広範なHTTP APIを公開しています。これは、ヘルスチェックをスクリプト化したり、独自の監視システムと統合したりするのに理想的です。

例:クラスターの健全性の確認

# 基本的な概要統計の確認
curl -u user:password http://localhost:15672/api/overview

# 特定のキュー(例:'task_queue')のメトリクスを取得
curl -u user:password http://localhost:15672/api/queues/%2F/task_queue

ヒント: HTTP APIは詳細なJSONデータを返すため、キュー長や未確認メッセージ数などの特定の数値しきい値に基づいてフィルタリングおよびアラートを設定できます。


PrometheusとGrafanaを使用した高度な監視

本番環境では、RabbitMQメトリクスをPrometheus(収集用)やGrafana(可視化用)などの標準的な時系列監視システムと統合することがベストプラクティスです。RabbitMQはこれ専用のプラグインを提供しています。

1. Prometheusプラグインの有効化

このプラグインは、Prometheusが期待する形式でメトリクスを公開します。通常はポート15692(または管理ポートを使用する場合は15672/metrics)で公開されます。

sudo rabbitmq-plugins enable rabbitmq_prometheus

2. Prometheusスクレイピングの設定

有効にしたら、エンドポイントをスクレイピングするようにPrometheusを設定する必要があります。prometheus.yml設定に以下のようなジョブを追加します。

scrape_configs:
  - job_name: 'rabbitmq'
    metrics_path: /metrics
    # rabbitmq_prometheusプラグインはデフォルトでポート15692の/metricsを公開します。
    static_configs:
      - targets: ['rabbitmq-host:15692']

3. Grafanaでの可視化

GrafanaはPrometheusによって収集されたデータを使用して強力なダッシュボードを作成します。主要なパネルには以下を含める必要があります。

  • キューバックログ: rabbitmq_queue_messages_readyrabbitmq_queue_messages_unackedを経時的にグラフ化します。
  • メッセージレート: パブリッシュ、デリバー、確認応答のレートを追跡して、コンシューマーが追いついているかどうかを確認します。
  • ノードリソース使用率: メモリ、ファイル記述子、Erlangプロセス使用量、ディスクアラームを追跡します。

キュー長のPrometheusメトリクス例:

プラグインによって公開されるキュー長の標準メトリクスは次のとおりです。

rabbitmq_queue_messages_ready{queue="my_critical_queue", vhost="/"}

監視のベストプラクティス:アラート

明確なしきい値に基づいて、Prometheus AlertmanagerまたはGrafanaでアラートを設定します。

シグナル アラート例 推奨アクション
準備完了メッセージ キューバックログが5分間増加し続けている コンシューマーエラーを確認し、アプリが安全に処理できる場合はコンシューマーを追加するか、プロデューサーを遅くする。
未確認メッセージ 未確認カウントが高いまま、確認応答レートが低い コンシューマーのレイテンシ、クラッシュ、プリフェッチ設定、ダウンストリーム依存関係を調査する。
ディスクアラーム ノードがディスク空き容量アラームを報告 容量を解放するか、ストレージを拡張するか、プロデューサーがブロックされたままになる前にデータを移動する。
メモリアラーム ノードがメモリアラームを報告 大きなキュー、高い接続/チャネル数、またはメモリを大量に消費するプラグインを見つけ、容量を調整する。

rabbitmqctlを使用したCLI診断

rabbitmqctlコマンドラインユーティリティは、特にWeb UIや外部監視システムが利用できない場合に、迅速で直接的な検査と運用チェックに不可欠です。

ノードステータスの確認

このコマンドは、実行中のアプリケーション、メモリ使用量、ファイル記述子数、接続の詳細を示す迅速なヘルスチェックを提供します。

rabbitmqctl status

重要なキューの一覧表示

list_queuesを使用して、主要業績評価指標(KPI)に焦点を当てることで、ボトルネックを迅速に特定できます。

# 名前、総メッセージ数、準備完了メッセージ数、コンシューマー数を表示するキューを一覧表示
rabbitmqctl list_queues name messages messages_ready consumers

# ビジーなノードの場合、出力をローカルでソートします。
rabbitmqctl list_queues name messages messages_ready consumers | sort -k2 -nr | head

接続とチャネルの分析

特定のクライアントの動作をトラブルシューティングするには、ユーザーやネットワークアドレスでフィルタリングして、接続とチャネルを一覧表示できます。

# アクティブな接続を一覧表示し、ユーザーと送信元IPを表示
rabbitmqctl list_connections user peer_host

# アクティブなチャネルとそのメッセージフローステータスを一覧表示
rabbitmqctl list_channels connection_details consumer_count messages_unacknowledged

大規模なクラスターでは、広範な一覧表示コマンドは、すでに負荷がかかっているノードにさらに負荷を追加する可能性があります。インシデント発生時には、対象を絞ったキュー、vhost、または接続チェックを優先してください。

パフォーマンスを維持するためのベストプラクティス

  1. コンシューマー容量の監視: 管理UIおよびエクスポートされたメトリクスでコンシューマー容量を監視します。値が低い場合、多くの場合、キューがコンシューマーが処理できるよりも速く配信できることを意味し、これはコンシューマーの遅延、低プリフェッチ、またはダウンストリームのレイテンシを示します。
  2. プロデューサーフロー制御の処理: RabbitMQはErlangのメモリおよびディスクアラームを使用してバックプレッシャーを適用します。これらのアラームを注意深く監視します。これらはノードが容量制限に達しており、プロデューサーがスロットルされていることを示します。
  3. ログ統合: RabbitMQログを集中ログシステム(ELKスタック、Splunkなど)に統合します。ネットワーク障害、認証失敗の試行、またはメモリ同期の遅延に関連する繰り返し発生する警告を探します。
  4. クラスターの健全性チェック: クラスターを実行している場合は、ノードメンバーシップ、ネットワークパーティション、クォーラムキューの健全性、および同期状態を監視します。rabbitmqctl cluster_statusは、ノードがクラスターメンバーシップについて同意しない場合の最初のチェックとして役立ちます。

重要なポイント

管理UIを簡単な検査に、PrometheusとGrafanaをトレンドとアラートに、そしてrabbitmqctlを何か問題が発生したときの集中的な診断に使用します。バックログの増加、スタックした未確認メッセージ、ディスクアラーム、メモリアラーム、クラスターの健全性に関するアラートを開始します。これらのシグナルは通常、アプリケーションがタイムアウトする前に問題を教えてくれます。