@blinklabs/dingo 0.46.4 → 0.80.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/README.md +63 -565
- package/npm/bin/dingo.js +37 -0
- package/npm/checksums.json +8 -0
- package/npm/install.js +211 -0
- package/npm/postinstall.js +21 -0
- package/package.json +23 -14
- package/.dockerignore +0 -9
- package/AGENTS.md +0 -52
- package/ARCHITECTURE.md +0 -1157
- package/CLAUDE.md +0 -38
- package/RELEASE_NOTES.md +0 -2076
- package/benchmark_results.md +0 -130
- package/benchmark_results_bp_pi.md +0 -50
- package/benchmark_results_targeted.md +0 -102
- package/devmode.sh +0 -37
- package/dingo.yaml.example +0 -376
- package/docker-compose.yml +0 -51
- package/docs/dashboards/README.md +0 -188
- package/docs/dashboards/alerts.yaml +0 -29
- package/docs/dashboards/prometheus.yaml +0 -16
- package/docs/dashboards/provisioning.yaml +0 -14
- package/generate_benchmarks.sh +0 -588
- package/generate_bp_pi_report.sh +0 -359
package/dingo.yaml.example
DELETED
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
# Example config file for dingo
|
|
2
|
-
# The values shown below correspond to the in-code defaults unless a
|
|
3
|
-
# setting is left commented out to preserve a storage-mode-specific
|
|
4
|
-
# runtime default.
|
|
5
|
-
|
|
6
|
-
# Public bind address for the Dingo server
|
|
7
|
-
# CLI: --bind-addr
|
|
8
|
-
bindAddr: "0.0.0.0"
|
|
9
|
-
|
|
10
|
-
# Path to the Cardano node configuration file
|
|
11
|
-
#
|
|
12
|
-
# Can be overridden with the config environment variable
|
|
13
|
-
# CLI: --cardano-config
|
|
14
|
-
cardanoConfig: "./config/cardano/preview/config.json"
|
|
15
|
-
|
|
16
|
-
# Global data directory for both blob and metadata storage plugins.
|
|
17
|
-
# Can be overridden with CARDANO_DATABASE_PATH or --data-dir.
|
|
18
|
-
# Plugin-specific data-dir settings below override this value.
|
|
19
|
-
databasePath: ".dingo"
|
|
20
|
-
|
|
21
|
-
# Database configuration
|
|
22
|
-
database:
|
|
23
|
-
# Blob storage plugin configuration
|
|
24
|
-
blob:
|
|
25
|
-
# Plugin to use for blob storage (badger, gcs, s3)
|
|
26
|
-
plugin: "badger"
|
|
27
|
-
# Configuration options for each plugin
|
|
28
|
-
badger:
|
|
29
|
-
# Data directory for BadgerDB storage
|
|
30
|
-
data-dir: ".dingo/badger"
|
|
31
|
-
# Block cache size in bytes.
|
|
32
|
-
# Leave unset to use the storage-mode default:
|
|
33
|
-
# - 0 when storageMode: "core"
|
|
34
|
-
# - 268435456 (256MB) when storageMode: "api"
|
|
35
|
-
# block-cache-size: 0
|
|
36
|
-
# Index cache size in bytes.
|
|
37
|
-
# Leave unset to use the runtime default (0 in both core and api modes).
|
|
38
|
-
# index-cache-size: 0
|
|
39
|
-
# Enable garbage collection (default: true)
|
|
40
|
-
gc: true
|
|
41
|
-
# Enable Snappy compression.
|
|
42
|
-
# Leave unset to use the storage-mode default:
|
|
43
|
-
# - false when storageMode: "core"
|
|
44
|
-
# - true when storageMode: "api"
|
|
45
|
-
# compression: false
|
|
46
|
-
gcs:
|
|
47
|
-
# Google Cloud Storage bucket name
|
|
48
|
-
bucket: ""
|
|
49
|
-
# Google Cloud project ID
|
|
50
|
-
project-id: ""
|
|
51
|
-
# Path prefix within the bucket
|
|
52
|
-
prefix: ""
|
|
53
|
-
s3:
|
|
54
|
-
# AWS Endpoint
|
|
55
|
-
endpoint: ""
|
|
56
|
-
# AWS S3 bucket name
|
|
57
|
-
bucket: ""
|
|
58
|
-
# AWS region
|
|
59
|
-
region: ""
|
|
60
|
-
# Path prefix within the bucket
|
|
61
|
-
prefix: ""
|
|
62
|
-
# AWS access key ID (optional - uses default credential chain if not set)
|
|
63
|
-
access-key-id: ""
|
|
64
|
-
# AWS secret access key (optional - uses default credential chain if not set)
|
|
65
|
-
secret-access-key: ""
|
|
66
|
-
|
|
67
|
-
# Metadata storage plugin configuration
|
|
68
|
-
metadata:
|
|
69
|
-
# Plugin to use for metadata storage (sqlite, postgres, mysql)
|
|
70
|
-
plugin: "sqlite"
|
|
71
|
-
# Configuration options for each plugin
|
|
72
|
-
sqlite:
|
|
73
|
-
# Path to SQLite database file
|
|
74
|
-
data-dir: ".dingo/metadata.db"
|
|
75
|
-
postgres:
|
|
76
|
-
# NOTE: These are example values for local development only.
|
|
77
|
-
# Do not use these credentials in production environments.
|
|
78
|
-
# Postgres host
|
|
79
|
-
host: "localhost"
|
|
80
|
-
# Postgres port
|
|
81
|
-
port: 5432
|
|
82
|
-
# Postgres user
|
|
83
|
-
user: "postgres"
|
|
84
|
-
# Postgres password (required - no default)
|
|
85
|
-
password: ""
|
|
86
|
-
# Postgres database name
|
|
87
|
-
database: "postgres"
|
|
88
|
-
# Postgres sslmode
|
|
89
|
-
ssl-mode: "disable"
|
|
90
|
-
# Postgres TimeZone
|
|
91
|
-
timezone: "UTC"
|
|
92
|
-
# Full Postgres DSN (overrides other options when set)
|
|
93
|
-
dsn: ""
|
|
94
|
-
mysql:
|
|
95
|
-
# NOTE: These are example values for local development only.
|
|
96
|
-
# Do not use these credentials in production environments.
|
|
97
|
-
# MySQL host
|
|
98
|
-
host: "localhost"
|
|
99
|
-
# MySQL port
|
|
100
|
-
port: 3306
|
|
101
|
-
# MySQL user
|
|
102
|
-
user: "root"
|
|
103
|
-
# MySQL password (required - no default)
|
|
104
|
-
password: ""
|
|
105
|
-
# MySQL database name
|
|
106
|
-
database: "mysql"
|
|
107
|
-
# MySQL TLS mode (mapped to tls= in DSN)
|
|
108
|
-
ssl-mode: ""
|
|
109
|
-
# MySQL time zone location
|
|
110
|
-
timezone: "UTC"
|
|
111
|
-
# Full MySQL DSN (overrides other options when set)
|
|
112
|
-
dsn: ""
|
|
113
|
-
|
|
114
|
-
# Path to the UNIX domain socket file used by the server
|
|
115
|
-
# CLI: --socket-path
|
|
116
|
-
socketPath: "dingo.socket"
|
|
117
|
-
|
|
118
|
-
# Name of the Cardano network
|
|
119
|
-
# CLI: --network
|
|
120
|
-
network: "preview"
|
|
121
|
-
|
|
122
|
-
# TLS certificate file path (for HTTPS)
|
|
123
|
-
#
|
|
124
|
-
# Can be overridden with the TLS_CERT_FILE_PATH environment variable
|
|
125
|
-
tlsCertFilePath: ""
|
|
126
|
-
|
|
127
|
-
# TLS key file path (for HTTPS)
|
|
128
|
-
#
|
|
129
|
-
# Can be overridden with the TLS_KEY_FILE_PATH environment variable
|
|
130
|
-
tlsKeyFilePath: ""
|
|
131
|
-
|
|
132
|
-
# Path to the topology configuration file for Cardano node
|
|
133
|
-
topology: ""
|
|
134
|
-
|
|
135
|
-
# TCP port to bind for Prometheus metrics endpoint
|
|
136
|
-
# CLI: --metrics-port
|
|
137
|
-
metricsPort: 12798
|
|
138
|
-
|
|
139
|
-
# TCP port to bind for pprof debug endpoints (heap, profile, goroutine, etc).
|
|
140
|
-
# 0 disables. Operators opt in; never enable in production by default — debug
|
|
141
|
-
# endpoints expose internal state and run on a separate listener from metrics.
|
|
142
|
-
# CLI: --debug-port Env: DINGO_DEBUG_PORT
|
|
143
|
-
debugPort: 0
|
|
144
|
-
|
|
145
|
-
# Internal/private address to bind for listening for Ouroboros NtC
|
|
146
|
-
privateBindAddr: "127.0.0.1"
|
|
147
|
-
|
|
148
|
-
# TCP port to bind for listening for Ouroboros NtC
|
|
149
|
-
# CLI: --private-port
|
|
150
|
-
privatePort: 3002
|
|
151
|
-
|
|
152
|
-
# TCP port to bind for listening for Ouroboros NtN
|
|
153
|
-
#
|
|
154
|
-
# Can be overridden with the port environment variable
|
|
155
|
-
# CLI: --port
|
|
156
|
-
relayPort: 3001
|
|
157
|
-
|
|
158
|
-
# Storage mode controls how much data is persisted.
|
|
159
|
-
# - "core": Only consensus data (UTxOs, certs, pools, pparams). Suitable for
|
|
160
|
-
# block producers and relay nodes. API ports are ignored in core mode.
|
|
161
|
-
# - "api": Core data plus full transaction metadata (witnesses, scripts, datums,
|
|
162
|
-
# redeemers). All APIs start automatically on their default ports.
|
|
163
|
-
#
|
|
164
|
-
# Can be overridden with DINGO_STORAGE_MODE
|
|
165
|
-
# CLI: --storage-mode
|
|
166
|
-
storageMode: "core"
|
|
167
|
-
|
|
168
|
-
# API ports — only used when storageMode is "api".
|
|
169
|
-
# In API mode, all APIs start on their default ports. Set a port to 0 to
|
|
170
|
-
# disable an individual API.
|
|
171
|
-
#
|
|
172
|
-
# UTxO RPC gRPC API port (default: 9090)
|
|
173
|
-
# Can be overridden with DINGO_UTXORPC_PORT
|
|
174
|
-
# CLI: --utxorpc-port
|
|
175
|
-
utxorpcPort: 9090
|
|
176
|
-
# Blockfrost-compatible REST API port (default: 3000)
|
|
177
|
-
# Can be overridden with DINGO_BLOCKFROST_PORT
|
|
178
|
-
# CLI: --blockfrost-port
|
|
179
|
-
blockfrostPort: 3000
|
|
180
|
-
# Mesh (Coinbase Rosetta) REST API port (default: 8080)
|
|
181
|
-
# Can be overridden with DINGO_MESH_PORT
|
|
182
|
-
# CLI: --mesh-port
|
|
183
|
-
meshPort: 8080
|
|
184
|
-
|
|
185
|
-
# base url of bark archive server
|
|
186
|
-
# CLI: --bark-url
|
|
187
|
-
barkBaseUrl: ""
|
|
188
|
-
|
|
189
|
-
# TCP port bind for listening for bark RPC calls
|
|
190
|
-
# CLI: --bark-port
|
|
191
|
-
barkPort: 0
|
|
192
|
-
|
|
193
|
-
# ---
|
|
194
|
-
# Deployment pattern examples (uncomment one block):
|
|
195
|
-
#
|
|
196
|
-
# Relay node (core storage, API ports ignored):
|
|
197
|
-
# storageMode: "core"
|
|
198
|
-
# blockProducer: false
|
|
199
|
-
#
|
|
200
|
-
# Data node (all APIs start on defaults automatically):
|
|
201
|
-
# storageMode: "api"
|
|
202
|
-
# # Override individual ports or set to 0 to disable:
|
|
203
|
-
# # blockfrostPort: 3100
|
|
204
|
-
# # meshPort: 0 # disable Mesh API
|
|
205
|
-
# # With storageMode: "api", leave mode-sensitive Badger settings unset to keep:
|
|
206
|
-
# # block-cache-size: 268435456
|
|
207
|
-
# # index-cache-size: 0
|
|
208
|
-
# # compression: true
|
|
209
|
-
#
|
|
210
|
-
# Validator / block producer (core storage, API ports ignored):
|
|
211
|
-
# storageMode: "core"
|
|
212
|
-
# blockProducer: true
|
|
213
|
-
# shelleyVrfKey: "/keys/vrf.skey"
|
|
214
|
-
# shelleyKesKey: "/keys/kes.skey"
|
|
215
|
-
# shelleyOperationalCertificate: "/keys/opcert.cert"
|
|
216
|
-
# # With storageMode: "core", Badger blob defaults switch to mmap-only:
|
|
217
|
-
# # block-cache-size: 0
|
|
218
|
-
# # index-cache-size: 0
|
|
219
|
-
# # compression: false
|
|
220
|
-
# # You can still override any of those explicitly under database.blob.badger.
|
|
221
|
-
# # Optional forging tolerances (0 = defaults)
|
|
222
|
-
# forgeSyncToleranceSlots: 0
|
|
223
|
-
# forgeStaleGapThresholdSlots: 0
|
|
224
|
-
#
|
|
225
|
-
# Dev mode (isolated, forge blocks, no outbound):
|
|
226
|
-
# runMode: "dev"
|
|
227
|
-
# ---
|
|
228
|
-
|
|
229
|
-
# Ignore prior chain history and start from current tip (default: false)
|
|
230
|
-
# This is experimental and may break — use with caution
|
|
231
|
-
intersectTip: false
|
|
232
|
-
|
|
233
|
-
# Maximum total size (in bytes) of all transactions allowed in the mempool.
|
|
234
|
-
# Transactions exceeding this limit will be rejected.
|
|
235
|
-
# Default: 1048576 (1 MiB) for Praos modes; 26214400 (25 MiB) for Leios.
|
|
236
|
-
# Leave commented to use the mode default; uncomment to override.
|
|
237
|
-
# CLI: --mempool-capacity
|
|
238
|
-
# mempoolCapacity: 1048576
|
|
239
|
-
|
|
240
|
-
# Forging tolerances (0 = defaults)
|
|
241
|
-
# forgeSyncToleranceSlots controls how far the local chain can lag the upstream
|
|
242
|
-
# tip before forging is skipped. forgeStaleGapThresholdSlots controls when to
|
|
243
|
-
# log an error if the chain tip is far ahead of the slot clock.
|
|
244
|
-
forgeSyncToleranceSlots: 0
|
|
245
|
-
forgeStaleGapThresholdSlots: 0
|
|
246
|
-
|
|
247
|
-
# Operational mode: "serve" (default), "load", or "dev"
|
|
248
|
-
# - serve: Full node with network connectivity (default)
|
|
249
|
-
# - load: Batch import from ImmutableDB (requires immutableDbPath)
|
|
250
|
-
# - dev: Development mode (forge blocks, disable outbound, skip topology)
|
|
251
|
-
# Note: CLI commands (serve, load) take priority over this setting
|
|
252
|
-
#
|
|
253
|
-
# Can be overridden with the DINGO_RUN_MODE environment variable
|
|
254
|
-
# CLI: --run-mode
|
|
255
|
-
runMode: "serve"
|
|
256
|
-
|
|
257
|
-
# Path to ImmutableDB for batch import (used when runMode is "load")
|
|
258
|
-
# Can also be provided as argument to 'dingo load' command
|
|
259
|
-
#
|
|
260
|
-
# Can be overridden with the DINGO_IMMUTABLE_DB_PATH environment variable
|
|
261
|
-
# CLI: --immutable-db-path
|
|
262
|
-
immutableDbPath: ""
|
|
263
|
-
|
|
264
|
-
# Validate historical blocks during ledger processing (default: false)
|
|
265
|
-
validateHistorical: false
|
|
266
|
-
|
|
267
|
-
# Peer targets - target number of peers in each state
|
|
268
|
-
# These are goals the system works toward, not hard limits.
|
|
269
|
-
# Use 0 for default values, -1 for unlimited
|
|
270
|
-
# Default: known=150, established=50, active=20
|
|
271
|
-
#
|
|
272
|
-
# Target number of known (cold) peers
|
|
273
|
-
# CLI: --target-known-peers
|
|
274
|
-
targetNumberOfKnownPeers: 0
|
|
275
|
-
# Target number of established (warm) peers
|
|
276
|
-
# CLI: --target-established-peers
|
|
277
|
-
targetNumberOfEstablishedPeers: 0
|
|
278
|
-
# Target number of active (hot) peers
|
|
279
|
-
# CLI: --target-active-peers
|
|
280
|
-
targetNumberOfActivePeers: 0
|
|
281
|
-
|
|
282
|
-
# Per-source quotas for active peers
|
|
283
|
-
# These specify how active peer slots are distributed by source.
|
|
284
|
-
# Use 0 for default values.
|
|
285
|
-
# Default: topology=3, gossip=12, ledger=5
|
|
286
|
-
#
|
|
287
|
-
# Active peer slots for topology sources (local + public roots)
|
|
288
|
-
activePeersTopologyQuota: 0
|
|
289
|
-
# Active peer slots for gossip sources
|
|
290
|
-
activePeersGossipQuota: 0
|
|
291
|
-
# Active peer slots for ledger sources
|
|
292
|
-
activePeersLedgerQuota: 0
|
|
293
|
-
|
|
294
|
-
# Inbound peer governance budget (phase 1)
|
|
295
|
-
# These define explicit operator intent for inbound peers as a governed source.
|
|
296
|
-
# Current behavior remains conservative; these values are surfaced in metrics and
|
|
297
|
-
# quota/status output to make inbound policy visible.
|
|
298
|
-
#
|
|
299
|
-
# Target number of inbound peers to keep in warm state.
|
|
300
|
-
# CLI: --inbound-warm-target
|
|
301
|
-
inboundWarmTarget: 0
|
|
302
|
-
# Quota for inbound peers in hot state.
|
|
303
|
-
# CLI: --inbound-hot-quota
|
|
304
|
-
inboundHotQuota: 0
|
|
305
|
-
# Minimum tenure before inbound peers are eligible for hot promotion.
|
|
306
|
-
# CLI: --inbound-min-tenure
|
|
307
|
-
inboundMinTenure: 0s
|
|
308
|
-
# Minimum score threshold for inbound hot promotion.
|
|
309
|
-
# CLI: --inbound-hot-score-threshold
|
|
310
|
-
inboundHotScoreThreshold: 0
|
|
311
|
-
# Future prune grace window for inbound peers.
|
|
312
|
-
# CLI: --inbound-prune-after
|
|
313
|
-
inboundPruneAfter: 0s
|
|
314
|
-
# Future duplex policy knob for inbound peers.
|
|
315
|
-
# CLI: --inbound-duplex-only-for-hot
|
|
316
|
-
inboundDuplexOnlyForHot: false
|
|
317
|
-
# Future cooldown knob for inbound peer governance actions.
|
|
318
|
-
# CLI: --inbound-cooldown
|
|
319
|
-
inboundCooldown: 0s
|
|
320
|
-
|
|
321
|
-
# Genesis bootstrap configuration
|
|
322
|
-
# Used only for from-origin sync. Default behavior keeps this enabled and
|
|
323
|
-
# exits Genesis mode automatically near the best known peer tip.
|
|
324
|
-
genesisBootstrap:
|
|
325
|
-
# Enable/disable Genesis bootstrap mode (default: true).
|
|
326
|
-
enabled: true
|
|
327
|
-
# Override the Genesis comparison window in slots.
|
|
328
|
-
# 0 auto-derives the window from genesis params (3k/f).
|
|
329
|
-
windowSlots: 0
|
|
330
|
-
# Minimum diversity groups to prefer while promoting peers during bootstrap.
|
|
331
|
-
# 0 uses the peer-governor default.
|
|
332
|
-
promotionMinDiversityGroups: 0
|
|
333
|
-
|
|
334
|
-
# Cache configuration for tiered CBOR cache system
|
|
335
|
-
# This controls the in-memory caching of UTxO and transaction CBOR data
|
|
336
|
-
cache:
|
|
337
|
-
# Number of entries in the hot UTxO cache (LFU eviction)
|
|
338
|
-
# Default: 50000
|
|
339
|
-
# CLI: --cache-hot-utxo-entries
|
|
340
|
-
hotUtxoEntries: 50000
|
|
341
|
-
# Number of entries in the hot transaction cache (LFU eviction)
|
|
342
|
-
# Default: 10000
|
|
343
|
-
hotTxEntries: 10000
|
|
344
|
-
# Maximum memory in bytes for hot transaction cache
|
|
345
|
-
# Default: 268435456 (256 MB)
|
|
346
|
-
hotTxMaxBytes: 268435456
|
|
347
|
-
# Number of blocks to keep in the block LRU cache
|
|
348
|
-
# Default: 500
|
|
349
|
-
# CLI: --cache-block-lru-entries
|
|
350
|
-
blockLruEntries: 500
|
|
351
|
-
# Number of recent blocks to warm up on startup
|
|
352
|
-
# Default: 1000
|
|
353
|
-
warmupBlocks: 1000
|
|
354
|
-
# Wait for cache warmup to complete before serving requests
|
|
355
|
-
# Default: true
|
|
356
|
-
# CLI: --cache-warmup-sync
|
|
357
|
-
warmupSync: true
|
|
358
|
-
|
|
359
|
-
# Mithril snapshot bootstrap configuration
|
|
360
|
-
# Use 'dingo mithril sync' or 'dingo sync --mithril' to bootstrap from a snapshot
|
|
361
|
-
# CLI: --mithril-enabled, --mithril-verify-certs
|
|
362
|
-
mithril:
|
|
363
|
-
# Enable Mithril integration (default: true)
|
|
364
|
-
enabled: true
|
|
365
|
-
# Override aggregator URL (auto-detected from network if empty)
|
|
366
|
-
# Supported networks: mainnet, preprod, preview
|
|
367
|
-
aggregatorUrl: ""
|
|
368
|
-
# Directory for downloading snapshot archives
|
|
369
|
-
# If empty, a randomized temporary directory is created automatically
|
|
370
|
-
# downloadDir: ""
|
|
371
|
-
# Remove temporary files after loading completes
|
|
372
|
-
# Default: true
|
|
373
|
-
cleanupAfterLoad: true
|
|
374
|
-
# Verify the Mithril certificate chain from snapshot back to genesis
|
|
375
|
-
# Default: true
|
|
376
|
-
verifyCertificates: true
|
package/docker-compose.yml
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# Dingo Cardano Node - Docker Compose Configuration
|
|
2
|
-
#
|
|
3
|
-
# Usage:
|
|
4
|
-
# docker compose up -d # Start with defaults (preview network)
|
|
5
|
-
# CARDANO_NETWORK=mainnet docker compose up -d # Start on mainnet
|
|
6
|
-
#
|
|
7
|
-
# With Mithril snapshot bootstrap (first run only):
|
|
8
|
-
# RESTORE_SNAPSHOT=1 docker compose up -d
|
|
9
|
-
|
|
10
|
-
services:
|
|
11
|
-
# --------------------------------------------------------------------------
|
|
12
|
-
# Basic relay node
|
|
13
|
-
# --------------------------------------------------------------------------
|
|
14
|
-
dingo:
|
|
15
|
-
build:
|
|
16
|
-
context: .
|
|
17
|
-
dockerfile: Dockerfile
|
|
18
|
-
image: ghcr.io/blinklabs-io/dingo:latest
|
|
19
|
-
restart: unless-stopped
|
|
20
|
-
environment:
|
|
21
|
-
- CARDANO_NETWORK=${CARDANO_NETWORK:-preview}
|
|
22
|
-
- CARDANO_DATABASE_PATH=/data/db
|
|
23
|
-
- DINGO_SOCKET_PATH=/ipc/dingo.socket
|
|
24
|
-
# Uncomment to enable debug logging
|
|
25
|
-
# - DINGO_DEBUG=1
|
|
26
|
-
# Uncomment to bootstrap from Mithril snapshot on first run
|
|
27
|
-
# - RESTORE_SNAPSHOT=1
|
|
28
|
-
ports:
|
|
29
|
-
# Ouroboros Node-to-Node (relay port)
|
|
30
|
-
- "3001:3001"
|
|
31
|
-
# Prometheus metrics (localhost only by default)
|
|
32
|
-
- "127.0.0.1:12798:12798"
|
|
33
|
-
# UTxO RPC (gRPC, localhost only by default)
|
|
34
|
-
- "127.0.0.1:9090:9090"
|
|
35
|
-
volumes:
|
|
36
|
-
# Persistent database storage
|
|
37
|
-
- dingo-data:/data/db
|
|
38
|
-
# Unix socket for cardano-cli and other NtC clients
|
|
39
|
-
- dingo-ipc:/ipc
|
|
40
|
-
healthcheck:
|
|
41
|
-
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:12798/metrics"]
|
|
42
|
-
interval: 30s
|
|
43
|
-
timeout: 5s
|
|
44
|
-
start_period: 60s
|
|
45
|
-
retries: 3
|
|
46
|
-
|
|
47
|
-
volumes:
|
|
48
|
-
dingo-data:
|
|
49
|
-
driver: local
|
|
50
|
-
dingo-ipc:
|
|
51
|
-
driver: local
|
|
@@ -1,188 +0,0 @@
|
|
|
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
|
-
| `dingo_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.
|
|
@@ -1,29 +0,0 @@
|
|
|
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."
|
|
@@ -1,16 +0,0 @@
|
|
|
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']
|
|
@@ -1,14 +0,0 @@
|
|
|
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
|