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