github.com/netdata/go.d.plugin@v0.58.1/modules/mongodb/collect_serverstatus.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package mongo
     4  
     5  import (
     6  	"fmt"
     7  	"reflect"
     8  
     9  	"github.com/netdata/go.d.plugin/agent/module"
    10  	"github.com/netdata/go.d.plugin/pkg/stm"
    11  )
    12  
    13  // collectServerStatus creates the map[string]int64 for the available dims.
    14  // nil values will be ignored and not added to the map and thus metrics should not appear on the dashboard.
    15  // Because mongo reports a metric only after it first appears,some dims might take a while to appear.
    16  // For example, in order to report number of create commands, a document must be created first.
    17  func (m *Mongo) collectServerStatus(mx map[string]int64) error {
    18  	s, err := m.conn.serverStatus()
    19  	if err != nil {
    20  		return fmt.Errorf("serverStatus command failed: %s", err)
    21  	}
    22  
    23  	m.addOptionalCharts(s)
    24  
    25  	for k, v := range stm.ToMap(s) {
    26  		mx[k] = v
    27  	}
    28  
    29  	if s.Transactions != nil && s.Transactions.CommitTypes != nil {
    30  		px := "txn_commit_types_"
    31  		v := s.Transactions.CommitTypes
    32  		mx[px+"no_shards_unsuccessful"] = v.NoShards.Initiated - v.NoShards.Successful
    33  		mx[px+"single_shard_unsuccessful"] = v.SingleShard.Initiated - v.SingleShard.Successful
    34  		mx[px+"single_write_shard_unsuccessful"] = v.SingleWriteShard.Initiated - v.SingleWriteShard.Successful
    35  		mx[px+"read_only_unsuccessful"] = v.ReadOnly.Initiated - v.ReadOnly.Successful
    36  		mx[px+"two_phase_commit_unsuccessful"] = v.TwoPhaseCommit.Initiated - v.TwoPhaseCommit.Successful
    37  		mx[px+"recover_with_token_unsuccessful"] = v.RecoverWithToken.Initiated - v.RecoverWithToken.Successful
    38  	}
    39  
    40  	return nil
    41  }
    42  
    43  func (m *Mongo) addOptionalCharts(s *documentServerStatus) {
    44  	m.addOptionalChart(s.OpLatencies,
    45  		&chartOperationsRate,
    46  		&chartOperationsLatencyTime,
    47  	)
    48  	m.addOptionalChart(s.WiredTiger,
    49  		&chartWiredTigerConcurrentReadTransactionsUsage,
    50  		&chartWiredTigerConcurrentWriteTransactionsUsage,
    51  		&chartWiredTigerCacheUsage,
    52  		&chartWiredTigerCacheDirtySpaceSize,
    53  		&chartWiredTigerCacheIORate,
    54  		&chartWiredTigerCacheEvictionsRate,
    55  	)
    56  	m.addOptionalChart(s.Tcmalloc,
    57  		&chartMemoryTCMallocStatsChart,
    58  	)
    59  	m.addOptionalChart(s.GlobalLock,
    60  		&chartGlobalLockActiveClientsCount,
    61  		&chartGlobalLockCurrentQueueCount,
    62  	)
    63  	m.addOptionalChart(s.Network.NumSlowDNSOperations,
    64  		&chartNetworkSlowDNSResolutionsRate,
    65  	)
    66  	m.addOptionalChart(s.Network.NumSlowSSLOperations,
    67  		&chartNetworkSlowSSLHandshakesRate,
    68  	)
    69  	m.addOptionalChart(s.Metrics.Cursor.TotalOpened,
    70  		&chartCursorsOpenedRate,
    71  	)
    72  	m.addOptionalChart(s.Metrics.Cursor.TimedOut,
    73  		&chartCursorsTimedOutRate,
    74  	)
    75  	m.addOptionalChart(s.Metrics.Cursor.Open.Total,
    76  		&chartCursorsOpenCount,
    77  	)
    78  	m.addOptionalChart(s.Metrics.Cursor.Open.NoTimeout,
    79  		&chartCursorsOpenNoTimeoutCount,
    80  	)
    81  	m.addOptionalChart(s.Metrics.Cursor.Lifespan,
    82  		&chartCursorsByLifespanCount,
    83  	)
    84  
    85  	if s.Transactions != nil {
    86  		m.addOptionalChart(s.Transactions,
    87  			&chartTransactionsCount,
    88  			&chartTransactionsRate,
    89  		)
    90  		m.addOptionalChart(s.Transactions.CommitTypes,
    91  			&chartTransactionsNoShardsCommitsRate,
    92  			&chartTransactionsNoShardsCommitsDurationTime,
    93  			&chartTransactionsSingleShardCommitsRate,
    94  			&chartTransactionsSingleShardCommitsDurationTime,
    95  			&chartTransactionsSingleWriteShardCommitsRate,
    96  			&chartTransactionsSingleWriteShardCommitsDurationTime,
    97  			&chartTransactionsReadOnlyCommitsRate,
    98  			&chartTransactionsReadOnlyCommitsDurationTime,
    99  			&chartTransactionsTwoPhaseCommitCommitsRate,
   100  			&chartTransactionsTwoPhaseCommitCommitsDurationTime,
   101  			&chartTransactionsRecoverWithTokenCommitsRate,
   102  			&chartTransactionsRecoverWithTokenCommitsDurationTime,
   103  		)
   104  	}
   105  	if s.Locks != nil {
   106  		m.addOptionalChart(s.Locks.Global, &chartGlobalLockAcquisitionsRate)
   107  		m.addOptionalChart(s.Locks.Database, &chartDatabaseLockAcquisitionsRate)
   108  		m.addOptionalChart(s.Locks.Collection, &chartCollectionLockAcquisitionsRate)
   109  		m.addOptionalChart(s.Locks.Mutex, &chartMutexLockAcquisitionsRate)
   110  		m.addOptionalChart(s.Locks.Metadata, &chartMetadataLockAcquisitionsRate)
   111  		m.addOptionalChart(s.Locks.Oplog, &chartOpLogLockAcquisitionsRate)
   112  	}
   113  }
   114  
   115  func (m *Mongo) addOptionalChart(iface any, charts ...*module.Chart) {
   116  	if reflect.ValueOf(iface).IsNil() {
   117  		return
   118  	}
   119  	for _, chart := range charts {
   120  		if m.optionalCharts[chart.ID] {
   121  			continue
   122  		}
   123  		m.optionalCharts[chart.ID] = true
   124  
   125  		if err := m.charts.Add(chart.Copy()); err != nil {
   126  			m.Warning(err)
   127  		}
   128  	}
   129  }