github.com/MetalBlockchain/subnet-evm@v0.4.9/sync/handlers/stats/stats.go (about)

     1  // (c) 2021-2022, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package stats
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/MetalBlockchain/subnet-evm/metrics"
    10  )
    11  
    12  // HandlerStats reports prometheus metrics for the state sync handlers
    13  type HandlerStats interface {
    14  	BlockRequestHandlerStats
    15  	CodeRequestHandlerStats
    16  	LeafsRequestHandlerStats
    17  }
    18  
    19  type BlockRequestHandlerStats interface {
    20  	IncBlockRequest()
    21  	IncMissingBlockHash()
    22  	UpdateBlocksReturned(num uint16)
    23  	UpdateBlockRequestProcessingTime(duration time.Duration)
    24  }
    25  
    26  type CodeRequestHandlerStats interface {
    27  	IncCodeRequest()
    28  	IncMissingCodeHash()
    29  	IncTooManyHashesRequested()
    30  	IncDuplicateHashesRequested()
    31  	UpdateCodeReadTime(duration time.Duration)
    32  	UpdateCodeBytesReturned(bytes uint32)
    33  }
    34  
    35  type LeafsRequestHandlerStats interface {
    36  	IncLeafsRequest()
    37  	IncInvalidLeafsRequest()
    38  	UpdateLeafsReturned(numLeafs uint16)
    39  	UpdateLeafsRequestProcessingTime(duration time.Duration)
    40  	UpdateReadLeafsTime(duration time.Duration)
    41  	UpdateSnapshotReadTime(duration time.Duration)
    42  	UpdateGenerateRangeProofTime(duration time.Duration)
    43  	UpdateRangeProofValsReturned(numProofVals int64)
    44  	IncMissingRoot()
    45  	IncTrieError()
    46  	IncProofError()
    47  	IncSnapshotReadError()
    48  	IncSnapshotReadAttempt()
    49  	IncSnapshotReadSuccess()
    50  	IncSnapshotSegmentValid()
    51  	IncSnapshotSegmentInvalid()
    52  }
    53  
    54  type handlerStats struct {
    55  	// BlockRequestHandler metrics
    56  	blockRequest               metrics.Counter
    57  	missingBlockHash           metrics.Counter
    58  	blocksReturned             metrics.Histogram
    59  	blockRequestProcessingTime metrics.Timer
    60  
    61  	// CodeRequestHandler stats
    62  	codeRequest              metrics.Counter
    63  	missingCodeHash          metrics.Counter
    64  	tooManyHashesRequested   metrics.Counter
    65  	duplicateHashesRequested metrics.Counter
    66  	codeBytesReturned        metrics.Histogram
    67  	codeReadDuration         metrics.Timer
    68  
    69  	// LeafsRequestHandler stats
    70  	leafsRequest               metrics.Counter
    71  	invalidLeafsRequest        metrics.Counter
    72  	leafsReturned              metrics.Histogram
    73  	leafsRequestProcessingTime metrics.Timer
    74  	leafsReadTime              metrics.Timer
    75  	snapshotReadTime           metrics.Timer
    76  	generateRangeProofTime     metrics.Timer
    77  	proofValsReturned          metrics.Histogram
    78  	missingRoot                metrics.Counter
    79  	trieError                  metrics.Counter
    80  	proofError                 metrics.Counter
    81  	snapshotReadError          metrics.Counter
    82  	snapshotReadAttempt        metrics.Counter
    83  	snapshotReadSuccess        metrics.Counter
    84  	snapshotSegmentValid       metrics.Counter
    85  	snapshotSegmentInvalid     metrics.Counter
    86  }
    87  
    88  func (h *handlerStats) IncBlockRequest() {
    89  	h.blockRequest.Inc(1)
    90  }
    91  
    92  func (h *handlerStats) IncMissingBlockHash() {
    93  	h.missingBlockHash.Inc(1)
    94  }
    95  
    96  func (h *handlerStats) UpdateBlocksReturned(num uint16) {
    97  	h.blocksReturned.Update(int64(num))
    98  }
    99  
   100  func (h *handlerStats) UpdateBlockRequestProcessingTime(duration time.Duration) {
   101  	h.blockRequestProcessingTime.Update(duration)
   102  }
   103  
   104  func (h *handlerStats) IncCodeRequest() {
   105  	h.codeRequest.Inc(1)
   106  }
   107  
   108  func (h *handlerStats) IncMissingCodeHash() {
   109  	h.missingCodeHash.Inc(1)
   110  }
   111  
   112  func (h *handlerStats) IncTooManyHashesRequested() {
   113  	h.tooManyHashesRequested.Inc(1)
   114  }
   115  
   116  func (h *handlerStats) IncDuplicateHashesRequested() {
   117  	h.duplicateHashesRequested.Inc(1)
   118  }
   119  
   120  func (h *handlerStats) UpdateCodeReadTime(duration time.Duration) {
   121  	h.codeReadDuration.Update(duration)
   122  }
   123  
   124  func (h *handlerStats) UpdateCodeBytesReturned(bytesLen uint32) {
   125  	h.codeBytesReturned.Update(int64(bytesLen))
   126  }
   127  
   128  func (h *handlerStats) IncLeafsRequest() {
   129  	h.leafsRequest.Inc(1)
   130  }
   131  
   132  func (h *handlerStats) IncInvalidLeafsRequest() {
   133  	h.invalidLeafsRequest.Inc(1)
   134  }
   135  
   136  func (h *handlerStats) UpdateLeafsRequestProcessingTime(duration time.Duration) {
   137  	h.leafsRequestProcessingTime.Update(duration)
   138  }
   139  
   140  func (h *handlerStats) UpdateLeafsReturned(numLeafs uint16) {
   141  	h.leafsReturned.Update(int64(numLeafs))
   142  }
   143  
   144  func (h *handlerStats) UpdateReadLeafsTime(duration time.Duration) {
   145  	h.leafsReadTime.Update(duration)
   146  }
   147  
   148  func (h *handlerStats) UpdateSnapshotReadTime(duration time.Duration) {
   149  	h.snapshotReadTime.Update(duration)
   150  }
   151  
   152  func (h *handlerStats) UpdateGenerateRangeProofTime(duration time.Duration) {
   153  	h.generateRangeProofTime.Update(duration)
   154  }
   155  
   156  func (h *handlerStats) UpdateRangeProofValsReturned(numProofVals int64) {
   157  	h.proofValsReturned.Update(numProofVals)
   158  }
   159  
   160  func (h *handlerStats) IncMissingRoot()            { h.missingRoot.Inc(1) }
   161  func (h *handlerStats) IncTrieError()              { h.trieError.Inc(1) }
   162  func (h *handlerStats) IncProofError()             { h.proofError.Inc(1) }
   163  func (h *handlerStats) IncSnapshotReadError()      { h.snapshotReadError.Inc(1) }
   164  func (h *handlerStats) IncSnapshotReadAttempt()    { h.snapshotReadAttempt.Inc(1) }
   165  func (h *handlerStats) IncSnapshotReadSuccess()    { h.snapshotReadSuccess.Inc(1) }
   166  func (h *handlerStats) IncSnapshotSegmentValid()   { h.snapshotSegmentValid.Inc(1) }
   167  func (h *handlerStats) IncSnapshotSegmentInvalid() { h.snapshotSegmentInvalid.Inc(1) }
   168  
   169  func NewHandlerStats(enabled bool) HandlerStats {
   170  	if !enabled {
   171  		return NewNoopHandlerStats()
   172  	}
   173  	return &handlerStats{
   174  		// initialize block request stats
   175  		blockRequest:               metrics.GetOrRegisterCounter("block_request_count", nil),
   176  		missingBlockHash:           metrics.GetOrRegisterCounter("block_request_missing_block_hash", nil),
   177  		blocksReturned:             metrics.GetOrRegisterHistogram("block_request_total_blocks", nil, metrics.NewExpDecaySample(1028, 0.015)),
   178  		blockRequestProcessingTime: metrics.GetOrRegisterTimer("block_request_processing_time", nil),
   179  
   180  		// initialize code request stats
   181  		codeRequest:              metrics.GetOrRegisterCounter("code_request_count", nil),
   182  		missingCodeHash:          metrics.GetOrRegisterCounter("code_request_missing_code_hash", nil),
   183  		tooManyHashesRequested:   metrics.GetOrRegisterCounter("code_request_too_many_hashes", nil),
   184  		duplicateHashesRequested: metrics.GetOrRegisterCounter("code_request_duplicate_hashes", nil),
   185  		codeReadDuration:         metrics.GetOrRegisterTimer("code_request_read_time", nil),
   186  		codeBytesReturned:        metrics.GetOrRegisterHistogram("code_request_bytes_returned", nil, metrics.NewExpDecaySample(1028, 0.015)),
   187  
   188  		// initialize leafs request stats
   189  		leafsRequest:               metrics.GetOrRegisterCounter("leafs_request_count", nil),
   190  		invalidLeafsRequest:        metrics.GetOrRegisterCounter("leafs_request_invalid", nil),
   191  		leafsRequestProcessingTime: metrics.GetOrRegisterTimer("leafs_request_processing_time", nil),
   192  		leafsReturned:              metrics.GetOrRegisterHistogram("leafs_request_total_leafs", nil, metrics.NewExpDecaySample(1028, 0.015)),
   193  		leafsReadTime:              metrics.GetOrRegisterTimer("leafs_request_read_time", nil),
   194  		snapshotReadTime:           metrics.GetOrRegisterTimer("leafs_request_snapshot_read_time", nil),
   195  		generateRangeProofTime:     metrics.GetOrRegisterTimer("leafs_request_generate_range_proof_time", nil),
   196  		proofValsReturned:          metrics.GetOrRegisterHistogram("leafs_request_proof_vals_returned", nil, metrics.NewExpDecaySample(1028, 0.015)),
   197  		missingRoot:                metrics.GetOrRegisterCounter("leafs_request_missing_root", nil),
   198  		trieError:                  metrics.GetOrRegisterCounter("leafs_request_trie_error", nil),
   199  		proofError:                 metrics.GetOrRegisterCounter("leafs_request_proof_error", nil),
   200  		snapshotReadError:          metrics.GetOrRegisterCounter("leafs_request_snapshot_read_error", nil),
   201  		snapshotReadAttempt:        metrics.GetOrRegisterCounter("leafs_request_snapshot_read_attempt", nil),
   202  		snapshotReadSuccess:        metrics.GetOrRegisterCounter("leafs_request_snapshot_read_success", nil),
   203  		snapshotSegmentValid:       metrics.GetOrRegisterCounter("leafs_request_snapshot_segment_valid", nil),
   204  		snapshotSegmentInvalid:     metrics.GetOrRegisterCounter("leafs_request_snapshot_segment_invalid", nil),
   205  	}
   206  }
   207  
   208  // no op implementation
   209  type noopHandlerStats struct{}
   210  
   211  func NewNoopHandlerStats() HandlerStats {
   212  	return &noopHandlerStats{}
   213  }
   214  
   215  // all operations are no-ops
   216  func (n *noopHandlerStats) IncBlockRequest()                                    {}
   217  func (n *noopHandlerStats) IncMissingBlockHash()                                {}
   218  func (n *noopHandlerStats) UpdateBlocksReturned(uint16)                         {}
   219  func (n *noopHandlerStats) UpdateBlockRequestProcessingTime(time.Duration)      {}
   220  func (n *noopHandlerStats) IncCodeRequest()                                     {}
   221  func (n *noopHandlerStats) IncMissingCodeHash()                                 {}
   222  func (n *noopHandlerStats) IncTooManyHashesRequested()                          {}
   223  func (n *noopHandlerStats) IncDuplicateHashesRequested()                        {}
   224  func (n *noopHandlerStats) UpdateCodeReadTime(time.Duration)                    {}
   225  func (n *noopHandlerStats) UpdateCodeBytesReturned(uint32)                      {}
   226  func (n *noopHandlerStats) IncLeafsRequest()                                    {}
   227  func (n *noopHandlerStats) IncInvalidLeafsRequest()                             {}
   228  func (n *noopHandlerStats) UpdateLeafsRequestProcessingTime(time.Duration)      {}
   229  func (n *noopHandlerStats) UpdateLeafsReturned(uint16)                          {}
   230  func (n *noopHandlerStats) UpdateReadLeafsTime(duration time.Duration)          {}
   231  func (n *noopHandlerStats) UpdateSnapshotReadTime(duration time.Duration)       {}
   232  func (n *noopHandlerStats) UpdateGenerateRangeProofTime(duration time.Duration) {}
   233  func (n *noopHandlerStats) UpdateRangeProofValsReturned(numProofVals int64)     {}
   234  func (n *noopHandlerStats) IncMissingRoot()                                     {}
   235  func (n *noopHandlerStats) IncTrieError()                                       {}
   236  func (n *noopHandlerStats) IncProofError()                                      {}
   237  func (n *noopHandlerStats) IncSnapshotReadError()                               {}
   238  func (n *noopHandlerStats) IncSnapshotReadAttempt()                             {}
   239  func (n *noopHandlerStats) IncSnapshotReadSuccess()                             {}
   240  func (n *noopHandlerStats) IncSnapshotSegmentValid()                            {}
   241  func (n *noopHandlerStats) IncSnapshotSegmentInvalid()                          {}