github.com/defanghe/fabric@v2.1.1+incompatible/orderer/consensus/kafka/metrics_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package kafka_test 8 9 import ( 10 "time" 11 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 15 "github.com/hyperledger/fabric/orderer/consensus/kafka" 16 "github.com/hyperledger/fabric/orderer/consensus/kafka/mock" 17 ) 18 19 var _ = Describe("Metrics", func() { 20 var ( 21 fakeMetricsRegistry *mock.MetricsRegistry 22 ) 23 24 BeforeEach(func() { 25 fakeMetricsRegistry = &mock.MetricsRegistry{} 26 }) 27 28 Describe("NewMetrics", func() { 29 var ( 30 fakeMetricsProvider *mock.MetricsProvider 31 ) 32 33 BeforeEach(func() { 34 fakeMetricsProvider = &mock.MetricsProvider{} 35 }) 36 37 It("initializes a new set of metrics", func() { 38 m := kafka.NewMetrics(fakeMetricsProvider, fakeMetricsRegistry) 39 Expect(m).NotTo(BeNil()) 40 Expect(fakeMetricsProvider.NewGaugeCallCount()).To(Equal(12)) 41 Expect(m.GoMetricsRegistry).To(Equal(fakeMetricsRegistry)) 42 }) 43 }) 44 45 Describe("PollGoMetrics", func() { 46 var ( 47 // The fake gometrics sources 48 fakeIncomingByteRateMeter *mock.MetricsMeter 49 fakeOutgoingByteRateMeter *mock.MetricsMeter 50 fakeRequestRateMeter *mock.MetricsMeter 51 fakeRequestSizeHistogram *mock.MetricsHistogram 52 fakeRequestLatencyHistogram *mock.MetricsHistogram 53 fakeResponseRateMeter *mock.MetricsMeter 54 fakeResponseSizeHistogram *mock.MetricsHistogram 55 fakeBatchSizeHistogram *mock.MetricsHistogram 56 fakeRecordSendRateMeter *mock.MetricsMeter 57 fakeRecordsPerRequestHistogram *mock.MetricsHistogram 58 fakeCompressionRatioHistogram *mock.MetricsHistogram 59 60 // The fake go-kit metric sinks 61 fakeIncomingByteRateGauge *mock.MetricsGauge 62 fakeOutgoingByteRateGauge *mock.MetricsGauge 63 fakeRequestRateGauge *mock.MetricsGauge 64 fakeRequestSizeGauge *mock.MetricsGauge 65 fakeRequestLatencyGauge *mock.MetricsGauge 66 fakeResponseRateGauge *mock.MetricsGauge 67 fakeResponseSizeGauge *mock.MetricsGauge 68 fakeBatchSizeGauge *mock.MetricsGauge 69 fakeRecordSendRateGauge *mock.MetricsGauge 70 fakeRecordsPerRequestGauge *mock.MetricsGauge 71 fakeCompressionRatioGauge *mock.MetricsGauge 72 73 m *kafka.Metrics 74 ) 75 76 BeforeEach(func() { 77 fakeIncomingByteRateMeter = &mock.MetricsMeter{} 78 fakeIncomingByteRateMeter.SnapshotReturns(fakeIncomingByteRateMeter) 79 fakeIncomingByteRateMeter.Rate1Returns(1) 80 81 fakeOutgoingByteRateMeter = &mock.MetricsMeter{} 82 fakeOutgoingByteRateMeter.SnapshotReturns(fakeOutgoingByteRateMeter) 83 fakeOutgoingByteRateMeter.Rate1Returns(2) 84 85 fakeRequestRateMeter = &mock.MetricsMeter{} 86 fakeRequestRateMeter.SnapshotReturns(fakeRequestRateMeter) 87 fakeRequestRateMeter.Rate1Returns(3) 88 89 fakeRequestSizeHistogram = &mock.MetricsHistogram{} 90 fakeRequestSizeHistogram.SnapshotReturns(fakeRequestSizeHistogram) 91 fakeRequestSizeHistogram.MeanReturns(4) 92 93 fakeRequestLatencyHistogram = &mock.MetricsHistogram{} 94 fakeRequestLatencyHistogram.SnapshotReturns(fakeRequestLatencyHistogram) 95 fakeRequestLatencyHistogram.MeanReturns(5) 96 97 fakeResponseRateMeter = &mock.MetricsMeter{} 98 fakeResponseRateMeter.SnapshotReturns(fakeResponseRateMeter) 99 fakeResponseRateMeter.Rate1Returns(6) 100 101 fakeResponseSizeHistogram = &mock.MetricsHistogram{} 102 fakeResponseSizeHistogram.SnapshotReturns(fakeResponseSizeHistogram) 103 fakeResponseSizeHistogram.MeanReturns(7) 104 105 fakeBatchSizeHistogram = &mock.MetricsHistogram{} 106 fakeBatchSizeHistogram.SnapshotReturns(fakeBatchSizeHistogram) 107 fakeBatchSizeHistogram.MeanReturns(8) 108 109 fakeRecordSendRateMeter = &mock.MetricsMeter{} 110 fakeRecordSendRateMeter.SnapshotReturns(fakeRecordSendRateMeter) 111 fakeRecordSendRateMeter.Rate1Returns(9) 112 113 fakeRecordsPerRequestHistogram = &mock.MetricsHistogram{} 114 fakeRecordsPerRequestHistogram.SnapshotReturns(fakeRecordsPerRequestHistogram) 115 fakeRecordsPerRequestHistogram.MeanReturns(10) 116 117 fakeCompressionRatioHistogram = &mock.MetricsHistogram{} 118 fakeCompressionRatioHistogram.SnapshotReturns(fakeCompressionRatioHistogram) 119 fakeCompressionRatioHistogram.MeanReturns(11) 120 121 fakeMetricsRegistry.EachStub = func(receiver func(name string, value interface{})) { 122 receiver("incoming-byte-rate-for-broker-0", fakeIncomingByteRateMeter) 123 receiver("incoming-byte-rate-for-broker-1", fakeIncomingByteRateMeter) 124 receiver("outgoing-byte-rate-for-broker-0", fakeOutgoingByteRateMeter) 125 receiver("outgoing-byte-rate-for-broker-1", fakeOutgoingByteRateMeter) 126 receiver("request-rate-for-broker-0", fakeRequestRateMeter) 127 receiver("request-size-for-broker-0", fakeRequestSizeHistogram) 128 receiver("request-latency-in-ms-for-broker-0", fakeRequestLatencyHistogram) 129 receiver("response-rate-for-broker-0", fakeResponseRateMeter) 130 receiver("response-size-for-broker-0", fakeResponseSizeHistogram) 131 receiver("batch-size-for-topic-mytopic", fakeBatchSizeHistogram) 132 receiver("record-send-rate-for-topic-mytopic", fakeRecordSendRateMeter) 133 receiver("records-per-request-for-topic-mytopic", fakeRecordsPerRequestHistogram) 134 receiver("compression-ratio-for-topic-mytopic", fakeCompressionRatioHistogram) 135 } 136 137 fakeIncomingByteRateGauge = &mock.MetricsGauge{} 138 fakeIncomingByteRateGauge.WithReturns(fakeIncomingByteRateGauge) 139 140 fakeOutgoingByteRateGauge = &mock.MetricsGauge{} 141 fakeOutgoingByteRateGauge.WithReturns(fakeOutgoingByteRateGauge) 142 143 fakeRequestRateGauge = &mock.MetricsGauge{} 144 fakeRequestRateGauge.WithReturns(fakeRequestRateGauge) 145 146 fakeRequestSizeGauge = &mock.MetricsGauge{} 147 fakeRequestSizeGauge.WithReturns(fakeRequestSizeGauge) 148 149 fakeRequestLatencyGauge = &mock.MetricsGauge{} 150 fakeRequestLatencyGauge.WithReturns(fakeRequestLatencyGauge) 151 152 fakeResponseRateGauge = &mock.MetricsGauge{} 153 fakeResponseRateGauge.WithReturns(fakeResponseRateGauge) 154 155 fakeResponseSizeGauge = &mock.MetricsGauge{} 156 fakeResponseSizeGauge.WithReturns(fakeResponseSizeGauge) 157 158 fakeBatchSizeGauge = &mock.MetricsGauge{} 159 fakeBatchSizeGauge.WithReturns(fakeBatchSizeGauge) 160 161 fakeRecordSendRateGauge = &mock.MetricsGauge{} 162 fakeRecordSendRateGauge.WithReturns(fakeRecordSendRateGauge) 163 164 fakeRecordsPerRequestGauge = &mock.MetricsGauge{} 165 fakeRecordsPerRequestGauge.WithReturns(fakeRecordsPerRequestGauge) 166 167 fakeCompressionRatioGauge = &mock.MetricsGauge{} 168 fakeCompressionRatioGauge.WithReturns(fakeCompressionRatioGauge) 169 170 m = &kafka.Metrics{ 171 IncomingByteRate: fakeIncomingByteRateGauge, 172 OutgoingByteRate: fakeOutgoingByteRateGauge, 173 RequestRate: fakeRequestRateGauge, 174 RequestSize: fakeRequestSizeGauge, 175 RequestLatency: fakeRequestLatencyGauge, 176 ResponseRate: fakeResponseRateGauge, 177 ResponseSize: fakeResponseSizeGauge, 178 BatchSize: fakeBatchSizeGauge, 179 RecordSendRate: fakeRecordSendRateGauge, 180 RecordsPerRequest: fakeRecordsPerRequestGauge, 181 CompressionRatio: fakeCompressionRatioGauge, 182 183 GoMetricsRegistry: fakeMetricsRegistry, 184 } 185 }) 186 187 It("converts the metrics in the registry to be gauages", func() { 188 m.PollGoMetrics() 189 190 Expect(fakeIncomingByteRateGauge.WithCallCount()).To(Equal(2)) 191 Expect(fakeIncomingByteRateGauge.WithArgsForCall(0)).To(Equal([]string{"broker_id", "0"})) 192 Expect(fakeIncomingByteRateGauge.WithArgsForCall(1)).To(Equal([]string{"broker_id", "1"})) 193 Expect(fakeIncomingByteRateGauge.SetCallCount()).To(Equal(2)) 194 Expect(fakeIncomingByteRateGauge.SetArgsForCall(0)).To(Equal(float64(1))) 195 196 Expect(fakeOutgoingByteRateGauge.WithCallCount()).To(Equal(2)) 197 Expect(fakeOutgoingByteRateGauge.WithArgsForCall(0)).To(Equal([]string{"broker_id", "0"})) 198 Expect(fakeOutgoingByteRateGauge.WithArgsForCall(1)).To(Equal([]string{"broker_id", "1"})) 199 Expect(fakeOutgoingByteRateGauge.SetCallCount()).To(Equal(2)) 200 Expect(fakeOutgoingByteRateGauge.SetArgsForCall(0)).To(Equal(float64(2))) 201 202 Expect(fakeRequestRateGauge.WithCallCount()).To(Equal(1)) 203 Expect(fakeRequestRateGauge.WithArgsForCall(0)).To(Equal([]string{"broker_id", "0"})) 204 Expect(fakeRequestRateGauge.SetCallCount()).To(Equal(1)) 205 Expect(fakeRequestRateGauge.SetArgsForCall(0)).To(Equal(float64(3))) 206 207 Expect(fakeRequestSizeGauge.WithCallCount()).To(Equal(1)) 208 Expect(fakeRequestSizeGauge.WithArgsForCall(0)).To(Equal([]string{"broker_id", "0"})) 209 Expect(fakeRequestSizeGauge.SetCallCount()).To(Equal(1)) 210 Expect(fakeRequestSizeGauge.SetArgsForCall(0)).To(Equal(float64(4))) 211 212 Expect(fakeRequestLatencyGauge.WithCallCount()).To(Equal(1)) 213 Expect(fakeRequestLatencyGauge.WithArgsForCall(0)).To(Equal([]string{"broker_id", "0"})) 214 Expect(fakeRequestLatencyGauge.SetCallCount()).To(Equal(1)) 215 Expect(fakeRequestLatencyGauge.SetArgsForCall(0)).To(Equal(float64(5))) 216 217 Expect(fakeResponseRateGauge.WithCallCount()).To(Equal(1)) 218 Expect(fakeResponseRateGauge.WithArgsForCall(0)).To(Equal([]string{"broker_id", "0"})) 219 Expect(fakeResponseRateGauge.SetCallCount()).To(Equal(1)) 220 Expect(fakeResponseRateGauge.SetArgsForCall(0)).To(Equal(float64(6))) 221 222 Expect(fakeResponseSizeGauge.WithCallCount()).To(Equal(1)) 223 Expect(fakeResponseSizeGauge.WithArgsForCall(0)).To(Equal([]string{"broker_id", "0"})) 224 Expect(fakeResponseSizeGauge.SetCallCount()).To(Equal(1)) 225 Expect(fakeResponseSizeGauge.SetArgsForCall(0)).To(Equal(float64(7))) 226 227 Expect(fakeBatchSizeGauge.WithCallCount()).To(Equal(1)) 228 Expect(fakeBatchSizeGauge.WithArgsForCall(0)).To(Equal([]string{"topic", "mytopic"})) 229 Expect(fakeBatchSizeGauge.SetCallCount()).To(Equal(1)) 230 Expect(fakeBatchSizeGauge.SetArgsForCall(0)).To(Equal(float64(8))) 231 232 Expect(fakeRecordSendRateGauge.WithCallCount()).To(Equal(1)) 233 Expect(fakeRecordSendRateGauge.WithArgsForCall(0)).To(Equal([]string{"topic", "mytopic"})) 234 Expect(fakeRecordSendRateGauge.SetCallCount()).To(Equal(1)) 235 Expect(fakeRecordSendRateGauge.SetArgsForCall(0)).To(Equal(float64(9))) 236 237 Expect(fakeRecordsPerRequestGauge.WithCallCount()).To(Equal(1)) 238 Expect(fakeRecordsPerRequestGauge.WithArgsForCall(0)).To(Equal([]string{"topic", "mytopic"})) 239 Expect(fakeRecordsPerRequestGauge.SetCallCount()).To(Equal(1)) 240 Expect(fakeRecordsPerRequestGauge.SetArgsForCall(0)).To(Equal(float64(10))) 241 242 Expect(fakeCompressionRatioGauge.WithCallCount()).To(Equal(1)) 243 Expect(fakeCompressionRatioGauge.WithArgsForCall(0)).To(Equal([]string{"topic", "mytopic"})) 244 Expect(fakeCompressionRatioGauge.SetCallCount()).To(Equal(1)) 245 Expect(fakeCompressionRatioGauge.SetArgsForCall(0)).To(Equal(float64(11))) 246 }) 247 248 Context("when the go-metrics source contains unknown metrics", func() { 249 var ( 250 fakeMeter *mock.MetricsMeter 251 ) 252 253 BeforeEach(func() { 254 fakeMeter = &mock.MetricsMeter{} 255 fakeMetricsRegistry.EachStub = func(receiver func(name string, value interface{})) { 256 receiver("unknown-metric-name", fakeMeter) 257 receiver("another-unknown-metric", fakeMeter) 258 } 259 }) 260 261 It("does nothing with them", func() { 262 m.PollGoMetrics() 263 Expect(fakeIncomingByteRateGauge.SetCallCount()).To(Equal(0)) 264 Expect(fakeOutgoingByteRateGauge.SetCallCount()).To(Equal(0)) 265 Expect(fakeRequestRateGauge.SetCallCount()).To(Equal(0)) 266 Expect(fakeRequestSizeGauge.SetCallCount()).To(Equal(0)) 267 Expect(fakeRequestLatencyGauge.SetCallCount()).To(Equal(0)) 268 Expect(fakeResponseRateGauge.SetCallCount()).To(Equal(0)) 269 Expect(fakeResponseSizeGauge.SetCallCount()).To(Equal(0)) 270 Expect(fakeBatchSizeGauge.SetCallCount()).To(Equal(0)) 271 Expect(fakeRecordSendRateGauge.SetCallCount()).To(Equal(0)) 272 Expect(fakeRecordsPerRequestGauge.SetCallCount()).To(Equal(0)) 273 Expect(fakeCompressionRatioGauge.SetCallCount()).To(Equal(0)) 274 275 Expect(fakeMeter.SnapshotCallCount()).To(Equal(0)) 276 }) 277 }) 278 279 Context("when a histogram metric does not have a histogram value", func() { 280 var ( 281 fakeMeter *mock.MetricsMeter 282 ) 283 284 BeforeEach(func() { 285 fakeMeter = &mock.MetricsMeter{} 286 fakeMetricsRegistry.EachStub = func(receiver func(name string, value interface{})) { 287 receiver("request-size-for-broker-0", fakeMeter) 288 } 289 }) 290 291 It("panics", func() { 292 Expect(m.PollGoMetrics).To(Panic()) 293 Expect(fakeRequestSizeGauge.SetCallCount()).To(Equal(0)) 294 Expect(fakeMeter.SnapshotCallCount()).To(Equal(0)) 295 }) 296 }) 297 298 Context("when a meter metric does not have a meter value", func() { 299 var ( 300 fakeHistogram *mock.MetricsHistogram 301 ) 302 303 BeforeEach(func() { 304 fakeHistogram = &mock.MetricsHistogram{} 305 fakeMetricsRegistry.EachStub = func(receiver func(name string, value interface{})) { 306 receiver("incoming-byte-rate-for-broker-0", fakeHistogram) 307 } 308 }) 309 310 It("panics", func() { 311 Expect(m.PollGoMetrics).To(Panic()) 312 Expect(fakeIncomingByteRateGauge.SetCallCount()).To(Equal(0)) 313 Expect(fakeHistogram.SnapshotCallCount()).To(Equal(0)) 314 }) 315 }) 316 }) 317 318 Describe("PollGoMetricsUntilStop", func() { 319 var ( 320 m *kafka.Metrics 321 stopChannel chan struct{} 322 iterations int 323 ) 324 325 BeforeEach(func() { 326 fakeMetricsRegistry.EachStub = func(func(string, interface{})) { 327 iterations++ 328 if iterations > 5 { 329 close(stopChannel) 330 } 331 } 332 m = &kafka.Metrics{ 333 GoMetricsRegistry: fakeMetricsRegistry, 334 } 335 stopChannel = make(chan struct{}) 336 }) 337 338 It("polls the go metrics until the stop channel closes", func() { 339 m.PollGoMetricsUntilStop(time.Millisecond, stopChannel) 340 Expect(iterations).To(BeNumerically(">", 5)) 341 }) 342 }) 343 })