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,53 @@ function toJSON(array|object $document): string
2830
2931class SDAMLogger implements SDAMSubscriber
3032{
33+ public function __construct (private readonly Closure $ handleOutput )
34+ {
35+ }
36+ 3137 public function serverChanged (ServerChangedEvent $ event ): void
3238 {
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" ;
39+ $ this ->handleOutput ->__invoke ($ event );
4440 }
4541
4642 public function serverClosed (ServerClosedEvent $ event ): void
4743 {
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" ;
44+ $ this ->handleOutput ->__invoke ($ event );
5545 }
5646
5747 public function serverHeartbeatFailed (ServerHeartbeatFailedEvent $ event ): void
5848 {
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" ;
49+ $ this ->handleOutput ->__invoke ($ event );
7050 }
7151
7252 public function serverHeartbeatStarted (ServerHeartbeatStartedEvent $ event ): void
7353 {
74- printf (
75- "serverHeartbeatStarted: %s:%d heartbeat started \n" ,
76- $ event ->getHost (),
77- $ event ->getPort (),
78- );
79- echo "\n" ;
54+ $ this ->handleOutput ->__invoke ($ event );
8055 }
8156
8257 public function serverHeartbeatSucceeded (ServerHeartbeatSucceededEvent $ event ): void
8358 {
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" ;
59+ $ this ->handleOutput ->__invoke ($ event );
9360 }
9461
9562 public function serverOpening (ServerOpeningEvent $ event ): void
9663 {
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" ;
64+ $ this ->handleOutput ->__invoke ($ event );
10465 }
10566
10667 public function topologyChanged (TopologyChangedEvent $ event ): void
10768 {
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" ;
69+ $ this ->handleOutput ->__invoke ($ event );
11570 }
11671
11772 public function topologyClosed (TopologyClosedEvent $ event ): void
11873 {
119- printf ("topologyClosed: %s was closed \n" , (string ) $ event ->getTopologyId ());
120- echo "\n" ;
74+ $ this ->handleOutput ->__invoke ($ event );
12175 }
12276
12377 public function topologyOpening (TopologyOpeningEvent $ event ): void
12478 {
125- printf ("topologyOpening: %s was opened \n" , (string ) $ event ->getTopologyId ());
126- echo "\n" ;
79+ $ this ->handleOutput ->__invoke ($ event );
12780 }
12881}
12982
@@ -132,7 +85,87 @@ public function topologyOpening(TopologyOpeningEvent $event): void
13285 * (including subscribers) are freed. */
13386$ client = new Client (getenv ('MONGODB_URI ' ) ?: 'mongodb://127.0.0.1/ ' , [], ['disableClientPersistence ' => true ]);
13487
135- $ client ->getManager ()->addSubscriber (new SDAMLogger ());
88+ $ handleOutput = function ($ event ): void {
89+ switch ($ event ::class) {
90+ case ServerChangedEvent::class:
91+ printf (
92+ "serverChanged: %s:%d changed from %s to %s \n" ,
93+ $ event ->getHost (),
94+ $ event ->getPort (),
95+ $ event ->getPreviousDescription ()->getType (),
96+ $ event ->getNewDescription ()->getType (),
97+ );
98+ 99+ printf ("previous hello response: %s \n" , toJson ($ event ->getPreviousDescription ()->getHelloResponse ()));
100+ printf ("new hello response: %s \n" , toJson ($ event ->getNewDescription ()->getHelloResponse ()));
101+ break ;
102+ case ServerClosedEvent::class:
103+ printf (
104+ "serverClosed: %s:%d was removed from topology %s \n" ,
105+ $ event ->getHost (),
106+ $ event ->getPort (),
107+ $ event ->getTopologyId (),
108+ );
109+ break ;
110+ case ServerHeartbeatFailedEvent::class:
111+ printf (
112+ "serverHeartbeatFailed: %s:%d heartbeat failed after %dμs \n" ,
113+ $ event ->getHost (),
114+ $ event ->getPort (),
115+ $ event ->getDurationMicros (),
116+ );
117+ 118+ $ error = $ event ->getError ();
119+ 120+ printf ("error: %s(%d): %s \n" , $ error ::class, $ error ->getCode (), $ error ->getMessage ());
121+ break ;
122+ case ServerHeartbeatStartedEvent::class:
123+ printf (
124+ "serverHeartbeatStarted: %s:%d heartbeat started \n" ,
125+ $ event ->getHost (),
126+ $ event ->getPort (),
127+ );
128+ break ;
129+ case ServerHeartbeatSucceededEvent::class:
130+ printf (
131+ "serverHeartbeatSucceeded: %s:%d heartbeat succeeded after %dμs \n" ,
132+ $ event ->getHost (),
133+ $ event ->getPort (),
134+ $ event ->getDurationMicros (),
135+ );
136+ 137+ printf ("reply: %s \n" , toJson ($ event ->getReply ()));
138+ break ;
139+ case ServerOpeningEvent::class:
140+ printf (
141+ "serverOpening: %s:%d was added to topology %s \n" ,
142+ $ event ->getHost (),
143+ $ event ->getPort (),
144+ $ event ->getTopologyId (),
145+ );
146+ break ;
147+ case TopologyChangedEvent::class:
148+ printf (
149+ "topologyChanged: %s changed from %s to %s \n" ,
150+ (string ) $ event ->getTopologyId (),
151+ $ event ->getPreviousDescription ()->getType (),
152+ $ event ->getNewDescription ()->getType (),
153+ );
154+ break ;
155+ case TopologyClosedEvent::class:
156+ printf ("topologyClosed: %s was closed \n" , (string ) $ event ->getTopologyId ());
157+ break ;
158+ case TopologyOpeningEvent::class:
159+ printf ("topologyOpening: %s was opened \n" , $ event ->getTopologyId ());
160+ break ;
161+ default :
162+ throw new Exception ('Event type not supported ' );
163+ }
164+ 165+ echo "\n" ;
166+ };
167+ 168+ $ client ->getManager ()->addSubscriber (new SDAMLogger ($ handleOutput ));
136169
137170$ client ->test ->command (['ping ' => 1 ]);
138171
0 commit comments