Docs Menu
Docs Home
/ / /
Ruby ドライバー
/

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

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

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

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

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

  • コマンド イベントの監視

  • サーバー検出とモニタリング(SDAM)イベントの監視

  • 接続プール イベントの監視

このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。ドライバーにイベントをレコード方法については、 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)

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

イベント名
説明

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

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

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

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 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)

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

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

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)
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ドキュメントを参照してください。

戻る

Atlas Vector Search