diff --git a/cl/phase1/core/state/ssz.go b/cl/phase1/core/state/ssz.go index 85a68cd69..81b09c748 100644 --- a/cl/phase1/core/state/ssz.go +++ b/cl/phase1/core/state/ssz.go @@ -13,7 +13,7 @@ func (b *CachingBeaconState) EncodeSSZ(buf []byte) ([]byte, error) { } h.PutSince() sz := metrics.NewHistTimer("encode_ssz_beacon_state_size") - sz.Update(float64(len(bts))) + sz.Observe(float64(len(bts))) return bts, err } @@ -23,7 +23,7 @@ func (b *CachingBeaconState) DecodeSSZ(buf []byte, version int) error { return err } sz := metrics.NewHistTimer("decode_ssz_beacon_state_size") - sz.Update(float64(len(buf))) + sz.Observe(float64(len(buf))) h.PutSince() return b.initBeaconState() } diff --git a/consensus/bor/heimdall/metrics.go b/consensus/bor/heimdall/metrics.go index 39160637a..0157c3776 100644 --- a/consensus/bor/heimdall/metrics.go +++ b/consensus/bor/heimdall/metrics.go @@ -83,5 +83,5 @@ func sendMetrics(ctx context.Context, start time.Time, isSuccessful bool) { } meters.request[isSuccessful].Set(1) - meters.timer.UpdateDuration(start) + meters.timer.ObserveDuration(start) } diff --git a/core/blockchain.go b/core/blockchain.go index 90a5a39b7..d750e6bbc 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -19,18 +19,16 @@ package core import ( "fmt" - "github.com/ledgerwatch/erigon-lib/metrics" "time" + "github.com/ledgerwatch/log/v3" "golang.org/x/crypto/sha3" "golang.org/x/exp/slices" - "github.com/ledgerwatch/log/v3" - "github.com/ledgerwatch/erigon-lib/chain" libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/common/cmp" - + "github.com/ledgerwatch/erigon-lib/metrics" "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/common/u256" "github.com/ledgerwatch/erigon/consensus" @@ -42,7 +40,7 @@ import ( ) var ( - BlockExecutionTimer = metrics.GetOrCreateSummary("chain_execution_seconds") + blockExecutionTimer = metrics.GetOrCreateSummary("chain_execution_seconds") ) type SyncMode string @@ -85,7 +83,7 @@ func ExecuteBlockEphemerally( logger log.Logger, ) (*EphemeralExecResult, error) { - defer BlockExecutionTimer.UpdateDuration(time.Now()) + defer blockExecutionTimer.ObserveDuration(time.Now()) block.Uncles() ibs := state.New(stateReader) header := block.Header() diff --git a/erigon-lib/kv/mdbx/kv_mdbx.go b/erigon-lib/kv/mdbx/kv_mdbx.go index 564f65537..b769e05ad 100644 --- a/erigon-lib/kv/mdbx/kv_mdbx.go +++ b/erigon-lib/kv/mdbx/kv_mdbx.go @@ -833,12 +833,12 @@ func (tx *MdbxTx) Commit() error { } if tx.db.opts.label == kv.ChainDB { - kv.DbCommitPreparation.Update(latency.Preparation.Seconds()) + kv.DbCommitPreparation.Observe(latency.Preparation.Seconds()) //kv.DbCommitAudit.Update(latency.Audit.Seconds()) - kv.DbCommitWrite.Update(latency.Write.Seconds()) - kv.DbCommitSync.Update(latency.Sync.Seconds()) - kv.DbCommitEnding.Update(latency.Ending.Seconds()) - kv.DbCommitTotal.Update(latency.Whole.Seconds()) + kv.DbCommitWrite.Observe(latency.Write.Seconds()) + kv.DbCommitSync.Observe(latency.Sync.Seconds()) + kv.DbCommitEnding.Observe(latency.Ending.Seconds()) + kv.DbCommitTotal.Observe(latency.Whole.Seconds()) //kv.DbGcWorkPnlMergeTime.Update(latency.GCDetails.WorkPnlMergeTime.Seconds()) //kv.DbGcWorkPnlMergeVolume.Set(uint64(latency.GCDetails.WorkPnlMergeVolume)) diff --git a/erigon-lib/metrics/duration_observer.go b/erigon-lib/metrics/duration_observer.go new file mode 100644 index 000000000..1b6b91d90 --- /dev/null +++ b/erigon-lib/metrics/duration_observer.go @@ -0,0 +1,14 @@ +package metrics + +import ( + "time" +) + +type DurationObserver interface { + // ObserveDuration observes duration since start time + ObserveDuration(start time.Time) +} + +func secondsSince(start time.Time) float64 { + return time.Since(start).Seconds() +} diff --git a/erigon-lib/metrics/histogram.go b/erigon-lib/metrics/histogram.go new file mode 100644 index 000000000..3477570eb --- /dev/null +++ b/erigon-lib/metrics/histogram.go @@ -0,0 +1,20 @@ +package metrics + +import ( + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +type Histogram interface { + prometheus.Histogram + DurationObserver +} + +type histogram struct { + prometheus.Summary +} + +func (h *histogram) ObserveDuration(start time.Time) { + h.Observe(secondsSince(start)) +} diff --git a/erigon-lib/metrics/register.go b/erigon-lib/metrics/register.go index 4102fca45..2ac13a6b4 100644 --- a/erigon-lib/metrics/register.go +++ b/erigon-lib/metrics/register.go @@ -2,25 +2,8 @@ package metrics import ( "fmt" - "time" - - "github.com/prometheus/client_golang/prometheus" ) -type Histogram interface { - // UpdateDuration updates request duration based on the given startTime. - UpdateDuration(time.Time) - - // Update updates h with v. - // - // Negative values and NaNs are ignored. - Update(float64) -} - -type Summary interface { - Histogram -} - // NewCounter registers and returns new counter with the given name. // // name must be valid Prometheus-compatible metric with possible labels. @@ -105,18 +88,6 @@ func GetOrCreateGauge(name string) Gauge { return &gauge{g} } -type summary struct { - prometheus.Summary -} - -func (sm summary) UpdateDuration(startTime time.Time) { - sm.Observe(time.Since(startTime).Seconds()) -} - -func (sm summary) Update(v float64) { - sm.Observe(v) -} - // NewSummary creates and returns new summary with the given name. // // name must be valid Prometheus-compatible metric with possible labels. @@ -133,7 +104,7 @@ func NewSummary(name string) Summary { panic(fmt.Errorf("could not create new summary: %w", err)) } - return summary{s} + return &summary{s} } // GetOrCreateSummary returns registered summary with the given name @@ -156,19 +127,7 @@ func GetOrCreateSummary(name string) Summary { panic(fmt.Errorf("could not get or create new summary: %w", err)) } - return summary{s} -} - -type histogram struct { - prometheus.Histogram -} - -func (h histogram) UpdateDuration(startTime time.Time) { - h.Observe(time.Since(startTime).Seconds()) -} - -func (h histogram) Update(v float64) { - h.Observe(v) + return &summary{s} } // NewHistogram creates and returns new histogram with the given name. @@ -187,7 +146,7 @@ func NewHistogram(name string) Histogram { panic(fmt.Errorf("could not create new histogram: %w", err)) } - return histogram{h} + return &histogram{h} } // GetOrCreateHistogram returns registered histogram with the given name @@ -210,5 +169,5 @@ func GetOrCreateHistogram(name string) Histogram { panic(fmt.Errorf("could not get or create new histogram: %w", err)) } - return histogram{h} + return &histogram{h} } diff --git a/erigon-lib/metrics/summary.go b/erigon-lib/metrics/summary.go new file mode 100644 index 000000000..615c487ed --- /dev/null +++ b/erigon-lib/metrics/summary.go @@ -0,0 +1,20 @@ +package metrics + +import ( + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +type Summary interface { + prometheus.Summary + DurationObserver +} + +type summary struct { + prometheus.Summary +} + +func (s *summary) ObserveDuration(start time.Time) { + s.Observe(secondsSince(start)) +} diff --git a/erigon-lib/metrics/timer.go b/erigon-lib/metrics/timer.go index 0cadd8ed3..1608e666d 100644 --- a/erigon-lib/metrics/timer.go +++ b/erigon-lib/metrics/timer.go @@ -22,7 +22,7 @@ func NewHistTimer(name string) *HistTimer { } func (h *HistTimer) PutSince() { - h.Histogram.UpdateDuration(h.start) + h.Histogram.ObserveDuration(h.start) } func (h *HistTimer) Tag(pairs ...string) *HistTimer { diff --git a/erigon-lib/state/aggregator.go b/erigon-lib/state/aggregator.go index d286b8849..e992e27c9 100644 --- a/erigon-lib/state/aggregator.go +++ b/erigon-lib/state/aggregator.go @@ -442,7 +442,7 @@ func (a *Aggregator) aggregate(ctx context.Context, step uint64) error { start := time.Now() collation, err := d.collateStream(ctx, step, txFrom, txTo, d.tx) mxRunningCollations.Dec() - mxCollateTook.UpdateDuration(start) + mxCollateTook.ObserveDuration(start) //mxCollationSize.Set(uint64(collation.valuesComp.Count())) mxCollationSizeHist.SetInt(collation.historyComp.Count()) @@ -481,8 +481,8 @@ func (a *Aggregator) aggregate(ctx context.Context, step uint64) error { mxPruningProgress.Dec() mxPruningProgress.Dec() - mxPruneTook.Update(d.stats.LastPruneTook.Seconds()) - mxPruneHistTook.Update(d.stats.LastPruneHistTook.Seconds()) + mxPruneTook.Observe(d.stats.LastPruneTook.Seconds()) + mxPruneHistTook.Observe(d.stats.LastPruneHistTook.Seconds()) } // when domain files are build and db is pruned, we can merge them @@ -503,7 +503,7 @@ func (a *Aggregator) aggregate(ctx context.Context, step uint64) error { start := time.Now() collation, err := d.collate(ctx, step*a.aggregationStep, (step+1)*a.aggregationStep, d.tx) mxRunningCollations.Dec() - mxCollateTook.UpdateDuration(start) + mxCollateTook.ObserveDuration(start) if err != nil { return fmt.Errorf("index collation %q has failed: %w", d.filenameBase, err) @@ -523,7 +523,7 @@ func (a *Aggregator) aggregate(ctx context.Context, step uint64) error { } mxRunningMerges.Dec() - mxBuildTook.UpdateDuration(start) + mxBuildTook.ObserveDuration(start) d.integrateFiles(sf, step*a.aggregationStep, (step+1)*a.aggregationStep) @@ -547,7 +547,7 @@ func (a *Aggregator) aggregate(ctx context.Context, step uint64) error { if err := d.prune(ctx, txFrom, txTo, math.MaxUint64, logEvery); err != nil { return err } - mxPruneTook.UpdateDuration(startPrune) + mxPruneTook.ObserveDuration(startPrune) mxPruningProgress.Dec() } @@ -565,7 +565,7 @@ func (a *Aggregator) aggregate(ctx context.Context, step uint64) error { "range", fmt.Sprintf("%.2fM-%.2fM", float64(txFrom)/10e5, float64(txTo)/10e5), "took", time.Since(stepStartedAt)) - mxStepTook.UpdateDuration(stepStartedAt) + mxStepTook.ObserveDuration(stepStartedAt) return nil } @@ -601,7 +601,7 @@ func (a *Aggregator) mergeLoopStep(ctx context.Context, maxEndTxNum uint64, work closeAll = false for _, s := range []DomainStats{a.accounts.stats, a.code.stats, a.storage.stats} { - mxBuildTook.Update(s.LastFileBuildingTook.Seconds()) + mxBuildTook.Observe(s.LastFileBuildingTook.Seconds()) } a.logger.Info("[stat] finished merge step", @@ -855,9 +855,9 @@ func (a *Aggregator) ComputeCommitment(saveStateAfter, trace bool) (rootHash []b } mxCommitmentKeys.AddUint64(a.commitment.comKeys) - mxCommitmentTook.Update(a.commitment.comTook.Seconds()) + mxCommitmentTook.Observe(a.commitment.comTook.Seconds()) - defer func(t time.Time) { mxCommitmentWriteTook.UpdateDuration(t) }(time.Now()) + defer func(t time.Time) { mxCommitmentWriteTook.ObserveDuration(t) }(time.Now()) for pref, update := range branchNodeUpdates { prefix := []byte(pref) diff --git a/erigon-lib/state/domain.go b/erigon-lib/state/domain.go index 837b4d7ae..93dfd1308 100644 --- a/erigon-lib/state/domain.go +++ b/erigon-lib/state/domain.go @@ -710,7 +710,7 @@ func (d *Domain) aggregate(ctx context.Context, step uint64, txFrom, txTo uint64 start := time.Now() collation, err := d.collateStream(ctx, step, txFrom, txTo, tx) mxRunningCollations.Dec() - mxCollateTook.UpdateDuration(start) + mxCollateTook.ObserveDuration(start) mxCollationSize.SetInt(collation.valuesComp.Count()) mxCollationSizeHist.SetInt(collation.historyComp.Count()) diff --git a/erigon-lib/txpool/pool.go b/erigon-lib/txpool/pool.go index d32301efd..1a4b3b8ad 100644 --- a/erigon-lib/txpool/pool.go +++ b/erigon-lib/txpool/pool.go @@ -303,7 +303,7 @@ func (p *TxPool) OnNewBlock(ctx context.Context, stateChanges *remote.StateChang return err } - defer newBlockTimer.UpdateDuration(time.Now()) + defer newBlockTimer.ObserveDuration(time.Now()) //t := time.Now() coreDB, cache := p.coreDBWithCache() @@ -414,7 +414,7 @@ func (p *TxPool) processRemoteTxs(ctx context.Context) error { return fmt.Errorf("txpool not started yet") } - defer processBatchTxsTimer.UpdateDuration(time.Now()) + defer processBatchTxsTimer.ObserveDuration(time.Now()) coreDB, cache := p.coreDBWithCache() coreTx, err := coreDB.BeginRo(ctx) if err != nil { @@ -718,7 +718,7 @@ func (p *TxPool) AddRemoteTxs(_ context.Context, newTxs types.TxSlots) { return } - defer addRemoteTxsTimer.UpdateDuration(time.Now()) + defer addRemoteTxsTimer.ObserveDuration(time.Now()) p.lock.Lock() defer p.lock.Unlock() for i, txn := range newTxs.Txs { @@ -1702,7 +1702,7 @@ func MainLoop(ctx context.Context, db kv.RwDB, coreDB kv.RoDB, p *TxPool, newTxs if announcements.Len() == 0 { return } - defer propagateNewTxsTimer.UpdateDuration(time.Now()) + defer propagateNewTxsTimer.ObserveDuration(time.Now()) announcements = announcements.DedupCopy() @@ -1804,7 +1804,7 @@ func MainLoop(ctx context.Context, db kv.RwDB, coreDB kv.RoDB, p *TxPool, newTxs var sizes []uint32 types, sizes, hashes = p.AppendAllAnnouncements(types, sizes, hashes[:0]) go send.PropagatePooledTxsToPeersList(newPeers, types, sizes, hashes) - propagateToNewPeerTimer.UpdateDuration(t) + propagateToNewPeerTimer.ObserveDuration(t) } } } @@ -1830,7 +1830,7 @@ func (p *TxPool) flushNoFsync(ctx context.Context, db kv.RwDB) (written uint64, } func (p *TxPool) flush(ctx context.Context, db kv.RwDB) (written uint64, err error) { - defer writeToDBTimer.UpdateDuration(time.Now()) + defer writeToDBTimer.ObserveDuration(time.Now()) // 1. get global lock on txpool and flush it to db, without fsync (to release lock asap) // 2. then fsync db without txpool lock written, err = p.flushNoFsync(ctx, db) diff --git a/rpc/handler.go b/rpc/handler.go index 389cdf6e1..05b66dbc1 100644 --- a/rpc/handler.go +++ b/rpc/handler.go @@ -449,7 +449,7 @@ func (h *handler) handleCall(cp *callProc, msg *jsonrpcMessage, stream *jsoniter if answer != nil && answer.Error != nil { failedReqeustGauge.Inc() } - newRPCServingTimerMS(msg.Method, answer == nil || answer.Error == nil).UpdateDuration(start) + newRPCServingTimerMS(msg.Method, answer == nil || answer.Error == nil).ObserveDuration(start) } return answer }