From 965b3e6cc88f3c3ed6b6ded03eda7a74e8174814 Mon Sep 17 00:00:00 2001 From: Fahim Ahmed Date: Wed, 28 Oct 2026 13:38:51 -0400 Subject: [PATCH 1/3] feat(report): chart builder validity-predicate and resting metrics Define charts for the reth_base_builder_validity_*, predicate_* and resting_predicate_* series base-bench scrapes from the native builder, plus the validity-flow txs/gas per block series it already allowlisted. ChartGrid only renders keys in CHART_CONFIG, so these were scraped but never shown. --- report/src/metricDefinitions.ts | 215 ++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) diff --git a/report/src/metricDefinitions.ts b/report/src/metricDefinitions.ts index 52a36b2b..9e16db81 100644 --- a/report/src/metricDefinitions.ts +++ b/report/src/metricDefinitions.ts @@ -397,6 +397,221 @@ export const CHART_CONFIG = { unit: "s", aliases: ["reth_sync_state_provider_total_account_fetch_latency"], }, + reth_base_builder_txs_included_per_block_flow_validity_avg: { + type: "line", + title: "Builder Validity Txs Included Per Block", + description: + "Average number of validity-predicate transactions from the pool included per block", + unit: "count", + }, + reth_base_builder_tx_gas_used_per_block_flow_validity_avg: { + type: "line", + title: "Builder Validity Gas Per Block", + description: + "Average gas used by validity-predicate transactions per block", + unit: "gas", + }, + reth_base_builder_validity_candidate_handling_duration_avg: { + type: "line", + title: "Builder Validity Candidate Handling", + description: + "Average time per flashblock spent iterating validity transactions, from yield to the predicate gate decision, including resting transactions parked in the iterator", + unit: "s", + }, + reth_base_builder_validity_predicate_eval_duration_per_block_avg: { + type: "line", + title: "Builder Predicate Evaluation Time", + description: + "Average total validity-predicate evaluation time per build, inclusive of state loads", + unit: "s", + }, + reth_base_builder_validity_predicate_rescan_duration_avg: { + type: "line", + title: "Builder Resting Predicate Rescan", + description: + "Average time spent rescanning parked validity predicates per build", + unit: "s", + }, + reth_base_builder_validity_predicate_candidates_evaluated_per_build_avg: { + type: "line", + title: "Builder Validity Candidates Evaluated", + description: + "Average number of validity transactions whose predicates were evaluated in the primary scan per build", + unit: "count", + }, + reth_base_builder_validity_predicate_candidates_deferred_per_build_avg: { + type: "line", + title: "Builder Validity Candidates Deferred", + description: + "Average number of validity transactions deferred without evaluation after the predicate time budget was exhausted per build", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluation_coverage_per_build_avg: { + type: "line", + title: "Builder Validity Evaluation Coverage", + description: + "Fraction (0-1) of primary-scan validity candidates evaluated per build; below 1 means the predicate time budget cut evaluation short", + }, + reth_base_builder_validity_predicate_eval_cutoff_builds_total: { + type: "line", + title: "Builder Predicate Budget Cutoffs", + description: + "Builds per block that deferred at least one validity transaction after exhausting the predicate evaluation budget", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_matched: { + type: "line", + title: "Builder Predicate Evaluations: Matched", + description: + "Validity predicate evaluations per block whose predicates all matched", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_not_satisfied: + { + type: "line", + title: "Builder Predicate Evaluations: Not Satisfied", + description: + "Validity predicate evaluations per block where a predicate did not match, leaving the transaction resting", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_budget_exhausted: + { + type: "line", + title: "Builder Predicate Evaluations: Budget Exhausted", + description: + "Validity transactions per block skipped because the predicate evaluation time budget was exhausted", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_expired: { + type: "line", + title: "Builder Predicate Evaluations: Expired", + description: + "Validity transactions per block dropped because a block-number or flashblock-index predicate can no longer be satisfied", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_read_error: { + type: "line", + title: "Builder Predicate Evaluations: Read Error", + description: + "Validity predicate evaluations per block that failed to read predicate state", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_rescan_matched: + { + type: "line", + title: "Builder Resting Rescan: Matched", + description: + "Parked validity transactions per block whose predicates matched when rescanned after state changed", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_rescan_not_satisfied: + { + type: "line", + title: "Builder Resting Rescan: Not Satisfied", + description: + "Parked validity transactions per block that stayed resting after a rescan", + unit: "count", + }, + reth_base_builder_predicate_accounts_loaded_total_avg: { + type: "line", + title: "Builder Predicate Account Reads", + description: + "Average accounts read while evaluating validity predicates per block, counting every read", + unit: "count", + }, + reth_base_builder_predicate_accounts_loaded_unique_avg: { + type: "line", + title: "Builder Predicate Unique Account Reads", + description: + "Average distinct accounts read while evaluating validity predicates per block", + unit: "count", + }, + reth_base_builder_predicate_slots_loaded_total_avg: { + type: "line", + title: "Builder Predicate Storage Reads", + description: + "Average storage slots read while evaluating validity predicates per block, counting re-reads", + unit: "count", + }, + reth_base_builder_predicate_slots_loaded_unique_avg: { + type: "line", + title: "Builder Predicate Unique Storage Reads", + description: + "Average distinct storage slots read while evaluating validity predicates per block", + unit: "count", + }, + reth_base_builder_resting_predicate_parked_total: { + type: "line", + title: "Builder Resting Predicates Parked", + description: + "Resting validity transactions per block parked in the transaction iterator without reaching the build loop", + unit: "count", + }, + reth_base_builder_resting_predicate_carried_avg: { + type: "line", + title: "Builder Resting Predicates Carried", + description: + "Average resting validity transactions carried into a block build from the previous block", + unit: "count", + }, + reth_base_builder_resting_predicate_carried_parked_total: { + type: "line", + title: "Builder Carried Resting Predicates Parked", + description: + "Of the parked resting validity transactions per block, those carried over from an earlier block", + unit: "count", + }, + reth_base_builder_resting_predicate_carry_released_total_reason_pre_block_state: + { + type: "line", + title: "Builder Resting Released: State Changed", + description: + "Carried resting validity transactions per block released at block start because watched state changed", + unit: "count", + }, + reth_base_builder_resting_predicate_carry_released_total_reason_block_number: + { + type: "line", + title: "Builder Resting Released: Block Number", + description: + "Carried resting validity transactions per block released at block start by a block-number predicate", + unit: "count", + }, + reth_base_builder_resting_predicate_carry_released_total_reason_unseen: { + type: "line", + title: "Builder Resting Released: Unseen", + description: + "Carried resting validity transactions per block released at block start because the pool no longer yielded them", + unit: "count", + }, + reth_base_builder_resting_predicate_carry_resets_total: { + type: "line", + title: "Builder Resting Carry Resets", + description: + "Block builds that discarded carried resting validity transactions because the parent was not the last block the builder finished", + unit: "count", + }, + reth_base_builder_resting_predicate_shadow_mismatches_total: { + type: "line", + title: "Builder Resting Shadow Mismatches", + description: + "Resting validity transactions per block whose predicates matched when evaluated in shadow mode, indicating the resting index disagreed with evaluation", + unit: "count", + }, + reth_base_builder_predicate_bucket_depth_avg: { + type: "line", + title: "Builder Predicate Bucket Depth", + description: + "Average depth of validity-predicate index buckets, sampled once per build", + unit: "count", + }, + reth_base_builder_predicate_bucket_wakeups_avg: { + type: "line", + title: "Builder Predicate Bucket Wakeups", + description: + "Average number of validity-predicate index buckets woken per build", + unit: "count", + }, } satisfies Record; const CHART_CONFIG_ORDER: (keyof typeof CHART_CONFIG)[] = [ From 2b35efb06f6afb0c4f906d77c8b3201b016b30c7 Mon Sep 17 00:00:00 2001 From: Fahim Ahmed Date: Wed, 28 Oct 2026 13:38:51 -0400 Subject: [PATCH 2/3] feat(report): chart the remaining validity evaluation outcomes Add rescan_budget_exhausted, rescan_read_error and unsupported to match the base-bench allowlist, so every ValidityEvaluationOutcome has a chart. --- report/src/metricDefinitions.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/report/src/metricDefinitions.ts b/report/src/metricDefinitions.ts index 9e16db81..71c41eea 100644 --- a/report/src/metricDefinitions.ts +++ b/report/src/metricDefinitions.ts @@ -512,6 +512,29 @@ export const CHART_CONFIG = { "Parked validity transactions per block that stayed resting after a rescan", unit: "count", }, + reth_base_builder_validity_predicate_evaluations_total_outcome_rescan_budget_exhausted: + { + type: "line", + title: "Builder Resting Rescan: Budget Exhausted", + description: + "Parked validity transactions per block left unevaluated on rescan because the predicate evaluation budget was exhausted", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_rescan_read_error: + { + type: "line", + title: "Builder Resting Rescan: Read Error", + description: + "Parked validity transactions per block whose rescan failed to read predicate state", + unit: "count", + }, + reth_base_builder_validity_predicate_evaluations_total_outcome_unsupported: { + type: "line", + title: "Builder Predicate Evaluations: Unsupported", + description: + "Validity transactions per block rejected unevaluated because a predicate kind is unsupported by the native builder", + unit: "count", + }, reth_base_builder_predicate_accounts_loaded_total_avg: { type: "line", title: "Builder Predicate Account Reads", From 83b731e03e26f035d46a867d1a2665f04bdab254 Mon Sep 17 00:00:00 2001 From: Fahim Ahmed Date: Wed, 28 Oct 2026 13:38:51 -0400 Subject: [PATCH 3/3] feat(report): chart txpool validity admissions Match the base-bench allowlist: validity transactions admitted to the pool per block (added / replaced), to read against validity txs included per block. --- report/src/metricDefinitions.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/report/src/metricDefinitions.ts b/report/src/metricDefinitions.ts index 71c41eea..c92ae5de 100644 --- a/report/src/metricDefinitions.ts +++ b/report/src/metricDefinitions.ts @@ -411,6 +411,20 @@ export const CHART_CONFIG = { "Average gas used by validity-predicate transactions per block", unit: "gas", }, + reth_txpool_validity_admitted_outcome_added: { + type: "line", + title: "Txpool Validity Admissions", + description: + "Validity transactions admitted to the builder's pool per block as new entries; compared with validity txs included per block it shows whether the validity lane is draining or backing up", + unit: "count", + }, + reth_txpool_validity_admitted_outcome_replaced: { + type: "line", + title: "Txpool Validity Replacements", + description: + "Validity transactions admitted per block that replaced an existing same-sender/nonce pool entry", + unit: "count", + }, reth_base_builder_validity_candidate_handling_duration_avg: { type: "line", title: "Builder Validity Candidate Handling",