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