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() {}