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

モニタリング

ドライバーを使用すると、特定のイベントが発生したときにアプリケーションが通知されるようになります。 これらのイベントは、次のカテゴリに分類されます。

  • コマンド監視

  • トポロジーのライフサイクル

  • サーバーのライフサイクル

  • サーバー ハートビート

  • 接続プールと接続

トポロジーとサーバー イベントは、サーバー検出とモニタリング(SDAM)の一部です。

サーバーに送信されるすべてのユーザー開始コマンドは、詳細な情報を取得するためにサブスクライブできるイベントを公開します。 モニタリング API は、各コマンドに対して保証された開始イベントを公開し、その後に成功または失敗したイベントのいずれかを公開します。 サブスクライブは、 startedsucceededfailedの 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エンジン トピックをサブスクライブすることで、アプリケーションは各サーバーのハートビートを通知できます。 サーバー ハートビート リスナーには、 startedsucceededfailedの 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 ドライバーは、 コマンド監視メカニズムを通じて一部のイベントを公開せず、時によっては編集します。

  1. コマンドがリダクションされたコマンドの特定のサブセットに属している場合、またはペイロードのリダクションをtriggerするキーが含まれている場合は、セキュリティ上の理由から空のペイロードが提供されます。 完全なペイロードにアクセスするには、 MONGO_RUBY_DRIVER_UNREDACT_EVENTS環境変数を1true 、またはyesに設定します。 次のコマンドはリダクションされます。

    • authenticate

    • saslStart

    • saslContinue

    • getnonce

    • createUser

    • updateUser

    • copydbgetnonce

    • copydbsaslstart

    • copydb

  2. コマンドがハンドシェイク コマンド( ismasterまたはhelloのいずれかで、モニタリング以外の接続では、イベントはまったく公開されません。

  3. モニタリング接続(is Master や hello など)を介して送信されたコマンドは、コマンド モニタリング イベントを公開しません。 代わりに、サーバーがチェックされるたびにサーバー ハートビート イベントが公開されます。 サーバー ハートビート イベントには、コマンドまたは応答のペイロードは含まれません。

  4. コマンドがハンドシェイク コマンドで、 speculativeAuthenticateオプションがtrueの場合、コマンドは編集され、空のペイロードが提供されます。

戻る

認証

項目一覧

  • コマンド監視
  • サーバーの検出と監視
  • サーバー ハートビート
  • 接続プールと接続モニタリング
  • モニタリングの無効化
  • 除外イベントと編集イベント