モニタリング
ドライバーを使用すると、特定のイベントが発生したときにアプリケーションが通知されるようになります。 これらのイベントは、次のカテゴリに分類されます。
コマンド監視
トポロジーのライフサイクル
サーバーのライフサイクル
サーバー ハートビート
接続プールと接続
トポロジーとサーバー イベントは、サーバー検出とモニタリング(SDAM)の一部です。
コマンド監視
サーバーに送信されるすべてのユーザー開始コマンドは、詳細な情報を取得するためにサブスクライブできるイベントを公開します。 モニタリング API は、各コマンドに対して保証された開始イベントを公開し、その後に成功または失敗したイベントのいずれかを公開します。 サブスクライブは、 started
、 succeeded
、 failed
の 3 つのメソッドを実装する必要があります。それぞれは、イベントの 1 つのパラメータを受け取ります。 以下は、ドライバーによって内部的に使用されるログ サブスクライブに基づくログ サブスクライブの例です。
class CommandLogSubscriber include Mongo::Loggable def started(event) # The default inspection of a command which is a BSON document gets # truncated in the middle. To get the full rendering of the command, the # ``to_json`` method can be called on the document. log_debug("#{prefix(event)} | STARTED | #{format_command(event.command.to_json)}") end def succeeded(event) log_debug("#{prefix(event)} | SUCCEEDED | #{event.duration}s") end def failed(event) log_debug("#{prefix(event)} | FAILED | #{event.message} | #{event.duration}s") end private def logger Mongo::Logger.logger end def format_command(args) begin args.inspect rescue Exception '<Unable to inspect arguments>' end end def format_message(message) format("COMMAND | %s".freeze, message) end def prefix(event) "#{event.address.to_s} | #{event.database_name}.#{event.command_name}" end end
カスタム サブスクリプションを登録するには、すべてのクライアントに対してグローバルに登録することも、クライアントごとに登録することもできます。
subscriber = CommandLogSubscriber.new Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::COMMAND, subscriber) client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test' ) client.subscribe( Mongo::Monitoring::COMMAND, subscriber )
出力例:
D, [2018-09-23T13:47:31.258020 #4692] DEBUG -- : COMMAND | 127.0.0.1:27027 | test.hello | STARTED | {"hello"=>1, "$readPreference"=>{"mode"=>"primary"}, "lsid"=>{"id"=><BSON::Binary:0x47111693353080 type=uuid data=0x730341e880dc40a2...>}} D, [2018-09-23T13:47:31.259145 #4692] DEBUG -- : COMMAND | 127.0.0.1:27027 | test.hello | SUCCEEDED | 0.000791175s
サーバーの検出と監視
Ruby ドライバーは サーバー検出とモニタリング(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".freeze, 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 イベントをサブスクライブする場合、クライアントの構築中にイベントが公開される可能性があるため、より詳細な情報を得るには次のようにします。
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)
出力例:
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.
注意
:sdam_proc
クライアント オプションは、それが指定されているクライアントの構築中にのみ適用されます。 Client#with
呼び出しによって特定のクライアント オプションが変更されると、イベント サブスクライブのデフォルト セットを持つドライバーによって新しいクラスターが作成される場合があります。 こうした場合、提供された:sdam_proc
は呼び出されず、アプリケーションはイベントを失う可能性があります。
サーバー ハートビート
SERVER_HEARTBエンジン トピックをサブスクライブすることで、アプリケーションは各サーバーのハートビートを通知できます。 サーバー ハートビート リスナーには、 started
、 succeeded
、 failed
の 3 つのメソッドを実装する必要があります。 各ハートビートによりリスナーでstarted
メソッドが呼び出され、ハートビートの結果に応じてsucceeded
failed
メソッドまたは メソッドが呼び出されます。
すべてのハートビート イベントには、ハートビートが送信されたサーバーのアドレスが含まれます。 成功したイベントと失敗したイベントには、hello またはレガシー hello コマンドのラウンド トリップ時間が含まれます。 失敗した イベントには、hello またはレガシー hello コマンドの実行中に発生した例外インスタンスも含まれます。 イベント属性の詳細については、「 ServerHeartbeatStarted 」、「 ServerHeartbeatSucceeded 、ServerHeartbeatFailed 」のAPIドキュメントを確認してください。
以下は、ハートビート イベント サブスクライブのログの例です。
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".freeze, message) end end
コマンド イベントと同様に、アプリケーションはハートビート イベントをグローバルまたは特定のクライアントに対してサブスクライブできます。
subscriber = HeartbeatLogSubscriber.new Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber) 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
ハートビート イベント間隔
MongoDB 4.2 以前のサーバーに接続すると、Ruby ドライバーはデフォルトでハートビートを発行し、 :heartbeat_frequency
(Ruby クライアント オプション)秒ごとにハートビートを発行し、ハートビートは重複しません(ハートビートの成功したイベントは、 の開始イベントが開始される前に公開されることが保証されます次のハートビートが公開されます)。 MongoDB 4.4 以降のサーバーに接続すると、ドライバーは複数の監視スレッドとより複雑なハートビート プロトコルを使用して、サーバーの状態の変更をより早く検出するように設計されています。その結果、ハートビート イベントの間隔はより不規則になり、ハートビート イベントは重複する可能性があります。 具体的には、待機していないハートビートの進行中に待機したハートビートが開始または終了することができ、その逆も同様です。 待機していないハートビートと待機しているハートビートを区別するには、 ServerHeartbeatStarted#awaited?
、 ServerHeartbeatSucceeded#awaited?
、 ServerHeartbeatFailed#awaited?
メソッドを使用します。
クライアントが操作を実行しようとし、適切なサーバーがない場合、配置はより頻繁にスキャンされます。各サーバーは500ミリ秒ごとにポーリングアップできます。 アプリケーションで特定のサーバーの手動スキャンをリクエストすることもできます。ドライバーは、スキャンの間に 500 ミリ秒の最小間隔を強制します。
接続プールと接続モニタリング
各クライアントは、認識されている配置内の各サーバーの接続プールを維持し、接続プールと個々の接続の両方のイベントを公開します。 これらのイベントをサブスクライブするには、公開されているイベントの単一のパラメータを受け取るメソッドpubished
を実装するサブスクライブ クラスを定義します。 ドライバーの将来のバージョンでは、このメカニズムを通じて公開される追加のイベントが導入される可能性があることに注意してください。
次のイベントは現在、 CMAP 仕様 に従ってドライバーによって実装されています。 :
PoolCreated
PoolCleared
PoolClosed
ConnectionCreed
ConnectionReady
ConnectionClosed
ConnectionCheckOutStarted
ConnectionCheckOutFailed
ConnectionCheckOutSucceeded
ConnectionCheckedIn
ドライバーは、すべての接続プールと接続関連のイベントをログに記録するために使用できるログ サブスクリプションを提供します。 このサブスクライブは、アプリケーションによって実行される各操作のログエントリが作成されるため、デフォルトでは有効になっていません。 このサブスクライブをグローバルまたはクライアントごとに有効にするには、次の手順に従います。
Mongo::Monitoring::Global.subscribe( Mongo::Monitoring::CONNECTION_POOL, Mongo::Monitoring::CmapLogSubscriber.new) client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test' ) subscriber = Mongo::Monitoring::CmapLogSubscriber.new client.subscribe( Mongo::Monitoring::CONNECTION_POOL, subscriber )
出力例:
D, [2019-05-06T17:23:21.595412 #8576] DEBUG -- : MONGODB | EVENT: #<PoolCreated address=127.0.0.1:27741 options={...}> D, [2019-05-06T17:23:21.595584 #8576] DEBUG -- : MONGODB | EVENT: #<PoolCleared address=127.0.0.1:27741> D, [2019-05-06T17:23:21.603549 #8576] DEBUG -- : MONGODB | EVENT: #<PoolCreated address=localhost:27741 options={...}> D, [2019-05-06T17:23:21.603616 #8576] DEBUG -- : MONGODB | EVENT: #<ConnectionCheckOutStarted address=localhost:27741> D, [2019-05-06T17:23:21.603684 #8576] DEBUG -- : MONGODB | EVENT: #<ConnectionCreated address=localhost:27741 connection_id=1> D, [2019-05-06T17:23:21.604079 #8576] DEBUG -- : MONGODB | EVENT: #<ConnectionCheckedOut address=localhost:27741 connection_id=1> D, [2019-05-06T17:23:21.605759 #8576] DEBUG -- : MONGODB | EVENT: #<ConnectionReady address=localhost:27741 connection_id=1> D, [2019-05-06T17:23:21.605784 #8576] DEBUG -- : MONGODB | EVENT: #<ConnectionCheckedIn address=localhost:27741 connection_id=1> D, [2019-05-06T17:23:21.605817 #8576] DEBUG -- : MONGODB | EVENT: #<PoolCleared address=localhost:27741> D, [2019-05-06T17:23:21.605852 #8576] DEBUG -- : MONGODB | EVENT: #<ConnectionClosed address=localhost:27741 connection_id=1 reason=stale>
モニタリングの無効化
モニタリングをオフにするには、クライアント モニタリング オプションをfalse
に設定します。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test', :monitoring => false )
除外イベントと編集イベント
Ruby ドライバーは、 コマンド監視メカニズムを通じて一部のイベントを公開せず、時によっては編集します。
コマンドがリダクションされたコマンドの特定のサブセットに属している場合、またはペイロードのリダクションをtriggerするキーが含まれている場合は、セキュリティ上の理由から空のペイロードが提供されます。 完全なペイロードにアクセスするには、
MONGO_RUBY_DRIVER_UNREDACT_EVENTS
環境変数を1
、true
、またはyes
に設定します。 次のコマンドはリダクションされます。authenticate
saslStart
saslContinue
getnonce
createUser
updateUser
copydbgetnonce
copydbsaslstart
copydb
コマンドがハンドシェイク コマンド(
ismaster
またはhello
のいずれかで、モニタリング以外の接続では、イベントはまったく公開されません。モニタリング接続(is Master や hello など)を介して送信されたコマンドは、コマンド モニタリング イベントを公開しません。 代わりに、サーバーがチェックされるたびにサーバー ハートビート イベントが公開されます。 サーバー ハートビート イベントには、コマンドまたは応答のペイロードは含まれません。
コマンドがハンドシェイク コマンドで、
speculativeAuthenticate
オプションがtrue
の場合、コマンドは編集され、空のペイロードが提供されます。