Skip to content
19 changes: 19 additions & 0 deletions exporter/diagnostic_data_collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,25 @@ func (d *diagnosticDataCollector) collect(ch chan<- prometheus.Metric) {
logger.Error("cannot decode getDiagnosticData", "error", err)
}

// For mongos, getDiagnosticData returns empty data, so fall back to serverStatus
if nodeType == typeMongos && len(m) == 0 {
logger.Debug("getDiagnosticData returned empty data for mongos, falling back to serverStatus")
serverStatusCmd := bson.D{{Key: "serverStatus", Value: "1"}}
serverStatusRes := client.Database("admin").RunCommand(d.ctx, serverStatusCmd)
if serverStatusRes.Err() != nil {
logger.Error("failed to run serverStatus command for mongos", "error", serverStatusRes.Err())
} else {
var serverStatusData bson.M
if err := serverStatusRes.Decode(&serverStatusData); err != nil {
logger.Error("cannot decode serverStatus for mongos", "error", err)
} else {
// Wrap serverStatus data in the expected structure for makeMetrics
m = bson.M{"serverStatus": serverStatusData}
logger.Debug("Successfully retrieved serverStatus data for mongos")
}
}
}

logger.Debug("getDiagnosticData result")
debugResult(logger, m)

Expand Down
37 changes: 37 additions & 0 deletions exporter/diagnostic_data_collector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,43 @@
}
}

func TestMongosDiagnosticDataCollectorMetrics(t *testing.T) {

Check failure on line 257 in exporter/diagnostic_data_collector_test.go

View workflow job for this annotation

GitHub Actions / Lint Check

Function TestMongosDiagnosticDataCollectorMetrics missing the call to method parallel (paralleltest)
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)

Check failure on line 258 in exporter/diagnostic_data_collector_test.go

View workflow job for this annotation

GitHub Actions / Lint Check

context.Background() could be replaced by t.Context() in TestMongosDiagnosticDataCollectorMetrics (usetesting)
defer cancel()

client := tu.DefaultTestClientMongoS(ctx, t)

logLevel := promslog.NewLevel()
err := logLevel.Set("debug")
require.NoError(t, err)
logger := promslog.New(&promslog.Config{
Level: logLevel,
})
ti := newTopologyInfo(ctx, client, logger)

dbBuildInfo, err := retrieveMongoDBBuildInfo(ctx, client, logger.With("component", "test"))
require.NoError(t, err)

c := newDiagnosticDataCollector(ctx, client, logger, true, ti, dbBuildInfo)

reg := prometheus.NewRegistry()
err = reg.Register(c)
require.NoError(t, err)
metrics := helpers.CollectMetrics(c)
actualMetrics := helpers.ReadMetrics(metrics)
filters := []string{
"mongodb_ss_connections",
}
actualMetrics = filterMetrics(actualMetrics, filters)
actualLines := helpers.Format(helpers.WriteMetrics(actualMetrics))
metricNames := getMetricNames(actualLines)

sort.Strings(filters)
for _, want := range filters {
assert.True(t, metricNames[want], fmt.Sprintf("missing %q metric", want))

Check failure on line 290 in exporter/diagnostic_data_collector_test.go

View workflow job for this annotation

GitHub Actions / Lint Check

formatter: remove unnecessary fmt.Sprintf (testifylint)
}
}

// errorCountHandler is a custom handler that keeps tracks of the number of errors and warnings that were logged.
// it discards all errors of other levels.
type errorCountHandler struct {
Expand Down