From 3e6fdd1740e4fc29a139e992939b62c5f205ba98 Mon Sep 17 00:00:00 2001 From: spypsy Date: Thu, 30 Jan 2025 12:45:10 +0000 Subject: [PATCH 1/2] chore: blob inclusion metrics --- yarn-project/circuit-types/src/stats/stats.ts | 4 ++ .../src/publisher/l1-publisher-metrics.ts | 39 +++++++++++++++++++ .../src/publisher/l1-publisher.ts | 10 +++++ yarn-project/telemetry-client/src/metrics.ts | 5 +++ 4 files changed, 58 insertions(+) diff --git a/yarn-project/circuit-types/src/stats/stats.ts b/yarn-project/circuit-types/src/stats/stats.ts index dafea919ab33..3f14cfaa537e 100644 --- a/yarn-project/circuit-types/src/stats/stats.ts +++ b/yarn-project/circuit-types/src/stats/stats.ts @@ -38,6 +38,10 @@ export type L1PublishStats = { blobDataGas: bigint; /** Amount of blob gas used. */ blobGasUsed: bigint; + /** Number of blobs in the tx */ + blobCount?: number; + /** Number of L1 blocks between tx submission and inclusion */ + inclusionBlocks?: number; }; /** Stats logged for each L1 rollup publish tx.*/ diff --git a/yarn-project/sequencer-client/src/publisher/l1-publisher-metrics.ts b/yarn-project/sequencer-client/src/publisher/l1-publisher-metrics.ts index 787b570e0785..c331a614c119 100644 --- a/yarn-project/sequencer-client/src/publisher/l1-publisher-metrics.ts +++ b/yarn-project/sequencer-client/src/publisher/l1-publisher-metrics.ts @@ -23,6 +23,11 @@ export class L1PublisherMetrics { private txBlobDataGasUsed: Histogram; private txBlobDataGasCost: Histogram; + private readonly blobCountHistogram: Histogram; + private readonly blobInclusionBlocksHistogram: Histogram; + private readonly blobTxSuccessCounter: UpDownCounter; + private readonly blobTxFailureCounter: UpDownCounter; + constructor(client: TelemetryClient, name = 'L1Publisher') { const meter = client.getMeter(name); @@ -71,6 +76,26 @@ export class L1PublisherMetrics { unit: 'gwei', valueType: ValueType.INT, }); + + this.blobCountHistogram = meter.createHistogram(Metrics.L1_PUBLISHER_BLOB_COUNT, { + description: 'Number of blobs in L1 transactions', + unit: 'blobs', + valueType: ValueType.INT, + }); + + this.blobInclusionBlocksHistogram = meter.createHistogram(Metrics.L1_PUBLISHER_BLOB_INCLUSION_BLOCKS, { + description: 'Number of L1 blocks between blob tx submission and inclusion', + unit: 'blocks', + valueType: ValueType.INT, + }); + + this.blobTxSuccessCounter = meter.createUpDownCounter(Metrics.L1_PUBLISHER_BLOB_TX_SUCCESS, { + description: 'Number of successful L1 transactions with blobs', + }); + + this.blobTxFailureCounter = meter.createUpDownCounter(Metrics.L1_PUBLISHER_BLOB_TX_FAILURE, { + description: 'Number of failed L1 transactions with blobs', + }); } recordFailedTx(txType: L1TxType) { @@ -78,6 +103,10 @@ export class L1PublisherMetrics { [Attributes.L1_TX_TYPE]: txType, [Attributes.OK]: false, }); + + if (txType === 'process') { + this.blobTxFailureCounter.add(1); + } } recordSubmitProof(durationMs: number, stats: L1PublishProofStats) { @@ -86,6 +115,16 @@ export class L1PublisherMetrics { recordProcessBlockTx(durationMs: number, stats: L1PublishBlockStats) { this.recordTx('process', durationMs, stats); + + if (stats.blobCount && stats.blobCount > 0) { + this.blobCountHistogram.record(stats.blobCount); + + if (stats.inclusionBlocks !== undefined) { + this.blobInclusionBlocksHistogram.record(stats.inclusionBlocks); + } + + this.blobTxSuccessCounter.add(1); + } } recordClaimEpochProofRightTx(durationMs: number, stats: L1PublishStats) { diff --git a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts index 872550f1fb4d..e7db6581f20f 100644 --- a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts +++ b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts @@ -600,6 +600,9 @@ export class L1Publisher { txHashes: txHashes ?? [], }; + // Get current block number before sending tx + const startBlock = await this.publicClient.getBlockNumber(); + // Publish body and propose block (if not already published) if (this.interrupted) { this.log.verbose('L2 block data syncing interrupted while processing blocks.', ctx); @@ -637,6 +640,11 @@ export class L1Publisher { }); const tx = await this.getTransactionStats(receipt.transactionHash); + + // Calculate inclusion blocks + const endBlock = receipt.blockNumber; + const inclusionBlocks = Number(endBlock - startBlock); + const stats: L1PublishBlockStats = { gasPrice: receipt.effectiveGasPrice, gasUsed: receipt.gasUsed, @@ -646,6 +654,8 @@ export class L1Publisher { ...pick(tx!, 'calldataGas', 'calldataSize', 'sender'), ...block.getStats(), eventName: 'rollup-published-to-l1', + blobCount: blobs.length, + inclusionBlocks, }; this.log.verbose(`Published L2 block to L1 rollup contract`, { ...stats, ...ctx }); this.metrics.recordProcessBlockTx(timer.ms(), stats); diff --git a/yarn-project/telemetry-client/src/metrics.ts b/yarn-project/telemetry-client/src/metrics.ts index 5314a2039680..90a696831570 100644 --- a/yarn-project/telemetry-client/src/metrics.ts +++ b/yarn-project/telemetry-client/src/metrics.ts @@ -145,3 +145,8 @@ export const NODEJS_EVENT_LOOP_DELAY_P99 = 'nodejs.eventloop.delay.p99'; export const NODEJS_EVENT_LOOP_UTILIZATION = 'nodejs.eventloop.utilization'; export const NODEJS_EVENT_LOOP_TIME = 'nodejs.eventloop.time'; + +export const L1_PUBLISHER_BLOB_COUNT = 'l1_publisher_blob_count'; +export const L1_PUBLISHER_BLOB_INCLUSION_BLOCKS = 'l1_publisher_blob_inclusion_blocks'; +export const L1_PUBLISHER_BLOB_TX_SUCCESS = 'l1_publisher_blob_tx_success'; +export const L1_PUBLISHER_BLOB_TX_FAILURE = 'l1_publisher_blob_tx_failure'; From 494ba5e3e40e1caa7a7470796a9c65917bdd9226 Mon Sep 17 00:00:00 2001 From: spypsy Date: Thu, 30 Jan 2025 14:58:02 +0000 Subject: [PATCH 2/2] fix metrics namespacing --- yarn-project/telemetry-client/src/metrics.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/yarn-project/telemetry-client/src/metrics.ts b/yarn-project/telemetry-client/src/metrics.ts index 90a696831570..a0521bec8913 100644 --- a/yarn-project/telemetry-client/src/metrics.ts +++ b/yarn-project/telemetry-client/src/metrics.ts @@ -67,6 +67,10 @@ export const L1_PUBLISHER_TX_CALLDATA_SIZE = 'aztec.l1_publisher.tx_calldata_siz export const L1_PUBLISHER_TX_CALLDATA_GAS = 'aztec.l1_publisher.tx_calldata_gas'; export const L1_PUBLISHER_TX_BLOBDATA_GAS_USED = 'aztec.l1_publisher.tx_blobdata_gas_used'; export const L1_PUBLISHER_TX_BLOBDATA_GAS_COST = 'aztec.l1_publisher.tx_blobdata_gas_cost'; +export const L1_PUBLISHER_BLOB_COUNT = 'aztec.l1_publisher.blob_count'; +export const L1_PUBLISHER_BLOB_INCLUSION_BLOCKS = 'aztec.l1_publisher.blob_inclusion_blocks'; +export const L1_PUBLISHER_BLOB_TX_SUCCESS = 'aztec.l1_publisher.blob_tx_success'; +export const L1_PUBLISHER_BLOB_TX_FAILURE = 'aztec.l1_publisher.blob_tx_failure'; export const PEER_MANAGER_GOODBYES_SENT = 'aztec.peer_manager.goodbyes_sent'; export const PEER_MANAGER_GOODBYES_RECEIVED = 'aztec.peer_manager.goodbyes_received'; @@ -145,8 +149,3 @@ export const NODEJS_EVENT_LOOP_DELAY_P99 = 'nodejs.eventloop.delay.p99'; export const NODEJS_EVENT_LOOP_UTILIZATION = 'nodejs.eventloop.utilization'; export const NODEJS_EVENT_LOOP_TIME = 'nodejs.eventloop.time'; - -export const L1_PUBLISHER_BLOB_COUNT = 'l1_publisher_blob_count'; -export const L1_PUBLISHER_BLOB_INCLUSION_BLOCKS = 'l1_publisher_blob_inclusion_blocks'; -export const L1_PUBLISHER_BLOB_TX_SUCCESS = 'l1_publisher_blob_tx_success'; -export const L1_PUBLISHER_BLOB_TX_FAILURE = 'l1_publisher_blob_tx_failure';