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  }