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 }