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  }