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