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