@blinklabs/dingo 0.37.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/RELEASE_NOTES.md CHANGED
@@ -1,6 +1,58 @@
1
1
  # Release Notes
2
2
 
3
3
 
4
+ ## v0.37.0 (April 27, 2026)
5
+
6
+ **Title:** Genesis bootstrap, governance, and steadier Mithril recovery
7
+
8
+ **Date:** April 27, 2026
9
+
10
+ **Version:** v0.37.0
11
+
12
+ Hi folks! Here’s what we shipped in v0.37.0.
13
+
14
+ ### ✨ What's New
15
+
16
+ * Added **Ouroboros Genesis bootstrap support:** Operators can now start from Genesis bootstrap flows, which gives early sync a clearer path before the node reaches the current chain tip.
17
+ * Expanded **Genesis mode chain selection:** Nodes can now choose the chain more safely during Genesis mode, which keeps early sync aligned with the right history.
18
+ * Introduced **bootstrap aware peer promotion:** Peer promotion now accounts for bootstrap state, which helps early sync keep useful peers active while the node is still catching up.
19
+ * Delivered **Conway governance ratification support:** Governance aware services can now track ratified actions more completely as Conway governance advances.
20
+ * Enabled **Conway governance enactment handling:** Governance state now follows enacted actions more accurately, which gives operators and integrators a clearer view of active governance outcomes.
21
+ * Preserved **committee quorum persistence:** Committee quorum information now persists across restarts, which keeps governance state steadier after interruptions.
22
+ * Opened **broader governance state handling:** Governance aware integrations can now read and handle more of the Conway governance state without losing important context.
23
+ * Unlocked **new Blockfrost compatible block endpoints:** Blockfrost compatible users can now retrieve additional block details through new block endpoints.
24
+ * Extended **new Blockfrost compatible network endpoints:** Network status integrations can now access new network endpoints in a Blockfrost compatible shape.
25
+ * Introduced **new Blockfrost compatible era endpoints:** Era aware clients can now request era information through new Blockfrost compatible endpoints.
26
+ * Added **new Blockfrost compatible genesis endpoints:** Genesis data is now available through new Blockfrost compatible endpoints for services that need network bootstrap details.
27
+
28
+ ### 💪 Improvements
29
+
30
+ * Improved **newer Mithril snapshot compatibility:** Bootstrap runs now accept newer snapshot shapes more reliably, which makes setup and recovery smoother across current Mithril data.
31
+ * Refined **interrupted Mithril resume safety:** Resuming after an interrupted Mithril run now behaves more safely, which reduces the chance of a broken recovery path.
32
+ * Enhanced **bootstrap aware peer governance:** Peer promotion and selection now align more closely with bootstrap state, which helps early sync keep useful peers active.
33
+ * Modernized **bootstrap and governance observability:** Operators can now see more metrics and event signals around bootstrap and governance behavior.
34
+ * Updated **operator and integrator guidance:** Documentation and workflow refreshes make recent bootstrap, governance, and API behavior easier to follow.
35
+
36
+ ### 🔧 Fixes
37
+
38
+ * Fixed **Mithril bootstrap resume reliability:** Mithril bootstrap and resume handling now recover more reliably when a previous run stopped before completion.
39
+ * Corrected **snapshot bootstrap handling:** Snapshot based bootstrap flows now handle current snapshot layouts correctly, which reduces failed setup paths.
40
+ * Hardened **early sync recovery behavior:** Recovery during early sync now follows Genesis mode chain selection and bootstrap aware promotion more safely after interruptions.
41
+ * Stabilized **governance state continuity:** Governance state now keeps ratification, enactment, and committee quorum handling steadier across restarts and replay.
42
+
43
+ ### 📋 What You Need to Know
44
+
45
+ * Clarified **Genesis bootstrap rollout:** Ouroboros Genesis bootstrap changes early sync behavior, including Genesis mode chain selection and bootstrap aware peer promotion.
46
+ * Highlighted **governance support growth:** Conway governance coverage now reaches ratification, enactment, committee quorum persistence, and broader governance state handling.
47
+ * Emphasized **steadier Mithril recovery:** Mithril bootstrap and resume handling now work more reliably with newer snapshot shapes and safer interrupted resume behavior.
48
+ * Summarized **expanded Blockfrost compatibility:** Blockfrost compatible users can now use new block, network, era, and genesis endpoints.
49
+
50
+ ### 🙏 Thank You
51
+
52
+ Thank you for trying!
53
+
54
+ ---
55
+
4
56
  ## v0.36.1 (April 21, 2026)
