对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

监控应用程序事件

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

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

Scala驾驶员将您可以监控的事件分为以下几类:

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

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

  • 连接池事件:与驾驶员使用MongoDB实例维护的连接池相关的事件

以下部分描述了每个事件类别,并展示了如何监控事件。要学习;了解如何将驾驶员事件记录到日志,请参阅日志记录指南。

命令事件是与MongoDB 数据库命令相关的事件。生成命令事件的数据库命令示例包括 findinsertdeletecount

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

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

重要

编辑输出

作为一项安全措施,驾驶员会编辑某些命令事件的内容以保护敏感信息。有关已编辑命令事件的完整列表,请参阅MongoDB命令日志记录和监控规范的安全部分。

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

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

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驾驶员定义了 9 个 SDAM 事件,并提供以下监听器接口,每个接口监听 3 个 SDAM 事件:

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

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

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

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

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

  • 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 命令时发布。此动作称为心跳。

当心跳成功时发布。

当 heartbeat 失败时发布。

连接池事件是与驾驶员维护的MongoDB实例连接池相关的事件。连接池是驾驶员与MongoDB实例维护的一设立打开的 TCP 连接。连接池减少了应用程序需要执行的网络握手次数,可以帮助应用程序更快地运行。

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

提示

连接池

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

以下示例定义了 ConnectionPoolLibrarian 类,该类实现了 ConnectionPoolListener 接口。每次驾驶员从连接池检出连接时,该类都会打印一条消息。

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 文档: