AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

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

このガイドでは、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)イベントは、接続している 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 ドキュメントを参照してください。