Docs 菜单
Docs 主页
/ / /
Ruby 驱动程序
/

监控应用程序事件

在本指南中,您可以学习;了解如何在MongoDB Ruby驱动程序中设立和配置监控

监控包括收集运行的程序的活动信息,您可以将这些信息与应用程序性能管理库一起使用。

通过监控Ruby驾驶员,您可以了解驱动程序的资源使用情况和性能。这些信息可以帮助您在设计和调试应用程序时做出明智的决策。

在本指南中,您可以学习;了解如何执行以下任务:

  • 监控命令事件

  • 监控服务器发现和监控 (SDAM) 事件

  • 监控连接池事件

本指南介绍如何在代码中使用有关驾驶员活动的信息。要学习;了解如何在驾驶员中记录事件,请参阅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)

您可以订阅以下任何命令监控事件:

事件名称
说明

启动命令时创建。

命令成功时创建。

命令失败时创建。

当您连接到的实例或集群的状态发生变化时, Ruby驾驶员会创建拓扑结构事件(也称为 SDAM 事件)。示例,当您建立新连接或集群选出新的主节点 (primary node in the replica set)节点时,驾驶员会创建一个事件。

要学习;了解有关拓扑结构事件的更多信息,请参阅服务器手册中的复制指南。

以下部分演示如何记录应用程序中的拓扑更改并探索这些事件中提供的信息。

您可以使用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)

下表提供了可用订阅者及其监控主题:

订阅者名称
监控主题
说明

SERVER_CLOSED

订阅 ServerClosed 事件并记录这些事件。

SERVER_DESCRIPTION_CHANGED

订阅 ServerDescriptionChanged 事件并记录这些事件。

SERVER_OPENING

订阅 ServerOpening 事件并记录这些事件。

TOPOLOGY_CHANGED

订阅 TopologyChanged 事件并记录这些事件。

TOPOLOGY_CLOSED

订阅 TopologyClosed 事件并记录这些事件。

TOPOLOGY_OPENING

订阅 TopologyOpening 事件并记录这些事件。

您可以在此页面的事件描述部分找到 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文档:

后退

Atlas Vector Search

在此页面上