Skip to content

Commit 101d1e7

Browse files
authored
GODRIVER-2904 Add environment log. (#1373)
* GODRIVER-2904 Add environment log. * minor updates * fix typos * fix typos * log before SRV lookup * improve logic
1 parent d92f20d commit 101d1e7

File tree

3 files changed

+291
-22
lines changed

3 files changed

+291
-22
lines changed

x/mongo/driver/topology/polling_srv_records_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ func (ss serverSorter) Less(i, j int) bool {
105105
}
106106

107107
func compareHosts(t *testing.T, received []description.Server, expected []string) {
108+
t.Helper()
108109
if len(received) != len(expected) {
109110
t.Fatalf("Number of hosts in topology does not match expected value. Got %v; want %v.", len(received), len(expected))
110111
}

x/mongo/driver/topology/topology.go

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,13 @@ func New(cfg *Config) (*Topology, error) {
161161
return t, nil
162162
}
163163

164-
func mustLogTopologyMessage(topo *Topology) bool {
164+
func mustLogTopologyMessage(topo *Topology, level logger.Level) bool {
165165
return topo.cfg.logger != nil && topo.cfg.logger.LevelComponentEnabled(
166-
logger.LevelDebug, logger.ComponentTopology)
166+
level, logger.ComponentTopology)
167167
}
168168

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,
171171
logger.ComponentTopology,
172172
msg,
173173
logger.SerializeTopology(logger.Topology{
@@ -176,15 +176,45 @@ func logTopologyMessage(topo *Topology, msg string, keysAndValues ...interface{}
176176
}, keysAndValues...)...)
177177
}
178178

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+
179209
func mustLogServerSelection(topo *Topology, level logger.Level) bool {
180210
return topo.cfg.logger != nil && topo.cfg.logger.LevelComponentEnabled(
181211
level, logger.ComponentServerSelection)
182212
}
183213

184214
func logServerSelection(
185215
ctx context.Context,
186-
level logger.Level,
187216
topo *Topology,
217+
level logger.Level,
188218
msg string,
189219
srvSelector description.ServerSelector,
190220
keysAndValues ...interface{},
@@ -224,7 +254,7 @@ func logServerSelectionSucceeded(
224254

225255
portInt64, _ := strconv.ParseInt(port, 10, 32)
226256

227-
logServerSelection(ctx, logger.LevelDebug, topo, logger.ServerSelectionSucceeded, srvSelector,
257+
logServerSelection(ctx, topo, logger.LevelDebug, logger.ServerSelectionSucceeded, srvSelector,
228258
logger.KeyServerHost, host,
229259
logger.KeyServerPort, portInt64)
230260
}
@@ -235,7 +265,7 @@ func logServerSelectionFailed(
235265
srvSelector description.ServerSelector,
236266
err error,
237267
) {
238-
logServerSelection(ctx, logger.LevelDebug, topo, logger.ServerSelectionFailed, srvSelector,
268+
logServerSelection(ctx, topo, logger.LevelDebug, logger.ServerSelectionFailed, srvSelector,
239269
logger.KeyFailure, err.Error())
240270
}
241271

@@ -321,13 +351,17 @@ func (t *Topology) Connect() error {
321351
}
322352

323353
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+
}
324362
if t.pollingRequired {
325-
uri, err := url.Parse(t.cfg.URI)
326-
if err != nil {
327-
return err
328-
}
329363
// sanity check before passing the hostname to resolver
330-
if parsedHosts := strings.Split(uri.Host, ","); len(parsedHosts) != 1 {
364+
if len(parsedHosts) != 1 {
331365
return fmt.Errorf("URI with SRV must include one and only one hostname")
332366
}
333367
_, _, err = net.SplitHostPort(uri.Host)
@@ -492,7 +526,7 @@ func (t *Topology) SelectServer(ctx context.Context, ss description.ServerSelect
492526

493527
if !doneOnce {
494528
if mustLogServerSelection(t, logger.LevelDebug) {
495-
logServerSelection(ctx, logger.LevelDebug, t, logger.ServerSelectionStarted, ss)
529+
logServerSelection(ctx, t, logger.LevelDebug, logger.ServerSelectionStarted, ss)
496530
}
497531

498532
// 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
531565
elapsed := time.Since(startTime)
532566
remainingTimeMS := t.cfg.ServerSelectionTimeout - elapsed
533567

534-
logServerSelection(ctx, logger.LevelInfo, t, logger.ServerSelectionWaiting, ss,
568+
logServerSelection(ctx, t, logger.LevelInfo, logger.ServerSelectionWaiting, ss,
535569
logger.KeyRemainingTimeMS, remainingTimeMS.Milliseconds())
536570
}
537571

@@ -970,7 +1004,7 @@ func (t *Topology) publishServerClosedEvent(addr address.Address) {
9701004
t.cfg.ServerMonitor.ServerClosed(serverClosed)
9711005
}
9721006

973-
if mustLogTopologyMessage(t) {
1007+
if mustLogTopologyMessage(t, logger.LevelDebug) {
9741008
serverHost, serverPort, err := net.SplitHostPort(addr.String())
9751009
if err != nil {
9761010
serverHost = addr.String()
@@ -979,7 +1013,7 @@ func (t *Topology) publishServerClosedEvent(addr address.Address) {
9791013

9801014
portInt64, _ := strconv.ParseInt(serverPort, 10, 32)
9811015

982-
logTopologyMessage(t, logger.TopologyServerClosed,
1016+
logTopologyMessage(t, logger.LevelDebug, logger.TopologyServerClosed,
9831017
logger.KeyServerHost, serverHost,
9841018
logger.KeyServerPort, portInt64)
9851019
}
@@ -997,8 +1031,8 @@ func (t *Topology) publishTopologyDescriptionChangedEvent(prev description.Topol
9971031
t.cfg.ServerMonitor.TopologyDescriptionChanged(topologyDescriptionChanged)
9981032
}
9991033

1000-
if mustLogTopologyMessage(t) {
1001-
logTopologyMessage(t, logger.TopologyDescriptionChanged,
1034+
if mustLogTopologyMessage(t, logger.LevelDebug) {
1035+
logTopologyMessage(t, logger.LevelDebug, logger.TopologyDescriptionChanged,
10021036
logger.KeyPreviousDescription, prev.String(),
10031037
logger.KeyNewDescription, current.String())
10041038
}
@@ -1014,8 +1048,8 @@ func (t *Topology) publishTopologyOpeningEvent() {
10141048
t.cfg.ServerMonitor.TopologyOpening(topologyOpening)
10151049
}
10161050

1017-
if mustLogTopologyMessage(t) {
1018-
logTopologyMessage(t, logger.TopologyOpening)
1051+
if mustLogTopologyMessage(t, logger.LevelDebug) {
1052+
logTopologyMessage(t, logger.LevelDebug, logger.TopologyOpening)
10191053
}
10201054
}
10211055

@@ -1029,7 +1063,7 @@ func (t *Topology) publishTopologyClosedEvent() {
10291063
t.cfg.ServerMonitor.TopologyClosed(topologyClosed)
10301064
}
10311065

1032-
if mustLogTopologyMessage(t) {
1033-
logTopologyMessage(t, logger.TopologyClosed)
1066+
if mustLogTopologyMessage(t, logger.LevelDebug) {
1067+
logTopologyMessage(t, logger.LevelDebug, logger.TopologyClosed)
10341068
}
10351069
}

0 commit comments

Comments
 (0)