From 87d772a7d708fec12f48cd8adc0dedff6e1025da Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 26 Aug 2024 10:15:20 +0200 Subject: Adding upstream version 1.47.0. Signed-off-by: Daniel Baumann --- .../go.d/modules/mongodb/collect_serverstatus.go | 129 +++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/go/plugin/go.d/modules/mongodb/collect_serverstatus.go (limited to 'src/go/plugin/go.d/modules/mongodb/collect_serverstatus.go') diff --git a/src/go/plugin/go.d/modules/mongodb/collect_serverstatus.go b/src/go/plugin/go.d/modules/mongodb/collect_serverstatus.go new file mode 100644 index 000000000..861726386 --- /dev/null +++ b/src/go/plugin/go.d/modules/mongodb/collect_serverstatus.go @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package mongo + +import ( + "fmt" + "reflect" + + "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module" + "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm" +) + +// collectServerStatus creates the map[string]int64 for the available dims. +// nil values will be ignored and not added to the map and thus metrics should not appear on the dashboard. +// Because mongo reports a metric only after it first appears,some dims might take a while to appear. +// For example, in order to report number of create commands, a document must be created first. +func (m *Mongo) collectServerStatus(mx map[string]int64) error { + s, err := m.conn.serverStatus() + if err != nil { + return fmt.Errorf("serverStatus command failed: %s", err) + } + + m.addOptionalCharts(s) + + for k, v := range stm.ToMap(s) { + mx[k] = v + } + + if s.Transactions != nil && s.Transactions.CommitTypes != nil { + px := "txn_commit_types_" + v := s.Transactions.CommitTypes + mx[px+"no_shards_unsuccessful"] = v.NoShards.Initiated - v.NoShards.Successful + mx[px+"single_shard_unsuccessful"] = v.SingleShard.Initiated - v.SingleShard.Successful + mx[px+"single_write_shard_unsuccessful"] = v.SingleWriteShard.Initiated - v.SingleWriteShard.Successful + mx[px+"read_only_unsuccessful"] = v.ReadOnly.Initiated - v.ReadOnly.Successful + mx[px+"two_phase_commit_unsuccessful"] = v.TwoPhaseCommit.Initiated - v.TwoPhaseCommit.Successful + mx[px+"recover_with_token_unsuccessful"] = v.RecoverWithToken.Initiated - v.RecoverWithToken.Successful + } + + return nil +} + +func (m *Mongo) addOptionalCharts(s *documentServerStatus) { + m.addOptionalChart(s.OpLatencies, + &chartOperationsRate, + &chartOperationsLatencyTime, + ) + m.addOptionalChart(s.WiredTiger, + &chartWiredTigerConcurrentReadTransactionsUsage, + &chartWiredTigerConcurrentWriteTransactionsUsage, + &chartWiredTigerCacheUsage, + &chartWiredTigerCacheDirtySpaceSize, + &chartWiredTigerCacheIORate, + &chartWiredTigerCacheEvictionsRate, + ) + m.addOptionalChart(s.Tcmalloc, + &chartMemoryTCMallocStatsChart, + ) + m.addOptionalChart(s.GlobalLock, + &chartGlobalLockActiveClientsCount, + &chartGlobalLockCurrentQueueCount, + ) + m.addOptionalChart(s.Network.NumSlowDNSOperations, + &chartNetworkSlowDNSResolutionsRate, + ) + m.addOptionalChart(s.Network.NumSlowSSLOperations, + &chartNetworkSlowSSLHandshakesRate, + ) + m.addOptionalChart(s.Metrics.Cursor.TotalOpened, + &chartCursorsOpenedRate, + ) + m.addOptionalChart(s.Metrics.Cursor.TimedOut, + &chartCursorsTimedOutRate, + ) + m.addOptionalChart(s.Metrics.Cursor.Open.Total, + &chartCursorsOpenCount, + ) + m.addOptionalChart(s.Metrics.Cursor.Open.NoTimeout, + &chartCursorsOpenNoTimeoutCount, + ) + m.addOptionalChart(s.Metrics.Cursor.Lifespan, + &chartCursorsByLifespanCount, + ) + + if s.Transactions != nil { + m.addOptionalChart(s.Transactions, + &chartTransactionsCount, + &chartTransactionsRate, + ) + m.addOptionalChart(s.Transactions.CommitTypes, + &chartTransactionsNoShardsCommitsRate, + &chartTransactionsNoShardsCommitsDurationTime, + &chartTransactionsSingleShardCommitsRate, + &chartTransactionsSingleShardCommitsDurationTime, + &chartTransactionsSingleWriteShardCommitsRate, + &chartTransactionsSingleWriteShardCommitsDurationTime, + &chartTransactionsReadOnlyCommitsRate, + &chartTransactionsReadOnlyCommitsDurationTime, + &chartTransactionsTwoPhaseCommitCommitsRate, + &chartTransactionsTwoPhaseCommitCommitsDurationTime, + &chartTransactionsRecoverWithTokenCommitsRate, + &chartTransactionsRecoverWithTokenCommitsDurationTime, + ) + } + if s.Locks != nil { + m.addOptionalChart(s.Locks.Global, &chartGlobalLockAcquisitionsRate) + m.addOptionalChart(s.Locks.Database, &chartDatabaseLockAcquisitionsRate) + m.addOptionalChart(s.Locks.Collection, &chartCollectionLockAcquisitionsRate) + m.addOptionalChart(s.Locks.Mutex, &chartMutexLockAcquisitionsRate) + m.addOptionalChart(s.Locks.Metadata, &chartMetadataLockAcquisitionsRate) + m.addOptionalChart(s.Locks.Oplog, &chartOpLogLockAcquisitionsRate) + } +} + +func (m *Mongo) addOptionalChart(iface any, charts ...*module.Chart) { + if reflect.ValueOf(iface).IsNil() { + return + } + for _, chart := range charts { + if m.optionalCharts[chart.ID] { + continue + } + m.optionalCharts[chart.ID] = true + + if err := m.charts.Add(chart.Copy()); err != nil { + m.Warning(err) + } + } +} -- cgit v1.2.3