Overview
在本指南中,您可以学习;了解如何在MongoDB Ruby驱动程序中设立和配置监控。
监控包括收集运行的程序的活动信息,您可以将这些信息与应用程序性能管理库一起使用。
通过监控Ruby驾驶员,您可以了解驱动程序的资源使用情况和性能。这些信息可以帮助您在设计和调试应用程序时做出明智的决策。
在本指南中,您可以学习;了解如何执行以下任务:
本指南介绍如何在代码中使用有关驾驶员活动的信息。要学习;了解如何在驾驶员中记录事件,请参阅Ruby驱动程序的 日志记录指南。
监控命令事件
命令事件是与 MongoDB 数据库命令相关的事件。您可以在应用程序中订阅一个或多个命令监控事件,从而使用驱动程序访问这些事件。
要学习;了解有关MongoDB 数据库命令的更多信息,请参阅MongoDB Server手册中的数据库命令指南。
订阅命令事件
您可以通过在应用程序中订阅命令事件来访问权限有关命令事件的详细信息。您可以在全局级别(监控集群的所有客户端)或客户端端级别订阅事件。此示例演示了以下操作:
实例化一个
CommandLogSubscriber
使用
Mongo::Monitoring::Global.subscribe
方法订阅全局级别的命令事件使用
Mongo::Client.subscribe
方法订阅客户端端级别的命令事件
require 'mongo' # Creates a subscriber for command monitoring subscriber = Mongo::Monitoring::CommandLogSubscriber.new # Globally subscribes to command monitoring events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::COMMAND, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to command monitoring events at the client level client.subscribe( Mongo::Monitoring::COMMAND, subscriber)
事件描述
您可以订阅以下任何命令监控事件:
事件名称 | 说明 |
---|---|
启动命令时创建。 | |
命令成功时创建。 | |
命令失败时创建。 |
监控服务器发现和监控 (SDAM) 事件
当您连接到的实例或集群的状态发生变化时, Ruby驾驶员会创建拓扑结构事件(也称为 SDAM 事件)。示例,当您建立新连接或集群选出新的主节点 (primary node in the replica set)节点时,驾驶员会创建一个事件。
要学习;了解有关拓扑结构事件的更多信息,请参阅服务器手册中的复制指南。
以下部分演示如何记录应用程序中的拓扑更改并探索这些事件中提供的信息。
订阅 SDAM 事件
您可以使用Ruby驱动程序的 subscribe
方法订阅事件。将定义监控事件类型的监控主题和订阅者对象作为参数传递给 subscribe
方法。您可以在全局级别(监控集群的所有客户端)或客户端端级别订阅事件。
此示例演示了以下操作:
实例化一个
ServerOpeningLogSubscriber
订阅者使用
Mongo::Monitoring::Global.subscribe
方法订阅全局级别的ServerOpening
事件使用
Mongo::Client.subscribe
方法在客户端端级别订阅ServerOpening
事件
require 'mongo' subscriber = Mongo::Monitoring::ServerOpeningLogSubscriber.new # Globally subscribes to ServerOpening events by using the SERVER_OPENING monitoring topic Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to ServerOpening events at the client level by using the SERVER_OPENING monitoring topic client.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber)
下表提供了可用订阅者及其监控主题:
订阅者名称 | 监控主题 | 说明 |
---|---|---|
| 订阅 | |
| 订阅 | |
| 订阅 | |
| 订阅 | |
| 订阅 | |
| 订阅 |
您可以在此页面的事件描述部分找到 SDAM事件描述表。
自定义 SDAM 监控
您可以创建自定义 SDAM 订阅者来访问权限有关服务器和拓扑结构事件的详细信息。为每个事件类型创建一个单独的类,因为每个事件的可用数据各不相同。
对于所有事件,订阅者都会调用 succeeded
方法并将事件作为参数传递。一个简单的 SDAM 日志订阅服务器可能类似于以下代码:
class SDAMLogSubscriber include Mongo::Loggable def succeeded(event) log_debug(format_event(event)) end private def logger Mongo::Logger.logger end def format_message(message) format("SDAM | %s", message) end end class TopologyOpeningLogSubscriber < SDAMLogSubscriber private def format_event(event) "Topology type '#{event.topology.display_name}' initializing." end end class ServerOpeningLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server #{event.address} initializing." end end class ServerDescriptionChangedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server description for #{event.address} changed from " + "'#{event.previous_description.server_type}' to '#{event.new_description.server_type}'." end end class TopologyChangedLogSubscriber < SDAMLogSubscriber private def format_event(event) if event.previous_topology != event.new_topology "Topology type '#{event.previous_topology.display_name}' changed to " + "type '#{event.new_topology.display_name}'." else "There was a change in the members of the '#{event.new_topology.display_name}' " + "topology." end end end class ServerClosedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server #{event.address} connection closed." end end class TopologyClosedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Topology type '#{event.topology.display_name}' closed." end end
要订阅事件,请创建适当的订阅者并订阅正确的监控主题。以下代码展示了如何在全局范围内订阅SDAM 事件:
topology_opening_subscriber = TopologyOpeningLogSubscriber.new server_opening_subscriber = ServerOpeningLogSubscriber.new server_description_changed_subscriber = ServerDescriptionChangedLogSubscriber.new topology_changed_subscriber = TopologyChangedLogSubscriber.new server_closed_subscriber = ServerClosedLogSubscriber.new topology_closed_subscriber = TopologyClosedLogSubscriber.new Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, topology_opening_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_OPENING, server_opening_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, server_description_changed_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, topology_changed_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_CLOSED, server_closed_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_CLOSED, topology_closed_subscriber)
以下代码演示如何使用 sdam-proc
客户端选项为单个客户端订阅SDAM 事件:
topology_opening_subscriber = TopologyOpeningLogSubscriber.new server_opening_subscriber = ServerOpeningLogSubscriber.new server_description_changed_subscriber = ServerDescriptionChangedLogSubscriber.new topology_changed_subscriber = TopologyChangedLogSubscriber.new server_closed_subscriber = ServerClosedLogSubscriber.new topology_closed_subscriber = TopologyClosedLogSubscriber.new sdam_proc = Proc.new do |client| client.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, topology_opening_subscriber) client.subscribe(Mongo::Monitoring::SERVER_OPENING, server_opening_subscriber) client.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, server_description_changed_subscriber) client.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, topology_changed_subscriber) client.subscribe(Mongo::Monitoring::SERVER_CLOSED, server_closed_subscriber) client.subscribe(Mongo::Monitoring::TOPOLOGY_CLOSED, topology_closed_subscriber) end client = Mongo::Client.new(['127.0.0.1:27017'], database: 'test', sdam_proc: sdam_proc)
注意
:sdam_proc
客户端选项仅适用于给定客户端。当使用 Client#with
调用更改某些客户端选项时,驾驶员可能会使用一设立默认的事件订阅者创建一个新集群。如果发生这种情况,则不会调用提供的 :sdam_proc
,并且应用程序可能会错过事件。
运行应用程序时,订阅者会记录 SDAM事件并输出如下消息:
D, [2018-10-09T13:58:03.489461 #22079] DEBUG -- : SDAM | Topology type 'Unknown' initializing. D, [2018-10-09T13:58:03.489699 #22079] DEBUG -- : SDAM | Server 127.0.0.1:27100 initializing. D, [2018-10-09T13:58:03.491384 #22079] DEBUG -- : SDAM | Server description for 127.0.0.1:27100 changed from 'unknown' to 'unknown'. D, [2018-10-09T13:58:03.491642 #22079] DEBUG -- : SDAM | Server localhost:27100 initializing. D, [2018-10-09T13:58:03.493199 #22079] DEBUG -- : SDAM | Server description for localhost:27100 changed from 'unknown' to 'primary'. D, [2018-10-09T13:58:03.493473 #22079] DEBUG -- : SDAM | Server localhost:27101 initializing. D, [2018-10-09T13:58:03.494874 #22079] DEBUG -- : SDAM | Server description for localhost:27101 changed from 'unknown' to 'secondary'. D, [2018-10-09T13:58:03.495139 #22079] DEBUG -- : SDAM | Server localhost:27102 initializing. D, [2018-10-09T13:58:03.496504 #22079] DEBUG -- : SDAM | Server description for localhost:27102 changed from 'unknown' to 'secondary'. D, [2018-10-09T13:58:03.496777 #22079] DEBUG -- : SDAM | Topology type 'Unknown' changed to type 'ReplicaSetNoPrimary'. D, [2018-10-09T13:58:03.497306 #22079] DEBUG -- : SDAM | Server 127.0.0.1:27100 connection closed. D, [2018-10-09T13:58:03.497606 #22079] DEBUG -- : SDAM | Topology type 'ReplicaSetNoPrimary' changed to type 'ReplicaSetWithPrimary'. # client.close D, [2018-10-09T13:58:05.342057 #22079] DEBUG -- : SDAM | Server localhost:27100 connection closed. D, [2018-10-09T13:58:05.342299 #22079] DEBUG -- : SDAM | Server localhost:27101 connection closed. D, [2018-10-09T13:58:05.342565 #22079] DEBUG -- : SDAM | Server localhost:27102 connection closed. D, [2018-10-09T13:58:05.342693 #22079] DEBUG -- : SDAM | Topology type 'ReplicaSetWithPrimary' closed.
服务器心跳
您还可以创建自定义订阅者来监控服务器心跳,当服务器监控向服务器发送 hello
命令时会发生心跳。
自定义服务器心跳订阅者与其他 SDAM 订阅者不同,因为它们必须实现以下三个方法:
started
:监听器收到心跳时调用succeeded
:对心跳成功结果的响应failed
:对心跳失败结果的响应
以下示例显示了心跳事件订阅者:
class HeartbeatLogSubscriber include Mongo::Loggable def started(event) log_debug("#{event.address} | STARTED") end def succeeded(event) log_debug("#{event.address} | SUCCEEDED | #{event.duration}s") end def failed(event) log_debug("#{event.address} | FAILED | #{event.error.class}: #{event.error.message} | #{event.duration}s") end private def logger Mongo::Logger.logger end def format_message(message) format("HEARTBEAT | %s", message) end end
您可以全局订阅心跳事件,也可以订阅特定客户端的心跳事件,如以下示例所示:
subscriber = HeartbeatLogSubscriber.new # Globally subscribes to Server Opening events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber) # Subscribes to Server Opening events at the client level client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'test' ) client.subscribe( Mongo::Monitoring::SERVER_HEARTBEAT, subscriber )
运行应用程序时,订阅者会记录心跳事件并输出如下消息:
D, [2018-09-23T13:44:10.707018 #1739] DEBUG -- : HEARTBEAT | 127.0.0.1:27027 | STARTED D, [2018-09-23T13:44:10.707778 #1739] DEBUG -- : HEARTBEAT | 127.0.0.1:27027 | SUCCEEDED | 0.000772381s
事件描述
下表提供了每个 SDAM事件的名称和描述:
eventType | 说明 |
---|---|
关闭服务器实例时创建的事件。 | |
服务器描述更改时创建的事件。 | |
服务器心跳失败时创建的事件。 | |
侦听器收到服务器心跳时创建的事件。 | |
服务器心跳成功时创建的事件。 | |
驾驶员连接到服务器时创建的事件。 | |
拓扑结构更改时创建的事件。 | |
在拓扑结构中的所有实例连接关闭时创建的事件。 | |
在驾驶员尝试连接到实例之前创建的事件。 |
监控连接池事件
连接池是驱动程序与 MongoDB 实例之间维护的一组开放的 TCP 连接。连接池有助于减少应用程序需要执行的网络握手次数,还能帮助应用程序更快地运行。
以下部分演示如何在应用程序中记录连接池事件并探索这些事件中提供的信息。
订阅连接池事件
您可以通过在应用程序中订阅所有连接池事件来访问权限有关这些事件的详细信息。您可以在全局级别订阅事件,这会监控集群的所有客户端,也可以在客户端端级别订阅事件:
此示例演示了以下操作:
实例化一个
CmapLogSubscriber
订阅者使用
Mongo::Monitoring::Global.subscribe
方法订阅全局级别的所有连接池事件使用
Mongo::Client.subscribe
方法订阅客户端端级别的所有连接池事件
require 'mongo' # Creates a subscriber for connection pool monitoring subscriber = Mongo::Monitoring::CmapLogSubscriber.new # Globally subscribes to connection pool monitoring events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to connection pool monitoring events at the client level client.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber)
事件描述
您可以订阅以下任何连接池监控事件:
事件名称 | 说明 |
---|---|
当操作无法获取用于执行的连接时创建。 | |
当操作尝试获取用于执行的连接时创建。 | |
在执行操作后,当连接被检回连接池时创建。 | |
当操作成功获取用于执行的连接时创建。 | |
在连接关闭时创建。 | |
在创建连接时创建,但不一定是在用于操作时创建。 | |
在连接成功完成一次握手并可用于操作后创建。 |
API 文档
要学习;了解有关本指南中讨论的任何类或方法的更多信息,请参阅以下API文档: