监控
该驱动程序使用JMX 用于创建 MXBeans 以监视驱动程序的各种方面。
驱动程序创建MXBean
实例,类型为 ConnectionPoolStatisticsMBean
。对于每个连接到的服务器,驱动程序注册一个 ConnectionPoolStatisticsMBean
实例。例如,当连接到副本集时,驱动程序为副本集中每个非隐藏成员创建一个实例。
每个 MXBean
实例都需要注册一个唯一的对象名称,该名称由一个域名和一组命名属性组成。驱动程序创建的所有 MXBean
实例都在域名 org.mongodb.driver
下。ConnectionPoolStatisticsMBean
实例具有以下属性
clusterId
:一个客户端生成的唯一标识符,在应用程序具有多个连接到同一 MongoDB 服务器部署的MongoClient
实例的情况下,用于确保对象名称的唯一性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
可以接受读取的可用服务器
连接池监控
驱动程序支持监控连接池相关事件。
应用程序通过配置MongoClientSettings
,使用实现ConnectionPoolListener
接口的类的实例来向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
。