diff --git a/core/blockchain.go b/core/blockchain.go index 81806728a5..595a6a17a3 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -58,45 +58,57 @@ import ( "github.com/ava-labs/libevm/metrics" "github.com/ava-labs/libevm/trie" "github.com/ava-labs/libevm/triedb" + + // Force libevm metrics of the same name to be registered first. + _ "github.com/ava-labs/libevm/core" ) +// ====== If resolving merge conflicts ====== +// +// All calls to metrics.NewRegistered*() have been replaced with +// metrics.GetOrRegister*() and this package's corresponding libevm package +// imported above. Together these ensure that the metric here is the same as the +// one with the same name in libevm. +// +// Note, however, those that have had their types overridden as +// [metrics.Counter]. var ( - accountReadTimer = metrics.NewRegisteredCounter("chain/account/reads", nil) - accountHashTimer = metrics.NewRegisteredCounter("chain/account/hashes", nil) - accountUpdateTimer = metrics.NewRegisteredCounter("chain/account/updates", nil) - accountCommitTimer = metrics.NewRegisteredCounter("chain/account/commits", nil) - storageReadTimer = metrics.NewRegisteredCounter("chain/storage/reads", nil) - storageHashTimer = metrics.NewRegisteredCounter("chain/storage/hashes", nil) - storageUpdateTimer = metrics.NewRegisteredCounter("chain/storage/updates", nil) - storageCommitTimer = metrics.NewRegisteredCounter("chain/storage/commits", nil) - snapshotAccountReadTimer = metrics.NewRegisteredCounter("chain/snapshot/account/reads", nil) - snapshotStorageReadTimer = metrics.NewRegisteredCounter("chain/snapshot/storage/reads", nil) - snapshotCommitTimer = metrics.NewRegisteredCounter("chain/snapshot/commits", nil) - - triedbCommitTimer = metrics.NewRegisteredCounter("chain/triedb/commits", nil) - - blockInsertTimer = metrics.NewRegisteredCounter("chain/block/inserts", nil) - blockInsertCount = metrics.NewRegisteredCounter("chain/block/inserts/count", nil) - blockContentValidationTimer = metrics.NewRegisteredCounter("chain/block/validations/content", nil) - blockStateInitTimer = metrics.NewRegisteredCounter("chain/block/inits/state", nil) - blockExecutionTimer = metrics.NewRegisteredCounter("chain/block/executions", nil) - blockTrieOpsTimer = metrics.NewRegisteredCounter("chain/block/trie", nil) - blockValidationTimer = metrics.NewRegisteredCounter("chain/block/validations/state", nil) - blockWriteTimer = metrics.NewRegisteredCounter("chain/block/writes", nil) - - acceptorQueueGauge = metrics.NewRegisteredGauge("chain/acceptor/queue/size", nil) - acceptorWorkTimer = metrics.NewRegisteredCounter("chain/acceptor/work", nil) - acceptorWorkCount = metrics.NewRegisteredCounter("chain/acceptor/work/count", nil) - processedBlockGasUsedCounter = metrics.NewRegisteredCounter("chain/block/gas/used/processed", nil) - acceptedBlockGasUsedCounter = metrics.NewRegisteredCounter("chain/block/gas/used/accepted", nil) - badBlockCounter = metrics.NewRegisteredCounter("chain/block/bad/count", nil) - - txUnindexTimer = metrics.NewRegisteredCounter("chain/txs/unindex", nil) - acceptedTxsCounter = metrics.NewRegisteredCounter("chain/txs/accepted", nil) - processedTxsCounter = metrics.NewRegisteredCounter("chain/txs/processed", nil) - - acceptedLogsCounter = metrics.NewRegisteredCounter("chain/logs/accepted", nil) - processedLogsCounter = metrics.NewRegisteredCounter("chain/logs/processed", nil) + accountReadTimer = getOrOverrideAsRegisteredCounter("chain/account/reads", nil) + accountHashTimer = getOrOverrideAsRegisteredCounter("chain/account/hashes", nil) + accountUpdateTimer = getOrOverrideAsRegisteredCounter("chain/account/updates", nil) + accountCommitTimer = getOrOverrideAsRegisteredCounter("chain/account/commits", nil) + storageReadTimer = getOrOverrideAsRegisteredCounter("chain/storage/reads", nil) + storageHashTimer = getOrOverrideAsRegisteredCounter("chain/storage/hashes", nil) + storageUpdateTimer = getOrOverrideAsRegisteredCounter("chain/storage/updates", nil) + storageCommitTimer = getOrOverrideAsRegisteredCounter("chain/storage/commits", nil) + snapshotAccountReadTimer = getOrOverrideAsRegisteredCounter("chain/snapshot/account/reads", nil) + snapshotStorageReadTimer = getOrOverrideAsRegisteredCounter("chain/snapshot/storage/reads", nil) + snapshotCommitTimer = getOrOverrideAsRegisteredCounter("chain/snapshot/commits", nil) + + triedbCommitTimer = getOrOverrideAsRegisteredCounter("chain/triedb/commits", nil) + + blockInsertTimer = metrics.GetOrRegisterCounter("chain/block/inserts", nil) + blockInsertCount = metrics.GetOrRegisterCounter("chain/block/inserts/count", nil) + blockContentValidationTimer = metrics.GetOrRegisterCounter("chain/block/validations/content", nil) + blockStateInitTimer = metrics.GetOrRegisterCounter("chain/block/inits/state", nil) + blockExecutionTimer = metrics.GetOrRegisterCounter("chain/block/executions", nil) + blockTrieOpsTimer = metrics.GetOrRegisterCounter("chain/block/trie", nil) + blockValidationTimer = metrics.GetOrRegisterCounter("chain/block/validations/state", nil) + blockWriteTimer = metrics.GetOrRegisterCounter("chain/block/writes", nil) + + acceptorQueueGauge = metrics.GetOrRegisterGauge("chain/acceptor/queue/size", nil) + acceptorWorkTimer = metrics.GetOrRegisterCounter("chain/acceptor/work", nil) + acceptorWorkCount = metrics.GetOrRegisterCounter("chain/acceptor/work/count", nil) + processedBlockGasUsedCounter = metrics.GetOrRegisterCounter("chain/block/gas/used/processed", nil) + acceptedBlockGasUsedCounter = metrics.GetOrRegisterCounter("chain/block/gas/used/accepted", nil) + badBlockCounter = metrics.GetOrRegisterCounter("chain/block/bad/count", nil) + + txUnindexTimer = metrics.GetOrRegisterCounter("chain/txs/unindex", nil) + acceptedTxsCounter = metrics.GetOrRegisterCounter("chain/txs/accepted", nil) + processedTxsCounter = metrics.GetOrRegisterCounter("chain/txs/processed", nil) + + acceptedLogsCounter = metrics.GetOrRegisterCounter("chain/logs/accepted", nil) + processedLogsCounter = metrics.GetOrRegisterCounter("chain/logs/processed", nil) ErrRefuseToCorruptArchiver = errors.New("node has operated with pruning disabled, shutting down to prevent missing tries") diff --git a/core/blockchain_ext.go b/core/blockchain_ext.go new file mode 100644 index 0000000000..db3d0dae00 --- /dev/null +++ b/core/blockchain_ext.go @@ -0,0 +1,27 @@ +// (c) 2024 Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. +package core + +import "github.com/ava-labs/libevm/metrics" + +// getOrOverrideAsRegisteredCounter searches for a metric already registered +// with`name`. If a metric is found and it is a Counter, it is returned. If a +// metric is found and it is not a Counter, it is unregistered and replaced with +// a new registered Counter. If no metric is found, a new Counter is constructed +// and registered. +// +// This is necessary for a metric defined in libevm with the same name but a +// different type to what we expect. +func getOrOverrideAsRegisteredCounter(name string, r metrics.Registry) metrics.Counter { + if r == nil { + r = metrics.DefaultRegistry + } + + switch c := r.GetOrRegister(name, metrics.NewCounter).(type) { + case metrics.Counter: + return c + default: // `name` must have already been registered to be any other type + r.Unregister(name) + return metrics.NewRegisteredCounter(name, r) + } +} diff --git a/core/main_test.go b/core/main_test.go index 6ea70c4b6c..28812d78a4 100644 --- a/core/main_test.go +++ b/core/main_test.go @@ -15,6 +15,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // No good way to shut down these goroutines: goleak.IgnoreTopFunction("github.com/ava-labs/coreth/core/state/snapshot.(*diskLayer).generate"), + goleak.IgnoreTopFunction("github.com/ava-labs/libevm/core.(*txSenderCacher).cache"), goleak.IgnoreTopFunction("github.com/ava-labs/libevm/metrics.(*meterArbiter).tick"), goleak.IgnoreTopFunction("github.com/syndtr/goleveldb/leveldb.(*DB).mpoolDrain"), } diff --git a/core/state/snapshot/snapshot.go b/core/state/snapshot/snapshot.go index 917bbf368c..06a16fc416 100644 --- a/core/state/snapshot/snapshot.go +++ b/core/state/snapshot/snapshot.go @@ -55,49 +55,55 @@ const ( skipGenThreshold = 500 * time.Millisecond ) +// ====== If resolving merge conflicts ====== +// +// All calls to metrics.NewRegistered*() have been replaced with +// metrics.GetOrRegister*() and this package's corresponding libevm package +// imported above. Together these ensure that the metric here is the same as the +// one with the same name in libevm. var ( - snapshotCleanAccountHitMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/hit", nil) - snapshotCleanAccountMissMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/miss", nil) - snapshotCleanAccountInexMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/inex", nil) - snapshotCleanAccountReadMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/read", nil) - snapshotCleanAccountWriteMeter = metrics.NewRegisteredMeter("state/snapshot/clean/account/write", nil) - - snapshotCleanStorageHitMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/hit", nil) - snapshotCleanStorageMissMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/miss", nil) - snapshotCleanStorageInexMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/inex", nil) - snapshotCleanStorageReadMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/read", nil) - snapshotCleanStorageWriteMeter = metrics.NewRegisteredMeter("state/snapshot/clean/storage/write", nil) - - snapshotDirtyAccountHitMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/hit", nil) - snapshotDirtyAccountMissMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/miss", nil) - snapshotDirtyAccountInexMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/inex", nil) - snapshotDirtyAccountReadMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/read", nil) - snapshotDirtyAccountWriteMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/account/write", nil) - - snapshotDirtyStorageHitMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/hit", nil) - snapshotDirtyStorageMissMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/miss", nil) - snapshotDirtyStorageInexMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/inex", nil) - snapshotDirtyStorageReadMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/read", nil) - snapshotDirtyStorageWriteMeter = metrics.NewRegisteredMeter("state/snapshot/dirty/storage/write", nil) - - snapshotDirtyAccountHitDepthHist = metrics.NewRegisteredHistogram("state/snapshot/dirty/account/hit/depth", nil, metrics.NewExpDecaySample(1028, 0.015)) - snapshotDirtyStorageHitDepthHist = metrics.NewRegisteredHistogram("state/snapshot/dirty/storage/hit/depth", nil, metrics.NewExpDecaySample(1028, 0.015)) - - snapshotFlushAccountItemMeter = metrics.NewRegisteredMeter("state/snapshot/flush/account/item", nil) - snapshotFlushAccountSizeMeter = metrics.NewRegisteredMeter("state/snapshot/flush/account/size", nil) - snapshotFlushStorageItemMeter = metrics.NewRegisteredMeter("state/snapshot/flush/storage/item", nil) - snapshotFlushStorageSizeMeter = metrics.NewRegisteredMeter("state/snapshot/flush/storage/size", nil) - - snapshotBloomIndexTimer = metrics.NewRegisteredResettingTimer("state/snapshot/bloom/index", nil) - snapshotBloomErrorGauge = metrics.NewRegisteredGaugeFloat64("state/snapshot/bloom/error", nil) - - snapshotBloomAccountTrueHitMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/account/truehit", nil) - snapshotBloomAccountFalseHitMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/account/falsehit", nil) - snapshotBloomAccountMissMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/account/miss", nil) - - snapshotBloomStorageTrueHitMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/storage/truehit", nil) - snapshotBloomStorageFalseHitMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/storage/falsehit", nil) - snapshotBloomStorageMissMeter = metrics.NewRegisteredMeter("state/snapshot/bloom/storage/miss", nil) + snapshotCleanAccountHitMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/account/hit", nil) + snapshotCleanAccountMissMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/account/miss", nil) + snapshotCleanAccountInexMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/account/inex", nil) + snapshotCleanAccountReadMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/account/read", nil) + snapshotCleanAccountWriteMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/account/write", nil) + + snapshotCleanStorageHitMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/storage/hit", nil) + snapshotCleanStorageMissMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/storage/miss", nil) + snapshotCleanStorageInexMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/storage/inex", nil) + snapshotCleanStorageReadMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/storage/read", nil) + snapshotCleanStorageWriteMeter = metrics.GetOrRegisterMeter("state/snapshot/clean/storage/write", nil) + + snapshotDirtyAccountHitMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/account/hit", nil) + snapshotDirtyAccountMissMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/account/miss", nil) + snapshotDirtyAccountInexMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/account/inex", nil) + snapshotDirtyAccountReadMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/account/read", nil) + snapshotDirtyAccountWriteMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/account/write", nil) + + snapshotDirtyStorageHitMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/storage/hit", nil) + snapshotDirtyStorageMissMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/storage/miss", nil) + snapshotDirtyStorageInexMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/storage/inex", nil) + snapshotDirtyStorageReadMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/storage/read", nil) + snapshotDirtyStorageWriteMeter = metrics.GetOrRegisterMeter("state/snapshot/dirty/storage/write", nil) + + snapshotDirtyAccountHitDepthHist = metrics.GetOrRegisterHistogram("state/snapshot/dirty/account/hit/depth", nil, metrics.NewExpDecaySample(1028, 0.015)) + snapshotDirtyStorageHitDepthHist = metrics.GetOrRegisterHistogram("state/snapshot/dirty/storage/hit/depth", nil, metrics.NewExpDecaySample(1028, 0.015)) + + snapshotFlushAccountItemMeter = metrics.GetOrRegisterMeter("state/snapshot/flush/account/item", nil) + snapshotFlushAccountSizeMeter = metrics.GetOrRegisterMeter("state/snapshot/flush/account/size", nil) + snapshotFlushStorageItemMeter = metrics.GetOrRegisterMeter("state/snapshot/flush/storage/item", nil) + snapshotFlushStorageSizeMeter = metrics.GetOrRegisterMeter("state/snapshot/flush/storage/size", nil) + + snapshotBloomIndexTimer = metrics.GetOrRegisterResettingTimer("state/snapshot/bloom/index", nil) + snapshotBloomErrorGauge = metrics.GetOrRegisterGaugeFloat64("state/snapshot/bloom/error", nil) + + snapshotBloomAccountTrueHitMeter = metrics.GetOrRegisterMeter("state/snapshot/bloom/account/truehit", nil) + snapshotBloomAccountFalseHitMeter = metrics.GetOrRegisterMeter("state/snapshot/bloom/account/falsehit", nil) + snapshotBloomAccountMissMeter = metrics.GetOrRegisterMeter("state/snapshot/bloom/account/miss", nil) + + snapshotBloomStorageTrueHitMeter = metrics.GetOrRegisterMeter("state/snapshot/bloom/storage/truehit", nil) + snapshotBloomStorageFalseHitMeter = metrics.GetOrRegisterMeter("state/snapshot/bloom/storage/falsehit", nil) + snapshotBloomStorageMissMeter = metrics.GetOrRegisterMeter("state/snapshot/bloom/storage/miss", nil) // ErrSnapshotStale is returned from data accessors if the underlying snapshot // layer had been invalidated due to the chain progressing forward far enough diff --git a/core/txpool/blobpool/metrics.go b/core/txpool/blobpool/metrics.go index ccd4dbb574..f4e9657945 100644 --- a/core/txpool/blobpool/metrics.go +++ b/core/txpool/blobpool/metrics.go @@ -26,22 +26,33 @@ package blobpool -import "github.com/ava-labs/libevm/metrics" +import ( + "github.com/ava-labs/libevm/metrics" + // Force libevm metrics of the same name to be registered first. + _ "github.com/ava-labs/libevm/core/txpool/blobpool" +) + +// ====== If resolving merge conflicts ====== +// +// All calls to metrics.NewRegistered*() have been replaced with +// metrics.GetOrRegister*() and this package's corresponding libevm package +// imported above. Together these ensure that the metric here is the same as the +// one with the same name in libevm. var ( // datacapGauge tracks the user's configured capacity for the blob pool. It // is mostly a way to expose/debug issues. - datacapGauge = metrics.NewRegisteredGauge("blobpool/datacap", nil) + datacapGauge = metrics.GetOrRegisterGauge("blobpool/datacap", nil) // The below metrics track the per-datastore metrics for the primary blob // store and the temporary limbo store. - datausedGauge = metrics.NewRegisteredGauge("blobpool/dataused", nil) - datarealGauge = metrics.NewRegisteredGauge("blobpool/datareal", nil) - slotusedGauge = metrics.NewRegisteredGauge("blobpool/slotused", nil) + datausedGauge = metrics.GetOrRegisterGauge("blobpool/dataused", nil) + datarealGauge = metrics.GetOrRegisterGauge("blobpool/datareal", nil) + slotusedGauge = metrics.GetOrRegisterGauge("blobpool/slotused", nil) - limboDatausedGauge = metrics.NewRegisteredGauge("blobpool/limbo/dataused", nil) - limboDatarealGauge = metrics.NewRegisteredGauge("blobpool/limbo/datareal", nil) - limboSlotusedGauge = metrics.NewRegisteredGauge("blobpool/limbo/slotused", nil) + limboDatausedGauge = metrics.GetOrRegisterGauge("blobpool/limbo/dataused", nil) + limboDatarealGauge = metrics.GetOrRegisterGauge("blobpool/limbo/datareal", nil) + limboSlotusedGauge = metrics.GetOrRegisterGauge("blobpool/limbo/slotused", nil) // The below metrics track the per-shelf metrics for the primary blob store // and the temporary limbo store. @@ -60,56 +71,56 @@ var ( // // There are no oversized data in the limbo, it only contains blobs and some // constant metadata. - oversizedDatausedGauge = metrics.NewRegisteredGauge("blobpool/oversized/dataused", nil) - oversizedDatagapsGauge = metrics.NewRegisteredGauge("blobpool/oversized/datagaps", nil) - oversizedSlotusedGauge = metrics.NewRegisteredGauge("blobpool/oversized/slotused", nil) - oversizedSlotgapsGauge = metrics.NewRegisteredGauge("blobpool/oversized/slotgaps", nil) + oversizedDatausedGauge = metrics.GetOrRegisterGauge("blobpool/oversized/dataused", nil) + oversizedDatagapsGauge = metrics.GetOrRegisterGauge("blobpool/oversized/datagaps", nil) + oversizedSlotusedGauge = metrics.GetOrRegisterGauge("blobpool/oversized/slotused", nil) + oversizedSlotgapsGauge = metrics.GetOrRegisterGauge("blobpool/oversized/slotgaps", nil) // basefeeGauge and blobfeeGauge track the current network 1559 base fee and // 4844 blob fee respectively. - basefeeGauge = metrics.NewRegisteredGauge("blobpool/basefee", nil) - blobfeeGauge = metrics.NewRegisteredGauge("blobpool/blobfee", nil) + basefeeGauge = metrics.GetOrRegisterGauge("blobpool/basefee", nil) + blobfeeGauge = metrics.GetOrRegisterGauge("blobpool/blobfee", nil) // pooltipGauge is the configurable miner tip to permit a transaction into // the pool. - pooltipGauge = metrics.NewRegisteredGauge("blobpool/pooltip", nil) + pooltipGauge = metrics.GetOrRegisterGauge("blobpool/pooltip", nil) // addwait/time, resetwait/time and getwait/time track the rough health of // the pool and whether it's capable of keeping up with the load from the // network. - addwaitHist = metrics.NewRegisteredHistogram("blobpool/addwait", nil, metrics.NewExpDecaySample(1028, 0.015)) - addtimeHist = metrics.NewRegisteredHistogram("blobpool/addtime", nil, metrics.NewExpDecaySample(1028, 0.015)) - getwaitHist = metrics.NewRegisteredHistogram("blobpool/getwait", nil, metrics.NewExpDecaySample(1028, 0.015)) - gettimeHist = metrics.NewRegisteredHistogram("blobpool/gettime", nil, metrics.NewExpDecaySample(1028, 0.015)) - pendwaitHist = metrics.NewRegisteredHistogram("blobpool/pendwait", nil, metrics.NewExpDecaySample(1028, 0.015)) - pendtimeHist = metrics.NewRegisteredHistogram("blobpool/pendtime", nil, metrics.NewExpDecaySample(1028, 0.015)) - resetwaitHist = metrics.NewRegisteredHistogram("blobpool/resetwait", nil, metrics.NewExpDecaySample(1028, 0.015)) - resettimeHist = metrics.NewRegisteredHistogram("blobpool/resettime", nil, metrics.NewExpDecaySample(1028, 0.015)) + addwaitHist = metrics.GetOrRegisterHistogram("blobpool/addwait", nil, metrics.NewExpDecaySample(1028, 0.015)) + addtimeHist = metrics.GetOrRegisterHistogram("blobpool/addtime", nil, metrics.NewExpDecaySample(1028, 0.015)) + getwaitHist = metrics.GetOrRegisterHistogram("blobpool/getwait", nil, metrics.NewExpDecaySample(1028, 0.015)) + gettimeHist = metrics.GetOrRegisterHistogram("blobpool/gettime", nil, metrics.NewExpDecaySample(1028, 0.015)) + pendwaitHist = metrics.GetOrRegisterHistogram("blobpool/pendwait", nil, metrics.NewExpDecaySample(1028, 0.015)) + pendtimeHist = metrics.GetOrRegisterHistogram("blobpool/pendtime", nil, metrics.NewExpDecaySample(1028, 0.015)) + resetwaitHist = metrics.GetOrRegisterHistogram("blobpool/resetwait", nil, metrics.NewExpDecaySample(1028, 0.015)) + resettimeHist = metrics.GetOrRegisterHistogram("blobpool/resettime", nil, metrics.NewExpDecaySample(1028, 0.015)) // The below metrics track various cases where transactions are dropped out // of the pool. Most are exceptional, some are chain progression and some // threshold cappings. - dropInvalidMeter = metrics.NewRegisteredMeter("blobpool/drop/invalid", nil) // Invalid transaction, consensus change or bugfix, neutral-ish - dropDanglingMeter = metrics.NewRegisteredMeter("blobpool/drop/dangling", nil) // First nonce gapped, bad - dropFilledMeter = metrics.NewRegisteredMeter("blobpool/drop/filled", nil) // State full-overlap, chain progress, ok - dropOverlappedMeter = metrics.NewRegisteredMeter("blobpool/drop/overlapped", nil) // State partial-overlap, chain progress, ok - dropRepeatedMeter = metrics.NewRegisteredMeter("blobpool/drop/repeated", nil) // Repeated nonce, bad - dropGappedMeter = metrics.NewRegisteredMeter("blobpool/drop/gapped", nil) // Non-first nonce gapped, bad - dropOverdraftedMeter = metrics.NewRegisteredMeter("blobpool/drop/overdrafted", nil) // Balance exceeded, bad - dropOvercappedMeter = metrics.NewRegisteredMeter("blobpool/drop/overcapped", nil) // Per-account cap exceeded, bad - dropOverflownMeter = metrics.NewRegisteredMeter("blobpool/drop/overflown", nil) // Global disk cap exceeded, neutral-ish - dropUnderpricedMeter = metrics.NewRegisteredMeter("blobpool/drop/underpriced", nil) // Gas tip changed, neutral - dropReplacedMeter = metrics.NewRegisteredMeter("blobpool/drop/replaced", nil) // Transaction replaced, neutral + dropInvalidMeter = metrics.GetOrRegisterMeter("blobpool/drop/invalid", nil) // Invalid transaction, consensus change or bugfix, neutral-ish + dropDanglingMeter = metrics.GetOrRegisterMeter("blobpool/drop/dangling", nil) // First nonce gapped, bad + dropFilledMeter = metrics.GetOrRegisterMeter("blobpool/drop/filled", nil) // State full-overlap, chain progress, ok + dropOverlappedMeter = metrics.GetOrRegisterMeter("blobpool/drop/overlapped", nil) // State partial-overlap, chain progress, ok + dropRepeatedMeter = metrics.GetOrRegisterMeter("blobpool/drop/repeated", nil) // Repeated nonce, bad + dropGappedMeter = metrics.GetOrRegisterMeter("blobpool/drop/gapped", nil) // Non-first nonce gapped, bad + dropOverdraftedMeter = metrics.GetOrRegisterMeter("blobpool/drop/overdrafted", nil) // Balance exceeded, bad + dropOvercappedMeter = metrics.GetOrRegisterMeter("blobpool/drop/overcapped", nil) // Per-account cap exceeded, bad + dropOverflownMeter = metrics.GetOrRegisterMeter("blobpool/drop/overflown", nil) // Global disk cap exceeded, neutral-ish + dropUnderpricedMeter = metrics.GetOrRegisterMeter("blobpool/drop/underpriced", nil) // Gas tip changed, neutral + dropReplacedMeter = metrics.GetOrRegisterMeter("blobpool/drop/replaced", nil) // Transaction replaced, neutral // The below metrics track various outcomes of transactions being added to // the pool. - addInvalidMeter = metrics.NewRegisteredMeter("blobpool/add/invalid", nil) // Invalid transaction, reject, neutral - addUnderpricedMeter = metrics.NewRegisteredMeter("blobpool/add/underpriced", nil) // Gas tip too low, neutral - addStaleMeter = metrics.NewRegisteredMeter("blobpool/add/stale", nil) // Nonce already filled, reject, bad-ish - addGappedMeter = metrics.NewRegisteredMeter("blobpool/add/gapped", nil) // Nonce gapped, reject, bad-ish - addOverdraftedMeter = metrics.NewRegisteredMeter("blobpool/add/overdrafted", nil) // Balance exceeded, reject, neutral - addOvercappedMeter = metrics.NewRegisteredMeter("blobpool/add/overcapped", nil) // Per-account cap exceeded, reject, neutral - addNoreplaceMeter = metrics.NewRegisteredMeter("blobpool/add/noreplace", nil) // Replacement fees or tips too low, neutral - addNonExclusiveMeter = metrics.NewRegisteredMeter("blobpool/add/nonexclusive", nil) // Plain transaction from same account exists, reject, neutral - addValidMeter = metrics.NewRegisteredMeter("blobpool/add/valid", nil) // Valid transaction, add, neutral + addInvalidMeter = metrics.GetOrRegisterMeter("blobpool/add/invalid", nil) // Invalid transaction, reject, neutral + addUnderpricedMeter = metrics.GetOrRegisterMeter("blobpool/add/underpriced", nil) // Gas tip too low, neutral + addStaleMeter = metrics.GetOrRegisterMeter("blobpool/add/stale", nil) // Nonce already filled, reject, bad-ish + addGappedMeter = metrics.GetOrRegisterMeter("blobpool/add/gapped", nil) // Nonce gapped, reject, bad-ish + addOverdraftedMeter = metrics.GetOrRegisterMeter("blobpool/add/overdrafted", nil) // Balance exceeded, reject, neutral + addOvercappedMeter = metrics.GetOrRegisterMeter("blobpool/add/overcapped", nil) // Per-account cap exceeded, reject, neutral + addNoreplaceMeter = metrics.GetOrRegisterMeter("blobpool/add/noreplace", nil) // Replacement fees or tips too low, neutral + addNonExclusiveMeter = metrics.GetOrRegisterMeter("blobpool/add/nonexclusive", nil) // Plain transaction from same account exists, reject, neutral + addValidMeter = metrics.GetOrRegisterMeter("blobpool/add/valid", nil) // Valid transaction, add, neutral ) diff --git a/core/txpool/legacypool/legacypool.go b/core/txpool/legacypool/legacypool.go index a7d0839dc0..2a026a0f16 100644 --- a/core/txpool/legacypool/legacypool.go +++ b/core/txpool/legacypool/legacypool.go @@ -49,6 +49,9 @@ import ( "github.com/ava-labs/libevm/log" "github.com/ava-labs/libevm/metrics" "github.com/holiman/uint256" + + // Force libevm metrics of the same name to be registered first. + _ "github.com/ava-labs/libevm/core/txpool/legacypool" ) const ( @@ -79,42 +82,48 @@ var ( baseFeeUpdateInterval = 10 * time.Second // Time interval at which to schedule a base fee update for the tx pool after ApricotPhase3 is enabled ) +// ====== If resolving merge conflicts ====== +// +// All calls to metrics.NewRegistered*() have been replaced with +// metrics.GetOrRegister*() and this package's corresponding libevm package +// imported above. Together these ensure that the metric here is the same as the +// one with the same name in libevm. var ( // Metrics for the pending pool - pendingDiscardMeter = metrics.NewRegisteredMeter("txpool/pending/discard", nil) - pendingReplaceMeter = metrics.NewRegisteredMeter("txpool/pending/replace", nil) - pendingRateLimitMeter = metrics.NewRegisteredMeter("txpool/pending/ratelimit", nil) // Dropped due to rate limiting - pendingNofundsMeter = metrics.NewRegisteredMeter("txpool/pending/nofunds", nil) // Dropped due to out-of-funds + pendingDiscardMeter = metrics.GetOrRegisterMeter("txpool/pending/discard", nil) + pendingReplaceMeter = metrics.GetOrRegisterMeter("txpool/pending/replace", nil) + pendingRateLimitMeter = metrics.GetOrRegisterMeter("txpool/pending/ratelimit", nil) // Dropped due to rate limiting + pendingNofundsMeter = metrics.GetOrRegisterMeter("txpool/pending/nofunds", nil) // Dropped due to out-of-funds // Metrics for the queued pool - queuedDiscardMeter = metrics.NewRegisteredMeter("txpool/queued/discard", nil) - queuedReplaceMeter = metrics.NewRegisteredMeter("txpool/queued/replace", nil) - queuedRateLimitMeter = metrics.NewRegisteredMeter("txpool/queued/ratelimit", nil) // Dropped due to rate limiting - queuedNofundsMeter = metrics.NewRegisteredMeter("txpool/queued/nofunds", nil) // Dropped due to out-of-funds - queuedEvictionMeter = metrics.NewRegisteredMeter("txpool/queued/eviction", nil) // Dropped due to lifetime + queuedDiscardMeter = metrics.GetOrRegisterMeter("txpool/queued/discard", nil) + queuedReplaceMeter = metrics.GetOrRegisterMeter("txpool/queued/replace", nil) + queuedRateLimitMeter = metrics.GetOrRegisterMeter("txpool/queued/ratelimit", nil) // Dropped due to rate limiting + queuedNofundsMeter = metrics.GetOrRegisterMeter("txpool/queued/nofunds", nil) // Dropped due to out-of-funds + queuedEvictionMeter = metrics.GetOrRegisterMeter("txpool/queued/eviction", nil) // Dropped due to lifetime // General tx metrics - knownTxMeter = metrics.NewRegisteredMeter("txpool/known", nil) - validTxMeter = metrics.NewRegisteredMeter("txpool/valid", nil) - invalidTxMeter = metrics.NewRegisteredMeter("txpool/invalid", nil) - underpricedTxMeter = metrics.NewRegisteredMeter("txpool/underpriced", nil) - overflowedTxMeter = metrics.NewRegisteredMeter("txpool/overflowed", nil) + knownTxMeter = metrics.GetOrRegisterMeter("txpool/known", nil) + validTxMeter = metrics.GetOrRegisterMeter("txpool/valid", nil) + invalidTxMeter = metrics.GetOrRegisterMeter("txpool/invalid", nil) + underpricedTxMeter = metrics.GetOrRegisterMeter("txpool/underpriced", nil) + overflowedTxMeter = metrics.GetOrRegisterMeter("txpool/overflowed", nil) // throttleTxMeter counts how many transactions are rejected due to too-many-changes between // txpool reorgs. - throttleTxMeter = metrics.NewRegisteredMeter("txpool/throttle", nil) + throttleTxMeter = metrics.GetOrRegisterMeter("txpool/throttle", nil) // reorgDurationTimer measures how long time a txpool reorg takes. - reorgDurationTimer = metrics.NewRegisteredTimer("txpool/reorgtime", nil) + reorgDurationTimer = metrics.GetOrRegisterTimer("txpool/reorgtime", nil) // dropBetweenReorgHistogram counts how many drops we experience between two reorg runs. It is expected // that this number is pretty low, since txpool reorgs happen very frequently. - dropBetweenReorgHistogram = metrics.NewRegisteredHistogram("txpool/dropbetweenreorg", nil, metrics.NewExpDecaySample(1028, 0.015)) + dropBetweenReorgHistogram = metrics.GetOrRegisterHistogram("txpool/dropbetweenreorg", nil, metrics.NewExpDecaySample(1028, 0.015)) - pendingGauge = metrics.NewRegisteredGauge("txpool/pending", nil) - queuedGauge = metrics.NewRegisteredGauge("txpool/queued", nil) - localGauge = metrics.NewRegisteredGauge("txpool/local", nil) - slotsGauge = metrics.NewRegisteredGauge("txpool/slots", nil) + pendingGauge = metrics.GetOrRegisterGauge("txpool/pending", nil) + queuedGauge = metrics.GetOrRegisterGauge("txpool/queued", nil) + localGauge = metrics.GetOrRegisterGauge("txpool/local", nil) + slotsGauge = metrics.GetOrRegisterGauge("txpool/slots", nil) - reheapTimer = metrics.NewRegisteredTimer("txpool/reheap", nil) + reheapTimer = metrics.GetOrRegisterTimer("txpool/reheap", nil) ) // BlockChain defines the minimal set of methods needed to back a tx pool with diff --git a/rpc/metrics.go b/rpc/metrics.go index a4469545d7..bb694de1a3 100644 --- a/rpc/metrics.go +++ b/rpc/metrics.go @@ -31,17 +31,26 @@ import ( "time" "github.com/ava-labs/libevm/metrics" + + // Force libevm metrics of the same name to be registered first. + _ "github.com/ava-labs/libevm/rpc" ) +// ====== If resolving merge conflicts ====== +// +// All calls to metrics.NewRegistered*() have been replaced with +// metrics.GetOrRegister*() and this package's corresponding libevm package +// imported above. Together these ensure that the metric here is the same as the +// one with the same name in libevm. var ( - rpcRequestGauge = metrics.NewRegisteredGauge("rpc/requests", nil) - successfulRequestGauge = metrics.NewRegisteredGauge("rpc/success", nil) - failedRequestGauge = metrics.NewRegisteredGauge("rpc/failure", nil) + rpcRequestGauge = metrics.GetOrRegisterGauge("rpc/requests", nil) + successfulRequestGauge = metrics.GetOrRegisterGauge("rpc/success", nil) + failedRequestGauge = metrics.GetOrRegisterGauge("rpc/failure", nil) // serveTimeHistName is the prefix of the per-request serving time histograms. serveTimeHistName = "rpc/duration" - rpcServingTimer = metrics.NewRegisteredTimer("rpc/duration/all", nil) + rpcServingTimer = metrics.GetOrRegisterTimer("rpc/duration/all", nil) ) // updateServeTimeHistogram tracks the serving time of a remote RPC call. diff --git a/scripts/lint_allowed_eth_imports.sh b/scripts/lint_allowed_eth_imports.sh index 967d22c20f..5e412c7fa7 100755 --- a/scripts/lint_allowed_eth_imports.sh +++ b/scripts/lint_allowed_eth_imports.sh @@ -6,13 +6,15 @@ set -o pipefail # Ensure that there are no eth imports that are not marked as explicitly allowed via ./scripts/eth-allowed-packages.txt # 1. Recursively search through all go files for any lines that include a direct import from go-ethereum -# 2. Ignore lines that import libevm with a named import starting with "eth" -# 3. Sort the unique results +# 2. Ignore lines that import libevm with a named import starting with "eth" or by _ import. +# 3. Sort the unique results. # 4. Print out the difference between the search results and the list of specified allowed package imports from libevm. libevm_regexp='"github.com/ava-labs/libevm/.*"' -allow_named_imports='eth\w\+ "' -extra_imports=$(find . -type f \( -name "*.go" \) ! -path "./core/main_test.go" ! -name "gen_*.go" \ - -exec sh -c 'grep "$0" -h "$2" | grep -v "$1" | grep -o "$0"' "${libevm_regexp}" "${allow_named_imports}" {} \; | \ +extra_imports=$(find . -type f \( -name "*.go" \) ! -path "./core/main_test.go" ! -name "gen_*.go" -print0 | + xargs -0 grep "${libevm_regexp}" | + grep -v 'eth\w\+ "' | + grep -v '_ "' | + grep -o "${libevm_regexp}" | sort -u | comm -23 - ./scripts/eth-allowed-packages.txt) if [ -n "${extra_imports}" ]; then echo "new ethereum imports should be added to ./scripts/eth-allowed-packages.txt to prevent accidental imports:" diff --git a/triedb/hashdb/database.go b/triedb/hashdb/database.go index 1a2e975074..2fd9bf6d43 100644 --- a/triedb/hashdb/database.go +++ b/triedb/hashdb/database.go @@ -46,42 +46,51 @@ import ( "github.com/ava-labs/libevm/trie/triestate" "github.com/ava-labs/libevm/triedb" "github.com/ava-labs/libevm/triedb/database" + + // Force libevm metrics of the same name to be registered first. + _ "github.com/ava-labs/libevm/triedb/hashdb" ) const ( cacheStatsUpdateFrequency = 1000 // update trie cache stats once per 1000 ops ) +// ====== If resolving merge conflicts ====== +// +// All calls to metrics.NewRegistered*() have been replaced with +// metrics.GetOrRegister*() and this package's corresponding libevm package +// imported above. Together these ensure that the metric here is the same as the +// one with the same name in libevm. var ( - memcacheCleanHitMeter = metrics.NewRegisteredMeter("hashdb/memcache/clean/hit", nil) - memcacheCleanMissMeter = metrics.NewRegisteredMeter("hashdb/memcache/clean/miss", nil) - memcacheCleanReadMeter = metrics.NewRegisteredMeter("hashdb/memcache/clean/read", nil) - memcacheCleanWriteMeter = metrics.NewRegisteredMeter("hashdb/memcache/clean/write", nil) - - memcacheDirtyHitMeter = metrics.NewRegisteredMeter("hashdb/memcache/dirty/hit", nil) - memcacheDirtyMissMeter = metrics.NewRegisteredMeter("hashdb/memcache/dirty/miss", nil) - memcacheDirtyReadMeter = metrics.NewRegisteredMeter("hashdb/memcache/dirty/read", nil) - memcacheDirtyWriteMeter = metrics.NewRegisteredMeter("hashdb/memcache/dirty/write", nil) - - memcacheDirtySizeGauge = metrics.NewRegisteredGaugeFloat64("hashdb/memcache/dirty/size", nil) - memcacheDirtyChildSizeGauge = metrics.NewRegisteredGaugeFloat64("hashdb/memcache/dirty/childsize", nil) - memcacheDirtyNodesGauge = metrics.NewRegisteredGauge("hashdb/memcache/dirty/nodes", nil) - - memcacheFlushMeter = metrics.NewRegisteredMeter("hashdb/memcache/flush/count", nil) - memcacheFlushTimeTimer = metrics.NewRegisteredResettingTimer("hashdb/memcache/flush/time", nil) - memcacheFlushLockTimeTimer = metrics.NewRegisteredResettingTimer("hashdb/memcache/flush/locktime", nil) - memcacheFlushNodesMeter = metrics.NewRegisteredMeter("hashdb/memcache/flush/nodes", nil) - memcacheFlushBytesMeter = metrics.NewRegisteredMeter("hashdb/memcache/flush/bytes", nil) - - memcacheGCTimeTimer = metrics.NewRegisteredResettingTimer("hashdb/memcache/gc/time", nil) - memcacheGCNodesMeter = metrics.NewRegisteredMeter("hashdb/memcache/gc/nodes", nil) - memcacheGCBytesMeter = metrics.NewRegisteredMeter("hashdb/memcache/gc/bytes", nil) - - memcacheCommitMeter = metrics.NewRegisteredMeter("hashdb/memcache/commit/count", nil) - memcacheCommitTimeTimer = metrics.NewRegisteredResettingTimer("hashdb/memcache/commit/time", nil) - memcacheCommitLockTimeTimer = metrics.NewRegisteredResettingTimer("hashdb/memcache/commit/locktime", nil) - memcacheCommitNodesMeter = metrics.NewRegisteredMeter("hashdb/memcache/commit/nodes", nil) - memcacheCommitBytesMeter = metrics.NewRegisteredMeter("hashdb/memcache/commit/bytes", nil) + memcacheCleanHitMeter = metrics.GetOrRegisterMeter("hashdb/memcache/clean/hit", nil) + memcacheCleanMissMeter = metrics.GetOrRegisterMeter("hashdb/memcache/clean/miss", nil) + memcacheCleanReadMeter = metrics.GetOrRegisterMeter("hashdb/memcache/clean/read", nil) + memcacheCleanWriteMeter = metrics.GetOrRegisterMeter("hashdb/memcache/clean/write", nil) + + memcacheDirtyHitMeter = metrics.GetOrRegisterMeter("hashdb/memcache/dirty/hit", nil) + memcacheDirtyMissMeter = metrics.GetOrRegisterMeter("hashdb/memcache/dirty/miss", nil) + memcacheDirtyReadMeter = metrics.GetOrRegisterMeter("hashdb/memcache/dirty/read", nil) + memcacheDirtyWriteMeter = metrics.GetOrRegisterMeter("hashdb/memcache/dirty/write", nil) + + memcacheDirtySizeGauge = metrics.GetOrRegisterGaugeFloat64("hashdb/memcache/dirty/size", nil) + memcacheDirtyChildSizeGauge = metrics.GetOrRegisterGaugeFloat64("hashdb/memcache/dirty/childsize", nil) + memcacheDirtyNodesGauge = metrics.GetOrRegisterGauge("hashdb/memcache/dirty/nodes", nil) + + memcacheFlushMeter = metrics.GetOrRegisterMeter("hashdb/memcache/flush/count", nil) + memcacheFlushTimeTimer = metrics.GetOrRegisterResettingTimer("hashdb/memcache/flush/time", nil) + memcacheFlushLockTimeTimer = metrics.GetOrRegisterResettingTimer("hashdb/memcache/flush/locktime", nil) + memcacheFlushNodesMeter = metrics.GetOrRegisterMeter("hashdb/memcache/flush/nodes", nil) + memcacheFlushBytesMeter = metrics.GetOrRegisterMeter("hashdb/memcache/flush/bytes", nil) + + memcacheGCTimeTimer = metrics.GetOrRegisterResettingTimer("hashdb/memcache/gc/time", nil) + memcacheGCNodesMeter = metrics.GetOrRegisterMeter("hashdb/memcache/gc/nodes", nil) + memcacheGCBytesMeter = metrics.GetOrRegisterMeter("hashdb/memcache/gc/bytes", nil) + + memcacheCommitMeter = metrics.GetOrRegisterMeter("hashdb/memcache/commit/count", nil) + memcacheCommitTimeTimer = metrics.GetOrRegisterResettingTimer("hashdb/memcache/commit/time", nil) + memcacheCommitLockTimeTimer = metrics.GetOrRegisterResettingTimer("hashdb/memcache/commit/locktime", nil) + memcacheCommitNodesMeter = metrics.GetOrRegisterMeter("hashdb/memcache/commit/nodes", nil) + memcacheCommitBytesMeter = metrics.GetOrRegisterMeter("hashdb/memcache/commit/bytes", nil) ) // ChildResolver defines the required method to decode the provided diff --git a/triedb/pathdb/metrics.go b/triedb/pathdb/metrics.go index 21038ecfc6..b09e9884d7 100644 --- a/triedb/pathdb/metrics.go +++ b/triedb/pathdb/metrics.go @@ -26,36 +26,47 @@ package pathdb -import "github.com/ava-labs/libevm/metrics" +import ( + "github.com/ava-labs/libevm/metrics" + // Force libevm metrics of the same name to be registered first. + _ "github.com/ava-labs/libevm/triedb/pathdb" +) + +// ====== If resolving merge conflicts ====== +// +// All calls to metrics.NewRegistered*() have been replaced with +// metrics.GetOrRegister*() and this package's corresponding libevm package +// imported above. Together these ensure that the metric here is the same as the +// one with the same name in libevm. // nolint: unused var ( - cleanHitMeter = metrics.NewRegisteredMeter("pathdb/clean/hit", nil) - cleanMissMeter = metrics.NewRegisteredMeter("pathdb/clean/miss", nil) - cleanReadMeter = metrics.NewRegisteredMeter("pathdb/clean/read", nil) - cleanWriteMeter = metrics.NewRegisteredMeter("pathdb/clean/write", nil) - - dirtyHitMeter = metrics.NewRegisteredMeter("pathdb/dirty/hit", nil) - dirtyMissMeter = metrics.NewRegisteredMeter("pathdb/dirty/miss", nil) - dirtyReadMeter = metrics.NewRegisteredMeter("pathdb/dirty/read", nil) - dirtyWriteMeter = metrics.NewRegisteredMeter("pathdb/dirty/write", nil) - dirtyNodeHitDepthHist = metrics.NewRegisteredHistogram("pathdb/dirty/depth", nil, metrics.NewExpDecaySample(1028, 0.015)) - - cleanFalseMeter = metrics.NewRegisteredMeter("pathdb/clean/false", nil) - dirtyFalseMeter = metrics.NewRegisteredMeter("pathdb/dirty/false", nil) - diskFalseMeter = metrics.NewRegisteredMeter("pathdb/disk/false", nil) - - commitTimeTimer = metrics.NewRegisteredTimer("pathdb/commit/time", nil) - commitNodesMeter = metrics.NewRegisteredMeter("pathdb/commit/nodes", nil) - commitBytesMeter = metrics.NewRegisteredMeter("pathdb/commit/bytes", nil) - - gcNodesMeter = metrics.NewRegisteredMeter("pathdb/gc/nodes", nil) - gcBytesMeter = metrics.NewRegisteredMeter("pathdb/gc/bytes", nil) - - diffLayerBytesMeter = metrics.NewRegisteredMeter("pathdb/diff/bytes", nil) - diffLayerNodesMeter = metrics.NewRegisteredMeter("pathdb/diff/nodes", nil) - - historyBuildTimeMeter = metrics.NewRegisteredTimer("pathdb/history/time", nil) - historyDataBytesMeter = metrics.NewRegisteredMeter("pathdb/history/bytes/data", nil) - historyIndexBytesMeter = metrics.NewRegisteredMeter("pathdb/history/bytes/index", nil) + cleanHitMeter = metrics.GetOrRegisterMeter("pathdb/clean/hit", nil) + cleanMissMeter = metrics.GetOrRegisterMeter("pathdb/clean/miss", nil) + cleanReadMeter = metrics.GetOrRegisterMeter("pathdb/clean/read", nil) + cleanWriteMeter = metrics.GetOrRegisterMeter("pathdb/clean/write", nil) + + dirtyHitMeter = metrics.GetOrRegisterMeter("pathdb/dirty/hit", nil) + dirtyMissMeter = metrics.GetOrRegisterMeter("pathdb/dirty/miss", nil) + dirtyReadMeter = metrics.GetOrRegisterMeter("pathdb/dirty/read", nil) + dirtyWriteMeter = metrics.GetOrRegisterMeter("pathdb/dirty/write", nil) + dirtyNodeHitDepthHist = metrics.GetOrRegisterHistogram("pathdb/dirty/depth", nil, metrics.NewExpDecaySample(1028, 0.015)) + + cleanFalseMeter = metrics.GetOrRegisterMeter("pathdb/clean/false", nil) + dirtyFalseMeter = metrics.GetOrRegisterMeter("pathdb/dirty/false", nil) + diskFalseMeter = metrics.GetOrRegisterMeter("pathdb/disk/false", nil) + + commitTimeTimer = metrics.GetOrRegisterTimer("pathdb/commit/time", nil) + commitNodesMeter = metrics.GetOrRegisterMeter("pathdb/commit/nodes", nil) + commitBytesMeter = metrics.GetOrRegisterMeter("pathdb/commit/bytes", nil) + + gcNodesMeter = metrics.GetOrRegisterMeter("pathdb/gc/nodes", nil) + gcBytesMeter = metrics.GetOrRegisterMeter("pathdb/gc/bytes", nil) + + diffLayerBytesMeter = metrics.GetOrRegisterMeter("pathdb/diff/bytes", nil) + diffLayerNodesMeter = metrics.GetOrRegisterMeter("pathdb/diff/nodes", nil) + + historyBuildTimeMeter = metrics.GetOrRegisterTimer("pathdb/history/time", nil) + historyDataBytesMeter = metrics.GetOrRegisterMeter("pathdb/history/bytes/data", nil) + historyIndexBytesMeter = metrics.GetOrRegisterMeter("pathdb/history/bytes/index", nil) )