33
44namespace MongoDB \Examples ;
55
6+ use Closure ;
7+ use Exception ;
68use MongoDB \BSON \Document ;
79use MongoDB \Client ;
810use MongoDB \Driver \Monitoring \SDAMSubscriber ;
@@ -28,102 +30,54 @@ function toJSON(array|object $document): string
2830
2931class SDAMLogger implements SDAMSubscriber
3032{
33+ /** @param Closure(object):void $handleOutput */
34+ public function __construct (private readonly Closure $ handleOutput )
35+ {
36+ }
37+
3138 public function serverChanged (ServerChangedEvent $ event ): void
3239 {
33- printf (
34- "serverChanged: %s:%d changed from %s to %s \n" ,
35- $ event ->getHost (),
36- $ event ->getPort (),
37- $ event ->getPreviousDescription ()->getType (),
38- $ event ->getNewDescription ()->getType (),
39- );
40-
41- printf ("previous hello response: %s \n" , toJson ($ event ->getPreviousDescription ()->getHelloResponse ()));
42- printf ("new hello response: %s \n" , toJson ($ event ->getNewDescription ()->getHelloResponse ()));
43- echo "\n" ;
40+ $ this ->handleOutput ->__invoke ($ event );
4441 }
4542
4643 public function serverClosed (ServerClosedEvent $ event ): void
4744 {
48- printf (
49- "serverClosed: %s:%d was removed from topology %s \n" ,
50- $ event ->getHost (),
51- $ event ->getPort (),
52- (string ) $ event ->getTopologyId (),
53- );
54- echo "\n" ;
45+ $ this ->handleOutput ->__invoke ($ event );
5546 }
5647
5748 public function serverHeartbeatFailed (ServerHeartbeatFailedEvent $ event ): void
5849 {
59- printf (
60- "serverHeartbeatFailed: %s:%d heartbeat failed after %dµs \n" ,
61- $ event ->getHost (),
62- $ event ->getPort (),
63- $ event ->getDurationMicros (),
64- );
65-
66- $ error = $ event ->getError ();
67-
68- printf ("error: %s(%d): %s \n" , $ error ::class, $ error ->getCode (), $ error ->getMessage ());
69- echo "\n" ;
50+ $ this ->handleOutput ->__invoke ($ event );
7051 }
7152
7253 public function serverHeartbeatStarted (ServerHeartbeatStartedEvent $ event ): void
7354 {
74- printf (
75- "serverHeartbeatStarted: %s:%d heartbeat started \n" ,
76- $ event ->getHost (),
77- $ event ->getPort (),
78- );
79- echo "\n" ;
55+ $ this ->handleOutput ->__invoke ($ event );
8056 }
8157
8258 public function serverHeartbeatSucceeded (ServerHeartbeatSucceededEvent $ event ): void
8359 {
84- printf (
85- "serverHeartbeatSucceeded: %s:%d heartbeat succeeded after %dµs \n" ,
86- $ event ->getHost (),
87- $ event ->getPort (),
88- $ event ->getDurationMicros (),
89- );
90-
91- printf ("reply: %s \n" , toJson ($ event ->getReply ()));
92- echo "\n" ;
60+ $ this ->handleOutput ->__invoke ($ event );
9361 }
9462
9563 public function serverOpening (ServerOpeningEvent $ event ): void
9664 {
97- printf (
98- "serverOpening: %s:%d was added to topology %s \n" ,
99- $ event ->getHost (),
100- $ event ->getPort (),
101- (string ) $ event ->getTopologyId (),
102- );
103- echo "\n" ;
65+ $ this ->handleOutput ->__invoke ($ event );
10466 }
10567
10668 public function topologyChanged (TopologyChangedEvent $ event ): void
10769 {
108- printf (
109- "topologyChanged: %s changed from %s to %s \n" ,
110- (string ) $ event ->getTopologyId (),
111- $ event ->getPreviousDescription ()->getType (),
112- $ event ->getNewDescription ()->getType (),
113- );
114- echo "\n" ;
70+ $ this ->handleOutput ->__invoke ($ event );
11571 }
11672
11773 public function topologyClosed (TopologyClosedEvent $ event ): void
11874 {
119- printf ("topologyClosed: %s was closed \n" , (string ) $ event ->getTopologyId ());
120- echo "\n" ;
75+ $ this ->handleOutput ->__invoke ($ event );
12176 }
12277
12378 public function topologyOpening (TopologyOpeningEvent $ event ): void
12479 {
125- printf ("topologyOpening: %s was opened \n" , (string ) $ event ->getTopologyId ());
126- echo "\n" ;
80+ $ this ->handleOutput ->__invoke ($ event );
12781 }
12882}
12983
@@ -132,7 +86,87 @@ public function topologyOpening(TopologyOpeningEvent $event): void
13286 * (including subscribers) are freed. */
13387$ client = new Client (getenv ('MONGODB_URI ' ) ?: 'mongodb://127.0.0.1/ ' , [], ['disableClientPersistence ' => true ]);
13488
135- $ client ->getManager ()->addSubscriber (new SDAMLogger ());
89+ $ handleOutput = function (object $ event ): void {
90+ switch ($ event ::class) {
91+ case ServerChangedEvent::class:
92+ printf (
93+ "serverChanged: %s:%d changed from %s to %s \n" ,
94+ $ event ->getHost (),
95+ $ event ->getPort (),
96+ $ event ->getPreviousDescription ()->getType (),
97+ $ event ->getNewDescription ()->getType (),
98+ );
99+
100+ printf ("previous hello response: %s \n" , toJson ($ event ->getPreviousDescription ()->getHelloResponse ()));
101+ printf ("new hello response: %s \n" , toJson ($ event ->getNewDescription ()->getHelloResponse ()));
102+ break ;
103+ case ServerClosedEvent::class:
104+ printf (
105+ "serverClosed: %s:%d was removed from topology %s \n" ,
106+ $ event ->getHost (),
107+ $ event ->getPort (),
108+ $ event ->getTopologyId ()->__toString (),
109+ );
110+ break ;
111+ case ServerHeartbeatFailedEvent::class:
112+ printf (
113+ "serverHeartbeatFailed: %s:%d heartbeat failed after %dµs \n" ,
114+ $ event ->getHost (),
115+ $ event ->getPort (),
116+ $ event ->getDurationMicros (),
117+ );
118+
119+ $ error = $ event ->getError ();
120+
121+ printf ("error: %s(%d): %s \n" , $ error ::class, $ error ->getCode (), $ error ->getMessage ());
122+ break ;
123+ case ServerHeartbeatStartedEvent::class:
124+ printf (
125+ "serverHeartbeatStarted: %s:%d heartbeat started \n" ,
126+ $ event ->getHost (),
127+ $ event ->getPort (),
128+ );
129+ break ;
130+ case ServerHeartbeatSucceededEvent::class:
131+ printf (
132+ "serverHeartbeatSucceeded: %s:%d heartbeat succeeded after %dµs \n" ,
133+ $ event ->getHost (),
134+ $ event ->getPort (),
135+ $ event ->getDurationMicros (),
136+ );
137+
138+ printf ("reply: %s \n" , toJson ($ event ->getReply ()));
139+ break ;
140+ case ServerOpeningEvent::class:
141+ printf (
142+ "serverOpening: %s:%d was added to topology %s \n" ,
143+ $ event ->getHost (),
144+ $ event ->getPort (),
145+ $ event ->getTopologyId ()->__toString (),
146+ );
147+ break ;
148+ case TopologyChangedEvent::class:
149+ printf (
150+ "topologyChanged: %s changed from %s to %s \n" ,
151+ $ event ->getTopologyId ()->__toString (),
152+ $ event ->getPreviousDescription ()->getType (),
153+ $ event ->getNewDescription ()->getType (),
154+ );
155+ break ;
156+ case TopologyClosedEvent::class:
157+ printf ("topologyClosed: %s was closed \n" , $ event ->getTopologyId ()->__toString ());
158+ break ;
159+ case TopologyOpeningEvent::class:
160+ printf ("topologyOpening: %s was opened \n" , $ event ->getTopologyId ()->__toString ());
161+ break ;
162+ default :
163+ throw new Exception ('Event type not supported ' );
164+ }
165+
166+ echo "\n" ;
167+ };
168+
169+ $ client ->getManager ()->addSubscriber (new SDAMLogger ($ handleOutput ));
136170
137171$ client ->test ->command (['ping ' => 1 ]);
138172
0 commit comments