github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/observer/metricobserver/observer_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package metricobserver_test
     5  
     6  import (
     7  	"strconv"
     8  	"time"
     9  
    10  	"github.com/juju/clock/testclock"
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	"github.com/prometheus/client_golang/prometheus"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/apiserver/observer"
    17  	"github.com/juju/juju/apiserver/observer/metricobserver"
    18  	"github.com/juju/juju/rpc"
    19  )
    20  
    21  type observerSuite struct {
    22  	testing.IsolationSuite
    23  	clock *testclock.Clock
    24  }
    25  
    26  var _ = gc.Suite(&observerSuite{})
    27  
    28  func (s *observerSuite) SetUpTest(c *gc.C) {
    29  	s.IsolationSuite.SetUpTest(c)
    30  	s.clock = testclock.NewClock(time.Time{})
    31  }
    32  
    33  func (s *observerSuite) TestObserver(c *gc.C) {
    34  	factory, finish := s.createFactory(c)
    35  	defer finish()
    36  
    37  	o := factory()
    38  	c.Assert(o, gc.NotNil)
    39  }
    40  
    41  func (s *observerSuite) TestRPCObserver(c *gc.C) {
    42  	factory, finish := s.createFactory(c)
    43  	defer finish()
    44  
    45  	o := factory().RPCObserver()
    46  	c.Assert(o, gc.NotNil)
    47  
    48  	latencies := []time.Duration{
    49  		1000 * time.Millisecond,
    50  		1500 * time.Millisecond,
    51  		2000 * time.Millisecond,
    52  	}
    53  	for _, latency := range latencies {
    54  		req := rpc.Request{
    55  			Type:    "api-facade",
    56  			Version: 42,
    57  			Action:  "api-method",
    58  		}
    59  		o.ServerRequest(&rpc.Header{Request: req}, nil)
    60  		s.clock.Advance(latency)
    61  		o.ServerReply(req, &rpc.Header{ErrorCode: "badness"}, nil)
    62  	}
    63  }
    64  
    65  func (s *observerSuite) createFactory(c *gc.C) (observer.ObserverFactory, func()) {
    66  	metricsCollector, finish := createMockMetrics(c, prometheus.Labels{
    67  		metricobserver.MetricLabelFacade:    "api-facade",
    68  		metricobserver.MetricLabelVersion:   strconv.Itoa(42),
    69  		metricobserver.MetricLabelMethod:    "api-method",
    70  		metricobserver.MetricLabelErrorCode: "badness",
    71  	})
    72  
    73  	factory, err := metricobserver.NewObserverFactory(metricobserver.Config{
    74  		Clock:            s.clock,
    75  		MetricsCollector: metricsCollector,
    76  	})
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	return factory, finish
    79  }