Skip to content

feat(devnet): Add Dynamic Upgrades Dashboard - #5058

Open
refcell wants to merge 1 commit into
mainfrom
rf/feat/devnet-dynamic-upgrades-dashboard
Open

refcell wants to merge 1 commit into
mainfrom
rf/feat/devnet-dynamic-upgrades-dashboard

Conversation

@refcell

@refcell refcell commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds an automatically provisioned Grafana dashboard for local devnet dynamic upgrades, linked from the control room with preserved node filters and time range. Adapts the internal chain-overview panels to Prometheus, covering observed schedules, cross-node and EL/CL divergence, read health, and apply diagnostics without treating missing telemetry as healthy zero. Documents usage and adds regression coverage for all 21 queries and 16 behavioral scenarios; provisioning, queries, and rendering were smoke-tested in Grafana 10.4.3 with synthetic metrics rather than a full devnet.

Co-authored-by: Codex <codex-noreply@coinbase.com>
@refcell refcell added feature New feature tooling Area: tooling labels Sep 15, 2026
@refcell refcell self-assigned this Sep 15, 2026
@cb-heimdall

Copy link
Copy Markdown
Collaborator

🟡 Heimdall Review Status

Requirement Status More Info
Reviews 🟡 0/1
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 1
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 1
1
1 if commit is unverified 0
Sum 1

@depot-code-access

depot-code-access Bot commented Sep 15, 2026

Copy link
Copy Markdown

✅ All benchmarks green — 14 within ±2% (deterministic instruction counts). View run

Benchmark details (14)
Benchmark Base (target) Head (this PR) Δ instructions
batch_queue/drain/drain_cached_span_batches 242,027 242,027 +0.0%
batch_transaction/encode_in_place/encode_in_place 4,199,759 4,199,759 +0.0%
batch_transaction/temporary_frame_buffers/temporary_frame_buffers 8,408,350 8,408,350 +0.0%
flashblock_decode/decode/brotli 3,296,484 3,296,484 +0.0%
flashblock_decode/decode/plain_json 2,280,194 2,280,194 +0.0%
flz/compress_len/real_contract_call 43,148 43,148 +0.0%
flz/compress_len/synthetic_0 38,205 38,205 +0.0%
flz/compress_len/synthetic_1 54,682 54,682 +0.0%
flz/compress_len/synthetic_2 147,976 147,976 +0.0%
flz/data_gas 43,059 43,059 +0.0%
flz/tx_estimated_size 43,056 43,056 +0.0%
frame_parse/decode/single_4kib 1,031 1,031 +0.0%
frame_parse/parse_frames/few_large 1,053,062 1,053,062 +0.0%
frame_parse/parse_frames/many_small 154,763 154,763 +0.0%

@refcell
refcell marked this pull request as ready for review September 15, 2026 17:45
@refcell
refcell enabled auto-merge September 15, 2026 17:45
@github-actions

Copy link
Copy Markdown
Contributor

Review Summary

PR: feat(devnet): Add Dynamic Upgrades Dashboard

This PR adds a Grafana dashboard for observing dynamic upgrade signals on the local devnet, a Python test harness validating all 21 PromQL queries against the devnet's Prometheus image, documentation, and a control-room link from the existing devnet dashboard.

Scope: Devnet observability tooling only (JSON, Python, Markdown). No Rust code or block-production paths are affected.

Findings: No issues found. The dashboard structure, PromQL queries, template variables, test coverage, and documentation are all sound.

@depot-code-access

Copy link
Copy Markdown

Base Std historical fork tests

Fork Result Passed Failed Skipped base/base base-anvil base-std
Beryl pass 616 0 13 a5de0d46 98e7839c 520d069b
Cobalt pass 725 0 14 a5de0d46 98e7839c 4571b325

View run

rules = [{"record": f"dashboard_expression_{index}", "expr": interpolate(expression, defaults)}
for index, expression in enumerate(expressions.values())]
compose = (DIRECTORY.parents[2] / "docker/docker-compose.yml").read_text()
image = re.search(r"image:\s*(prom/prometheus:[^\s]+)", compose).group(1)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: re.search(…).group(1) raises an opaque AttributeError: 'NoneType' object has no attribute 'group' if the Prometheus image line is ever removed or reformatted in docker-compose.yml. Consider a guard with a descriptive message:

Suggested change
image = re.search(r"image:\s*(prom/prometheus:[^\s]+)", compose).group(1)
match = re.search(r"image:\s*(prom/prometheus:[^\s]+)", compose)
assert match, "Could not find prom/prometheus image in docker-compose.yml"
image = match.group(1)

@github-actions

Copy link
Copy Markdown
Contributor

Review Summary

This PR adds a Grafana dashboard for monitoring dynamic upgrade signals on the local devnet, along with a Python test harness that validates all 21 PromQL queries and 16 behavioral scenarios using promtool in Docker.

Scope: Devnet observability tooling only — no Rust code, no block-production paths, no node logic changes.

What looks good:

  • Dashboard correctly distinguishes "no telemetry" from healthy zero throughout (stat panels, descriptions, value mappings).
  • PromQL divergence detection properly requires count > 1 to avoid single-reporter false positives.
  • Read-error deduplication via max by (job, instance, layer) prevents inflation from per-upgrade counter duplication.
  • Empty-schedule reads intentionally omit the upgrade filter, and the test ("empty schedules have no upgrade label") validates this.
  • Test harness pulls the exact Prometheus image from docker-compose.yml, ensuring promtool version alignment with the devnet.

One minor finding: posted inline on the test script (re.search without a None guard).

No blocking issues found.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New feature tooling Area: tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants