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  }