github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/mongo/mongometrics/mgostatsmetrics_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENSE file for details.
     3  
     4  package mongometrics_test
     5  
     6  import (
     7  	"github.com/juju/mgo/v3"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	"github.com/prometheus/client_golang/prometheus"
    11  	dto "github.com/prometheus/client_model/go"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/mongo/mongometrics"
    15  )
    16  
    17  type MgoStatsCollectorSuite struct {
    18  	testing.IsolationSuite
    19  	collector       *mongometrics.MgoStatsCollector
    20  	getCurrentStats func() mgo.Stats
    21  }
    22  
    23  var _ = gc.Suite(&MgoStatsCollectorSuite{})
    24  
    25  func (s *MgoStatsCollectorSuite) SetUpTest(c *gc.C) {
    26  	s.IsolationSuite.SetUpTest(c)
    27  	s.getCurrentStats = func() mgo.Stats {
    28  		return mgo.Stats{}
    29  	}
    30  	s.collector = mongometrics.NewMgoStatsCollector(func() mgo.Stats {
    31  		return s.getCurrentStats()
    32  	})
    33  }
    34  
    35  func (s *MgoStatsCollectorSuite) TestDescribe(c *gc.C) {
    36  	ch := make(chan *prometheus.Desc)
    37  	go func() {
    38  		defer close(ch)
    39  		s.collector.Describe(ch)
    40  	}()
    41  	var descs []*prometheus.Desc
    42  	for desc := range ch {
    43  		descs = append(descs, desc)
    44  	}
    45  	c.Assert(descs, gc.HasLen, 9)
    46  	c.Assert(descs[0].String(), gc.Matches, `.*fqName: "mgo_clusters".*`)
    47  	c.Assert(descs[1].String(), gc.Matches, `.*fqName: "mgo_master_conns".*`)
    48  	c.Assert(descs[2].String(), gc.Matches, `.*fqName: "mgo_slave_conns".*`)
    49  	c.Assert(descs[3].String(), gc.Matches, `.*fqName: "mgo_sent_ops_total".*`)
    50  	c.Assert(descs[4].String(), gc.Matches, `.*fqName: "mgo_received_ops_total".*`)
    51  	c.Assert(descs[5].String(), gc.Matches, `.*fqName: "mgo_received_docs_total".*`)
    52  	c.Assert(descs[6].String(), gc.Matches, `.*fqName: "mgo_sockets_alive".*`)
    53  	c.Assert(descs[7].String(), gc.Matches, `.*fqName: "mgo_sockets_inuse".*`)
    54  	c.Assert(descs[8].String(), gc.Matches, `.*fqName: "mgo_socket_refs".*`)
    55  }
    56  
    57  func (s *MgoStatsCollectorSuite) TestCollect(c *gc.C) {
    58  	s.getCurrentStats = func() mgo.Stats {
    59  		return mgo.Stats{
    60  			Clusters:     1,
    61  			MasterConns:  2,
    62  			SlaveConns:   3,
    63  			SentOps:      4,
    64  			ReceivedOps:  5,
    65  			ReceivedDocs: 6,
    66  			SocketsAlive: 7,
    67  			SocketsInUse: 8,
    68  			SocketRefs:   9,
    69  		}
    70  	}
    71  
    72  	stringptr := func(v string) *string {
    73  		return &v
    74  	}
    75  	float64ptr := func(v float64) *float64 {
    76  		return &v
    77  	}
    78  	metricTypePtr := func(v dto.MetricType) *dto.MetricType {
    79  		return &v
    80  	}
    81  
    82  	registry := prometheus.NewPedanticRegistry()
    83  	registry.Register(s.collector)
    84  	metricFamilies, err := registry.Gather()
    85  	c.Assert(err, jc.ErrorIsNil)
    86  	c.Assert(metricFamilies, gc.HasLen, 9)
    87  
    88  	mc := jc.NewMultiChecker()
    89  	mc.AddExpr("_.CreatedTimestamp", gc.NotNil)
    90  	mc.AddExpr("_.CreatedTimestamp", jc.Ignore)
    91  	c.Assert(metricFamilies, mc, []*dto.MetricFamily{{
    92  		Name: stringptr("mgo_clusters"),
    93  		Help: stringptr("Current number of clusters"),
    94  		Type: metricTypePtr(dto.MetricType_GAUGE),
    95  		Metric: []*dto.Metric{{
    96  			Gauge: &dto.Gauge{Value: float64ptr(1)},
    97  		}},
    98  	}, {
    99  		Name: stringptr("mgo_master_conns"),
   100  		Help: stringptr("Current number of master conns"),
   101  		Type: metricTypePtr(dto.MetricType_GAUGE),
   102  		Metric: []*dto.Metric{{
   103  			Gauge: &dto.Gauge{Value: float64ptr(2)},
   104  		}},
   105  	}, {
   106  		Name: stringptr("mgo_received_docs_total"),
   107  		Help: stringptr("Total number of received docs"),
   108  		Type: metricTypePtr(dto.MetricType_COUNTER),
   109  		Metric: []*dto.Metric{{
   110  			Counter: &dto.Counter{Value: float64ptr(6)},
   111  		}},
   112  	}, {
   113  		Name: stringptr("mgo_received_ops_total"),
   114  		Help: stringptr("Total number of received ops"),
   115  		Type: metricTypePtr(dto.MetricType_COUNTER),
   116  		Metric: []*dto.Metric{{
   117  			Counter: &dto.Counter{Value: float64ptr(5)},
   118  		}},
   119  	}, {
   120  		Name: stringptr("mgo_sent_ops_total"),
   121  		Help: stringptr("Total number of sent ops"),
   122  		Type: metricTypePtr(dto.MetricType_COUNTER),
   123  		Metric: []*dto.Metric{{
   124  			Counter: &dto.Counter{Value: float64ptr(4)},
   125  		}},
   126  	}, {
   127  		Name: stringptr("mgo_slave_conns"),
   128  		Help: stringptr("Current number of slave conns"),
   129  		Type: metricTypePtr(dto.MetricType_GAUGE),
   130  		Metric: []*dto.Metric{{
   131  			Gauge: &dto.Gauge{Value: float64ptr(3)},
   132  		}},
   133  	}, {
   134  		Name: stringptr("mgo_socket_refs"),
   135  		Help: stringptr("Current number of sockets referenced"),
   136  		Type: metricTypePtr(dto.MetricType_GAUGE),
   137  		Metric: []*dto.Metric{{
   138  			Gauge: &dto.Gauge{Value: float64ptr(9)},
   139  		}},
   140  	}, {
   141  		Name: stringptr("mgo_sockets_alive"),
   142  		Help: stringptr("Current number of sockets alive"),
   143  		Type: metricTypePtr(dto.MetricType_GAUGE),
   144  		Metric: []*dto.Metric{{
   145  			Gauge: &dto.Gauge{Value: float64ptr(7)},
   146  		}},
   147  	}, {
   148  		Name: stringptr("mgo_sockets_inuse"),
   149  		Help: stringptr("Current number of sockets in use"),
   150  		Type: metricTypePtr(dto.MetricType_GAUGE),
   151  		Metric: []*dto.Metric{{
   152  			Gauge: &dto.Gauge{Value: float64ptr(8)},
   153  		}},
   154  	}})
   155  }
   156  
   157  func (s *MgoStatsCollectorSuite) TestCollectCounterDelta(c *gc.C) {
   158  	var sentOps int
   159  	s.getCurrentStats = func() mgo.Stats {
   160  		return mgo.Stats{SentOps: sentOps}
   161  	}
   162  	float64ptr := func(v float64) *float64 {
   163  		return &v
   164  	}
   165  	registry := prometheus.NewPedanticRegistry()
   166  	registry.Register(s.collector)
   167  
   168  	sentOps = 1
   169  	metricFamilies, err := registry.Gather()
   170  	c.Assert(err, jc.ErrorIsNil)
   171  	c.Assert(metricFamilies[4].Metric[0].Counter.Value, jc.DeepEquals, float64ptr(1))
   172  
   173  	sentOps = 3
   174  	metricFamilies, err = registry.Gather()
   175  	c.Assert(err, jc.ErrorIsNil)
   176  	c.Assert(metricFamilies[4].Metric[0].Counter.Value, jc.DeepEquals, float64ptr(3))
   177  }