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 }