Overview
在本指南中,您可以学习如何使用Scala驱动程序监控驱动程序操作期间发生的事件。监控包括收集有关运行的程序的活动的信息,您可以将这些信息与应用程序或应用程序性能管理库一起使用。
您可以监控应用程序事件,以了解驱动程序的资源使用情况和性能,这有助于您在设计和调试应用程序时做出明智的决策。
Scala 驱动程序将可以监控的事件组织到以下类别:
命令事件:与 MongoDB 数据库命令相关的事件
服务器发现和监控 (SDAM) 事件:与连接到的 MongoDB 实例或集群状态变化相关的事件
连接池事件:与驱动程序与 MongoDB 实例维护的连接池相关的事件
以下部分介绍每个事件类别并展示如何监控事件。要了解如何将驱动程序事件记录到日志,请参阅日志记录指南。
监控命令事件
命令事件是与 MongoDB 数据库命令相关的事件。生成命令事件的数据库命令示例包括 find、insert、delete 和 count。
Scala驱动程序不会为其内部调用的命令发布事件。这包括驱动程序用于监控集群的命令以及与连接建立相关的命令,例如初始 hello 命令。
要监控命令事件,请创建一个实现CommandListener接口的类,并使用MongoClient实例。
要了解有关 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 事件
服务器发现与监控 (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)时。 | ||
在驱动程序首次连接到集群时发布。 | ||
当驱动程序与集群断开连接时发布。 | ||
当服务器说明变更时发布。 | ||
在拓扑结构中添加新服务器时发布。 | ||
从拓扑结构中删除现有服务器时发布。 | ||
当服务器监控向服务器发送 | ||
当心跳成功时发布。 | ||
心跳失败时发布。 |
监控连接池事件
连接池事件是与驱动程序与 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 文档
要进一步了解本指南所讨论的方法和类型,请参阅以下 API 文档: