Skip to content

Commit 6706f93

Browse files
authored
core: add gauge metrics + histograms for block gas used and blob gas used (#705)
* core: add gauge metric for block gas used and blob gas used This can be used to track the DA footprint per block * encapsulate OPStack additions into new file and function * add histogram metrics for (blob)GasUsed * update fork.yaml * typos
1 parent f305011 commit 6706f93

File tree

5 files changed

+62
-9
lines changed

5 files changed

+62
-9
lines changed

core/blockchain.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ var (
6464
headFastBlockGauge = metrics.NewRegisteredGauge("chain/head/receipt", nil)
6565
headFinalizedBlockGauge = metrics.NewRegisteredGauge("chain/head/finalized", nil)
6666
headSafeBlockGauge = metrics.NewRegisteredGauge("chain/head/safe", nil)
67-
headBaseFeeGauge = metrics.NewRegisteredGauge("chain/head/basefee", nil)
6867

6968
chainInfoGauge = metrics.NewRegisteredGaugeInfo("chain/info", nil)
7069
chainMgaspsMeter = metrics.NewRegisteredResettingTimer("chain/mgasps", nil)
@@ -1230,7 +1229,9 @@ func (bc *BlockChain) writeHeadBlock(block *types.Block) {
12301229

12311230
bc.currentBlock.Store(block.Header())
12321231
headBlockGauge.Update(int64(block.NumberU64()))
1233-
headBaseFeeGauge.TryUpdate(block.Header().BaseFee)
1232+
1233+
// OPStack addition
1234+
updateOptimismBlockMetrics(block.Header())
12341235
}
12351236

12361237
// stopWithoutSaving stops the blockchain service. If any imports are currently in progress
@@ -1398,7 +1399,9 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
13981399
bc.currentSnapBlock.Store(header)
13991400
headHeaderGauge.Update(header.Number.Int64())
14001401
headFastBlockGauge.Update(header.Number.Int64())
1401-
headBaseFeeGauge.TryUpdate(header.BaseFee)
1402+
1403+
// OPStack addition
1404+
updateOptimismBlockMetrics(header)
14021405
return nil
14031406
}
14041407
// writeAncient writes blockchain and corresponding receipt chain into ancient store.
@@ -2771,7 +2774,9 @@ func (bc *BlockChain) InsertHeadersBeforeCutoff(headers []*types.Header) (int, e
27712774
bc.currentSnapBlock.Store(last)
27722775
headHeaderGauge.Update(last.Number.Int64())
27732776
headFastBlockGauge.Update(last.Number.Int64())
2774-
headBaseFeeGauge.TryUpdate(last.BaseFee)
2777+
2778+
// OPStack addition
2779+
updateOptimismBlockMetrics(last)
27752780
return 0, nil
27762781
}
27772782

core/blockchain_optimism.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package core
2+
3+
import (
4+
"github.com/ethereum/go-ethereum/core/types"
5+
"github.com/ethereum/go-ethereum/metrics"
6+
)
7+
8+
// OPStack additions
9+
var (
10+
headBaseFeeGauge = metrics.NewRegisteredGauge("chain/head/basefee", nil)
11+
headGasUsedGauge = metrics.NewRegisteredGauge("chain/head/gas_used", nil)
12+
headBlobGasUsedGauge = metrics.NewRegisteredGauge("chain/head/blob_gas_used", nil)
13+
14+
headGasUsedHist = metrics.NewRegisteredHistogram("chain/head/gas_used_hist", nil, metrics.NewExpDecaySample(1028, 0.015))
15+
headBlobGasUsedHist = metrics.NewRegisteredHistogram("chain/head/blob_gas_used_hist", nil, metrics.NewExpDecaySample(1028, 0.015))
16+
)
17+
18+
func updateOptimismBlockMetrics(header *types.Header) error {
19+
headBaseFeeGauge.TryUpdate(header.BaseFee)
20+
headGasUsedGauge.Update(int64(header.GasUsed))
21+
headBlobGasUsedGauge.TryUpdateUint64(header.BlobGasUsed)
22+
headGasUsedHist.Update(int64(header.GasUsed))
23+
if header.BlobGasUsed != nil {
24+
headBlobGasUsedHist.Update(int64(*header.BlobGasUsed))
25+
}
26+
return nil
27+
}

core/headerchain.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ func NewHeaderChain(chainDb ethdb.Database, config *params.ChainConfig, engine c
9292
}
9393
hc.currentHeaderHash = hc.CurrentHeader().Hash()
9494
headHeaderGauge.Update(hc.CurrentHeader().Number.Int64())
95-
headBaseFeeGauge.TryUpdate(hc.CurrentHeader().BaseFee)
95+
96+
// OPStack addition
97+
updateOptimismBlockMetrics(hc.CurrentHeader())
9698
return hc, nil
9799
}
98100

@@ -183,7 +185,9 @@ func (hc *HeaderChain) Reorg(headers []*types.Header) error {
183185
hc.currentHeaderHash = last.Hash()
184186
hc.currentHeader.Store(types.CopyHeader(last))
185187
headHeaderGauge.Update(last.Number.Int64())
186-
headBaseFeeGauge.TryUpdate(last.BaseFee)
188+
189+
// OPStack addition
190+
updateOptimismBlockMetrics(last)
187191
return nil
188192
}
189193

@@ -486,7 +490,9 @@ func (hc *HeaderChain) SetCurrentHeader(head *types.Header) {
486490
hc.currentHeader.Store(head)
487491
hc.currentHeaderHash = head.Hash()
488492
headHeaderGauge.Update(head.Number.Int64())
489-
headBaseFeeGauge.TryUpdate(head.BaseFee)
493+
494+
// OPStack addition
495+
updateOptimismBlockMetrics(head)
490496
}
491497

492498
type (
@@ -573,7 +579,9 @@ func (hc *HeaderChain) setHead(headBlock uint64, headTime uint64, updateFn Updat
573579
hc.currentHeader.Store(parent)
574580
hc.currentHeaderHash = parentHash
575581
headHeaderGauge.Update(parent.Number.Int64())
576-
headBaseFeeGauge.TryUpdate(parent.BaseFee)
582+
583+
// OPStack addition
584+
updateOptimismBlockMetrics(parent)
577585

578586
// If this is the first iteration, wipe any leftover data upwards too so
579587
// we don't end up with dangling daps in the database

fork.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,10 @@ def:
199199
- title: Warn on missing hardfork data and emit additional metrics
200200
globs:
201201
- "core/blockchain.go"
202-
- title: Additional metrics
202+
- title: Define additional header-based metrics
203+
globs:
204+
- "core/blockchain_optimism.go"
205+
- title: Add hooks for additional header-chain metrics
203206
globs:
204207
- "core/headerchain.go"
205208
- title: Optional Engine API extensions

metrics/gauge.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ func (g *Gauge) Update(v int64) {
4545
(*atomic.Int64)(g).Store(v)
4646
}
4747

48+
// OPStack addition
4849
// TryUpdate updates the gauge if the value is non-nil, converting it to int64.
4950
func (g *Gauge) TryUpdate(v *big.Int) {
5051
if v == nil {
@@ -53,6 +54,15 @@ func (g *Gauge) TryUpdate(v *big.Int) {
5354
(*atomic.Int64)(g).Store(v.Int64())
5455
}
5556

57+
// OPStack additon
58+
// TryUpdate updates the gauge if the value is non-nil, converting it to int64.
59+
func (g *Gauge) TryUpdateUint64(v *uint64) {
60+
if v == nil {
61+
return
62+
}
63+
(*atomic.Int64)(g).Store(int64(*v))
64+
}
65+
5666
// UpdateIfGt updates the gauge's value if v is larger then the current value.
5767
func (g *Gauge) UpdateIfGt(v int64) {
5868
value := (*atomic.Int64)(g)

0 commit comments

Comments
 (0)