Overview
このガイドでは、 MongoDB Rubyドライバーで監視を設定および構成する方法を学習できます。
モニタリングには、実行中のプログラムのアクティビティに関する情報を収集することが含まれます。この情報はアプリケーションパフォーマンス マネジメント ライブラリで使用できます。
Rubyドライバーを監視すると、ドライバーのリソース使用量とパフォーマンスを理解できます。この情報は、アプリケーションの設計とデバッグ時に情報に基づいた決定を行う際に役立ちます。
このガイドでは、次のタスクを実行する方法を学習できます。
このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。ドライバーにイベントをレコード方法については、 Rubyドライバーの ログガイド を参照してください。
コマンド イベントの監視
コマンドイベントは、 MongoDBデータベースコマンドに関連するイベントです。アプリケーションでサブスクライブすることで、ドライバーを使用して 1 つ以上のコマンド モニタリング イベントにアクセスできます。
MongoDBデータベースコマンドの詳細については、 MongoDB Serverマニュアルのデータベースコマンドガイドを参照してください。
コマンド イベントへのサブスクライブ
アプリケーションでコマンド イベントをサブスクライブすることで、コマンド イベントの詳細にアクセスできます。イベントは、クラスターのすべてのクライアントを監視するグローバル レベルで、またはクライアントレベルでサブスクライブできます。この例では、次のアクションを示しています。
をインスタンス化します
CommandLogSubscriber
Mongo::Monitoring::Global.subscribe
メソッドを使用して、グローバルレベルでコマンド イベントをサブスクライブしますMongo::Client.subscribe
メソッドを使用してクライアントレベルでコマンド イベントをサブスクライブします
require 'mongo' # Creates a subscriber for command monitoring subscriber = Mongo::Monitoring::CommandLogSubscriber.new # Globally subscribes to command monitoring events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::COMMAND, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to command monitoring events at the client level client.subscribe( Mongo::Monitoring::COMMAND, subscriber)
イベントの説明
次のコマンド モニタリング イベントのいずれかにサブスクライブできます。
イベント名 | 説明 |
---|---|
コマンドが開始されたときに作成されます。 | |
コマンドが成功したときに作成されます。 | |
コマンドが失敗した場合に作成されます。 |
サーバー検出とモニタリング(SDAM)イベントの監視
Rubyドライバーは、接続したインスタンスまたはクラスターの状態が変化した場合に、SDAM イベントとも呼ばれるトポロジーイベントを作成します。例、新しい接続を確立するか、クラスターが新しい プライマリノードを選択した場合、ドライバーはイベントを作成します。
トポロジーイベントの詳細については、サーバー マニュアルの レプリケーションガイドを参照してください。
次のセクションでは、アプリケーション内のトポロジーの変更を記録し、これらのイベントで提供される情報を調べる方法を示します。
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 topic Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to ServerOpening events at the client level by using the SERVER_OPENING monitoring topic client.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber)
次の表は、利用可能なサブスクライブとそのモニタリングトピックを示しています。
サブスクリプション名 | モニタリング トピック | 説明 |
---|---|---|
| は | |
| は | |
| は | |
| は | |
| は | |
| は |
このページのイベントの説明セクションに、SDAMイベント説明の表があります。
カスタム 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) end end class TopologyOpeningLogSubscriber < SDAMLogSubscriber private def format_event(event) "Topology type '#{event.topology.display_name}' initializing." end end class ServerOpeningLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server #{event.address} initializing." end end 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}'." end end 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 end end class ServerClosedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server #{event.address} connection closed." end end class TopologyClosedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Topology type '#{event.topology.display_name}' closed." end end
イベントをサブスクライブするには、適切なサブスクライブを作成し、正しい モニタリングトピックにサブスクライブします。次のコードは、SDAM イベントをグローバルにサブスクライブする方法を示しています。
topology_opening_subscriber = TopologyOpeningLogSubscriber.new server_opening_subscriber = ServerOpeningLogSubscriber.new server_description_changed_subscriber = ServerDescriptionChangedLogSubscriber.new topology_changed_subscriber = TopologyChangedLogSubscriber.new server_closed_subscriber = ServerClosedLogSubscriber.new topology_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.new server_opening_subscriber = ServerOpeningLogSubscriber.new server_description_changed_subscriber = ServerDescriptionChangedLogSubscriber.new topology_changed_subscriber = TopologyChangedLogSubscriber.new server_closed_subscriber = ServerClosedLogSubscriber.new topology_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) end end
次の例に示すように、ハートビート イベントをグローバルまたは特定のクライアントに対してサブスクライブすることができます。
subscriber = HeartbeatLogSubscriber.new # Globally subscribes to Server Opening events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber) # Subscribes to Server Opening events at the client level client = 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 | STARTED D, [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 monitoring subscriber = Mongo::Monitoring::CmapLogSubscriber.new # Globally subscribes to connection pool monitoring events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to connection pool monitoring events at the client level client.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber)
イベントの説明
次の接続プール モニタリング イベントのいずれかにサブスクライブできます。
イベント名 | 説明 |
---|---|
操作が実行用接続の取得に失敗した場合に作成されます。 | |
操作が実行用接続を取得しようとしたときに作成されます。 | |
操作が実行された後に接続がプールにチェックバックされたときに作成されます。 | |
操作が実行用接続を正常に取得したときに作成されます。 | |
接続が閉じられたときに作成されます。 | |
接続が作成されたときに作成されますが、操作に使用される場合は必ずしも作成されません。 | |
接続がハンドシェイクを正常に完了し、操作に使用する準備が整った後に作成されます。 |
API ドキュメント
このガイドで説明するクラスやメソッドの詳細については、次のAPIドキュメントを参照してください。