JMX 监控
驾驶员使用 JMX 创建 MXBean 允许您监控驾驶员的各个方面。
驱动程序创建单一类型ConnectionPoolStatisticsMBean
的 MXBean
实例。 驱动程序为其连接的每台服务器注册一个ConnectionPoolStatisticsMBean
实例。 例如,当连接到副本集时,驱动程序会为副本集的每个非隐藏成员创建一个实例。
每个MXBean
实例都必须使用唯一的对象名称进行注册,该名称由一个域和一设立命名属性组成。 驾驶员创建的所有MXBean
实例都在域org.mongodb.driver
下。 ConnectionPoolStatisticsMBean
的实例具有以下属性:
clusterId
:客户端生成的唯一标识符,在应用程序有多个MongoClient
实例连接到同一MongoDB 服务器部署的情况下,用于确保对象名称的唯一性host
:服务器的主机名port
:服务器监听的端口minSize
:允许的最小池大小,包括空闲和正在使用的节点maxSize
:池的最大允许大小,包括空闲和正在使用的节点size
:池的当前大小,包括空闲和正在使用的节点checkedOutCount
:当前正在使用的连接数
默认情况下,JMX 连接池监控处于禁用状态。 要启用此功能,请在创建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
。 此外,当客户端进入以下任一状态时,它还会打印一条消息:
有可接受写入的可用服务器
没有可接受写入的可用服务器
具有可用服务器,该服务器将使用配置的
ReadPreference
没有可用服务器接受读取,方法是使用配置的
ReadPreference
连接监控/池化(Pooling)
驱动程序支持监控与连接池相关的事件。
通过使用实现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 连接的每个MongoDB服务器的每个连接池相关事件,使用这些选项配置的MongoClient
都会向System.out
打印一条消息。