Skip to content

Commit 7e3170f

Browse files
authored
core/filtermaps: add metrics (ethereum#31511)
This PR adds metrics related to map rendering and pattern matching to the `core/filtermaps` package.
1 parent 4add312 commit 7e3170f

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

core/filtermaps/filtermaps.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ import (
3030
"github.com/ethereum/go-ethereum/core/types"
3131
"github.com/ethereum/go-ethereum/ethdb"
3232
"github.com/ethereum/go-ethereum/log"
33+
"github.com/ethereum/go-ethereum/metrics"
34+
)
35+
36+
var (
37+
mapCountGauge = metrics.NewRegisteredGauge("filtermaps/maps/count", nil) // actual number of rendered maps
38+
mapLogValueMeter = metrics.NewRegisteredMeter("filtermaps/maps/logvalues", nil) // number of log values processed
39+
mapBlockMeter = metrics.NewRegisteredMeter("filtermaps/maps/blocks", nil) // number of block delimiters processed
40+
mapRenderTimer = metrics.NewRegisteredTimer("filtermaps/maps/rendertime", nil) // time elapsed while rendering a single map
41+
mapWriteTimer = metrics.NewRegisteredTimer("filtermaps/maps/writetime", nil) // time elapsed while writing a batch of finished maps to db
42+
matchRequestTimer = metrics.NewRegisteredTimer("filtermaps/match/requesttime", nil) // processing time a matching request in a single epoch
43+
matchEpochTimer = metrics.NewRegisteredTimer("filtermaps/match/epochtime", nil) // total processing time a matching request
44+
matchBaseRowAccessMeter = metrics.NewRegisteredMeter("filtermaps/match/baserowaccess", nil) // number of accessed rows on layer 0
45+
matchBaseRowSizeMeter = metrics.NewRegisteredMeter("filtermaps/match/baserowsize", nil) // size of accessed rows on layer 0
46+
matchExtRowAccessMeter = metrics.NewRegisteredMeter("filtermaps/match/extrowaccess", nil) // number of accessed rows on higher layers
47+
matchExtRowSizeMeter = metrics.NewRegisteredMeter("filtermaps/match/extrowsize", nil) // size of accessed rows on higher layers
48+
matchLogLookup = metrics.NewRegisteredMeter("filtermaps/match/loglookup", nil) // number of log lookups based on potential matches
49+
matchAllMeter = metrics.NewRegisteredMeter("filtermaps/match/matchall", nil) // number of requests returned with ErrMatchAll
3350
)
3451

3552
const (
@@ -429,8 +446,12 @@ func (f *FilterMaps) setRange(batch ethdb.KeyValueWriter, newView *ChainView, ne
429446
TailPartialEpoch: newRange.tailPartialEpoch,
430447
}
431448
rawdb.WriteFilterMapsRange(batch, rs)
449+
if !isTempRange {
450+
mapCountGauge.Update(int64(newRange.maps.Count() + newRange.tailPartialEpoch))
451+
}
432452
} else {
433453
rawdb.DeleteFilterMapsRange(batch)
454+
mapCountGauge.Update(0)
434455
}
435456
}
436457

core/filtermaps/map_renderer.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"math"
2323
"sort"
24+
"time"
2425

