github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/metric/metrics_test.go (about)

     1  package metric_test
     2  
     3  import (
     4  	"github.com/pf-qiu/concourse/v6/atc/db"
     5  	"github.com/pf-qiu/concourse/v6/atc/metric"
     6  	"github.com/pf-qiu/concourse/v6/atc/metric/metricfakes"
     7  
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/gomega"
    10  )
    11  
    12  var _ = Describe("Metrics", func() {
    13  	Describe("worker state metric", func() {
    14  		var (
    15  			emitter *smartFakeEmitter
    16  			monitor *metric.Monitor
    17  		)
    18  
    19  		BeforeEach(func() {
    20  			emitter = new(smartFakeEmitter)
    21  			monitor = metric.NewMonitor()
    22  
    23  			emitterFactory := new(metricfakes.FakeEmitterFactory)
    24  			emitterFactory.IsConfiguredReturns(true)
    25  			emitterFactory.NewEmitterReturns(emitter, nil)
    26  
    27  			monitor.RegisterEmitter(emitterFactory)
    28  			monitor.Initialize(testLogger, "test", map[string]string{}, 1000)
    29  		})
    30  
    31  		It("emits a value for every state", func() {
    32  			givenNoWorkers().Emit(testLogger, monitor)
    33  
    34  			waitForEvents(emitter)
    35  
    36  			for _, state := range db.AllWorkerStates() {
    37  				event := emitter.eventWithState(state)
    38  				Expect(event.Value).To(Equal(float64(0)))
    39  			}
    40  		})
    41  
    42  		It("correctly emits the number of running workers", func() {
    43  			givenOneWorkerWithState(db.WorkerStateRunning).
    44  				Emit(testLogger, monitor)
    45  
    46  			waitForEvents(emitter)
    47  
    48  			event := emitter.eventWithState(db.WorkerStateRunning)
    49  			Expect(event.Value).To(Equal(float64(1)))
    50  		})
    51  	})
    52  })
    53  
    54  type smartFakeEmitter struct {
    55  	metricfakes.FakeEmitter
    56  }
    57  
    58  func (fakeEmitter *smartFakeEmitter) eventWithState(state db.WorkerState) *metric.Event {
    59  	for i := 0; i < fakeEmitter.EmitCallCount(); i++ {
    60  		_, event := fakeEmitter.EmitArgsForCall(i)
    61  		if event.Attributes["state"] == string(state) {
    62  			return &event
    63  		}
    64  	}
    65  	return nil
    66  }
    67  
    68  func givenNoWorkers() metric.WorkersState {
    69  	return metric.WorkersState{
    70  		WorkerStateByName: make(map[string]db.WorkerState),
    71  	}
    72  }
    73  
    74  func givenOneWorkerWithState(state db.WorkerState) metric.WorkersState {
    75  	workersState := givenNoWorkers()
    76  	workersState.WorkerStateByName["my-worker"] = state
    77  	return workersState
    78  }
    79  
    80  func waitForEvents(fakeEmitter *smartFakeEmitter) {
    81  	numberOfWorkerStates := len(db.AllWorkerStates())
    82  	Eventually(fakeEmitter.EmitCallCount).Should(Equal(numberOfWorkerStates))
    83  }