From a4d222f5c0271d2d2d47f3d8065f1af9cd088a9f Mon Sep 17 00:00:00 2001 From: Vicens Juan Tomas Monserrat Date: Wed, 20 Aug 2025 13:38:06 +0200 Subject: [PATCH 1/2] Fix mongodb_connections metric for mongos instances --- exporter/diagnostic_data_collector.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/exporter/diagnostic_data_collector.go b/exporter/diagnostic_data_collector.go index 147e19ae4..24856fb90 100644 --- a/exporter/diagnostic_data_collector.go +++ b/exporter/diagnostic_data_collector.go @@ -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) From e2cb4dfac1ac06f0cfe1b71f4db570cb935c7a58 Mon Sep 17 00:00:00 2001 From: Vicens Juan Tomas Monserrat Date: Tue, 30 Sep 2025 13:14:35 +0200 Subject: [PATCH 2/2] Add TestMongosDiagnosticDataCollectorMetrics --- exporter/diagnostic_data_collector_test.go | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/exporter/diagnostic_data_collector_test.go b/exporter/diagnostic_data_collector_test.go index 04584aec9..137be88f9 100644 --- a/exporter/diagnostic_data_collector_test.go +++ b/exporter/diagnostic_data_collector_test.go @@ -254,6 +254,43 @@ func TestAllDiagnosticDataCollectorMetrics(t *testing.T) { } } +func TestMongosDiagnosticDataCollectorMetrics(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + 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)) + } +} + // 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 {