core/txpool/legacypool: add metric for accounts in txpool (#33646)

This PR adds metrics that count the number of accounts having transactions 
in the txpool. Together with the transaction count this can be used as a 
simple indicator of the diversity of transactions in the pool.

Note: as an alternative implementation, we could use a periodic or event
driven update of these Gauges using len.

I've preferred this implementation to match what we have for the pool
sizes.

---------

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
This commit is contained in:
Csaba Kiraly 2026-01-21 02:23:03 +01:00 committed by GitHub
parent 2eb1ccc6c4
commit 54ab4e3c7d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 0 deletions

View file

@ -114,6 +114,9 @@ var (
queuedGauge = metrics.NewRegisteredGauge("txpool/queued", nil)
slotsGauge = metrics.NewRegisteredGauge("txpool/slots", nil)
pendingAddrsGauge = metrics.NewRegisteredGauge("txpool/pending/accounts", nil)
queuedAddrsGauge = metrics.NewRegisteredGauge("txpool/queued/accounts", nil)
reheapTimer = metrics.NewRegisteredTimer("txpool/reheap", nil)
)
@ -844,6 +847,7 @@ func (pool *LegacyPool) promoteTx(addr common.Address, hash common.Hash, tx *typ
// Try to insert the transaction into the pending queue
if pool.pending[addr] == nil {
pool.pending[addr] = newList(true)
pendingAddrsGauge.Inc(1)
}
list := pool.pending[addr]
@ -1083,6 +1087,7 @@ func (pool *LegacyPool) removeTx(hash common.Hash, outofbound bool, unreserve bo
// If no more pending transactions are left, remove the list
if pending.Empty() {
delete(pool.pending, addr)
pendingAddrsGauge.Dec(1)
}
// Postpone any invalidated transactions
for _, tx := range invalids {
@ -1580,6 +1585,7 @@ func (pool *LegacyPool) demoteUnexecutables() {
// Delete the entire pending entry if it became empty.
if list.Empty() {
delete(pool.pending, addr)
pendingAddrsGauge.Dec(1)
if _, ok := pool.queue.get(addr); !ok {
pool.reserver.Release(addr)
}
@ -1839,6 +1845,9 @@ func (pool *LegacyPool) Clear() {
pool.pending = make(map[common.Address]*list)
pool.queue = newQueue(pool.config, pool.signer)
pool.pendingNonces = newNoncer(pool.currentState)
pendingAddrsGauge.Update(0)
queuedAddrsGauge.Update(0)
}
// HasPendingAuth returns a flag indicating whether there are pending

View file

@ -114,6 +114,7 @@ func (q *queue) remove(addr common.Address, tx *types.Transaction) {
if future.Empty() {
delete(q.queued, addr)
delete(q.beats, addr)
queuedAddrsGauge.Dec(1)
}
}
}
@ -123,6 +124,7 @@ func (q *queue) add(tx *types.Transaction) (*common.Hash, error) {
from, _ := types.Sender(q.signer, tx) // already validated
if q.queued[from] == nil {
q.queued[from] = newList(false)
queuedAddrsGauge.Inc(1)
}
inserted, old := q.queued[from].Add(tx, q.config.PriceBump)
if !inserted {
@ -200,6 +202,7 @@ func (q *queue) promoteExecutables(accounts []common.Address, gasLimit uint64, c
if list.Empty() {
delete(q.queued, addr)
delete(q.beats, addr)
queuedAddrsGauge.Dec(1)
removedAddresses = append(removedAddresses, addr)
}
}