diff --git a/examples/sdam_logger.php b/examples/sdam_logger.php new file mode 100644 index 000000000..00762c63d --- /dev/null +++ b/examples/sdam_logger.php @@ -0,0 +1,145 @@ +getHost(), + $event->getPort(), + $event->getPreviousDescription()->getType(), + $event->getNewDescription()->getType(), + ); + + printf("previous hello response: %s\n", toJson($event->getPreviousDescription()->getHelloResponse())); + printf("new hello response: %s\n", toJson($event->getNewDescription()->getHelloResponse())); + echo "\n"; + } + + public function serverClosed(ServerClosedEvent $event): void + { + printf( + "serverClosed: %s:%d was removed from topology %s\n", + $event->getHost(), + $event->getPort(), + (string) $event->getTopologyId(), + ); + echo "\n"; + } + + public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void + { + printf( + "serverHeartbeatFailed: %s:%d heartbeat failed after %dµs\n", + $event->getHost(), + $event->getPort(), + $event->getDurationMicros(), + ); + + $error = $event->getError(); + + printf("error: %s(%d): %s\n", get_class($error), $error->getCode(), $error->getMessage()); + echo "\n"; + } + + public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void + { + printf( + "serverHeartbeatStarted: %s:%d heartbeat started\n", + $event->getHost(), + $event->getPort(), + ); + echo "\n"; + } + + public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void + { + printf( + "serverHeartbeatSucceeded: %s:%d heartbeat succeeded after %dµs\n", + $event->getHost(), + $event->getPort(), + $event->getDurationMicros(), + ); + + printf("reply: %s\n", toJson($event->getReply())); + echo "\n"; + } + + public function serverOpening(ServerOpeningEvent $event): void + { + printf( + "serverOpening: %s:%d was added to topology %s\n", + $event->getHost(), + $event->getPort(), + (string) $event->getTopologyId(), + ); + echo "\n"; + } + + public function topologyChanged(TopologyChangedEvent $event): void + { + printf( + "topologyChanged: %s changed from %s to %s\n", + (string) $event->getTopologyId(), + $event->getPreviousDescription()->getType(), + $event->getNewDescription()->getType(), + ); + echo "\n"; + } + + public function topologyClosed(TopologyClosedEvent $event): void + { + printf("topologyClosed: %s was closed\n", (string) $event->getTopologyId()); + echo "\n"; + } + + public function topologyOpening(TopologyOpeningEvent $event): void + { + printf("topologyOpening: %s was opened\n", (string) $event->getTopologyId()); + echo "\n"; + } +} + +/* Note: TopologyClosedEvent can only be observed for non-persistent clients. + * Persistent clients are destroyed in GSHUTDOWN, long after any PHP objects + * (including subscribers) are freed. */ +$client = new Client(getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/', [], ['disableClientPersistence' => true]); + +$client->getManager()->addSubscriber(new SDAMLogger()); + +$client->test->command(['ping' => 1]); + +/* Events dispatched during mongoc_client_destroy can only be observed before + * RSHUTDOWN. Observing TopologyClosedEvent requires using a non-persistent + * client and freeing it before the script ends. */ +unset($client); diff --git a/tests/ExamplesTest.php b/tests/ExamplesTest.php index 2d4a55301..4c58bcc71 100644 --- a/tests/ExamplesTest.php +++ b/tests/ExamplesTest.php @@ -128,6 +128,23 @@ public static function provideExamples(): Generator 'expectedOutput' => $expectedOutput, ]; + /* Note: Do not assert output beyond the initial topology events, as it + * may vary based on the test environment. PHPUnit's matching behavior + * for "%A" also seems to differ slightly from run-tests.php, otherwise + * we could assert the final topologyClosed event. */ + $expectedOutput = <<<'OUTPUT' +topologyOpening: %x was opened + +topologyChanged: %x changed from Unknown to %s + +%A +OUTPUT; + + yield 'sdam_logger' => [ + 'file' => __DIR__ . '/../examples/sdam_logger.php', + 'expectedOutput' => $expectedOutput, + ]; + $expectedOutput = <<<'OUTPUT' MongoDB\Examples\TypeMapEntry Object (