2526
"github.com/ethereum/go-ethereum/common"
2627
"github.com/ethereum/go-ethereum/common/lru"
@@ -301,6 +302,11 @@ func (r *mapRenderer) run(stopCb func() bool, writeCb func()) (bool, error) {
301302

302303
// renderCurrentMap renders a single map.
303304
func (r *mapRenderer) renderCurrentMap(stopCb func() bool) (bool, error) {
305+
var (
306+
totalTime time.Duration
307+
logValuesProcessed, blocksProcessed int64
308+
)
309+
start := time.Now()
304310
if !r.iterator.updateChainView(r.f.targetView) {
305311
return false, errChainUpdate
306312
}
@@ -316,9 +322,11 @@ func (r *mapRenderer) renderCurrentMap(stopCb func() bool) (bool, error) {
316322
for r.iterator.lvIndex < uint64(r.currentMap.mapIndex+1)<<r.f.logValuesPerMap && !r.iterator.finished {
317323
waitCnt++
318324
if waitCnt >= valuesPerCallback {
325+
totalTime += time.Since(start)
319326
if stopCb() {
320327
return false, nil
321328
}
329+
start = time.Now()
322330
if !r.iterator.updateChainView(r.f.targetView) {
323331
return false, errChainUpdate
324332
}
@@ -343,8 +351,10 @@ func (r *mapRenderer) renderCurrentMap(stopCb func() bool) (bool, error) {
343351
return false, fmt.Errorf("failed to advance log iterator at %d while rendering map %d: %v", r.iterator.lvIndex, r.currentMap.mapIndex, err)
344352
}
345353
if !r.iterator.skipToBoundary {
354+
logValuesProcessed++
346355
r.currentMap.lastBlock = r.iterator.blockNumber
347356
if r.iterator.blockStart {
357+
blocksProcessed++
348358
r.currentMap.blockLvPtrs = append(r.currentMap.blockLvPtrs, r.iterator.lvIndex)
349359
}
350360
if !r.f.testDisableSnapshots && r.renderBefore >= r.f.indexedRange.maps.AfterLast() &&
@@ -358,12 +368,18 @@ func (r *mapRenderer) renderCurrentMap(stopCb func() bool) (bool, error) {
358368
r.currentMap.headDelimiter = r.iterator.lvIndex
359369
}
360370
r.currentMap.lastBlockId = r.f.targetView.getBlockId(r.currentMap.lastBlock)
371+
totalTime += time.Since(start)
372+
mapRenderTimer.Update(totalTime)
373+
mapLogValueMeter.Mark(logValuesProcessed)
374+
mapBlockMeter.Mark(blocksProcessed)
361375
return true, nil
362376
}
363377

364378
// writeFinishedMaps writes rendered maps to the database and updates
365379
// filterMapsRange and indexedView accordingly.
366380
func (r *mapRenderer) writeFinishedMaps(pauseCb func() bool) error {
381+
var totalTime time.Duration
382+
start := time.Now()
367383
if len(r.finishedMaps) == 0 {
368384
return nil
369385
}
@@ -379,7 +395,7 @@ func (r *mapRenderer) writeFinishedMaps(pauseCb func() bool) error {
379395
if err != nil {
380396
return fmt.Errorf("failed to get updated rendered range: %v", err)
381397
}
382-
renderedView := r.f.targetView // stopCb callback might still change targetView while writing finished maps
398+
renderedView := r.f.targetView // pauseCb callback might still change targetView while writing finished maps
383399

384400
batch := r.f.db.NewBatch()
385401
var writeCnt int
@@ -393,7 +409,9 @@ func (r *mapRenderer) writeFinishedMaps(pauseCb func() bool) error {
393409
// do not exit while in partially written state but do allow processing
394410
// events and pausing while block processing is in progress
395411
r.f.indexLock.Unlock()
412+
totalTime += time.Since(start)
396413
pauseCb()
414+
start = time.Now()
397415
r.f.indexLock.Lock()
398416
batch = r.f.db.NewBatch()
399417
}
@@ -477,6 +495,8 @@ func (r *mapRenderer) writeFinishedMaps(pauseCb func() bool) error {
477495
if err := batch.Write(); err != nil {
478496
log.Crit("Error writing log index update batch", "error", err)
479497
}
498+
totalTime += time.Since(start)
499+
mapWriteTimer.Update(totalTime)
480500
return nil
481501
}
482502

core/filtermaps/matcher.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ func GetPotentialMatches(ctx context.Context, backend MatcherBackend, firstBlock
125125

126126
start := time.Now()
127127
res, err := m.process()
128+
matchRequestTimer.Update(time.Since(start))
128129

129130
if doRuntimeStats {
130131
log.Info("Log search finished", "elapsed", time.Since(start))
@@ -202,6 +203,7 @@ func (m *matcherEnv) process() ([]*types.Log, error) {
202203
logs = append(logs, tasks[waitEpoch].logs...)
203204
if err := tasks[waitEpoch].err; err != nil {
204205
if err == ErrMatchAll {
206+
matchAllMeter.Mark(1)
205207
return logs, err
206208
}
207209
return logs, fmt.Errorf("failed to process log index epoch %d: %v", waitEpoch, err)
@@ -220,6 +222,7 @@ func (m *matcherEnv) process() ([]*types.Log, error) {
220222

221223
// processEpoch returns the potentially matching logs from the given epoch.
222224
func (m *matcherEnv) processEpoch(epochIndex uint32) ([]*types.Log, error) {
225+
start := time.Now()
223226
var logs []*types.Log
224227
// create a list of map indices to process
225228
fm, lm := epochIndex<<m.params.logMapsPerEpoch, (epochIndex+1)<<m.params.logMapsPerEpoch-1
@@ -254,6 +257,7 @@ func (m *matcherEnv) processEpoch(epochIndex uint32) ([]*types.Log, error) {
254257
logs = append(logs, mlogs...)
255258
}
256259
m.getLogStats.addAmount(st, int64(len(logs)))
260+
matchEpochTimer.Update(time.Since(start))
257261
return logs, nil
258262
}
259263

@@ -273,6 +277,7 @@ func (m *matcherEnv) getLogsFromMatches(matches potentialMatches) ([]*types.Log,
273277
if log != nil {
274278
logs = append(logs, log)
275279
}
280+
matchLogLookup.Mark(1)
276281
}
277282
return logs, nil
278283
}
@@ -381,6 +386,13 @@ func (m *singleMatcherInstance) getMatchesForLayer(ctx context.Context, layerInd
381386
m.stats.setState(&st, stNone)
382387
return nil, fmt.Errorf("failed to retrieve filter map %d row %d: %v", mapIndex, rowIndex, err)
383388
}
389+
if layerIndex == 0 {
390+
matchBaseRowAccessMeter.Mark(1)
391+
matchBaseRowSizeMeter.Mark(int64(len(filterRow)))
392+
} else {
393+
matchExtRowAccessMeter.Mark(1)
394+
matchExtRowSizeMeter.Mark(int64(len(filterRow)))
395+
}
384396
m.stats.addAmount(st, int64(len(filterRow)))
385397
m.stats.setState(&st, stOther)
386398
filterRows = append(filterRows, filterRow)

0 commit comments

Comments
 (0)