드라이버 레벨에서 전역으로 subscriber를 등록하는 방법임.
라이브러리 레벨에서 하는 방법은 아래 링크 참조.
https://www.mongodb.com/docs/php-library/upcoming/reference/method/MongoDBClient-addSubscriber/
아래는 전역으로 subscriber를 등록하여 MongoDB command를 모니터링하는 예제.
<?php
use MongoDB\Driver\Monitoring\CommandSubscriber;
use MongoDB\Driver\Monitoring\CommandStartedEvent;
use MongoDB\Driver\Monitoring\CommandSucceededEvent;
use MongoDB\Driver\Monitoring\CommandFailedEvent;
// subscriber
// https://www.php.net/manual/en/class.mongodb-driver-monitoring-commandsubscriber.php
class MyCommandSubscriber implements CommandSubscriber
{
// 커맨드 시작시
// https://www.php.net/manual/en/class.mongodb-driver-monitoring-commandstartedevent.php
public function commandStarted(CommandStartedEvent $event)
{
// read preference를 확인하고 싶을 경우
printf("ReadPreference = %s\n", get_object_vars($event->getCommand())['$readPreference']->mode);
}
// 커맨드 성공시
// https://www.php.net/manual/en/class.mongodb-driver-monitoring-commandsucceededevent.php
public function commandSucceeded(CommandSucceededEvent $event)
{
// command 전송 후 reply 받을 때까지 걸린 시간
printf("duration = %.3f sec\n", $event->getDuration() / 1000000);
}
// 커맨드 실패시
// https://www.php.net/manual/en/class.mongodb-driver-monitoring-commandfailedevent.php
public function commandFailed(CommandFailedEvent $event)
{
//
}
}
// subscriber 등록
$myCommandSubscriber = new MyCommandSubscriber();
MongoDB\Driver\Monitoring\addSubscriber($myCommandSubscriber);
// 여기서 뭔가 MongoDB 커맨드를 실행하면 내가 등록한 subscriber의 각 이벤트 핸들러에 지정된 내용이 처리됨
// 각 이벤트 객체들이 가진 정보들이 풍부하므로 필터링을 통해 필요한 것들만 로그파일에 저장하거나 메시지큐를 통해 모으는 식으로 처리 가능