Overview
在本指南中,您可以学习;了解如何在MongoDB PHP库中设立和配置监控。
监控是在应用程序运行时收集有关应用程序行为的信息的进程。这些信息可以帮助您在设计和调试应用程序时做出明智的决策。您还可以使用监控事件中的信息来追踪应用程序的性能和资源使用情况。
MongoDB PHP库会发出命令事件以及提供应用程序信息的服务器发现和监控 (SDAM) 事件。您可以侦听这些事件以监控您的应用程序。
事件类型
驾驶员发出的事件类型取决于正在执行的操作。 下表描述了驾驶员发出的事件类型:
监控事件
要监控事件,您必须执行以下操作:
创建事件订阅者
要订阅监控事件,请创建一个实现事件订阅者接口的类。您可以实现以下接口:
MongoDB\Driver\Monitoring\CommandSubscriber
,订阅命令事件MongoDB\Driver\Monitoring\SDAMSubscriber
,订阅 SDAM 事件
命令事件订阅器示例
要订阅SDAM事件,请创建一个实现 MongoDB\Driver\Monitoring\CommandSubscriber
接口的类。在您的类中,定义每个 CommandSubscriber
方法。下表描述了这些方法以及它们接收通知的命令事件:
方法 | 命令事件 | 说明 |
---|---|---|
命令不成功时调用 | ||
在向服务器发送命令时调用 | ||
命令成功时调用 |
以下代码创建 MyCommandSubscriber
类,该类实现 CommandSubscriber
接口。该类定义了每个 CommandSubscriber
方法,并包含 commandStarted()
方法的自定义逻辑,该逻辑会打印服务器收到的每个新命令的详细信息:
class MyCommandSubscriber implements MongoDB\Driver\Monitoring\CommandSubscriber { /** @param resource $stream */ public function __construct(private $stream) { } public function commandStarted(MongoDB\Driver\Monitoring\CommandStartedEvent $event): void { fwrite($this->stream, sprintf( 'Started command #%d "%s": %s%s', $event->getRequestId(), $event->getCommandName(), MongoDB\BSON\Document::fromPHP($event->getCommand())->toCanonicalExtendedJSON(), PHP_EOL, )); } public function commandSucceeded(MongoDB\Driver\Monitoring\CommandSucceededEvent $event): void { } public function commandFailed(MongoDB\Driver\Monitoring\CommandFailedEvent $event): void { } }
SDAM 事件订阅示例
要订阅SDAM事件,请创建一个实现 MongoDB\Driver\Monitoring\SDAMSubscriber
接口的类。在您的类中,定义每个 SDAMSubscriber
方法。下表描述了这些方法以及它们接收通知的命令事件:
方法 | SDAM 事件 | 说明 |
---|---|---|
在服务器描述更改时调用 | ||
从拓扑结构中删除服务器时调用 | ||
服务器心跳不成功时调用 | ||
在服务器收到心跳时调用 | ||
服务器心跳成功时调用 | ||
在拓扑结构中添加新服务器时调用 | ||
拓扑结构描述更改时调用 | ||
在拓扑结构关闭时调用 | ||
打开拓扑结构时调用 |
以下代码创建 MySDAMSubscriber
类,该类实现 SDAMSubscriber
接口。该类定义了每个 SDAMSubscriber
方法,并包含 serverOpening()
方法的自定义逻辑,该逻辑会打印有关添加到拓扑结构中的服务器的详细信息:
class MySDAMSubscriber implements MongoDB\Driver\Monitoring\SDAMSubscriber { /** @param resource $stream */ public function __construct(private $stream) { } public function serverOpening(MongoDB\Driver\Monitoring\ServerOpeningEvent $event): void { fprintf( $this->stream, 'Server opening on %s:%s\n', $event->getHost(), $event->getPort(), PHP_EOL, ); } public function serverClosed(MongoDB\Driver\Monitoring\ServerClosedEvent $event): void { } public function serverChanged(MongoDB\Driver\Monitoring\ServerChangedEvent $event): void { } public function serverHeartbeatFailed(MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent $event): void { } public function serverHeartbeatStarted(MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent $event): void { } public function serverHeartbeatSucceeded(MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent $event): void { } public function topologyChanged(MongoDB\Driver\Monitoring\TopologyChangedEvent $event): void { } public function topologyClosed(MongoDB\Driver\Monitoring\TopologyClosedEvent $event): void { } public function topologyOpening(MongoDB\Driver\Monitoring\TopologyOpeningEvent $event): void { } }
注册事件订阅者
创建实现订阅者接口的类后,必须向 MongoDB\Client
注册此类,才能接收客户端的事件通知。要注册订阅者,请调用 MongoDB\Client::addSubscriber()
方法并将订阅者类的实例作为参数传递。
例子
以下代码使用 注册此命令以及在此页面的“创建事件订阅者”部分中创建的 SDAM事件订阅者:MongoDB\Client
$commandSub = new MyCommandSubscriber(STDERR); $sdamSub = new MySDAMSubscriber(STDERR); $client->addSubscriber($commandSub); $client->addSubscriber($sdamSub);
当您启动应用程序并运行插入命令时,您的订阅者记录类似于以下内容的事件并输出消息:
Server opening on ac-rmuag0v-shard-00-00.gh0qg50.mongodb.net:27017 Server opening on ac-rmuag0v-shard-00-01.gh0qg50.mongodb.net:27017 Server opening on ac-rmuag0v-shard-00-02.gh0qg50.mongodb.net:27017 Started command #3 "insert": { "insert" : ... }
删除订阅者
要从客户端端取消注册订阅者,请使用 MongoDB\Client::removeSubscriber()
方法。
以下代码展示了如何删除在本页的“命令事件订阅者示例”部分中创建的订阅者:
$client->removeSubscriber($commandSub);
API 文档
要学习;了解有关本指南中讨论的任何类或方法的更多信息,请参阅以下API文档:
要学习;了解有关订阅者类和方法的更多信息,请参阅PHP手册中的以下页面: