github.com/kaituanwang/hyperledger@v2.0.1+incompatible/common/ledger/blkstorage/fsblkstorage/metrics_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 SPDX-License-Identifier: Apache-2.0 4 */ 5 6 package fsblkstorage 7 8 import ( 9 "testing" 10 "time" 11 12 "github.com/hyperledger/fabric/common/ledger/testutil" 13 "github.com/hyperledger/fabric/common/metrics" 14 "github.com/hyperledger/fabric/common/metrics/metricsfakes" 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func TestStatsBlockchainHeight(t *testing.T) { 19 testMetricProvider := testutilConstructMetricProvider() 20 env := newTestEnvWithMetricsProvider(t, NewConf(testPath(), 0), testMetricProvider.fakeProvider) 21 defer env.Cleanup() 22 23 provider := env.provider 24 ledgerid := "ledger-stats" 25 store, err := provider.OpenBlockStore(ledgerid) 26 assert.NoError(t, err) 27 defer store.Shutdown() 28 29 // add genesis block 30 blockGenerator, genesisBlock := testutil.NewBlockGenerator(t, "testchannelid", false) 31 err = store.AddBlock(genesisBlock) 32 assert.NoError(t, err) 33 34 // add one more block 35 b1 := blockGenerator.NextBlock([][]byte{}) 36 err = store.AddBlock(b1) 37 assert.NoError(t, err) 38 39 // should have 3 calls for fakeBlockchainHeightGauge: OpenBlockStore, genesis block, and block b1 40 fakeBlockchainHeightGauge := testMetricProvider.fakeBlockchainHeightGauge 41 expectedCallCount := 3 42 assert.Equal(t, expectedCallCount, fakeBlockchainHeightGauge.SetCallCount()) 43 44 // verify the call for OpenBlockStore 45 assert.Equal(t, float64(0), fakeBlockchainHeightGauge.SetArgsForCall(0)) 46 assert.Equal(t, []string{"channel", ledgerid}, fakeBlockchainHeightGauge.WithArgsForCall(0)) 47 48 // verify the call for adding genesis block 49 assert.Equal(t, float64(1), fakeBlockchainHeightGauge.SetArgsForCall(1)) 50 assert.Equal(t, []string{"channel", ledgerid}, fakeBlockchainHeightGauge.WithArgsForCall(1)) 51 52 // verify the call for adding block b1 53 assert.Equal(t, float64(2), fakeBlockchainHeightGauge.SetArgsForCall(2)) 54 assert.Equal(t, []string{"channel", ledgerid}, fakeBlockchainHeightGauge.WithArgsForCall(2)) 55 56 // shutdown and reopen the store to verify blockchain height 57 store.Shutdown() 58 store, err = provider.OpenBlockStore(ledgerid) 59 assert.NoError(t, err) 60 61 // verify the call when opening an existing ledger - should set height correctly 62 assert.Equal(t, float64(2), fakeBlockchainHeightGauge.SetArgsForCall(3)) 63 assert.Equal(t, []string{"channel", ledgerid}, fakeBlockchainHeightGauge.WithArgsForCall(3)) 64 65 // invoke updateBlockStats api explicitly and verify the call with fake metrics 66 store.(*fsBlockStore).updateBlockStats(10, 1*time.Second) 67 assert.Equal(t, float64(11), fakeBlockchainHeightGauge.SetArgsForCall(4)) 68 assert.Equal(t, []string{"channel", ledgerid}, fakeBlockchainHeightGauge.WithArgsForCall(4)) 69 } 70 71 func TestStatsBlockCommit(t *testing.T) { 72 testMetricProvider := testutilConstructMetricProvider() 73 env := newTestEnvWithMetricsProvider(t, NewConf(testPath(), 0), testMetricProvider.fakeProvider) 74 defer env.Cleanup() 75 76 provider := env.provider 77 ledgerid := "ledger-stats" 78 store, err := provider.OpenBlockStore(ledgerid) 79 assert.NoError(t, err) 80 defer store.Shutdown() 81 82 // add a genesis block 83 blockGenerator, genesisBlock := testutil.NewBlockGenerator(t, "testchannelid", false) 84 err = store.AddBlock(genesisBlock) 85 assert.NoError(t, err) 86 87 // add 3 more blocks 88 for i := 1; i <= 3; i++ { 89 b := blockGenerator.NextBlock([][]byte{}) 90 err = store.AddBlock(b) 91 assert.NoError(t, err) 92 } 93 94 fakeBlockstorageCommitTimeHist := testMetricProvider.fakeBlockstorageCommitTimeHist 95 96 // should have 4 calls to fakeBlockstorageCommitTimeHist: genesis block, and 3 blocks 97 expectedCallCount := 1 + 3 98 assert.Equal(t, expectedCallCount, fakeBlockstorageCommitTimeHist.ObserveCallCount()) 99 100 // verify the value of channel in each call (0, 1, 2, 3) 101 for i := 0; i < expectedCallCount; i++ { 102 assert.Equal(t, []string{"channel", ledgerid}, fakeBlockstorageCommitTimeHist.WithArgsForCall(i)) 103 } 104 105 // invoke updateBlockStats api explicitly and verify with fake metrics (call number is 4) 106 store.(*fsBlockStore).updateBlockStats(4, 10*time.Second) 107 assert.Equal(t, 108 []string{"channel", ledgerid}, 109 testMetricProvider.fakeBlockstorageCommitTimeHist.WithArgsForCall(4), 110 ) 111 assert.Equal(t, 112 float64(10), 113 testMetricProvider.fakeBlockstorageCommitTimeHist.ObserveArgsForCall(4), 114 ) 115 } 116 117 type testMetricProvider struct { 118 fakeProvider *metricsfakes.Provider 119 fakeBlockchainHeightGauge *metricsfakes.Gauge 120 fakeBlockstorageCommitTimeHist *metricsfakes.Histogram 121 } 122 123 func testutilConstructMetricProvider() *testMetricProvider { 124 fakeProvider := &metricsfakes.Provider{} 125 fakeBlockchainHeightGauge := testutilConstructGauge() 126 fakeBlockstorageCommitTimeHist := testutilConstructHist() 127 fakeProvider.NewGaugeStub = func(opts metrics.GaugeOpts) metrics.Gauge { 128 switch opts.Name { 129 case blockchainHeightOpts.Name: 130 return fakeBlockchainHeightGauge 131 default: 132 return nil 133 } 134 } 135 fakeProvider.NewHistogramStub = func(opts metrics.HistogramOpts) metrics.Histogram { 136 switch opts.Name { 137 case blockstorageCommitTimeOpts.Name: 138 return fakeBlockstorageCommitTimeHist 139 default: 140 return nil 141 } 142 } 143 144 return &testMetricProvider{ 145 fakeProvider, 146 fakeBlockchainHeightGauge, 147 fakeBlockstorageCommitTimeHist, 148 } 149 } 150 151 func testutilConstructGauge() *metricsfakes.Gauge { 152 fakeGauge := &metricsfakes.Gauge{} 153 fakeGauge.WithStub = func(lableValues ...string) metrics.Gauge { 154 return fakeGauge 155 } 156 return fakeGauge 157 } 158 159 func testutilConstructHist() *metricsfakes.Histogram { 160 fakeHist := &metricsfakes.Histogram{} 161 fakeHist.WithStub = func(lableValues ...string) metrics.Histogram { 162 return fakeHist 163 } 164 return fakeHist 165 }