github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/logsender/logsendermetrics/logsendermetrics_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENSE file for details.
     3  
     4  package logsendermetrics_test
     5  
     6  import (
     7  	"github.com/juju/loggo"
     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/worker/logsender"
    15  	"github.com/juju/juju/worker/logsender/logsendermetrics"
    16  	"github.com/juju/juju/worker/logsender/logsendertest"
    17  )
    18  
    19  const maxLen = 3
    20  
    21  type bufferedLogWriterSuite struct {
    22  	testing.IsolationSuite
    23  	writer    *logsender.BufferedLogWriter
    24  	collector logsendermetrics.BufferedLogWriterMetrics
    25  }
    26  
    27  var _ = gc.Suite(&bufferedLogWriterSuite{})
    28  
    29  func (s *bufferedLogWriterSuite) SetUpTest(c *gc.C) {
    30  	s.IsolationSuite.SetUpTest(c)
    31  	s.writer = logsender.NewBufferedLogWriter(maxLen)
    32  	s.collector = logsendermetrics.BufferedLogWriterMetrics{s.writer}
    33  	s.AddCleanup(func(*gc.C) { s.writer.Close() })
    34  }
    35  
    36  func (s *bufferedLogWriterSuite) TestDescribe(c *gc.C) {
    37  	ch := make(chan *prometheus.Desc)
    38  	go func() {
    39  		defer close(ch)
    40  		s.collector.Describe(ch)
    41  	}()
    42  	var descs []*prometheus.Desc
    43  	for desc := range ch {
    44  		descs = append(descs, desc)
    45  	}
    46  	c.Assert(descs, gc.HasLen, 4)
    47  	c.Assert(descs[0].String(), gc.Matches, `.*fqName: "juju_logsender_capacity".*`)
    48  	c.Assert(descs[1].String(), gc.Matches, `.*fqName: "juju_logsender_enqueued_total".*`)
    49  	c.Assert(descs[2].String(), gc.Matches, `.*fqName: "juju_logsender_sent_total".*`)
    50  	c.Assert(descs[3].String(), gc.Matches, `.*fqName: "juju_logsender_dropped_total".*`)
    51  }
    52  
    53  func (s *bufferedLogWriterSuite) TestCollect(c *gc.C) {
    54  	s.writer.Write(loggo.Entry{})
    55  	s.writer.Write(loggo.Entry{})
    56  	s.writer.Write(loggo.Entry{})
    57  	s.writer.Write(loggo.Entry{})
    58  	s.writer.Write(loggo.Entry{}) // causes first to be dropped
    59  
    60  	for i := 0; i < maxLen; i++ {
    61  		<-s.writer.Logs()
    62  	}
    63  
    64  	logsendertest.ExpectLogStats(c, s.writer, logsender.LogStats{
    65  		Enqueued: 5,
    66  		Sent:     3,
    67  		Dropped:  1,
    68  	})
    69  
    70  	ch := make(chan prometheus.Metric)
    71  	go func() {
    72  		defer close(ch)
    73  		s.collector.Collect(ch)
    74  	}()
    75  
    76  	var metrics []prometheus.Metric
    77  	for metric := range ch {
    78  		metrics = append(metrics, metric)
    79  	}
    80  	c.Assert(metrics, gc.HasLen, 4)
    81  
    82  	var dtoMetrics [4]dto.Metric
    83  	for i, metric := range metrics {
    84  		err := metric.Write(&dtoMetrics[i])
    85  		c.Assert(err, jc.ErrorIsNil)
    86  	}
    87  
    88  	float64ptr := func(v float64) *float64 {
    89  		return &v
    90  	}
    91  	c.Assert(dtoMetrics, jc.DeepEquals, [4]dto.Metric{
    92  		{Counter: &dto.Counter{Value: float64ptr(3)}},
    93  		{Counter: &dto.Counter{Value: float64ptr(5)}},
    94  		{Counter: &dto.Counter{Value: float64ptr(3)}},
    95  		{Counter: &dto.Counter{Value: float64ptr(1)}},
    96  	})
    97  }