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

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package mongo
     4  
     5  import (
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/netdata/go.d.plugin/agent/module"
    10  )
    11  
    12  func (m *Mongo) collectSharding(mx map[string]int64) error {
    13  	nodes, err := m.conn.shardNodes()
    14  	if err != nil {
    15  		return err
    16  	}
    17  
    18  	mx["shard_nodes_aware"] = nodes.ShardAware
    19  	mx["shard_nodes_unaware"] = nodes.ShardUnaware
    20  
    21  	dbPart, err := m.conn.shardDatabasesPartitioning()
    22  	if err != nil {
    23  		return err
    24  	}
    25  
    26  	mx["shard_databases_partitioned"] = dbPart.Partitioned
    27  	mx["shard_databases_unpartitioned"] = dbPart.UnPartitioned
    28  
    29  	collPart, err := m.conn.shardCollectionsPartitioning()
    30  	if err != nil {
    31  		return err
    32  	}
    33  
    34  	mx["shard_collections_partitioned"] = collPart.Partitioned
    35  	mx["shard_collections_unpartitioned"] = collPart.UnPartitioned
    36  
    37  	chunksPerShard, err := m.conn.shardChunks()
    38  	if err != nil {
    39  		return err
    40  	}
    41  
    42  	seen := make(map[string]bool)
    43  
    44  	for shard, count := range chunksPerShard {
    45  		seen[shard] = true
    46  		mx["shard_id_"+shard+"_chunks"] = count
    47  	}
    48  
    49  	for id := range seen {
    50  		if !m.shards[id] {
    51  			m.shards[id] = true
    52  			m.addShardCharts(id)
    53  		}
    54  	}
    55  
    56  	for id := range m.shards {
    57  		if !seen[id] {
    58  			delete(m.shards, id)
    59  			m.removeShardCharts(id)
    60  		}
    61  	}
    62  
    63  	return nil
    64  }
    65  
    66  func (m *Mongo) addShardCharts(id string) {
    67  	charts := chartsTmplShardingShard.Copy()
    68  
    69  	for _, chart := range *charts {
    70  		chart.ID = fmt.Sprintf(chart.ID, id)
    71  		chart.Labels = []module.Label{
    72  			{Key: "shard_id", Value: id},
    73  		}
    74  		for _, dim := range chart.Dims {
    75  			dim.ID = fmt.Sprintf(dim.ID, id)
    76  		}
    77  	}
    78  
    79  	if err := m.Charts().Add(*charts...); err != nil {
    80  		m.Warning(err)
    81  	}
    82  
    83  }
    84  
    85  func (m *Mongo) removeShardCharts(id string) {
    86  	px := fmt.Sprintf("%s%s_", chartPxShard, id)
    87  
    88  	for _, chart := range *m.Charts() {
    89  		if strings.HasPrefix(chart.ID, px) {
    90  			chart.MarkRemove()
    91  			chart.MarkNotCreated()
    92  		}
    93  	}
    94  }
    95  
    96  func (m *Mongo) addShardingCharts() {
    97  	charts := chartsSharding.Copy()
    98  
    99  	if err := m.Charts().Add(*charts...); err != nil {
   100  		m.Warning(err)
   101  	}
   102  }