@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
|