github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/metrics_test.go (about)

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