@@ -161,13 +161,13 @@ func New(cfg *Config) (*Topology, error) {
161
161
return t , nil
162
162
}
163
163
164
- func mustLogTopologyMessage (topo * Topology ) bool {
164
+ func mustLogTopologyMessage (topo * Topology , level logger. Level ) bool {
165
165
return topo .cfg .logger != nil && topo .cfg .logger .LevelComponentEnabled (
166
- logger . LevelDebug , logger .ComponentTopology )
166
+ level , logger .ComponentTopology )
167
167
}
168
168
169
- func logTopologyMessage (topo * Topology , msg string , keysAndValues ... interface {}) {
170
- topo .cfg .logger .Print (logger . LevelDebug ,
169
+ func logTopologyMessage (topo * Topology , level logger. Level , msg string , keysAndValues ... interface {}) {
170
+ topo .cfg .logger .Print (level ,
171
171
logger .ComponentTopology ,
172
172
msg ,
173
173
logger .SerializeTopology (logger.Topology {
@@ -176,15 +176,45 @@ func logTopologyMessage(topo *Topology, msg string, keysAndValues ...interface{}
176
176
}, keysAndValues ... )... )
177
177
}
178
178
179
+ func logTopologyThirdPartyUsage (topo * Topology , parsedHosts []string ) {
180
+ thirdPartyMessages := [2 ]string {
181
+ `You appear to be connected to a CosmosDB cluster. For more information regarding feature compatibility and support please visit https://www.mongodb.com/supportability/cosmosdb` ,
182
+ `You appear to be connected to a DocumentDB cluster. For more information regarding feature compatibility and support please visit https://www.mongodb.com/supportability/documentdb` ,
183
+ }
184
+
185
+ thirdPartySuffixes := map [string ]int {
186
+ ".cosmos.azure.com" : 0 ,
187
+ ".docdb.amazonaws.com" : 1 ,
188
+ ".docdb-elastic.amazonaws.com" : 1 ,
189
+ }
190
+
191
+ hostSet := make ([]bool , len (thirdPartyMessages ))
192
+ for _ , host := range parsedHosts {
193
+ if h , _ , err := net .SplitHostPort (host ); err == nil {
194
+ host = h
195
+ }
196
+ for suffix , env := range thirdPartySuffixes {
197
+ if ! strings .HasSuffix (host , suffix ) {
198
+ continue
199
+ }
200
+ if hostSet [env ] {
201
+ break
202
+ }
203
+ hostSet [env ] = true
204
+ logTopologyMessage (topo , logger .LevelInfo , thirdPartyMessages [env ])
205
+ }
206
+ }
207
+ }
208
+
179
209
func mustLogServerSelection (topo * Topology , level logger.Level ) bool {
180
210
return topo .cfg .logger != nil && topo .cfg .logger .LevelComponentEnabled (
181
211
level , logger .ComponentServerSelection )
182
212
}
183
213
184
214
func logServerSelection (
185
215
ctx context.Context ,
186
- level logger.Level ,
187
216
topo * Topology ,
217
+ level logger.Level ,
188
218
msg string ,
189
219
srvSelector description.ServerSelector ,
190
220
keysAndValues ... interface {},
@@ -224,7 +254,7 @@ func logServerSelectionSucceeded(
224
254
225
255
portInt64 , _ := strconv .ParseInt (port , 10 , 32 )
226
256
227
- logServerSelection (ctx , logger .LevelDebug , topo , logger .ServerSelectionSucceeded , srvSelector ,
257
+ logServerSelection (ctx , topo , logger .LevelDebug , logger .ServerSelectionSucceeded , srvSelector ,
228
258
logger .KeyServerHost , host ,
229
259
logger .KeyServerPort , portInt64 )
230
260
}
@@ -235,7 +265,7 @@ func logServerSelectionFailed(
235
265
srvSelector description.ServerSelector ,
236
266
err error ,
237
267
) {
238
- logServerSelection (ctx , logger .LevelDebug , topo , logger .ServerSelectionFailed , srvSelector ,
268
+ logServerSelection (ctx , topo , logger .LevelDebug , logger .ServerSelectionFailed , srvSelector ,
239
269
logger .KeyFailure , err .Error ())
240
270
}
241
271
@@ -321,13 +351,17 @@ func (t *Topology) Connect() error {
321
351
}
322
352
323
353
t .serversLock .Unlock ()
354
+ uri , err := url .Parse (t .cfg .URI )
355
+ if err != nil {
356
+ return err
357
+ }
358
+ parsedHosts := strings .Split (uri .Host , "," )
359
+ if mustLogTopologyMessage (t , logger .LevelInfo ) {
360
+ logTopologyThirdPartyUsage (t , parsedHosts )
361
+ }
324
362
if t .pollingRequired {
325
- uri , err := url .Parse (t .cfg .URI )
326
- if err != nil {
327
- return err
328
- }
329
363
// sanity check before passing the hostname to resolver
330
- if parsedHosts := strings . Split ( uri . Host , "," ); len (parsedHosts ) != 1 {
364
+ if len (parsedHosts ) != 1 {
331
365
return fmt .Errorf ("URI with SRV must include one and only one hostname" )
332
366
}
333
367
_ , _ , err = net .SplitHostPort (uri .Host )
@@ -492,7 +526,7 @@ func (t *Topology) SelectServer(ctx context.Context, ss description.ServerSelect
492
526
493
527
if ! doneOnce {
494
528
if mustLogServerSelection (t , logger .LevelDebug ) {
495
- logServerSelection (ctx , logger .LevelDebug , t , logger .ServerSelectionStarted , ss )
529
+ logServerSelection (ctx , t , logger .LevelDebug , logger .ServerSelectionStarted , ss )
496
530
}
497
531
498
532
// for the first pass, select a server from the current description.
@@ -531,7 +565,7 @@ func (t *Topology) SelectServer(ctx context.Context, ss description.ServerSelect
531
565
elapsed := time .Since (startTime )
532
566
remainingTimeMS := t .cfg .ServerSelectionTimeout - elapsed
533
567
534
- logServerSelection (ctx , logger .LevelInfo , t , logger .ServerSelectionWaiting , ss ,
568
+ logServerSelection (ctx , t , logger .LevelInfo , logger .ServerSelectionWaiting , ss ,
535
569
logger .KeyRemainingTimeMS , remainingTimeMS .Milliseconds ())
536
570
}
537
571
@@ -970,7 +1004,7 @@ func (t *Topology) publishServerClosedEvent(addr address.Address) {
970
1004
t .cfg .ServerMonitor .ServerClosed (serverClosed )
971
1005
}
972
1006
973
- if mustLogTopologyMessage (t ) {
1007
+ if mustLogTopologyMessage (t , logger . LevelDebug ) {
974
1008
serverHost , serverPort , err := net .SplitHostPort (addr .String ())
975
1009
if err != nil {
976
1010
serverHost = addr .String ()
@@ -979,7 +1013,7 @@ func (t *Topology) publishServerClosedEvent(addr address.Address) {
979
1013
980
1014
portInt64 , _ := strconv .ParseInt (serverPort , 10 , 32 )
981
1015
982
- logTopologyMessage (t , logger .TopologyServerClosed ,
1016
+ logTopologyMessage (t , logger .LevelDebug , logger . TopologyServerClosed ,
983
1017
logger .KeyServerHost , serverHost ,
984
1018
logger .KeyServerPort , portInt64 )
985
1019
}
@@ -997,8 +1031,8 @@ func (t *Topology) publishTopologyDescriptionChangedEvent(prev description.Topol
997
1031
t .cfg .ServerMonitor .TopologyDescriptionChanged (topologyDescriptionChanged )
998
1032
}
999
1033
1000
- if mustLogTopologyMessage (t ) {
1001
- logTopologyMessage (t , logger .TopologyDescriptionChanged ,
1034
+ if mustLogTopologyMessage (t , logger . LevelDebug ) {
1035
+ logTopologyMessage (t , logger .LevelDebug , logger . TopologyDescriptionChanged ,
1002
1036
logger .KeyPreviousDescription , prev .String (),
1003
1037
logger .KeyNewDescription , current .String ())
1004
1038
}
@@ -1014,8 +1048,8 @@ func (t *Topology) publishTopologyOpeningEvent() {
1014
1048
t .cfg .ServerMonitor .TopologyOpening (topologyOpening )
1015
1049
}
1016
1050
1017
- if mustLogTopologyMessage (t ) {
1018
- logTopologyMessage (t , logger .TopologyOpening )
1051
+ if mustLogTopologyMessage (t , logger . LevelDebug ) {
1052
+ logTopologyMessage (t , logger .LevelDebug , logger . TopologyOpening )
1019
1053
}
1020
1054
}
1021
1055
@@ -1029,7 +1063,7 @@ func (t *Topology) publishTopologyClosedEvent() {
1029
1063
t .cfg .ServerMonitor .TopologyClosed (topologyClosed )
1030
1064
}
1031
1065
1032
- if mustLogTopologyMessage (t ) {
1033
- logTopologyMessage (t , logger .TopologyClosed )
1066
+ if mustLogTopologyMessage (t , logger . LevelDebug ) {
1067
+ logTopologyMessage (t , logger .LevelDebug , logger . TopologyClosed )
1034
1068
}
1035
1069
}
0 commit comments