github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/mongo/mongometrics/txnmetrics_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENSE file for details.
     3  
     4  package mongometrics_test
     5  
     6  import (
     7  	"errors"
     8  	"reflect"
     9  
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/prometheus/client_golang/prometheus"
    13  	dto "github.com/prometheus/client_model/go"
    14  	gc "gopkg.in/check.v1"
    15  	"gopkg.in/mgo.v2/bson"
    16  	"gopkg.in/mgo.v2/txn"
    17  
    18  	"github.com/juju/juju/mongo/mongometrics"
    19  )
    20  
    21  type TxnCollectorSuite struct {
    22  	testing.IsolationSuite
    23  	collector *mongometrics.TxnCollector
    24  }
    25  
    26  var _ = gc.Suite(&TxnCollectorSuite{})
    27  
    28  func (s *TxnCollectorSuite) SetUpTest(c *gc.C) {
    29  	s.IsolationSuite.SetUpTest(c)
    30  	s.collector = mongometrics.NewTxnCollector()
    31  }
    32  
    33  func (s *TxnCollectorSuite) TestDescribe(c *gc.C) {
    34  	ch := make(chan *prometheus.Desc)
    35  	go func() {
    36  		defer close(ch)
    37  		s.collector.Describe(ch)
    38  	}()
    39  	var descs []*prometheus.Desc
    40  	for desc := range ch {
    41  		descs = append(descs, desc)
    42  	}
    43  	c.Assert(descs, gc.HasLen, 1)
    44  	c.Assert(descs[0].String(), gc.Matches, `.*fqName: "juju_mgo_txn_ops_total".*`)
    45  }
    46  
    47  func (s *TxnCollectorSuite) TestCollect(c *gc.C) {
    48  	s.collector.AfterRunTransaction("dbname", "modeluuid", []txn.Op{{
    49  		C:      "update-coll",
    50  		Update: bson.D{},
    51  	}, {
    52  		C:      "insert-coll",
    53  		Insert: bson.D{},
    54  	}, {
    55  		C:      "remove-coll",
    56  		Remove: true,
    57  	}, {
    58  		C: "assert-coll",
    59  	}}, nil)
    60  
    61  	s.collector.AfterRunTransaction("dbname", "modeluuid", []txn.Op{{
    62  		C:      "update-coll",
    63  		Update: bson.D{},
    64  	}}, errors.New("bewm"))
    65  
    66  	ch := make(chan prometheus.Metric)
    67  	go func() {
    68  		defer close(ch)
    69  		s.collector.Collect(ch)
    70  	}()
    71  
    72  	var metrics []prometheus.Metric
    73  	for metric := range ch {
    74  		metrics = append(metrics, metric)
    75  	}
    76  	c.Assert(metrics, gc.HasLen, 5)
    77  
    78  	var dtoMetrics [5]dto.Metric
    79  	for i, metric := range metrics {
    80  		err := metric.Write(&dtoMetrics[i])
    81  		c.Assert(err, jc.ErrorIsNil)
    82  	}
    83  
    84  	float64ptr := func(v float64) *float64 {
    85  		return &v
    86  	}
    87  	labelpair := func(n, v string) *dto.LabelPair {
    88  		return &dto.LabelPair{Name: &n, Value: &v}
    89  	}
    90  	expected := []dto.Metric{
    91  		{
    92  			Counter: &dto.Counter{Value: float64ptr(1)},
    93  			Label: []*dto.LabelPair{
    94  				labelpair("collection", "update-coll"),
    95  				labelpair("database", "dbname"),
    96  				labelpair("failed", ""),
    97  				labelpair("optype", "update"),
    98  			},
    99  		},
   100  		{
   101  			Counter: &dto.Counter{Value: float64ptr(1)},
   102  			Label: []*dto.LabelPair{
   103  				labelpair("collection", "insert-coll"),
   104  				labelpair("database", "dbname"),
   105  				labelpair("failed", ""),
   106  				labelpair("optype", "insert"),
   107  			},
   108  		},
   109  		{
   110  			Counter: &dto.Counter{Value: float64ptr(1)},
   111  			Label: []*dto.LabelPair{
   112  				labelpair("collection", "remove-coll"),
   113  				labelpair("database", "dbname"),
   114  				labelpair("failed", ""),
   115  				labelpair("optype", "remove"),
   116  			},
   117  		},
   118  		{
   119  			Counter: &dto.Counter{Value: float64ptr(1)},
   120  			Label: []*dto.LabelPair{
   121  				labelpair("collection", "assert-coll"),
   122  				labelpair("database", "dbname"),
   123  				labelpair("failed", ""),
   124  				labelpair("optype", "assert"),
   125  			},
   126  		},
   127  		{
   128  			Counter: &dto.Counter{Value: float64ptr(1)},
   129  			Label: []*dto.LabelPair{
   130  				labelpair("collection", "update-coll"),
   131  				labelpair("database", "dbname"),
   132  				labelpair("failed", "failed"),
   133  				labelpair("optype", "update"),
   134  			},
   135  		},
   136  	}
   137  	for _, dm := range dtoMetrics {
   138  		var found bool
   139  		for i, m := range expected {
   140  			if !reflect.DeepEqual(dm, m) {
   141  				continue
   142  			}
   143  			expected = append(expected[:i], expected[i+1:]...)
   144  			found = true
   145  			break
   146  		}
   147  		if !found {
   148  			c.Errorf("metric %+v not expected", dm)
   149  		}
   150  	}
   151  }