Docs 菜单
Docs 主页
/ / /
Scala
/

监控

在此页面上

  • 命令监控
  • 集群监控
  • 连接监控/池化(Pooling)

驱动程序使用 JMX 创建 MXBean 允许您监控驱动程序的各个方面。

驱动程序创建单一类型ConnectionPoolStatisticsMBean MXBean实例。 驱动程序为其连接的每台服务器注册一个ConnectionPoolStatisticsMBean实例。 例如,当连接到副本集时,驱动程序会为副本集的每个非隐藏成员创建一个实例。

每个MXBean实例都必须使用唯一的对象名称进行注册,该名称由一个域和一组命名属性组成。驱动程序创建的所有MXBean实例都在域org.mongodb.driver下。 ConnectionPoolStatisticsMBean的实例具有以下属性:

  • clusterId:客户端生成的唯一标识符,在应用程序有多个MongoClient实例连接到同一 MongoDB Server 部署的情况下,用于确保对象名称的唯一性

  • 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 Server 之前向System.out打印一条消息,并在每个命令成功完成或失败时打印另一条消息。

该驱动程序实现了 SDAM 监控规范,允许在驱动程序检测到与其连接的 MongoDB cluster 的拓扑结构发生变化时通知应用程序。

通过使用实现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

驱动程序支持监控与连接池相关的事件。

通过使用实现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 Server,每个与连接池相关的事件,使用这些选项配置的MongoClient都会向System.out打印一条消息。

后退

日志记录