AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

アプリケーション イベントの監視

このガイドでは、 MongoDB Rubyドライバーで監視を設定および構成する方法を学習できます。

モニタリングには、実行中のプログラムのアクティビティに関する情報を収集することが含まれます。この情報はアプリケーションパフォーマンス マネジメント ライブラリで使用できます。

Rubyドライバーを監視すると、ドライバーのリソース使用量とパフォーマンスを理解できます。この情報は、アプリケーションの設計とデバッグ時に情報に基づいた決定を行う際に役立ちます。

このガイドでは、次のタスクを実行する方法を学習できます。

このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。ドライバーでイベントをレコードする方法を学ぶには、Rubyドライバーのログガイドを参照してください。

コマンドイベントは、 MongoDBデータベースコマンドに関連するイベントです。アプリケーションでサブスクライブすることで、ドライバーを使用して 1 つ以上のコマンド モニタリング イベントにアクセスできます。

MongoDBデータベースコマンドの詳細については、 MongoDB Serverマニュアルのデータベースコマンドガイドを参照してください。

アプリケーションでコマンド イベントをサブスクライブすることで、コマンド イベントの詳細にアクセスできます。イベントは、クラスターのすべてのクライアントを監視するグローバル レベルで、またはクライアントレベルでサブスクライブできます。この例では、次のアクションを示しています。

  • をインスタンス化します CommandLogSubscriber

  • Mongo::Monitoring::Global.subscribe メソッドを使用して、グローバルレベルでコマンド イベントをサブスクライブします

  • Mongo::Client.subscribe メソッドを使用してクライアントレベルでコマンド イベントをサブスクライブします

require 'mongo' # Creates a subscriber for command monitoringsubscriber = Mongo::Monitoring::CommandLogSubscriber.new # Globally subscribes to command monitoring eventsMongo::Monitoring::Global.subscribe(Mongo::Monitoring::COMMAND, subscriber) # Replace with your connection string and connect to your clienturi = '<connection string>'client = Mongo::Client.new(uri) # Subscribes to command monitoring events at the client levelclient.subscribe( Mongo::Monitoring::COMMAND, subscriber)

次のコマンド モニタリング イベントのいずれかにサブスクライブできます。

イベント名
説明

コマンドが開始されたときに作成されます。

コマンドが成功したときに作成されます。

コマンドが失敗した場合に作成されます。

Rubyドライバーは、接続したインスタンスまたはクラスターの状態が変化した場合に、SDAM イベントとも呼ばれるトポロジーイベントを作成します。例、新しい接続を確立するか、クラスターが新しい プライマリノードを選択した場合、ドライバーはイベントを作成します。

トポロジーイベントの詳細については、サーバー マニュアルの レプリケーションガイドを参照してください。

次のセクションでは、アプリケーション内のトポロジーの変更を記録し、これらのイベントで提供される情報を調べる方法を示します。

Rubyドライバーの subscribe メソッドを使用してイベントをサブスクライブできます。モニタリングイベントタイプを定義する モニタリングトピックと、サブスクライブオブジェクトをsubscribe メソッドの引数として渡します。イベントは、クラスターのすべてのクライアントを監視するグローバル レベルで、またはクライアントレベルでサブスクライブできます。

この例では、次のアクションを示しています。

  • ServerOpeningLogSubscriber サブスクライブをインスタンス化します

  • Mongo::Monitoring::Global.subscribe メソッドを使用して、グローバルレベルで ServerOpening イベントをサブスクライブします

  • Mongo::Client.subscribe メソッドを使用して、クライアントレベルで ServerOpening イベントをサブスクライブします

require 'mongo' subscriber = Mongo::Monitoring::ServerOpeningLogSubscriber.new # Globally subscribes to ServerOpening events by using the SERVER_OPENING monitoring topicMongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber) # Replace with your connection string and connect to your clienturi = '<connection string>'client = Mongo::Client.new(uri) # Subscribes to ServerOpening events at the client level by using the SERVER_OPENING monitoring topicclient.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber)

