对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

监控应用程序事件

在本指南中,您可以学习如何使用Scala驱动程序监控驱动程序操作期间发生的事件。监控包括收集有关运行的程序的活动的信息,您可以将这些信息与应用程序或应用程序性能管理库一起使用。

您可以监控应用程序事件,以了解驱动程序的资源使用情况和性能,这有助于您在设计和调试应用程序时做出明智的决策。

Scala 驱动程序将可以监控的事件组织到以下类别:

  • 命令事件:与 MongoDB 数据库命令相关的事件

  • 服务器发现和监控 (SDAM) 事件:与连接到的 MongoDB 实例或集群状态变化相关的事件

  • 连接池事件:与驱动程序与 MongoDB 实例维护的连接池相关的事件

以下部分介绍每个事件类别并展示如何监控事件。要了解如何将驱动程序事件记录到日志,请参阅日志记录指南。

命令事件是与 MongoDB 数据库命令相关的事件。生成命令事件的数据库命令示例包括 find、insert、delete 和 count。

Scala驱动程序不会为其内部调用的命令发布事件。这包括驱动程序用于监控集群的命令以及与连接建立相关的命令,例如初始 hello 命令。

要监控命令事件,请创建一个实现CommandListener接口的类,并使用MongoClient实例。

重要

编辑输出

作为安全措施,驱动程序会编辑某些命令事件的内容,以保护敏感信息。有关编辑命令事件的完整列表,请参阅 MongoDB 命令记录和监控规范的 安全部分。

要了解有关 MongoDB 数据库命令的更多信息,请参阅 数据库命令。

以下示例定义了实现 CommandListener 接口的 CommandCounter 类。该类追踪驱动程序成功执行每个数据库命令的次数,并在每个命令完成时打印此信息。

case class CommandCounter() extends CommandListener {
private val commands =
scala.collection.mutable.Map[String, Int]()
override def commandStarted(event: CommandStartedEvent): Unit = {}
override def commandSucceeded(
event: CommandSucceededEvent
): Unit = {
val commandName = event.getCommandName
commands(commandName) =
commands.getOrElse(commandName, 0) + 1
println(commands.toMap)
}
override def commandFailed(event: CommandFailedEvent): Unit = {}
}

以下代码将 CommandCounter 类的一个实例添加到 MongoClientSettings 对象中,并使用以下设置配置 MongoClient 实例:

val settings: MongoClientSettings = MongoClientSettings
.builder()
.addCommandListener(CommandCounter())
.applyConnectionString(ConnectionString("<connection string>"))
.build()
val mongoClient: MongoClient = MongoClient(settings)

运行应用程序时,输出类似以下内容:

Map(find -> 1)
Map(find -> 2)
Map(find -> 2, endSessions -> 1)

下表描述了 Scala 驱动程序发布的命令事件以及处理这些事件的监听器接口:

eventType
监听器接口
说明

在数据库命令开始时发布。

在数据库命令成功时发布。

在数据库命令失败时发布。

服务器发现与监控 (SDAM) 事件是与所连接的 MongoDB 实例或集群状态变化相关的事件。

Scala 驱动程序定义了九个 SDAM 事件,并提供以下监听器接口,每个接口监听三个 SDAM 事件:

  • ClusterListener:侦听与拓扑结构更改或集群状态和结构更改相关的事件

  • ServerListener:侦听与单个服务器更改相关的事件

  • ServerMonitorListener:监听心跳事件,报告副本集节点之间的通信状态

您可以使用 SDAM 事件中的信息来了解集群更改、评估集群运行状况或规划容量。

以下示例定义了实现 ClusterListener 接口的 TestClusterListener 类。该类包含在响应以下拓扑结构相关事件时打印消息的方法:

  • clusterOpening(): 当驱动程序首次连接到集群时打印一条消息

  • clusterClosed(): 当驱动程序与集群断开连接时打印一条消息

  • clusterDescriptionChanged():打印有关集群读取和写入可用性更改的消息

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 ID ${event.getClusterId} opening")
override def clusterClosed(event: ClusterClosedEvent): Unit =
println(s"Cluster with ID ${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 对象中,并使用以下设置配置 MongoClient 实例:

val uri: ConnectionString = ConnectionString("<connection string>")
val settings: MongoClientSettings = MongoClientSettings
.builder()
.applyToClusterSettings((builder: ClusterSettings.Builder) =>
builder.addClusterListener(TestClusterListener(ReadPreference.secondary())))
.applyConnectionString(uri)
.build()
val client: MongoClient = MongoClient(settings)

运行应用程序时,输出类似以下内容:

Cluster with ID ClusterId{value='...', description='...'} opening
Writable server available
Readable server available
Cluster with ID ClusterId{value='...', description='...'} closed

下表介绍了每个 SDAM 事件、处理该事件的监听器接口以及驱动程序发布该事件的时间:

eventType
监听器接口
说明

在拓扑结构说明变更时发布,例如选举新的主节点 (primary node in the replica set)时。

在驱动程序首次连接到集群时发布。

当驱动程序与集群断开连接时发布。

当服务器说明变更时发布。

在拓扑结构中添加新服务器时发布。

从拓扑结构中删除现有服务器时发布。

当服务器监控向服务器发送 hello 命令时发布。此操作称为心跳。

当心跳成功时发布。

心跳失败时发布。

连接池事件是与驱动程序与 MongoDB 实例之间维护的连接池相关的事件。连接池是驱动程序与 MongoDB 实例之间维护的一组开放的 TCP 连接。连接池可以减少应用程序需要执行的网络握手次数,并可以帮助应用程序更快地运行。

要监控连接池事件,请创建一个实现 ConnectionPoolListener 接口的类,并使用 MongoClient实例注册该类的实例。

提示

连接池

要学习有关连接池的更多信息,请参阅连接池指南。

以下示例定义了实现 ConnectionPoolListener 接口的 ConnectionPoolLibrarian 类。每当驱动程序从连接池中检出连接时,该类都会打印一条消息。

case class ConnectionPoolLibrarian()
extends ConnectionPoolListener {
override def connectionCheckedOut(
event: ConnectionCheckedOutEvent
): Unit =
println(
s"Let me get you the connection with id " +
s"${event.getConnectionId.getLocalValue}..."
)
override def connectionCheckOutFailed(
event: ConnectionCheckOutFailedEvent
): Unit = {}
}

以下代码将 ConnectionPoolLibrarian 类的一个实例添加到 MongoClientSettings 对象中,并使用以下设置配置 MongoClient 实例:

val settings: MongoClientSettings = MongoClientSettings
.builder()
.applyToConnectionPoolSettings(
(builder: ConnectionPoolSettings.Builder) =>
builder.addConnectionPoolListener(
ConnectionPoolLibrarian()
)
)
.applyConnectionString(ConnectionString("<connection string>"))
.build()
val mongoClient: MongoClient = MongoClient(settings)

运行应用程序时,输出类似以下内容:

Let me get you the connection with id 1...

下表描述了 Scala 驱动程序发布的连接池事件以及处理这些事件的监听器接口:

eventType
监听器接口
说明

创建连接池时发布。

当连接池就绪可用时发布。

关闭连接池时发布。

在连接池中创建连接时发布。

在连接完成握手并准备好使用时发布。

连接关闭时发布。

当驱动程序开始检查连接时发布。

当驱动程序成功检出连接时发布。

在驱动程序无法检出连接时发布。

在驱动程序将连接检查回到连接池时发布。

清除连接池时发布。

要进一步了解本指南所讨论的方法和类型,请参阅以下 API 文档: