Skip to content

Commit 2fcce89

Browse files
authored
PHPLIB-1177: SDAM logger example (#1142)
1 parent e3b6462 commit 2fcce89

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

examples/sdam_logger.php

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace MongoDB\Examples;
5+
6+
use MongoDB\Client;
7+
use MongoDB\Driver\Monitoring\SDAMSubscriber;
8+
use MongoDB\Driver\Monitoring\ServerChangedEvent;
9+
use MongoDB\Driver\Monitoring\ServerClosedEvent;
10+
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
11+
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
12+
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
13+
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
14+
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
15+
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
16+
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;
17+
18+
use function get_class;
19+
use function getenv;
20+
use function MongoDB\BSON\fromPHP;
21+
use function MongoDB\BSON\toRelaxedExtendedJSON;
22+
use function printf;
23+
24+
require __DIR__ . '/../vendor/autoload.php';
25+
26+
/** @param array|object $document */
27+
function toJSON($document): string
28+
{
29+
return toRelaxedExtendedJSON(fromPHP($document));
30+
}
31+
32+
class SDAMLogger implements SDAMSubscriber
33+
{
34+
public function serverChanged(ServerChangedEvent $event): void
35+
{
36+
printf(
37+
"serverChanged: %s:%d changed from %s to %s\n",
38+
$event->getHost(),
39+
$event->getPort(),
40+
$event->getPreviousDescription()->getType(),
41+
$event->getNewDescription()->getType(),
42+
);
43+
44+
printf("previous hello response: %s\n", toJson($event->getPreviousDescription()->getHelloResponse()));
45+
printf("new hello response: %s\n", toJson($event->getNewDescription()->getHelloResponse()));
46+
echo "\n";
47+
}
48+
49+
public function serverClosed(ServerClosedEvent $event): void
50+
{
51+
printf(
52+
"serverClosed: %s:%d was removed from topology %s\n",
53+
$event->getHost(),
54+
$event->getPort(),
55+
(string) $event->getTopologyId(),
56+
);
57+
echo "\n";
58+
}
59+
60+
public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void
61+
{
62+
printf(
63+
"serverHeartbeatFailed: %s:%d heartbeat failed after %dµs\n",
64+
$event->getHost(),
65+
$event->getPort(),
66+
$event->getDurationMicros(),
67+
);
68+
69+
$error = $event->getError();
70+
71+
printf("error: %s(%d): %s\n", get_class($error), $error->getCode(), $error->getMessage());
72+
echo "\n";
73+
}
74+
75+
public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void
76+
{
77+
printf(
78+
"serverHeartbeatStarted: %s:%d heartbeat started\n",
79+
$event->getHost(),
80+
$event->getPort(),
81+
);
82+
echo "\n";
83+
}
84+
85+
public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void
86+
{
87+
printf(
88+
"serverHeartbeatSucceeded: %s:%d heartbeat succeeded after %dµs\n",
89+
$event->getHost(),
90+
$event->getPort(),
91+
$event->getDurationMicros(),
92+
);
93+
94+
printf("reply: %s\n", toJson($event->getReply()));
95+
echo "\n";
96+
}
97+
98+
public function serverOpening(ServerOpeningEvent $event): void
99+
{
100+
printf(
101+
"serverOpening: %s:%d was added to topology %s\n",
102+
$event->getHost(),
103+
$event->getPort(),
104+
(string) $event->getTopologyId(),
105+
);
106+
echo "\n";
107+
}
108+
109+
public function topologyChanged(TopologyChangedEvent $event): void
110+
{
111+
printf(
112+
"topologyChanged: %s changed from %s to %s\n",
113+
(string) $event->getTopologyId(),
114+
$event->getPreviousDescription()->getType(),
115+
$event->getNewDescription()->getType(),
116+
);
117+
echo "\n";
118+
}
119+
120+
public function topologyClosed(TopologyClosedEvent $event): void
121+
{
122+
printf("topologyClosed: %s was closed\n", (string) $event->getTopologyId());
123+
echo "\n";
124+
}
125+
126+
public function topologyOpening(TopologyOpeningEvent $event): void
127+
{
128+
printf("topologyOpening: %s was opened\n", (string) $event->getTopologyId());
129+
echo "\n";
130+
}
131+
}
132+
133+
/* Note: TopologyClosedEvent can only be observed for non-persistent clients.
134+
* Persistent clients are destroyed in GSHUTDOWN, long after any PHP objects
135+
* (including subscribers) are freed. */
136+
$client = new Client(getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/', [], ['disableClientPersistence' => true]);
137+
138+
$client->getManager()->addSubscriber(new SDAMLogger());
139+
140+
$client->test->command(['ping' => 1]);
141+
142+
/* Events dispatched during mongoc_client_destroy can only be observed before
143+
* RSHUTDOWN. Observing TopologyClosedEvent requires using a non-persistent
144+
* client and freeing it before the script ends. */
145+
unset($client);

tests/ExamplesTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,23 @@ public static function provideExamples(): Generator
128128
'expectedOutput' => $expectedOutput,
129129
];
130130

131+
/* Note: Do not assert output beyond the initial topology events, as it
132+
* may vary based on the test environment. PHPUnit's matching behavior
133+
* for "%A" also seems to differ slightly from run-tests.php, otherwise
134+
* we could assert the final topologyClosed event. */
135+
$expectedOutput = <<<'OUTPUT'
136+
topologyOpening: %x was opened
137+
138+
topologyChanged: %x changed from Unknown to %s
139+
140+
%A
141+
OUTPUT;
142+
143+
yield 'sdam_logger' => [
144+
'file' => __DIR__ . '/../examples/sdam_logger.php',
145+
'expectedOutput' => $expectedOutput,
146+
];
147+
131148
$expectedOutput = <<<'OUTPUT'
132149
MongoDB\Examples\TypeMapEntry Object
133150
(

0 commit comments

Comments
 (0)