33
44namespace MongoDB \Examples ;
55
6+ use Closure ;
7+ use Exception ;
68use MongoDB \BSON \Document ;
79use MongoDB \Client ;
10+ use MongoDB \Driver \Monitoring \CommandFailedEvent ;
11+ use MongoDB \Driver \Monitoring \CommandSucceededEvent ;
812use MongoDB \Driver \Monitoring \SDAMSubscriber ;
913use MongoDB \Driver \Monitoring \ServerChangedEvent ;
1014use MongoDB \Driver \Monitoring \ServerClosedEvent ;
@@ -28,102 +32,53 @@ function toJSON(array|object $document): string
2832
2933class SDAMLogger implements SDAMSubscriber
3034{
35+ public function __construct (private readonly Closure $ handleOutput )
36+ {
37+ }
38+
3139 public function serverChanged (ServerChangedEvent $ event ): void
3240 {
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" ;
41+ $ this ->handleOutput ->__invoke ($ event );
4442 }
4543
4644 public function serverClosed (ServerClosedEvent $ event ): void
4745 {
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" ;
46+ $ this ->handleOutput ->__invoke ($ event );
5547 }
5648
5749 public function serverHeartbeatFailed (ServerHeartbeatFailedEvent $ event ): void
5850 {
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" ;
51+ $ this ->handleOutput ->__invoke ($ event );
7052 }
7153
7254 public function serverHeartbeatStarted (ServerHeartbeatStartedEvent $ event ): void
7355 {
74- printf (
75- "serverHeartbeatStarted: %s:%d heartbeat started \n" ,
76- $ event ->getHost (),
77- $ event ->getPort (),
78- );
79- echo "\n" ;
56+ $ this ->handleOutput ->__invoke ($ event );
8057 }
8158
8259 public function serverHeartbeatSucceeded (ServerHeartbeatSucceededEvent $ event ): void
8360 {
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" ;
61+ $ this ->handleOutput ->__invoke ($ event );
9362 }
9463
9564 public function serverOpening (ServerOpeningEvent $ event ): void
9665 {
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" ;
66+ $ this ->handleOutput ->__invoke ($ event );
10467 }
10568
10669 public function topologyChanged (TopologyChangedEvent $ event ): void
10770 {
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" ;
71+ $ this ->handleOutput ->__invoke ($ event );
11572 }
11673
11774 public function topologyClosed (TopologyClosedEvent $ event ): void
11875 {
119- printf ("topologyClosed: %s was closed \n" , (string ) $ event ->getTopologyId ());
120- echo "\n" ;
76+ $ this ->handleOutput ->__invoke ($ event );
12177 }
12278
12379 public function topologyOpening (TopologyOpeningEvent $ event ): void
12480 {
125- printf ("topologyOpening: %s was opened \n" , (string ) $ event ->getTopologyId ());
126- echo "\n" ;
81+ $ this ->handleOutput ->__invoke ($ event );
12782 }
12883}
12984
@@ -132,7 +87,87 @@ public function topologyOpening(TopologyOpeningEvent $event): void
13287 * (including subscribers) are freed. */
13388$ client = new Client (getenv ('MONGODB_URI ' ) ?: 'mongodb://127.0.0.1/ ' , [], ['disableClientPersistence ' => true ]);
13489
135- $ client ->getManager ()->addSubscriber (new SDAMLogger ());
90+ $ handleOutput = function ($ event ): void {
91+ switch ($ event ::class) {
92+ case ServerChangedEvent::class:
93+ printf (
94+ "serverChanged: %s:%d changed from %s to %s \n" ,
95+ $ event ->getHost (),
96+ $ event ->getPort (),
97+ $ event ->getPreviousDescription ()->getType (),
98+ $ event ->getNewDescription ()->getType (),
99+ );
100+
101+ printf ("previous hello response: %s \n" , toJson ($ event ->getPreviousDescription ()->getHelloResponse ()));
102+ printf ("new hello response: %s \n" , toJson ($ event ->getNewDescription ()->getHelloResponse ()));
103+ break ;
104+ case ServerClosedEvent::class:
105+ printf (
106+ "serverClosed: %s:%d was removed from topology %s \n" ,
107+ $ event ->getHost (),
108+ $ event ->getPort (),
109+ $ event ->getTopologyId (),
110+ );
111+ break ;
112+ case ServerHeartbeatFailedEvent::class:
113+ printf (
114+ "serverHeartbeatFailed: %s:%d heartbeat failed after %dµs \n" ,
115+ $ event ->getHost (),
116+ $ event ->getPort (),
117+ $ event ->getDurationMicros (),
118+ );
119+
120+ $ error = $ event ->getError ();
121+
122+ printf ("error: %s(%d): %s \n" , $ error ::class, $ error ->getCode (), $ error ->getMessage ());
123+ break ;
124+ case ServerHeartbeatStartedEvent::class:
125+ printf (
126+ "serverHeartbeatStarted: %s:%d heartbeat started \n" ,
127+ $ event ->getHost (),
128+ $ event ->getPort (),
129+ );
130+ break ;
131+ case ServerHeartbeatSucceededEvent::class:
132+ printf (
133+ "serverHeartbeatSucceeded: %s:%d heartbeat succeeded after %dµs \n" ,
134+ $ event ->getHost (),
135+ $ event ->getPort (),
136+ $ event ->getDurationMicros (),
137+ );
138+
139+ printf ("reply: %s \n" , toJson ($ event ->getReply ()));
140+ break ;
141+ case ServerOpeningEvent::class:
142+ printf (
143+ "serverOpening: %s:%d was added to topology %s \n" ,
144+ $ event ->getHost (),
145+ $ event ->getPort (),
146+ $ event ->getTopologyId (),
147+ );
148+ break ;
149+ case TopologyChangedEvent::class:
150+ printf (
151+ "topologyChanged: %s changed from %s to %s \n" ,
152+ (string ) $ event ->getTopologyId (),
153+ $ event ->getPreviousDescription ()->getType (),
154+ $ event ->getNewDescription ()->getType (),
155+ );
156+ break ;
157+ case TopologyClosedEvent::class:
158+ printf ("topologyClosed: %s was closed \n" , (string ) $ event ->getTopologyId ());
159+ break ;
160+ case TopologyOpeningEvent::class:
161+ printf ("topologyOpening: %s was opened \n" , $ event ->getTopologyId ());
162+ break ;
163+ default :
164+ throw new Exception ('Event type not supported ' );
165+ }
166+
167+ echo "\n" ;
168+ };
169+
170+ $ client ->getManager ()->addSubscriber (new SDAMLogger ($ handleOutput ));
136171
137172$ client ->test ->command (['ping ' => 1 ]);
138173
0 commit comments