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 }