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 }