Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 53d1ef2

Browse files
committed
Add metrics for builder (#24)
* Add metrics for builder * add metrics for individual simulations * Add builder metrics to README (#34)
1 parent adaab4b commit 53d1ef2

File tree

10 files changed

+96
-0
lines changed

10 files changed

+96
-0
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ $ geth --help
212212
213213
--miner.extradata value
214214
Block extra data set by the miner (default = client version)
215+
216+
METRICS
217+
218+
--metrics.builder value (default: false)
219+
Enable builder metrics collection and reporting
215220
```
216221

217222
This will start `geth` in snap-sync mode with a DB memory allowance of 1GB, as the

cmd/geth/chaincmd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ if one is set. Otherwise it prints the genesis from the datadir.`,
8181
utils.CacheGCFlag,
8282
utils.MetricsEnabledFlag,
8383
utils.MetricsEnabledExpensiveFlag,
84+
utils.MetricsEnabledBuilderFlag,
8485
utils.MetricsHTTPFlag,
8586
utils.MetricsPortFlag,
8687
utils.MetricsEnableInfluxDBFlag,

cmd/geth/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,9 @@ func applyMetricConfig(ctx *cli.Context, cfg *gethConfig) {
235235
if ctx.IsSet(utils.MetricsEnabledExpensiveFlag.Name) {
236236
cfg.Metrics.EnabledExpensive = ctx.Bool(utils.MetricsEnabledExpensiveFlag.Name)
237237
}
238+
if ctx.IsSet(utils.MetricsEnabledBuilderFlag.Name) {
239+
cfg.Metrics.EnabledBuilder = ctx.Bool(utils.MetricsEnabledBuilderFlag.Name)
240+
}
238241
if ctx.IsSet(utils.MetricsHTTPFlag.Name) {
239242
cfg.Metrics.HTTP = ctx.String(utils.MetricsHTTPFlag.Name)
240243
}

cmd/geth/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ var (
207207
metricsFlags = []cli.Flag{
208208
utils.MetricsEnabledFlag,
209209
utils.MetricsEnabledExpensiveFlag,
210+
utils.MetricsEnabledBuilderFlag,
210211
utils.MetricsHTTPFlag,
211212
utils.MetricsPortFlag,
212213
utils.MetricsEnableInfluxDBFlag,

cmd/utils/flags.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,12 @@ var (
10351035
Usage: "Enable expensive metrics collection and reporting",
10361036
Category: flags.MetricsCategory,
10371037
}
1038+
// Builder metrics flag
1039+
MetricsEnabledBuilderFlag = &cli.BoolFlag{
1040+
Name: "metrics.builder",
1041+
Usage: "Enable builder metrics collection and reporting",
1042+
Category: flags.MetricsCategory,
1043+
}
10381044

10391045
// MetricsHTTPFlag defines the endpoint for a stand-alone metrics HTTP endpoint.
10401046
// Since the pprof service enables sensitive/vulnerable behavior, this allows a user

core/state/statedb.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,11 @@ func (s *StateDB) Copy() *StateDB {
800800
state.snapStorage[k] = temp
801801
}
802802
}
803+
804+
if metrics.EnabledBuilder {
805+
stateCopyMeter.Mark(1)
806+
}
807+
803808
return state
804809
}
805810

@@ -808,6 +813,11 @@ func (s *StateDB) Snapshot() int {
808813
id := s.nextRevisionId
809814
s.nextRevisionId++
810815
s.validRevisions = append(s.validRevisions, revision{id, s.journal.length()})
816+
817+
if metrics.EnabledBuilder {
818+
stateSnapshotMeter.Mark(1)
819+
}
820+
811821
return id
812822
}
813823

metrics/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package metrics
2020
type Config struct {
2121
Enabled bool `toml:",omitempty"`
2222
EnabledExpensive bool `toml:",omitempty"`
23+
EnabledBuilder bool `toml:",omitempty"`
2324
HTTP string `toml:",omitempty"`
2425
Port int `toml:",omitempty"`
2526
EnableInfluxDB bool `toml:",omitempty"`
@@ -39,6 +40,7 @@ type Config struct {
3940
var DefaultConfig = Config{
4041
Enabled: false,
4142
EnabledExpensive: false,
43+
EnabledBuilder: false,
4244
HTTP: "127.0.0.1",
4345
Port: 6060,
4446
EnableInfluxDB: false,

metrics/metrics.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,18 @@ var Enabled = false
2727
// for health monitoring and debug metrics that might impact runtime performance.
2828
var EnabledExpensive = false
2929

30+
// EnabledBuilder is a flag meant to collect metrics and performance of the builder
31+
var EnabledBuilder = false
32+
3033
// enablerFlags is the CLI flag names to use to enable metrics collections.
3134
var enablerFlags = []string{"metrics"}
3235

3336
// expensiveEnablerFlags is the CLI flag names to use to enable metrics collections.
3437
var expensiveEnablerFlags = []string{"metrics.expensive"}
3538

39+
// builderEnablerFlags is the CLI flag names to use to enable metrics collections.
40+
var builderEnablerFlags = []string{"metrics.builder"}
41+
3642
// Init enables or disables the metrics system. Since we need this to run before
3743
// any other code gets to create meters and timers, we'll actually do an ugly hack
3844
// and peek into the command line args for the metrics flag.
@@ -52,6 +58,14 @@ func init() {
5258
EnabledExpensive = true
5359
}
5460
}
61+
62+
for _, enabler := range builderEnablerFlags {
63+
if !EnabledBuilder && flag == enabler {
64+
log.Info("Enabling builder metrics collection")
65+
EnabledBuilder = true
66+
break
67+
}
68+
}
5569
}
5670
}
5771

miner/metrics.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package miner
2+
3+
import (
4+
"github.com/ethereum/go-ethereum/metrics"
5+
)
6+
7+
var (
8+
blockProfitHistogram = metrics.NewRegisteredHistogram("miner/block/profit", nil, metrics.NewExpDecaySample(1028, 0.015))
9+
bundleTxNumHistogram = metrics.NewRegisteredHistogram("miner/bundle/txnum", nil, metrics.NewExpDecaySample(1028, 0.015))
10+
blockProfitGauge = metrics.NewRegisteredGauge("miner/block/profit/gauge", nil)
11+
culmulativeProfitGauge = metrics.NewRegisteredGauge("miner/block/profit/culmulative", nil)
12+
13+
buildBlockTimer = metrics.NewRegisteredTimer("miner/block/build", nil)
14+
mergeAlgoTimer = metrics.NewRegisteredTimer("miner/block/merge", nil)
15+
blockBundleSimulationTimer = metrics.NewRegisteredTimer("miner/block/simulate", nil)
16+
successfulBundleSimulationTimer = metrics.NewRegisteredTimer("miner/bundle/simulate/success", nil)
17+
failedBundleSimulationTimer = metrics.NewRegisteredTimer("miner/bundle/simulate/failed", nil)
18+
19+
20+
simulationMeter = metrics.NewRegisteredMeter("miner/block/simulation", nil)
21+
simulationCommittedMeter = metrics.NewRegisteredMeter("miner/block/simulation/committed", nil)
22+
simulationRevertedMeter = metrics.NewRegisteredMeter("miner/block/simulation/reverted", nil)
23+
24+
gasUsedGauge = metrics.NewRegisteredGauge("miner/block/gasused", nil)
25+
transactionNumGauge = metrics.NewRegisteredGauge("miner/block/txnum", nil)
26+
)

miner/worker.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/ethereum/go-ethereum/eth/tracers/logger"
3838
"github.com/ethereum/go-ethereum/event"
3939
"github.com/ethereum/go-ethereum/log"
40+
"github.com/ethereum/go-ethereum/metrics"
4041
"github.com/ethereum/go-ethereum/params"
4142
"github.com/ethereum/go-ethereum/trie"
4243
)
@@ -1396,7 +1397,11 @@ func (w *worker) fillTransactionsAlgoWorker(interrupt *int32, env *environment)
13961397
}
13971398

13981399
builder := newGreedyBuilder(w.chain, w.chainConfig, w.blockList, env, interrupt)
1400+
start := time.Now()
13991401
newEnv, blockBundles := builder.buildBlock(bundlesToConsider, pending)
1402+
if metrics.EnabledBuilder {
1403+
mergeAlgoTimer.Update(time.Since(start))
1404+
}
14001405
*env = *newEnv
14011406

14021407
return nil, blockBundles, bundlesToConsider
@@ -1679,17 +1684,37 @@ func (w *worker) simulateBundles(env *environment, bundles []types.MevBundle, pe
16791684
wg.Add(1)
16801685
go func(idx int, bundle types.MevBundle, state *state.StateDB) {
16811686
defer wg.Done()
1687+
1688+
start := time.Now()
1689+
if metrics.EnabledBuilder {
1690+
bundleTxNumHistogram.Update(int64(len(bundle.Txs)))
1691+
}
1692+
16821693
if len(bundle.Txs) == 0 {
16831694
return
16841695
}
16851696
gasPool := new(core.GasPool).AddGas(env.header.GasLimit)
16861697
simmed, err := w.computeBundleGas(env, bundle, state, gasPool, pendingTxs, 0)
16871698

1699+
if metrics.EnabledBuilder {
1700+
simulationMeter.Mark(1)
1701+
}
1702+
16881703
if err != nil {
1704+
if metrics.EnabledBuilder {
1705+
simulationRevertedMeter.Mark(1)
1706+
failedBundleSimulationTimer.UpdateSince(start)
1707+
}
1708+
16891709
log.Trace("Error computing gas for a bundle", "error", err)
16901710
return
16911711
}
16921712
simResult[idx] = &simmed
1713+
1714+
if metrics.EnabledBuilder {
1715+
simulationCommittedMeter.Mark(1)
1716+
successfulBundleSimulationTimer.UpdateSince(start)
1717+
}
16931718
}(i, bundle, env.state.Copy())
16941719
}
16951720

@@ -1705,6 +1730,9 @@ func (w *worker) simulateBundles(env *environment, bundles []types.MevBundle, pe
17051730
}
17061731

17071732
log.Debug("Simulated bundles", "block", env.header.Number, "allBundles", len(bundles), "okBundles", len(simulatedBundles), "time", time.Since(start))
1733+
if metrics.EnabledBuilder {
1734+
blockBundleSimulationTimer.Update(time.Since(start))
1735+
}
17081736
return simulatedBundles, nil
17091737
}
17101738

0 commit comments

Comments
 (0)