Background
etc/grafana/dashboards/morph-reth.json is a Morph fork of upstream reth's overview dashboard, plus Morph-specific Engine API / payload-builder rows. The last dashboard change in this repo was PR #110 (2026-05-20, "Improve Grafana dashboard signal quality"). Since then we have stayed on reth v2.4.0 while upstream's etc/grafana/dashboards/overview.json continued to grow (state-root task, proof workers, engine-API message mix, blob/getBlobs latency, cargo-features, etc.). The Morph JSON was never rebased onto that tree.
Separately, bounded historical proofs (PR #142 / proofs-history ExEx) already emit Prometheus metrics that have no dashboard coverage:
morph.proofs: per-block duration (total / execution / state-root / write), trie/leaf write counters, earliest_block / latest_block window gauges, prune and unwind error counters.
morph.rpc.proofs: eth_getProof request / success / failure counters and latency.
Operators therefore cannot see whether the 7-day proofs window is healthy, lagging, pruning, or serving RPC, from the provisioned Grafana stack (etc/docker-compose.yml).
Problem
- Drift from upstream. Broken or stale PromQL against current reth metric names; missing panels that operators already expect from a v2.4 reth node.
- No proofs-history observability. After enabling
--morph.proofs-history, there is no row for window bounds, catch-up cost, prune/unwind failures, or historical-proof RPC rate/latency.
Proposed work
- Rebase
etc/grafana/dashboards/morph-reth.json onto the upstream reth overview dashboard that matches our pinned tag (paradigmxyz/reth v2.4.0), then re-apply Morph-only rows (custom L2 Engine API, payload builder, head timegap, Morph filters chain / role / service). Do not blindly copy later-than-v2.4 panels whose metric names we do not emit yet.
- Keep the Morph-specific Engine API and payload-builder sections; they are not in upstream.
- Add a Proof History row covering at least:
- Window:
reth_morph_proofs_earliest_block / reth_morph_proofs_latest_block (and the gap vs canonical height).
- Ingest cost:
block_total_duration_seconds, block_execution_duration_seconds, block_state_root_duration_seconds, block_write_duration_seconds.
- Write volume: account/storage trie updates and hashed leaves.
- Errors:
prune_errors_total, unwind_errors_total.
- RPC:
reth_morph_rpc_proofs_requests_total, success/failure rates, latency_seconds.
- Follow the export flow in
etc/README.md (Grafana UI export for sharing externally) so the JSON stays importable by etc/docker-compose.yml provisioning. Preserve ${datasource} / Prometheus placeholder replacement.
- Short note in
etc/README.md that proofs-history panels require the node to be run with proofs history enabled.
Out of scope
- Changing metric names in
morph-proofs / morph-rpc (adapt the dashboard to what we already emit).
- Alerting rules / Grafana Cloud.
- Implementing
eth_getMultiProof (separate issue). If that RPC lands first, add a method label or a second RPC series in the same Proof History row.
Acceptance
- Dashboard still provisions from
etc/grafana and the Morph Engine / payload rows still work.
- New Proof History panels render against a node that has proofs history on (empty/zero is fine when it is off).
- PromQL uses metrics that exist on the v2.4.0 + Morph binary; no panels pointed at names we do not scrape.
Background
etc/grafana/dashboards/morph-reth.jsonis a Morph fork of upstream reth's overview dashboard, plus Morph-specific Engine API / payload-builder rows. The last dashboard change in this repo was PR #110 (2026-05-20, "Improve Grafana dashboard signal quality"). Since then we have stayed on reth v2.4.0 while upstream'setc/grafana/dashboards/overview.jsoncontinued to grow (state-root task, proof workers, engine-API message mix, blob/getBlobs latency, cargo-features, etc.). The Morph JSON was never rebased onto that tree.Separately, bounded historical proofs (PR #142 / proofs-history ExEx) already emit Prometheus metrics that have no dashboard coverage:
morph.proofs: per-block duration (total / execution / state-root / write), trie/leaf write counters,earliest_block/latest_blockwindow gauges, prune and unwind error counters.morph.rpc.proofs:eth_getProofrequest / success / failure counters and latency.Operators therefore cannot see whether the 7-day proofs window is healthy, lagging, pruning, or serving RPC, from the provisioned Grafana stack (
etc/docker-compose.yml).Problem
--morph.proofs-history, there is no row for window bounds, catch-up cost, prune/unwind failures, or historical-proof RPC rate/latency.Proposed work
etc/grafana/dashboards/morph-reth.jsononto the upstream reth overview dashboard that matches our pinned tag (paradigmxyz/rethv2.4.0), then re-apply Morph-only rows (custom L2 Engine API, payload builder, head timegap, Morph filterschain/role/service). Do not blindly copy later-than-v2.4 panels whose metric names we do not emit yet.reth_morph_proofs_earliest_block/reth_morph_proofs_latest_block(and the gap vs canonical height).block_total_duration_seconds,block_execution_duration_seconds,block_state_root_duration_seconds,block_write_duration_seconds.prune_errors_total,unwind_errors_total.reth_morph_rpc_proofs_requests_total, success/failure rates,latency_seconds.etc/README.md(Grafana UI export for sharing externally) so the JSON stays importable byetc/docker-compose.ymlprovisioning. Preserve${datasource}/ Prometheus placeholder replacement.etc/README.mdthat proofs-history panels require the node to be run with proofs history enabled.Out of scope
morph-proofs/morph-rpc(adapt the dashboard to what we already emit).eth_getMultiProof(separate issue). If that RPC lands first, add a method label or a second RPC series in the same Proof History row.Acceptance
etc/grafanaand the Morph Engine / payload rows still work.