次の表は、利用可能なサブスクライブとそのモニタリングトピックを示しています。

サブスクリプション名
モニタリング トピック
説明

SERVER_CLOSED

は ServerClosed イベントをサブスクライブしてログに記録します。

SERVER_DESCRIPTION_CHANGED

は ServerDescriptionChanged イベントをサブスクライブしてログに記録します。

SERVER_OPENING

は ServerOpening イベントをサブスクライブしてログに記録します。

TOPOLOGY_CHANGED

は TopologyChanged イベントをサブスクライブしてログに記録します。

TOPOLOGY_CLOSED

は TopologyClosed イベントをサブスクライブしてログに記録します。

TOPOLOGY_OPENING

は TopologyOpening イベントをサブスクライブしてログに記録します。

このページのイベントの説明セクションに、SDAMイベント説明の表があります。

カスタム SDAM サブスクライブを作成して、サーバーとトポロジーイベントの詳細にアクセスできます。各イベントで利用可能なデータが異なるため、各イベントタイプに対して個別のクラスを作成します。

すべてのイベントに対して、サブスクライブは succeeded メソッドを呼び出し、そのイベントを引数として渡します。単純な SDAM ログ サブスクライブは、次のコードのようになります。

class SDAMLogSubscriber include Mongo::Loggable def succeeded(event) log_debug(format_event(event)) end private def logger Mongo::Logger.logger end def format_message(message) format("SDAM | %s", message) endend class TopologyOpeningLogSubscriber < SDAMLogSubscriber private def format_event(event) "Topology type '#{event.topology.display_name}' initializing." endend class ServerOpeningLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server #{event.address} initializing." endend class ServerDescriptionChangedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server description for #{event.address} changed from " + "'#{event.previous_description.server_type}' to '#{event.new_description.server_type}'." endend class TopologyChangedLogSubscriber < SDAMLogSubscriber private def format_event(event) if event.previous_topology != event.new_topology "Topology type '#{event.previous_topology.display_name}' changed to " + "type '#{event.new_topology.display_name}'." else "There was a change in the members of the '#{event.new_topology.display_name}' " + "topology." end endend class ServerClosedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server #{event.address} connection closed." endend class TopologyClosedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Topology type '#{event.topology.display_name}' closed." endend

イベントをサブスクライブするには、適切なサブスクライブを作成し、正しい モニタリングトピックにサブスクライブします。次のコードは、SDAM イベントをグローバルにサブスクライブする方法を示しています。

topology_opening_subscriber = TopologyOpeningLogSubscriber.newserver_opening_subscriber = ServerOpeningLogSubscriber.newserver_description_changed_subscriber = ServerDescriptionChangedLogSubscriber.newtopology_changed_subscriber = TopologyChangedLogSubscriber.newserver_closed_subscriber = ServerClosedLogSubscriber.newtopology_closed_subscriber = TopologyClosedLogSubscriber.new Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, topology_opening_subscriber)Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_OPENING, server_opening_subscriber)Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, server_description_changed_subscriber)Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, topology_changed_subscriber)Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_CLOSED, server_closed_subscriber)Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_CLOSED, topology_closed_subscriber)

次のコードは、sdam-procクライアントオプションを使用して単一クライアントの SDAM イベントをサブスクライブする方法を示しています。

topology_opening_subscriber = TopologyOpeningLogSubscriber.newserver_opening_subscriber = ServerOpeningLogSubscriber.newserver_description_changed_subscriber = ServerDescriptionChangedLogSubscriber.newtopology_changed_subscriber = TopologyChangedLogSubscriber.newserver_closed_subscriber = ServerClosedLogSubscriber.newtopology_closed_subscriber = TopologyClosedLogSubscriber.new sdam_proc = Proc.new do |client| client.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, topology_opening_subscriber) client.subscribe(Mongo::Monitoring::SERVER_OPENING, server_opening_subscriber) client.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, server_description_changed_subscriber) client.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, topology_changed_subscriber) client.subscribe(Mongo::Monitoring::SERVER_CLOSED, server_closed_subscriber) client.subscribe(Mongo::Monitoring::TOPOLOGY_CLOSED, topology_closed_subscriber)end client = Mongo::Client.new(['127.0.0.1:27017'], database: 'test', sdam_proc: sdam_proc)

