Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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