监控
驾驶员使用 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
实例:
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
打印一条消息。