ドライバーは 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インスタンスを追加する必要があります。
MongoClientSettings settings = MongoClientSettings.builder() .applyToConnectionPoolSettings(builder -> builder.addConnectionPoolListener(new JMXConnectionPoolListener())) .build();
コマンド監視
ドライバーは コマンド監視仕様を実装し、コマンドが開始されたときとコマンドが成功または失敗したときにアプリケーションに通知できるようにします。
アプリケーションは、 CommandListenerインターフェースを実装するクラスのインスタンスを含むMongoClientSettingsインスタンスを構成することで、コマンド リスナーをMongoClientに登録します。 次の例は、 CommandListenerインターフェースの簡単な実装です。
public class TestCommandListener implements CommandListener { public void commandStarted(final CommandStartedEvent event) { System.out.println(String.format("Sent command '%s:%s' with id %s to database '%s' " + "on connection '%s' to server '%s'", event.getCommandName(), event.getCommand().get(event.getCommandName()), event.getRequestId(), event.getDatabaseName(), event.getConnectionDescription() .getConnectionId(), event.getConnectionDescription().getServerAddress())); } public void commandSucceeded(final CommandSucceededEvent event) { System.out.println(String.format("Successfully executed command '%s' with id %s " + "on connection '%s' to server '%s'", event.getCommandName(), event.getRequestId(), event.getConnectionDescription() .getConnectionId(), event.getConnectionDescription().getServerAddress())); } public void commandFailed(final CommandFailedEvent event) { System.out.println(String.format("Failed execution of command '%s' with id %s " + "on connection '%s' to server '%s' with exception '%s'", event.getCommandName(), event.getRequestId(), event.getConnectionDescription() .getConnectionId(), event.getConnectionDescription().getServerAddress(), event.getThrowable())); } }
次の例では、 TestCommandListenerのインスタンスで構成されたMongoClientSettingsのインスタンスを作成します。
MongoClientSettings settings = MongoClientSettings.builder() .addCommandListener(new TestCommandListener()) .build(); MongoClient client = MongoClients.create(settings);
これらのオプションで構成されたMongoClientは、各コマンドを MongoDB サーバーに送信する前にSystem.outにメッセージを出力し、各コマンドの成功または失敗時に別のメッセージを出力します。
クラスター モニタリング
ドライバーは SDAM モニタリング仕様を実装し、接続先の MongoDB クラスターのトポロジーに対する変更をドライバーが検出したときにアプリケーションに通知できるようにします。
アプリケーションは、 ClusterListener 、 ServerListener 、またはServerMonitorListenerインターフェースのいずれかを実装するクラスのインスタンスでMongoClientSettingsを構成することで、 MongoClientでリスナーを登録します。
次のコードは、クラスター リスナーの作成方法を示しています。
public class TestClusterListener implements ClusterListener { private final ReadPreference readPreference; private boolean isWritable; private boolean isReadable; public TestClusterListener(final ReadPreference readPreference) { this.readPreference = readPreference; } public void clusterOpening(final ClusterOpeningEvent clusterOpeningEvent) { System.out.println(String.format("Cluster with unique client identifier %s opening", clusterOpeningEvent.getClusterId())); } public void clusterClosed(final ClusterClosedEvent clusterClosedEvent) { System.out.println(String.format("Cluster with unique client identifier %s closed", clusterClosedEvent.getClusterId())); } public void clusterDescriptionChanged(final ClusterDescriptionChangedEvent event) { if (!isWritable) { if (event.getNewDescription().hasWritableServer()) { isWritable = true; System.out.println("Writable server available!"); } } else { if (!event.getNewDescription().hasWritableServer()) { isWritable = false; System.out.println("No writable server available!"); } } if (!isReadable) { if (event.getNewDescription().hasReadableServer(readPreference)) { isReadable = true; System.out.println("Readable server available!"); } } else { if (!event.getNewDescription().hasReadableServer(readPreference)) { isReadable = false; System.out.println("No readable server available!"); } } } }
次の例では、 TestClusterListenerのインスタンスで構成されたMongoClientSettingsのインスタンスを作成します。
List<ServerAddress> seedList = ... MongoClientSettings settings = MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.addClusterListener(new TestClusterListener(ReadPreference.secondary()))) .build(); MongoClient client = MongoClients.create(settings);
これらのオプションで構成されたMongoClientは、 MongoClientがこれらのオプションを使用して作成され、かつMongoClientが閉じられたときに、 System.outにメッセージを出力します。 さらに、クライアントが次のいずれかの状態になったときにメッセージが出力されます。
書込み (write) を受け入れる使用可能なサーバーがあること
書込み (write) を受け入れる使用可能なサーバーがありません
構成された を使用して読み取りを受け入れる使用可能なサーバーがある
ReadPreference構成された を使用して読み取りを受け入れる使用可能なサーバーがない
ReadPreference
接続プールの監視
ドライバーは、接続プール関連のイベントの監視をサポートしています。
アプリケーションは、 ConnectionPoolListenerインターフェースを実装するクラスのインスタンスでMongoClientSettingsを構成することで、 MongoClientでリスナーを登録します。
次のコードは、接続プール リスナーの作成方法を示しています。
public class TestConnectionPoolListener implements ConnectionPoolListener { public void connectionPoolOpened(final ConnectionPoolOpenedEvent event) { System.out.println(event); } public void connectionPoolClosed(final ConnectionPoolClosedEvent event) { System.out.println(event); } public void connectionCheckedOut(final ConnectionCheckedOutEvent event) { System.out.println(event); } public void connectionCheckedIn(final ConnectionCheckedInEvent event) { System.out.println(event); } public void connectionAdded(final ConnectionAddedEvent event) { System.out.println(event); } public void connectionRemoved(final ConnectionRemovedEvent event) { System.out.println(event); } }
次の例では、 TestConnectionPoolListenerのインスタンスで構成されたMongoClientSettingsのインスタンスを作成します。
List<ServerAddress> seedList = ... MongoClientSettings settings = MongoClientSettings.builder() .applyToConnectionPoolSettings(builder -> builder.addConnectionPoolListener(new TestConnectionPoolListener())) .build(); MongoClient client = MongoClients.create(settings);
これらのオプションで構成されたMongoClientは、MongoClient が接続されている各 MongoDB サーバーの接続プール関連のイベントごとにSystem.outにメッセージを出力します。