github.com/kaituanwang/hyperledger@v2.0.1+incompatible/core/ledger/kvledger/metrics_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 SPDX-License-Identifier: Apache-2.0 4 */ 5 6 package kvledger 7 8 import ( 9 "testing" 10 "time" 11 12 "github.com/hyperledger/fabric-protos-go/common" 13 "github.com/hyperledger/fabric-protos-go/peer" 14 "github.com/hyperledger/fabric/bccsp/sw" 15 "github.com/hyperledger/fabric/common/ledger/testutil" 16 "github.com/hyperledger/fabric/common/metrics" 17 "github.com/hyperledger/fabric/common/metrics/metricsfakes" 18 lgr "github.com/hyperledger/fabric/core/ledger" 19 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/txmgr" 20 "github.com/hyperledger/fabric/core/ledger/mock" 21 "github.com/stretchr/testify/assert" 22 ) 23 24 func TestStatsBlockCommit(t *testing.T) { 25 conf, cleanup := testConfig(t) 26 defer cleanup() 27 testMetricProvider := testutilConstructMetricProvider() 28 29 cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore()) 30 assert.NoError(t, err) 31 provider, err := NewProvider( 32 &lgr.Initializer{ 33 DeployedChaincodeInfoProvider: &mock.DeployedChaincodeInfoProvider{}, 34 MetricsProvider: testMetricProvider.fakeProvider, 35 Config: conf, 36 Hasher: cryptoProvider, 37 }, 38 ) 39 if err != nil { 40 t.Fatalf("Failed to create new Provider: %s", err) 41 } 42 defer provider.Close() 43 44 // create a ledger 45 ledgerid := "ledger1" 46 _, gb := testutil.NewBlockGenerator(t, ledgerid, false) 47 l, err := provider.Create(gb) 48 assert.NoError(t, err) 49 ledger := l.(*kvLedger) 50 defer ledger.Close() 51 52 // calls during committing genesis block 53 assert.Equal(t, 54 []string{"channel", ledgerid}, 55 testMetricProvider.fakeBlockProcessingTimeHist.WithArgsForCall(0), 56 ) 57 assert.Equal(t, 58 []string{"channel", ledgerid}, 59 testMetricProvider.fakeBlockstorageCommitWithPvtDataTimeHist.WithArgsForCall(0), 60 ) 61 assert.Equal(t, 62 []string{"channel", ledgerid}, 63 testMetricProvider.fakeStatedbCommitTimeHist.WithArgsForCall(0), 64 ) 65 assert.Equal(t, 66 []string{ 67 "channel", ledgerid, 68 "transaction_type", common.HeaderType_CONFIG.String(), 69 "chaincode", "unknown", 70 "validation_code", peer.TxValidationCode_VALID.String(), 71 }, 72 testMetricProvider.fakeTransactionsCount.WithArgsForCall(0), 73 ) 74 75 // invoke updateBlockStats api explicitly and verify the calls with fake metrics 76 ledger.updateBlockStats( 77 1*time.Second, 2*time.Second, 3*time.Second, 78 []*txmgr.TxStatInfo{ 79 { 80 ValidationCode: peer.TxValidationCode_VALID, 81 TxType: common.HeaderType_ENDORSER_TRANSACTION, 82 ChaincodeID: &peer.ChaincodeID{Name: "mycc", Version: "1.0"}, 83 NumCollections: 2, 84 }, 85 { 86 ValidationCode: peer.TxValidationCode_INVALID_OTHER_REASON, 87 TxType: -1, 88 }, 89 }, 90 ) 91 assert.Equal(t, 92 []string{"channel", ledgerid}, 93 testMetricProvider.fakeBlockProcessingTimeHist.WithArgsForCall(1), 94 ) 95 assert.Equal(t, 96 float64(1), 97 testMetricProvider.fakeBlockProcessingTimeHist.ObserveArgsForCall(1), 98 ) 99 assert.Equal(t, 100 []string{"channel", ledgerid}, 101 testMetricProvider.fakeBlockstorageCommitWithPvtDataTimeHist.WithArgsForCall(1), 102 ) 103 assert.Equal(t, 104 float64(2), 105 testMetricProvider.fakeBlockstorageCommitWithPvtDataTimeHist.ObserveArgsForCall(1), 106 ) 107 assert.Equal(t, 108 []string{"channel", ledgerid}, 109 testMetricProvider.fakeStatedbCommitTimeHist.WithArgsForCall(1), 110 ) 111 assert.Equal(t, 112 float64(3), 113 testMetricProvider.fakeStatedbCommitTimeHist.ObserveArgsForCall(1), 114 ) 115 assert.Equal(t, 116 []string{ 117 "channel", ledgerid, 118 "transaction_type", common.HeaderType_ENDORSER_TRANSACTION.String(), 119 "chaincode", "mycc:1.0", 120 "validation_code", peer.TxValidationCode_VALID.String(), 121 }, 122 testMetricProvider.fakeTransactionsCount.WithArgsForCall(1), 123 ) 124 assert.Equal(t, 125 float64(1), 126 testMetricProvider.fakeTransactionsCount.AddArgsForCall(1), 127 ) 128 129 assert.Equal(t, 130 []string{ 131 "channel", ledgerid, 132 "transaction_type", "unknown", 133 "chaincode", "unknown", 134 "validation_code", peer.TxValidationCode_INVALID_OTHER_REASON.String(), 135 }, 136 testMetricProvider.fakeTransactionsCount.WithArgsForCall(2), 137 ) 138 assert.Equal(t, 139 float64(1), 140 testMetricProvider.fakeTransactionsCount.AddArgsForCall(2), 141 ) 142 } 143 144 type testMetricProvider struct { 145 fakeProvider *metricsfakes.Provider 146 fakeBlockProcessingTimeHist *metricsfakes.Histogram 147 fakeBlockstorageCommitWithPvtDataTimeHist *metricsfakes.Histogram 148 fakeStatedbCommitTimeHist *metricsfakes.Histogram 149 fakeTransactionsCount *metricsfakes.Counter 150 } 151 152 func testutilConstructMetricProvider() *testMetricProvider { 153 fakeProvider := &metricsfakes.Provider{} 154 fakeBlockProcessingTimeHist := testutilConstructHist() 155 fakeBlockstorageCommitWithPvtDataTimeHist := testutilConstructHist() 156 fakeStatedbCommitTimeHist := testutilConstructHist() 157 fakeTransactionsCount := testutilConstructCounter() 158 fakeProvider.NewGaugeStub = func(opts metrics.GaugeOpts) metrics.Gauge { 159 // return a gauge for metrics in common/ledger 160 return testutilConstructGauge() 161 } 162 fakeProvider.NewHistogramStub = func(opts metrics.HistogramOpts) metrics.Histogram { 163 switch opts.Name { 164 case blockProcessingTimeOpts.Name: 165 return fakeBlockProcessingTimeHist 166 case blockAndPvtdataStoreCommitTimeOpts.Name: 167 return fakeBlockstorageCommitWithPvtDataTimeHist 168 case statedbCommitTimeOpts.Name: 169 return fakeStatedbCommitTimeHist 170 default: 171 // return a histogram for metrics in common/ledger 172 return testutilConstructHist() 173 } 174 } 175 176 fakeProvider.NewCounterStub = func(opts metrics.CounterOpts) metrics.Counter { 177 switch opts.Name { 178 case transactionCountOpts.Name: 179 return fakeTransactionsCount 180 } 181 return nil 182 } 183 return &testMetricProvider{ 184 fakeProvider, 185 fakeBlockProcessingTimeHist, 186 fakeBlockstorageCommitWithPvtDataTimeHist, 187 fakeStatedbCommitTimeHist, 188 fakeTransactionsCount, 189 } 190 } 191 192 func testutilConstructGauge() *metricsfakes.Gauge { 193 fakeGauge := &metricsfakes.Gauge{} 194 fakeGauge.WithStub = func(lableValues ...string) metrics.Gauge { 195 return fakeGauge 196 } 197 return fakeGauge 198 } 199 200 func testutilConstructHist() *metricsfakes.Histogram { 201 fakeHist := &metricsfakes.Histogram{} 202 fakeHist.WithStub = func(lableValues ...string) metrics.Histogram { 203 return fakeHist 204 } 205 return fakeHist 206 } 207 208 func testutilConstructCounter() *metricsfakes.Counter { 209 fakeCounter := &metricsfakes.Counter{} 210 fakeCounter.WithStub = func(lableValues ...string) metrics.Counter { 211 return fakeCounter 212 } 213 return fakeCounter 214 }