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  })