注意

:sdam_procクライアントオプションは指定されたクライアントにのみ適用されます。Client#with 呼び出しを使用して特定のクライアントオプションが変更されると、ドライバーはイベントサブスクライブのデフォルトセットを含む新しいクラスターを作成する場合があります。こうした場合、提供された :sdam_proc は呼び出されず、アプリケーションはイベントを失う可能性があります。

アプリケーションを実行すると、サブスクライブは SDAMイベントを記録し、次のようなメッセージを出力します。

D, [2018-10-09T13:58:03.489461 #22079] DEBUG -- : SDAM | Topology type 'Unknown' initializing.D, [2018-10-09T13:58:03.489699 #22079] DEBUG -- : SDAM | Server 127.0.0.1:27100 initializing.D, [2018-10-09T13:58:03.491384 #22079] DEBUG -- : SDAM | Server description for 127.0.0.1:27100 changed from 'unknown' to 'unknown'.D, [2018-10-09T13:58:03.491642 #22079] DEBUG -- : SDAM | Server localhost:27100 initializing.D, [2018-10-09T13:58:03.493199 #22079] DEBUG -- : SDAM | Server description for localhost:27100 changed from 'unknown' to 'primary'.D, [2018-10-09T13:58:03.493473 #22079] DEBUG -- : SDAM | Server localhost:27101 initializing.D, [2018-10-09T13:58:03.494874 #22079] DEBUG -- : SDAM | Server description for localhost:27101 changed from 'unknown' to 'secondary'.D, [2018-10-09T13:58:03.495139 #22079] DEBUG -- : SDAM | Server localhost:27102 initializing.D, [2018-10-09T13:58:03.496504 #22079] DEBUG -- : SDAM | Server description for localhost:27102 changed from 'unknown' to 'secondary'.D, [2018-10-09T13:58:03.496777 #22079] DEBUG -- : SDAM | Topology type 'Unknown' changed to type 'ReplicaSetNoPrimary'.D, [2018-10-09T13:58:03.497306 #22079] DEBUG -- : SDAM | Server 127.0.0.1:27100 connection closed.D, [2018-10-09T13:58:03.497606 #22079] DEBUG -- : SDAM | Topology type 'ReplicaSetNoPrimary' changed to type 'ReplicaSetWithPrimary'. # client.close D, [2018-10-09T13:58:05.342057 #22079] DEBUG -- : SDAM | Server localhost:27100 connection closed.D, [2018-10-09T13:58:05.342299 #22079] DEBUG -- : SDAM | Server localhost:27101 connection closed.D, [2018-10-09T13:58:05.342565 #22079] DEBUG -- : SDAM | Server localhost:27102 connection closed.D, [2018-10-09T13:58:05.342693 #22079] DEBUG -- : SDAM | Topology type 'ReplicaSetWithPrimary' closed.

また、カスタム サブスクライブを作成して、サーバーのハートビートを監視することもできます。ハートビートは、サーバーモニターがサーバーに hello コマンドを送信したときに発生します。

カスタムサーバーハートビート サブスクライブは、次の 3 つの方法を実装する必要があるため、他の SDAM サブスクライブと異なります。

  • started: リスナーがハートビートを受信したときに呼び出されます

  • succeeded: ハートビート結果が成功した場合の応答

  • failed: ハートビートが失敗した結果に対する応答

次の例は、ハートビートイベントサブスクライブを示しています。

class HeartbeatLogSubscriber include Mongo::Loggable def started(event) log_debug("#{event.address} | STARTED") end def succeeded(event) log_debug("#{event.address} | SUCCEEDED | #{event.duration}s") end def failed(event) log_debug("#{event.address} | FAILED | #{event.error.class}: #{event.error.message} | #{event.duration}s") end private def logger Mongo::Logger.logger end def format_message(message) format("HEARTBEAT | %s", message) endend

次の例に示すように、ハートビート イベントをグローバルまたは特定のクライアントに対してサブスクライブすることができます。

subscriber = HeartbeatLogSubscriber.new # Globally subscribes to Server Opening eventsMongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber) # Subscribes to Server Opening events at the client levelclient = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'test' )client.subscribe( Mongo::Monitoring::SERVER_HEARTBEAT, subscriber )

アプリケーションを実行すると、サブスクライブはハートビートイベントを記録し、次のようなメッセージを出力します。

D, [2018-09-23T13:44:10.707018 #1739] DEBUG -- : HEARTBEAT | 127.0.0.1:27027 | STARTEDD, [2018-09-23T13:44:10.707778 #1739] DEBUG -- : HEARTBEAT | 127.0.0.1:27027 | SUCCEEDED | 0.000772381s

次の表は、各 SDAMイベントの名前と説明を示しています。

eventType
説明

サーバーインスタンスが閉じられたときに作成されるイベント。

サーバーの説明が変更されたときに作成されるイベント。

サーバーのハートビートが失敗したときに作成されるイベント。

サーバーハートビートがリスナーによって受信されたときに作成されるイベント。

サーバーのハートビートが成功したときに作成されるイベント。

ドライバーがサーバーに接続したときに作成されるイベント。

トポロジーが変更されたときに作成されるイベント。

トポロジー内のすべてのインスタンス接続が閉じられたときに作成されるイベント。

ドライバーがインスタンスに接続しようとする前に作成されたイベント。

接続プールとは、ドライバーがMongoDBインスタンスと維持するオープン TCP 接続のセットです。接続プールは、アプリケーションが実行する必要があるネットワーク ハンドシェイクの数を減らし、アプリケーションの実行を高速化するのに役立ちます。

次のセクションでは、アプリケーションで接続プール イベントを記録し、これらのイベントで提供される情報を調べる方法を示します。

すべての接続プールイベントの詳細には、アプリケーションでサブスクライブすることでアクセスできます。イベントは、クラスターのすべてのクライアントを監視するグローバル レベルまたはクライアントレベルでサブスクライブできます。

この例では、次のアクションを示しています。

  • CmapLogSubscriber サブスクライブをインスタンス化します

  • Mongo::Monitoring::Global.subscribe メソッドを使用して、グローバルレベルのすべての接続プールイベントをサブスクライブします

  • Mongo::Client.subscribe メソッドを使用して、クライアントレベルのすべての接続プールイベントをサブスクライブします

require 'mongo' # Creates a subscriber for connection pool monitoringsubscriber = Mongo::Monitoring::CmapLogSubscriber.new # Globally subscribes to connection pool monitoring eventsMongo::Monitoring::Global.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber) # Replace with your connection string and connect to your clienturi = '<connection string>'client = Mongo::Client.new(uri) # Subscribes to connection pool monitoring events at the client levelclient.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber)

次の接続プール モニタリング イベントのいずれかにサブスクライブできます。

イベント名
説明

操作が実行用接続の取得に失敗した場合に作成されます。

操作が実行用接続を取得しようとしたときに作成されます。

操作が実行された後に接続がプールにチェックバックされたときに作成されます。

操作が実行用接続を正常に取得したときに作成されます。

接続が閉じられたときに作成されます。

接続が作成されたときに作成されますが、操作に使用される場合は必ずしも作成されません。

接続がハンドシェイクを正常に完了し、操作に使用する準備が整った後に作成されます。

すべての接続が閉じられ、接続プールがクリアされたときに作成されます。

サーバー インスタンスが破棄される前に接続プールが閉じられたときに作成されます。

接続プールが作成されたときに作成されます。

接続プールが準備できたときに作成されます。

このガイドで説明するクラスやメソッドの詳細については、次のAPIドキュメントを参照してください。