github.com/ethereum-optimism/optimism@v1.7.2/op-node/rollup/driver/metered_l1fetcher.go (about) 1 package driver 2 3 import ( 4 "context" 5 "time" 6 7 "github.com/ethereum-optimism/optimism/op-node/rollup/derive" 8 "github.com/ethereum-optimism/optimism/op-service/eth" 9 "github.com/ethereum/go-ethereum/common" 10 "github.com/ethereum/go-ethereum/core/types" 11 ) 12 13 type L1FetcherMetrics interface { 14 RecordL1RequestTime(method string, duration time.Duration) 15 } 16 17 type MeteredL1Fetcher struct { 18 inner derive.L1Fetcher 19 metrics L1FetcherMetrics 20 now func() time.Time 21 } 22 23 func NewMeteredL1Fetcher(inner derive.L1Fetcher, metrics L1FetcherMetrics) *MeteredL1Fetcher { 24 return &MeteredL1Fetcher{ 25 inner: inner, 26 metrics: metrics, 27 now: time.Now, 28 } 29 } 30 func (m *MeteredL1Fetcher) L1BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L1BlockRef, error) { 31 defer m.recordTime("L1BlockRefByLabel")() 32 return m.inner.L1BlockRefByLabel(ctx, label) 33 } 34 35 func (m *MeteredL1Fetcher) L1BlockRefByNumber(ctx context.Context, num uint64) (eth.L1BlockRef, error) { 36 defer m.recordTime("L1BlockRefByNumber")() 37 return m.inner.L1BlockRefByNumber(ctx, num) 38 } 39 40 func (m *MeteredL1Fetcher) L1BlockRefByHash(ctx context.Context, hash common.Hash) (eth.L1BlockRef, error) { 41 defer m.recordTime("L1BlockRefByHash")() 42 return m.inner.L1BlockRefByHash(ctx, hash) 43 } 44 45 func (m *MeteredL1Fetcher) InfoByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, error) { 46 defer m.recordTime("InfoByHash")() 47 return m.inner.InfoByHash(ctx, hash) 48 } 49 50 func (m *MeteredL1Fetcher) InfoAndTxsByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, types.Transactions, error) { 51 defer m.recordTime("InfoAndTxsByHash")() 52 return m.inner.InfoAndTxsByHash(ctx, hash) 53 } 54 55 func (m *MeteredL1Fetcher) FetchReceipts(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Receipts, error) { 56 defer m.recordTime("FetchReceipts")() 57 return m.inner.FetchReceipts(ctx, blockHash) 58 } 59 60 var _ derive.L1Fetcher = (*MeteredL1Fetcher)(nil) 61 62 func (m *MeteredL1Fetcher) recordTime(method string) func() { 63 start := m.now() 64 return func() { 65 end := m.now() 66 m.metrics.RecordL1RequestTime(method, end.Sub(start)) 67 } 68 }