ドライバーは JMX を使用して、ドライバーのさまざまな側面を監視できる macOS を作成します。
ドライバーは、単一のタイプConnectionPoolStatisticsMBeanの MXBeanインスタンスを作成します。 ドライバーは、接続するサーバーごとに 1 つのConnectionPoolStatisticsMBeanインスタンスを登録します。 たとえば、レプリカセットに接続すると、ドライバーはレプリカセットの非表示でないメンバーごとに インスタンスを作成します。
各MXBeanインスタンスは、ドメインと名前付きプロパティのセットで構成される一意のオブジェクト名で登録する必要があります。 ドライバーによって作成されたすべてのMXBeanインスタンスは、ドメインorg.mongodb.driverの下にあります。 ConnectionPoolStatisticsMBeanのインスタンスには次のプロパティがあります。
clusterId: クライアントが生成した一意の識別子で、アプリケーションが同じ MongoDB サーバー配置に接続されている複数のMongoClientインスタンスがある状況でオブジェクト名の一意性を確保するために必要です。host: サーバーのホスト名port: サーバーがリッスンしているポートminSize: アイドル状態と使用中のノードを含む、プールの最小許可サイズmaxSize: アイドル状態と使用中のノードを含む、プールの最大許容サイズsize: アイドル状態と使用中のノードを含むプールの現在のサイズcheckedOutCount: 現在使用中の接続の現在の数
JTX 接続プールのモニタリングはデフォルトで無効になっています。 これを有効にするには、 MongoClientSettingsインスタンスの作成時にcom.mongodb.management.JMXConnectionPoolListenerインスタンスを追加する必要があります。
val settings: MongoClientSettings = MongoClientSettings.builder() .applyToConnectionPoolSettings((builder: ConnectionPoolSettings.Builder) => builder.addConnectionPoolListener(new JMXConnectionPoolListener())) .build()
コマンド監視
ドライバーは コマンド監視仕様を実装し、コマンドが開始されたときとコマンドが成功または失敗したときにアプリケーションに通知できるようにします。
アプリケーションは、 CommandListenerインターフェースを実装するクラスのインスタンスを含むMongoClientSettingsインスタンスを構成することで、コマンド リスナーをMongoClientに登録します。 次の例は、 CommandListenerインターフェースの簡単な実装です。
case class TestCommandListener() extends CommandListener { override def commandStarted(event: CommandStartedEvent): Unit = { println(s"""Sent command '${event.getCommandName}:${event.getCommand.get(event.getCommandName)}' | with id ${event.getRequestId} to database '${event.getDatabaseName}' | on connection '${event.getConnectionDescription.getConnectionId}' to server | '${event.getConnectionDescription.getServerAddress}'""".stripMargin) } override def commandSucceeded(event: CommandSucceededEvent): Unit = { println(s"""Successfully executed command '${event.getCommandName}}' | with id ${event.getRequestId} | on connection '${event.getConnectionDescription.getConnectionId}' to server | '${event.getConnectionDescription.getServerAddress}'""".stripMargin) } override def commandFailed(event: CommandFailedEvent): Unit = { println(s"""Failed execution of command '${event.getCommandName}}' | with id ${event.getRequestId} | on connection '${event.getConnectionDescription.getConnectionId}' to server | '${event.getConnectionDescription.getServerAddress} | with exception '${event.getThrowable}'""".stripMargin) } }
次の例では、 TestCommandListenerのインスタンスで構成されたMongoClientSettingsのインスタンスを作成します。
val settings: MongoClientSettings = MongoClientSettings.builder() .addCommandListener(TestCommandListener()) .build() val client: MongoClient = MongoClient(settings)
これらのオプションで構成されたMongoClientは、各コマンドを MongoDB サーバーに送信する前にSystem.outにメッセージを出力し、各コマンドの成功または失敗時に別のメッセージを出力します。
クラスター モニタリング
ドライバーは SDAM モニタリング仕様を実装し、接続先の MongoDB クラスターのトポロジーに対する変更をドライバーが検出したときにアプリケーションに通知できるようにします。
アプリケーションは、 ClusterListener 、 ServerListener 、またはServerMonitorListenerインターフェースのいずれかを実装するクラスのインスタンスでMongoClientSettingsを構成することで、 MongoClientでリスナーを登録します。
次のコードは、クラスター リスナーの作成方法を示しています。
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 unique client identifier ${event.getClusterId} opening") override def clusterClosed(event: ClusterClosedEvent): Unit = println(s"Cluster with unique client identifier ${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のインスタンスを作成します。
val settings: MongoClientSettings = MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.addClusterListener(TestClusterListener(ReadPreference.secondary()))) .build() val client: MongoClient = MongoClient(settings)
これらのオプションで構成されたMongoClientは、 MongoClientがこれらのオプションを使用して作成され、かつMongoClientが閉じられたときに、 System.outにメッセージを出力します。 さらに、クライアントが次のいずれかの状態になったときにメッセージが出力されます。
書込み (write) を受け入れる使用可能なサーバーがあること
書込み (write) を受け入れる使用可能なサーバーがありません
構成された を使用して読み取りを受け入れる使用可能なサーバーがある
ReadPreference構成された を使用して読み取りを受け入れる使用可能なサーバーがない
ReadPreference
接続プールの監視
ドライバーは、接続プール関連のイベントの監視をサポートしています。
アプリケーションは、 ConnectionPoolListenerインターフェースを実装するクラスのインスタンスでMongoClientSettingsを構成することで、 MongoClientでリスナーを登録します。
次のコードは、接続プール リスナーの作成方法を示しています。
case class TestConnectionPoolListener() extends ConnectionPoolListener { override def connectionPoolOpened(event: ConnectionPoolOpenedEvent): Unit = println(event) override def connectionPoolClosed(event: ConnectionPoolClosedEvent): Unit = println(event) override def connectionCheckedOut(event: ConnectionCheckedOutEvent): Unit = println(event) override def connectionCheckedIn(event: ConnectionCheckedInEvent): Unit = println(event) override def waitQueueEntered(event: ConnectionPoolWaitQueueEnteredEvent): Unit = println(event) override def waitQueueExited(event: ConnectionPoolWaitQueueExitedEvent): Unit = println(event) override def connectionAdded(event: ConnectionAddedEvent): Unit = println(event) override def connectionRemoved(event: ConnectionRemovedEvent): Unit = println(event) }
次の例では、 TestConnectionPoolListenerのインスタンスで構成されたMongoClientSettingsのインスタンスを作成します。
val settings: MongoClientSettings = MongoClientSettings.builder() .applyToConnectionPoolSettings((builder: ConnectionPoolSettings.Builder) => builder.addConnectionPoolListener(TestConnectionPoolListener())) .build() val client: MongoClient = MongoClient(settings)
これらのオプションで構成されたMongoClientは、MongoClient が接続されている各 MongoDB サーバーの接続プール関連のイベントごとにSystem.outにメッセージを出力します。