Overview
このガイドでは、 Scalaドライバーを使用して、 ドライバー操作中に発生するイベントを監視する方法を学習できます。モニタリングには、実行中のプログラムのアクティビティに関する情報を収集することが含まれます。この情報は、アプリケーションまたはアプリケーションパフォーマンス管理ライブラリで使用できます。
アプリケーションイベントを監視して、ドライバーのリソース使用量とパフォーマンスを理解でき、アプリケーションの設計およびデバッグ 時に情報に基づいた決定を行うことができます。
Scalaドライバーは、モニターできるイベントを次のカテゴリに分類します。
コマンド イベント: MongoDBデータベースコマンドに関連するイベント
サーバー検出とモニタリング(SDAM)イベント: 接続しているMongoDBインスタンスまたはクラスターの状態の変更に関連するイベント
接続プール イベント: ドライバーがMongoDBインスタンスと維持する接続プールに関連するイベント
以下のセクションでは、各イベントカテゴリの説明と、イベントを監視する方法を示します。ドライバー イベントをログにレコード方法については、「 ログ記録ガイド 」を参照してください。
コマンド イベントの監視
コマンドイベントは、 MongoDBデータベースコマンドに関連するイベントです。コマンド イベントを生成するデータベースコマンドの例には、find、insert、delete、count などがあります。
Scalaドライバーは、内部で呼び出すコマンドのイベントを公開しません。これには、ドライバーがクラスターを監視するために使用するコマンドや、最初の hello コマンドなど、接続確立に関連するコマンドが含まれます。
コマンド イベントを監視するには、 CommandListenerインターフェースを実装するクラスを作成し、そのクラスのインスタンスをMongoClientインスタンスに登録します。
重要
編集済み出力
セキュリティ対策として、ドライバーは機密情報を保護するために、一部のコマンドイベントの内容をリダクションします。編集されたコマンド イベントの完全なリストについては、 MongoDBコマンドのログ記録とモニタリング 仕様の「 セキュリティ 」セクションを参照してください。
MongoDBデータベースコマンドの詳細については、「 データベースコマンド 」を参照してください。
例
次の例では、CommandListener インターフェースを実装する CommandCounterクラスを定義します。クラスは、ドライバーが各データベースコマンドを正常に実行した回数を追跡し、コマンドが完了するたびにこの情報を出力します。
case class CommandCounter() extends CommandListener { private val commands = scala.collection.mutable.Map[String, Int]() override def commandStarted(event: CommandStartedEvent): Unit = {} override def commandSucceeded( event: CommandSucceededEvent ): Unit = { val commandName = event.getCommandName commands(commandName) = commands.getOrElse(commandName, 0) + 1 println(commands.toMap) } override def commandFailed(event: CommandFailedEvent): Unit = {} }
次のコードは、CommandCounterクラスのインスタンスを MongoClientSettingsオブジェクトに追加し、 設定を使用して MongoClientインスタンスを構成します。
val settings: MongoClientSettings = MongoClientSettings .builder() .addCommandListener(CommandCounter()) .applyConnectionString(ConnectionString("<connection string>")) .build() val mongoClient: MongoClient = MongoClient(settings)
アプリケーション を実行すると、出力は次のようになります。
Map(find -> 1) Map(find -> 2) Map(find -> 2, endSessions -> 1)
イベントの説明
次の表では、 Scalaドライバーが公開するコマンド イベントと、それを処理するリスナー インターフェースについて説明します。
eventType | リスナー インターフェース | 説明 |
|---|---|---|
データベースコマンドの開始時に公開されます。 | ||
データベースコマンド が成功したときに公開されます。 | ||
データベースコマンドが失敗した場合に公開されます。 |
SDAM イベントの監視
サーバー検出とモニタリング(SDAM)イベントは、接続しているMongoDBインスタンスまたはクラスターの状態の変更に関連するイベントです。
Scalaドライバーは 9 つの SDAM イベントを定義し、それぞれ 3 つの SDAM イベントをリッスンする次のリスナー インターフェースを提供します。
ClusterListener:トポロジーの変更、またはクラスターの状態と構造の変更に関連するイベントをリッスンしますServerListener: 個々のサーバーの変更に関連するイベントをリッスンServerMonitorListener:レプリカセットノード間の通信状況を報告するハートビート イベントをリッスンします。
SDAM イベントの情報を使用して、クラスターの変更の理解、クラスターの健全性の評価、または プランキャパシティーを行えます。
例
次の例では、ClusterListener インターフェースを実装する TestClusterListenerクラスを定義します。クラスには、次のトポロジー関連のイベントに応答してメッセージを出力するメソッドが含まれています。
clusterOpening(): ドライバーが最初にクラスターに接続したときにメッセージを出力しますclusterClosed(): ドライバーがクラスターから切断されたときにメッセージを出力しますclusterDescriptionChanged(): クラスターの読み取りおよび書込み (write) の可用性の変更に関するメッセージを出力します
case class TestClusterListener(readPreference: ReadPreference) extends ClusterListener { var isWritable: Boolean = false var isReadable: Boolean = false override def clusterOpening(event: ClusterOpeningEvent): Unit = println(s"Cluster with ID ${event.getClusterId} opening") override def clusterClosed(event: ClusterClosedEvent): Unit = println(s"Cluster with ID ${event.getClusterId} closed") override def clusterDescriptionChanged(event: ClusterDescriptionChangedEvent): Unit = { if (!isWritable) { if (event.getNewDescription.hasWritableServer) { isWritable = true println("Writable server available") } } else { if (!event.getNewDescription.hasWritableServer) { isWritable = false println("No writable server available") } } if (!isReadable) { if (event.getNewDescription.hasReadableServer(readPreference)) { isReadable = true println("Readable server available") } } else { if (!event.getNewDescription.hasReadableServer(readPreference)) { isReadable = false println("No readable server available") } } } }
次のコードは、TestClusterListenerクラスのインスタンスを MongoClientSettingsオブジェクトに追加し、 設定を使用して MongoClientインスタンスを構成します。
val uri: ConnectionString = ConnectionString("<connection string>") val settings: MongoClientSettings = MongoClientSettings .builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.addClusterListener(TestClusterListener(ReadPreference.secondary()))) .applyConnectionString(uri) .build() val client: MongoClient = MongoClient(settings)
アプリケーション を実行すると、出力は次のようになります。
Cluster with ID ClusterId{value='...', description='...'} opening Writable server available Readable server available Cluster with ID ClusterId{value='...', description='...'} closed
イベントの説明
次の表は、各 SDAMイベント、それを取り扱うリスナー インターフェース、およびドライバーがそれを公開するタイミングについて説明しています。
eventType | リスナー インターフェース | 説明 |
|---|---|---|
新しいプライマリの選挙など、トポロジーの説明が変更されたときに公開されます。 | ||
ドライバーが最初にクラスターに接続したときに発行されます。 | ||
ドライバーがクラスターから切断されたときに発行されます。 | ||
サーバーの説明が変更されたときに公開されます。 | ||
新しいサーバーがトポロジーに追加されたときに発行されます。 | ||
既存のサーバーがトポロジーから削除されたときに公開されます。 | ||
サーバーモニターがサーバーに | ||
ハートビートが成功したときに公開されます。 | ||
ハートビートが失敗したときに公開されます。 |
接続プール イベントの監視
接続プールイベントは、ドライバがMongoDBインスタンスと維持する接続プールに関連するイベントです。接続プールとは、ドライバーがMongoDBインスタンスと維持するオープン TCP 接続のセットです。接続プールを使用すると、アプリケーションが実行する必要があるネットワーク ハンドシェイクの数が減り、アプリケーションの実行が高速化されます。
接続プールのイベントを監視するには、ConnectionPoolListener インターフェースを実装するクラスを作成し、そのクラスのインスタンスを MongoClientインスタンスに登録します。
例
次の例では、ConnectionPoolListener インターフェースを実装する ConnectionPoolLibrarianクラスを定義します。クラスは、ドライバーが接続プールから接続をチェックアウトするたびにメッセージを出力します。
case class ConnectionPoolLibrarian() extends ConnectionPoolListener { override def connectionCheckedOut( event: ConnectionCheckedOutEvent ): Unit = println( s"Let me get you the connection with id " + s"${event.getConnectionId.getLocalValue}..." ) override def connectionCheckOutFailed( event: ConnectionCheckOutFailedEvent ): Unit = {} }
次のコードは、ConnectionPoolLibrarianクラスのインスタンスを MongoClientSettingsオブジェクトに追加し、 設定を使用して MongoClientインスタンスを構成します。
val settings: MongoClientSettings = MongoClientSettings .builder() .applyToConnectionPoolSettings( (builder: ConnectionPoolSettings.Builder) => builder.addConnectionPoolListener( ConnectionPoolLibrarian() ) ) .applyConnectionString(ConnectionString("<connection string>")) .build() val mongoClient: MongoClient = MongoClient(settings)
アプリケーション を実行すると、出力は次のようになります。
Let me get you the connection with id 1...
イベントの説明
次の表では、 Scalaドライバーが公開する接続プールイベントと、それを処理するリスナー インターフェースについて説明します。
eventType | リスナー インターフェース | 説明 |
|---|---|---|
接続プールの作成時に公開されます。 | ||
接続プールが使用可能になったときに公開されます。 | ||
接続プールが閉じられたときに公開されます。 | ||
プールで接続が作成されたときに公開されます。 | ||
接続がハンドシェイクを完了し、使用可能になったときに公開されます。 | ||
接続が閉じられたときに公開されます。 | ||
ドライバーが接続のチェックアウトを開始したときに発行されます。 | ||
ドライバーが接続を正常にチェックアウトしたときに公開されます。 | ||
ドライバーが接続のチェックアウトに失敗した場合に発行されます。 | ||
ドライバーが接続をプールにチェックバックするときに発行されます。 | ||
接続プールがクリアされたときに公開されます。 |
API ドキュメント
このガイドで説明するメソッドとタイプの詳細については、次の API ドキュメントを参照してください。