文档菜单
文档首页
/ / /
Scala
/

监控

在本页

  • 命令监控
  • 集群监控
  • 连接池监控

该驱动程序使用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集群拓扑结构变化时得到通知。

应用程序通过使用实现ClusterListenerServerListenerServerMonitorListener接口之一的类实例配置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

返回

日志记录