github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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/testing" 8 jc "github.com/juju/testing/checkers" 9 "github.com/prometheus/client_golang/prometheus" 10 dto "github.com/prometheus/client_model/go" 11 gc "gopkg.in/check.v1" 12 "gopkg.in/mgo.v2" 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 c.Assert(metricFamilies, jc.DeepEquals, []*dto.MetricFamily{{ 88 Name: stringptr("mgo_clusters"), 89 Help: stringptr("Current number of clusters"), 90 Type: metricTypePtr(dto.MetricType_GAUGE), 91 Metric: []*dto.Metric{{ 92 Gauge: &dto.Gauge{Value: float64ptr(1)}, 93 }}, 94 }, { 95 Name: stringptr("mgo_master_conns"), 96 Help: stringptr("Current number of master conns"), 97 Type: metricTypePtr(dto.MetricType_GAUGE), 98 Metric: []*dto.Metric{{ 99 Gauge: &dto.Gauge{Value: float64ptr(2)}, 100 }}, 101 }, { 102 Name: stringptr("mgo_received_docs_total"), 103 Help: stringptr("Total number of received docs"), 104 Type: metricTypePtr(dto.MetricType_COUNTER), 105 Metric: []*dto.Metric{{ 106 Counter: &dto.Counter{Value: float64ptr(6)}, 107 }}, 108 }, { 109 Name: stringptr("mgo_received_ops_total"), 110 Help: stringptr("Total number of received ops"), 111 Type: metricTypePtr(dto.MetricType_COUNTER), 112 Metric: []*dto.Metric{{ 113 Counter: &dto.Counter{Value: float64ptr(5)}, 114 }}, 115 }, { 116 Name: stringptr("mgo_sent_ops_total"), 117 Help: stringptr("Total number of sent ops"), 118 Type: metricTypePtr(dto.MetricType_COUNTER), 119 Metric: []*dto.Metric{{ 120 Counter: &dto.Counter{Value: float64ptr(4)}, 121 }}, 122 }, { 123 Name: stringptr("mgo_slave_conns"), 124 Help: stringptr("Current number of slave conns"), 125 Type: metricTypePtr(dto.MetricType_GAUGE), 126 Metric: []*dto.Metric{{ 127 Gauge: &dto.Gauge{Value: float64ptr(3)}, 128 }}, 129 }, { 130 Name: stringptr("mgo_socket_refs"), 131 Help: stringptr("Current number of sockets referenced"), 132 Type: metricTypePtr(dto.MetricType_GAUGE), 133 Metric: []*dto.Metric{{ 134 Gauge: &dto.Gauge{Value: float64ptr(9)}, 135 }}, 136 }, { 137 Name: stringptr("mgo_sockets_alive"), 138 Help: stringptr("Current number of sockets alive"), 139 Type: metricTypePtr(dto.MetricType_GAUGE), 140 Metric: []*dto.Metric{{ 141 Gauge: &dto.Gauge{Value: float64ptr(7)}, 142 }}, 143 }, { 144 Name: stringptr("mgo_sockets_inuse"), 145 Help: stringptr("Current number of sockets in use"), 146 Type: metricTypePtr(dto.MetricType_GAUGE), 147 Metric: []*dto.Metric{{ 148 Gauge: &dto.Gauge{Value: float64ptr(8)}, 149 }}, 150 }}) 151 } 152 153 func (s *MgoStatsCollectorSuite) TestCollectCounterDelta(c *gc.C) { 154 var sentOps int 155 s.getCurrentStats = func() mgo.Stats { 156 return mgo.Stats{SentOps: sentOps} 157 } 158 float64ptr := func(v float64) *float64 { 159 return &v 160 } 161 registry := prometheus.NewPedanticRegistry() 162 registry.Register(s.collector) 163 164 sentOps = 1 165 metricFamilies, err := registry.Gather() 166 c.Assert(err, jc.ErrorIsNil) 167 c.Assert(metricFamilies[4].Metric[0].Counter.Value, jc.DeepEquals, float64ptr(1)) 168 169 sentOps = 3 170 metricFamilies, err = registry.Gather() 171 c.Assert(err, jc.ErrorIsNil) 172 c.Assert(metricFamilies[4].Metric[0].Counter.Value, jc.DeepEquals, float64ptr(3)) 173 }