モニタリング
ドライバーは JTX を使用して、ドライバーのさまざまな側面を監視できる 返しを作成します。
ドライバーは、単一のタイプ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
にメッセージを出力します。