5
57
 
6
58
  **Title:** Steadier catch-up sync and refreshed integrations
@@ -0,0 +1,188 @@
1
+ # Dingo Grafana Dashboards
2
+
3
+ Monitoring dashboards for [Dingo](https://github.com/blinklabs-io/dingo), the Go Cardano node by Blink Labs.
4
+
5
+ ## Dashboards
6
+
7
+ | Dashboard | File | Description |
8
+ |-----------|------|-------------|
9
+ | **Node Overview** | `node-overview.json` | At-a-glance header (epoch, slot, tip gap, density, blockfetch, mempool, KES, peers, storage, runtime), block height, epoch progress, forging stats |
10
+ | **Block Production** | `block-production.json` | Forge latency heatmap, block delay CDFs, forge rates, KES lifecycle |
11
+ | **Peer Health** | `peer-health.json` | Hot/warm/cold peers, connection types, peer state timeseries, promotions/demotions, network I/O |
12
+ | **Mempool** | `mempool.json` | Pending TXs, mempool size, TX lifecycle, CBOR cache, event bus |
13
+ | **Resource Usage** | `resources.json` | CPU, memory, GC heatmap, disk I/O, IOPS, PSI pressure, Badger, file descriptors |
14
+
15
+ `full-panel.json` contains the standalone Business Text header panel for embedding into custom dashboards.
16
+
17
+ ## Prerequisites
18
+
19
+ Before you begin, make sure you have:
20
+
21
+ - **Grafana 12+** (tested on 12.4) — [install guide](https://grafana.com/docs/grafana/latest/setup-grafana/installation/)
22
+ - **Prometheus** scraping your Dingo node on port `12798` (configured in step 2 below)
23
+ - **Dingo** node with metrics enabled (default port `12798`)
24
+ - **[Business Text plugin](https://grafana.com/grafana/plugins/marcusolsson-dynamictext-panel/)** — required by all dashboards for the header panel
25
+ - **[prometheus-node-exporter](https://github.com/prometheus/node_exporter)** — required only by the Resource Usage dashboard for host-level CPU, memory, and disk metrics
26
+
27
+ ## Quick start
28
+
29
+ ### 1. Install the Business Text plugin
30
+
31
+ Open a terminal on the machine running Grafana and run:
32
+
33
+ ```bash
34
+ grafana-cli plugins install marcusolsson-dynamictext-panel
35
+ sudo systemctl restart grafana-server
36
+ ```
37
+
38
+ If you are running Grafana in Docker or Kubernetes, set the environment variable instead:
39
+
40
+ ```text
41
+ GF_INSTALL_PLUGINS=marcusolsson-dynamictext-panel
42
+ ```
43
+
44
+ ### 2. Configure Prometheus scrape targets
45
+
46
+ Prometheus needs to know where to find your Dingo node. Add the following to your `prometheus.yml` under `scrape_configs`:
47
+
48
+ ```yaml
49
+ - job_name: dingo
50
+ scrape_interval: 15s
51
+ static_configs:
52
+ - targets: ['localhost:12798']
53
+
54
+ # Optional: required for Resource Usage dashboard
55
+ - job_name: node
56
+ scrape_interval: 15s
57
+ static_configs:
58
+ - targets: ['localhost:9100']
59
+ ```
60
+
61
+ Then reload Prometheus to apply the change:
62
+
63
+ ```bash
64
+ sudo systemctl reload prometheus
65
+ ```
66
+
67
+ ### 3. Import dashboards
68
+
69
+ There are two ways to get the dashboards into Grafana.
70
+
71
+ **Option A: Provisioning (recommended)**
72
+
73
+ Provisioning automatically loads dashboards from files on disk. Grafana will pick them up on startup or within about 30 seconds if already running.
74
+
75
+ ```bash
76
+ sudo cp docs/dashboards/provisioning.yaml /etc/grafana/provisioning/dashboards/dingo.yaml
77
+ sudo mkdir -p /var/lib/grafana/dashboards/dingo
78
+ sudo cp docs/dashboards/*.json /var/lib/grafana/dashboards/dingo/
79
+ sudo chown -R grafana:grafana /var/lib/grafana/dashboards/dingo/
80
+ sudo systemctl restart grafana-server
81
+ ```
82
+
83
+ After restarting, go to **Dashboards → Browse** in the Grafana UI and search for "Dingo". All five dashboards appear in a **Dingo** folder automatically.
84
+
85
+ **Note:** `allowUiUpdates: true` lets you edit dashboards in the Grafana UI, but changes will be overwritten on the next provision cycle (every 30 seconds). To make permanent edits, modify the JSON files directly.
86
+
87
+ **Option B: Manual import**
88
+
89
+ 1. Open Grafana in your browser
90
+ 2. Go to **Dashboards → New → Import**
91
+ 3. Upload each JSON file
92
+ 4. Select your Prometheus datasource when prompted
93
+
94
+ ### 4. Alert rules (optional)
95
+
96
+ The alert rules file is ready to use as-is — no editing required.
97
+
98
+ Copy the file to your Prometheus rules directory:
99
+
100
+ ```bash
101
+ sudo cp docs/dashboards/alerts.yaml /etc/prometheus/rules/dingo.yaml
102
+ ```
103
+
104
+ Then add it to `prometheus.yml`:
105
+
106
+ ```yaml
107
+ rule_files:
108
+ - /etc/prometheus/rules/dingo.yaml
109
+ ```
110
+
111
+ Reload Prometheus:
112
+
113
+ ```bash
114
+ sudo systemctl reload prometheus
115
+ ```
116
+
117
+ ## Datasource
118
+
119
+ All dashboards expect a Prometheus datasource with UID `prometheus`. If your datasource has a different UID, update it before importing or recreate the datasource with UID `prometheus`.
120
+
121
+ ## Template variables
122
+
123
+ All dashboards include two template variables that auto-discover dingo instances:
124
+
125
+ | Variable | Query | Purpose |
126
+ |----------|-------|---------|
127
+ | `$network` | `label_values(dingo_build_info, network)` | Selects the Cardano network (`preview`, `preprod`, `mainnet`). |
128
+ | `$instance` | `label_values(dingo_build_info{network="$network"}, instance)` | Selects specific dingo instance(s). Multi-select with "All" default. |
129
+
130
+ `dingo_build_info` is a metric only dingo exposes (includes `network`, `version`, `commit` labels). This ensures dropdowns show only dingo targets, never Haskell cardano-node.
131
+
132
+ All panel queries use `{network="$network", instance=~"$instance"}` as their selector.
133
+
134
+ The **Resource Usage** dashboard adds a third variable:
135
+
136
+ | Variable | Query | Purpose |
137
+ |----------|-------|---------|
138
+ | `$node_instance` | `label_values(node_uname_info, instance)` | Selects the node_exporter target for host-level metrics (CPU, memory, disk, network). node_exporter runs on a different port (default `9100`) from the dingo metrics port, so it needs its own instance dropdown. |
139
+
140
+ Set `$node_instance` to the hostname/port reported by your node_exporter scrape target (typically `localhost:9100` or the host IP).
141
+
142
+ ## Navigation
143
+
144
+ Dashboard-level links at the top of each dashboard connect all 5 dashboards. Links preserve the selected time range and template variables.
145
+
146
+ ## Dormant metrics
147
+
148
+ Some metrics only emit when their feature is active. Panels display "No data" until activated:
149
+
150
+ | Metric | Activates when |
151
+ |--------|---------------|
152
+ | `cardano_node_metrics_Forge_node_is_leader_int` | Forging is enabled |
153
+ | `cardano_node_metrics_Forge_adopted_int` | Block is forged and adopted |
154
+ | `cardano_node_metrics_blockForgingLatency_seconds_bucket` | Block is forged |
155
+ | `cardano_node_metrics_remainingKESPeriods_int` | KES key is configured |
156
+ | `dingo_forge_tip_gap_slots` | Forging is enabled |
157
+ | `dingo_database_size_bytes` | Database stores are initialized |
158
+ | `database_blob_*` | Badger blob store is active |
159
+
160
+ ## File listing
161
+
162
+ ```text
163
+ docs/dashboards/
164
+ node-overview.json Node Overview dashboard
165
+ block-production.json Block Production dashboard
166
+ peer-health.json Peer Health dashboard
167
+ mempool.json Mempool dashboard
168
+ resources.json Resource Usage dashboard
169
+ full-panel.json Business Text header panel (standalone)
170
+ provisioning.yaml Grafana provisioning config
171
+ prometheus.yaml Prometheus scrape config snippet
172
+ alerts.yaml Prometheus alert rules
173
+ README.md This file
174
+ ```
175
+
176
+ ## Troubleshooting
177
+
178
+ **Business Text plugin not found / panels show "Panel plugin not found: marcusolsson-dynamictext-panel"**
179
+ Install the plugin (step 1 above) and restart Grafana. If running in a managed environment, add `marcusolsson-dynamictext-panel` to your `GF_INSTALL_PLUGINS` list.
180
+
181
+ **Panels show "No data"**
182
+ Check that Prometheus is scraping your Dingo node: open Prometheus in the browser, go to **Status → Targets**, and confirm the `dingo` job is up. Also verify the `$network` and `$instance` template variables at the top of the dashboard are set to the correct values.
183
+
184
+ **Datasource UID mismatch ("datasource not found")**
185
+ All JSON files use the datasource UID `prometheus`. If your Prometheus datasource has a different UID, either rename it to `prometheus` in **Connections → Data sources**, or do a find-and-replace of `"prometheus"` with your actual UID in the JSON files before importing.
186
+
187
+ **Dashboards not appearing after provisioning**
188
+ Confirm `/etc/grafana/provisioning/dashboards/dingo.yaml` references the correct path. Grafana auto-reloads provisioned dashboards every 30 seconds; if it hasn't appeared after a minute, check the Grafana log (`journalctl -u grafana-server`) for errors.
@@ -0,0 +1,29 @@
1
+ groups:
2
+ - name: dingo
3
+ rules:
4
+ - alert: DingoBlockStall
5
+ expr: changes(cardano_node_metrics_blockNum_int{network=~".+"}[5m]) == 0
6
+ for: 0m
7
+ labels:
8
+ severity: warning
9
+ annotations:
10
+ summary: "Dingo block height stalled on {{ $labels.network }}"
11
+ description: "Node {{ $labels.instance }} on {{ $labels.network }}: block height has not changed in 5 minutes."
12
+
13
+ - alert: DingoSlotDrift
14
+ expr: changes(cardano_node_metrics_slotNum_int{network=~".+"}[2m]) == 0
15
+ for: 0m
16
+ labels:
17
+ severity: warning
18
+ annotations:
19
+ summary: "Dingo slot counter stalled on {{ $labels.network }}"
20
+ description: "Node {{ $labels.instance }} on {{ $labels.network }}: slot counter has not advanced in 2 minutes."
21
+
22
+ - alert: DingoPeerLoss
23
+ expr: cardano_node_metrics_connectionManager_outgoingConns{network=~".+"} == 0
24
+ for: 5m
25
+ labels:
26
+ severity: critical
27
+ annotations:
28
+ summary: "Dingo has no outgoing peers on {{ $labels.network }}"
29
+ description: "Node {{ $labels.instance }} on {{ $labels.network }}: zero outgoing connections for 5+ minutes. Node cannot sync."
@@ -0,0 +1,16 @@
1
+ ## Prometheus scrape configuration for Dingo dashboards
2
+ ##
3
+ ## Add these jobs to your prometheus.yml under scrape_configs:
4
+
5
+ scrape_configs:
6
+ # Dingo node metrics (default port 12798)
7
+ - job_name: dingo
8
+ scrape_interval: 15s
9
+ static_configs:
10
+ - targets: ['localhost:12798']
11
+
12
+ # Node exporter for host-level metrics (required by Resource Usage dashboard)
13
+ - job_name: node
14
+ scrape_interval: 15s
15
+ static_configs:
16
+ - targets: ['localhost:9100']
@@ -0,0 +1,14 @@
1
+ apiVersion: 1
2
+
3
+ providers:
4
+ - name: dingo
5
+ orgId: 1
6
+ folder: Dingo
7
+ folderUid: dingo-dashboards
8
+ type: file
9
+ disableDeletion: false
10
+ updateIntervalSeconds: 30
11
+ allowUiUpdates: true
12
+ options:
13
+ path: /var/lib/grafana/dashboards/dingo
14
+ foldersFromFilesStructure: false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blinklabs/dingo",
3
- "version": "0.37.0",
3
+ "version": "0.38.0",
4
4
  "description": "Dingo is a Cardano blockchain data node",
5
5
  "main": "index.js",
6
6
  "bin": {