AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

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

このガイドでは、 Scalaドライバーを使用して、 ドライバー操作中に発生するイベントを監視する方法を学習できます。モニタリングには、実行中のプログラムのアクティビティに関する情報を収集することが含まれます。この情報は、アプリケーションまたはアプリケーションパフォーマンス管理ライブラリで使用できます。

アプリケーションイベントを監視して、ドライバーのリソース使用量とパフォーマンスを理解でき、アプリケーションの設計およびデバッグ 時に情報に基づいた決定を行うことができます。

Scalaドライバーは、モニターできるイベントを次のカテゴリに分類します。

  • コマンド イベント: MongoDBデータベースコマンドに関連するイベント

  • サーバー検出とモニタリング(SDAM)イベント: 接続しているMongoDBインスタンスまたはクラスターの状態の変更に関連するイベント

  • 接続プール イベント: ドライバーがMongoDBインスタンスと維持する接続プールに関連するイベント

以下のセクションでは、各イベントカテゴリの説明と、イベントを監視する方法を示します。ドライバー イベントをログにレコード方法については、「 ログ記録ガイド 」を参照してください。

コマンドイベントは、 MongoDBデータベースコマンドに関連するイベントです。コマンド イベントを生成するデータベースコマンドの例には、findinsertdeletecount などがあります。

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)イベントは、接続している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
リスナー インターフェース
説明

新しいプライマリの選挙など、トポロジーの説明が変更されたときに公開されます。

ドライバーが最初にクラスターに接続したときに発行されます。

ドライバーがクラスターから切断されたときに発行されます。

サーバーの説明が変更されたときに公開されます。

新しいサーバーがトポロジーに追加されたときに発行されます。

既存のサーバーがトポロジーから削除されたときに公開されます。

サーバーモニターがサーバーに hello コマンドを送信したときに公開されます。このアクションは、ハートビートと呼ばれます。

ハートビートが成功したときに公開されます。

ハートビートが失敗したときに公開されます。

接続プールイベントは、ドライバがMongoDBインスタンスと維持する接続プールに関連するイベントです。接続プールとは、ドライバーがMongoDBインスタンスと維持するオープン TCP 接続のセットです。接続プールを使用すると、アプリケーションが実行する必要があるネットワーク ハンドシェイクの数が減り、アプリケーションの実行が高速化されます。

接続プールのイベントを監視するには、ConnectionPoolListener インターフェースを実装するクラスを作成し、そのクラスのインスタンスを MongoClientインスタンスに登録します。

Tip

接続プール

接続プールの詳細については、接続プールガイドを参照してください。

次の例では、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 ドキュメントを参照してください。