firehol/netdata

View on GitHub
src/go/plugin/go.d/modules/mongodb/collect_serverstatus.go

Summary

Maintainability
A
1 hr
Test Coverage
// 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)
        }
    }
}