3
3
4
4
namespace MongoDB \Examples ;
5
5
6
+ use Closure ;
7
+ use Exception ;
6
8
use MongoDB \BSON \Document ;
7
9
use MongoDB \Client ;
8
10
use MongoDB \Driver \Monitoring \SDAMSubscriber ;
@@ -28,102 +30,54 @@ function toJSON(array|object $document): string
28
30
29
31
class SDAMLogger implements SDAMSubscriber
30
32
{
33
+ /** @param Closure(object):void $handleOutput */
34
+ public function __construct (private readonly Closure $ handleOutput )
35
+ {
36
+ }
37
+
31
38
public function serverChanged (ServerChangedEvent $ event ): void
32
39
{
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 );
44
41
}
45
42
46
43
public function serverClosed (ServerClosedEvent $ event ): void
47
44
{
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 );
55
46
}
56
47
57
48
public function serverHeartbeatFailed (ServerHeartbeatFailedEvent $ event ): void
58
49
{
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 );
70
51
}
71
52
72
53
public function serverHeartbeatStarted (ServerHeartbeatStartedEvent $ event ): void
73
54
{
74
- printf (
75
- "serverHeartbeatStarted: %s:%d heartbeat started \n" ,
76
- $ event ->getHost (),
77
- $ event ->getPort (),
78
- );
79
- echo "\n" ;
55
+ $ this ->handleOutput ->__invoke ($ event );
80
56
}
81
57
82
58
public function serverHeartbeatSucceeded (ServerHeartbeatSucceededEvent $ event ): void
83
59
{
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 );
93
61
}
94
62
95
63
public function serverOpening (ServerOpeningEvent $ event ): void
96
64
{
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 );
104
66
}
105
67
106
68
public function topologyChanged (TopologyChangedEvent $ event ): void
107
69
{
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 );
115
71
}
116
72
117
73
public function topologyClosed (TopologyClosedEvent $ event ): void
118
74
{
119
- printf ("topologyClosed: %s was closed \n" , (string ) $ event ->getTopologyId ());
120
- echo "\n" ;
75
+ $ this ->handleOutput ->__invoke ($ event );
121
76
}
122
77
123
78
public function topologyOpening (TopologyOpeningEvent $ event ): void
124
79
{
125
- printf ("topologyOpening: %s was opened \n" , (string ) $ event ->getTopologyId ());
126
- echo "\n" ;
80
+ $ this ->handleOutput ->__invoke ($ event );
127
81
}
128
82
}
129
83
@@ -132,7 +86,87 @@ public function topologyOpening(TopologyOpeningEvent $event): void
132
86
* (including subscribers) are freed. */
133
87
$ client = new Client (getenv ('MONGODB_URI ' ) ?: 'mongodb://127.0.0.1/ ' , [], ['disableClientPersistence ' => true ]);
134
88
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 ));
136
170
137
171
$ client ->test ->command (['ping ' => 1 ]);
138
172
0 commit comments