diff --git a/deploy/grafana/stream.json b/deploy/grafana/stream.json index 70777db..fceaa8b 100644 --- a/deploy/grafana/stream.json +++ b/deploy/grafana/stream.json @@ -42,7 +42,7 @@ } ] }, - "description": "Stream operational dashboard adapted from the checksum-pinned Jetstream V2 dashboard. Protocol and lifecycle rows are unchanged; the runtime row uses Stream process metrics, and final Stream-only rows expose current-batch backfill work and scheduler health.", + "description": "Stream operational dashboard adapted from the checksum-pinned Jetstream V2 dashboard. Protocol and lifecycle rows are unchanged; the runtime row uses Stream process metrics, and final Stream-only rows expose backfill work over time and scheduler health.", "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, @@ -7214,7 +7214,7 @@ { "id": 80, "type": "row", - "title": "Backfill batch progress", + "title": "Backfill progress over time", "collapsed": false, "gridPos": { "h": 1, @@ -7228,8 +7228,8 @@ { "id": 81, "type": "timeseries", - "title": "Current dispatch batch over time", - "description": "Absolute repository counts in the current process. listRepos is fetched in pages of 1,000; Stream follows upstream Jetstream V2 by accumulating about 100,000 entries before shuffling and dispatching a batch. Durably committed advances only after that batch checkpoint. These lines are not a percentage of the full network.", + "title": "Backfill repositories over time", + "description": "Absolute repository counts across the current backfill run. listRepos is fetched in pages of 1,000; Stream follows upstream Jetstream V2 by accumulating about 100,000 entries before shuffling and dispatching a batch. Durably committed advances only after that batch checkpoint. These lines are not a percentage of the full network.", "datasource": { "type": "prometheus", "uid": "${datasource}" diff --git a/docs/grafana-dashboard.md b/docs/grafana-dashboard.md index 01b74a5..08d59b6 100644 --- a/docs/grafana-dashboard.md +++ b/docs/grafana-dashboard.md @@ -11,7 +11,7 @@ The exact reviewed bytes are vendored at `deploy/grafana/jetstream-upstream.json`; deployment does not depend on the network or a moving branch. Stream provisions `deploy/grafana/stream.json` (SHA-256 -`630cc34ad8cc22944871c00759b905c8b4eef25e7d4a792b4822dd983d3f46e8`). It is +`c2600122ad4cf2acd81d013438c5b536cc46f37255ea8cf7e829e7536c9321f9`). It is deterministically generated by `tools/adapt_dashboard.py` from the pinned source. The generator refuses a changed source checksum, and the tests prove every upstream non-runtime panel remains structurally identical. Stream adds @@ -193,7 +193,8 @@ The following dashboard families already have non-placeholder producers: - `jetstream_compaction_watermark_seq` - `jetstream_compaction_watermark_lag_seconds` -The Stream-only backfill chart plots absolute repository counts over time: +The Stream-only backfill chart plots absolute repository counts across the +current run over time: `discovered`, `processed`, and `durably committed`. It deliberately does not present a whole-network percentage while `listRepos` is still discovering the denominator. Upstream requests are pages of 1,000 entries; the production diff --git a/tests/test_dashboard_contract.py b/tests/test_dashboard_contract.py index fd1a05a..dca5c3a 100644 --- a/tests/test_dashboard_contract.py +++ b/tests/test_dashboard_contract.py @@ -64,7 +64,7 @@ class DashboardContractTest(unittest.TestCase): progress = stream_panels[81] self.assertEqual("timeseries", progress["type"]) - self.assertEqual("Current dispatch batch over time", progress["title"]) + self.assertEqual("Backfill repositories over time", progress["title"]) self.assertIn("pages of 1,000", progress["description"]) self.assertIn("100,000", progress["description"]) self.assertIn("not a percentage of the full network", progress["description"]) diff --git a/tools/adapt_dashboard.py b/tools/adapt_dashboard.py index 8fc4175..2bbf939 100644 --- a/tools/adapt_dashboard.py +++ b/tools/adapt_dashboard.py @@ -41,9 +41,9 @@ def progress_panel(template: dict) -> dict: panel.update( id=81, type="timeseries", - title="Current dispatch batch over time", + title="Backfill repositories over time", description=( - "Absolute repository counts in the current process. listRepos is fetched in pages " + "Absolute repository counts across the current backfill run. listRepos is fetched in pages " "of 1,000; Stream follows upstream Jetstream V2 by accumulating about 100,000 " "entries before shuffling and dispatching a batch. Durably committed advances only " "after that batch checkpoint. These lines are not a percentage of the full network." @@ -168,7 +168,7 @@ def adapt(raw: bytes) -> bytes: progress_row = copy.deepcopy(panels[75]) progress_row.update( id=80, - title="Backfill batch progress", + title="Backfill progress over time", description="The final network denominator is unknown until listRepos discovery finishes.", gridPos={"h": 1, "w": 24, "x": 0, "y": 170}, ) @@ -256,7 +256,7 @@ def adapt(raw: bytes) -> bytes: dashboard["description"] = ( "Stream operational dashboard adapted from the checksum-pinned Jetstream V2 dashboard. " "Protocol and lifecycle rows are unchanged; the runtime row uses Stream process metrics, " - "and final Stream-only rows expose current-batch backfill work and scheduler health." + "and final Stream-only rows expose backfill work over time and scheduler health." ) return (json.dumps(dashboard, indent=2, ensure_ascii=False) + "\n").encode() diff --git a/tools/check_dashboard.py b/tools/check_dashboard.py index a2feb6d..5eba6cd 100755 --- a/tools/check_dashboard.py +++ b/tools/check_dashboard.py @@ -17,7 +17,7 @@ UPSTREAM_DASHBOARD = ROOT / "deploy/grafana/jetstream-upstream.json" DEFAULT_DASHBOARD = ROOT / "deploy/grafana/stream.json" EXPECTED_SHA256 = { UPSTREAM_DASHBOARD.resolve(): "ef6033c182d8c3f9d88af7d91e61126724efbe72e6b940984c9de12e9530cd91", - DEFAULT_DASHBOARD.resolve(): "630cc34ad8cc22944871c00759b905c8b4eef25e7d4a792b4822dd983d3f46e8", + DEFAULT_DASHBOARD.resolve(): "c2600122ad4cf2acd81d013438c5b536cc46f37255ea8cf7e829e7536c9321f9", } METRIC_RE = re.compile(r"\b(?:jetstream|go|process|stream)_[a-zA-Z_:][a-zA-Z0-9_:]*") TYPE_RE = re.compile(r"^# TYPE ([a-zA-Z_:][a-zA-Z0-9_:]*) (\w+)$")