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