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