Home / Input Output / cardano-node
May 25, 8-9 PM (0)
May 25, 9-10 PM (0)
May 25, 10-11 PM (3)
May 25, 11-12 AM (0)
May 26, 12-1 AM (0)
May 26, 1-2 AM (0)
May 26, 2-3 AM (0)
May 26, 3-4 AM (0)
May 26, 4-5 AM (0)
May 26, 5-6 AM (0)
May 26, 6-7 AM (0)
May 26, 7-8 AM (1)
May 26, 8-9 AM (0)
May 26, 9-10 AM (0)
May 26, 10-11 AM (1)
May 26, 11-12 PM (0)
May 26, 12-1 PM (0)
May 26, 1-2 PM (0)
May 26, 2-3 PM (0)
May 26, 3-4 PM (0)
May 26, 4-5 PM (0)
May 26, 5-6 PM (0)
May 26, 6-7 PM (0)
May 26, 7-8 PM (0)
May 26, 8-9 PM (0)
May 26, 9-10 PM (0)
May 26, 10-11 PM (0)
May 26, 11-12 AM (0)
May 27, 12-1 AM (0)
May 27, 1-2 AM (1)
May 27, 2-3 AM (0)
May 27, 3-4 AM (0)
May 27, 4-5 AM (28)
May 27, 5-6 AM (0)
May 27, 6-7 AM (2)
May 27, 7-8 AM (0)
May 27, 8-9 AM (0)
May 27, 9-10 AM (6)
May 27, 10-11 AM (8)
May 27, 11-12 PM (0)
May 27, 12-1 PM (1)
May 27, 1-2 PM (0)
May 27, 2-3 PM (0)
May 27, 3-4 PM (0)
May 27, 4-5 PM (0)
May 27, 5-6 PM (0)
May 27, 6-7 PM (0)
May 27, 7-8 PM (0)
May 27, 8-9 PM (1)
May 27, 9-10 PM (0)
May 27, 10-11 PM (0)
May 27, 11-12 AM (0)
May 28, 12-1 AM (0)
May 28, 1-2 AM (0)
May 28, 2-3 AM (0)
May 28, 3-4 AM (0)
May 28, 4-5 AM (0)
May 28, 5-6 AM (2)
May 28, 6-7 AM (0)
May 28, 7-8 AM (1)
May 28, 8-9 AM (1)
May 28, 9-10 AM (11)
May 28, 10-11 AM (3)
May 28, 11-12 PM (0)
May 28, 12-1 PM (0)
May 28, 1-2 PM (0)
May 28, 2-3 PM (0)
May 28, 3-4 PM (0)
May 28, 4-5 PM (0)
May 28, 5-6 PM (1)
May 28, 6-7 PM (0)
May 28, 7-8 PM (0)
May 28, 8-9 PM (0)
May 28, 9-10 PM (0)
May 28, 10-11 PM (1)
May 28, 11-12 AM (0)
May 29, 12-1 AM (2)
May 29, 1-2 AM (3)
May 29, 2-3 AM (0)
May 29, 3-4 AM (0)
May 29, 4-5 AM (0)
May 29, 5-6 AM (0)
May 29, 6-7 AM (1)
May 29, 7-8 AM (0)
May 29, 8-9 AM (1)
May 29, 9-10 AM (0)
May 29, 10-11 AM (1)
May 29, 11-12 PM (0)
May 29, 12-1 PM (13)
May 29, 1-2 PM (10)
May 29, 2-3 PM (2)
May 29, 3-4 PM (0)
May 29, 4-5 PM (0)
May 29, 5-6 PM (8)
May 29, 6-7 PM (1)
May 29, 7-8 PM (0)
May 29, 8-9 PM (0)
May 29, 9-10 PM (0)
May 29, 10-11 PM (0)
May 29, 11-12 AM (0)
May 30, 12-1 AM (1)
May 30, 1-2 AM (0)
May 30, 2-3 AM (0)
May 30, 3-4 AM (0)
May 30, 4-5 AM (0)
May 30, 5-6 AM (0)
May 30, 6-7 AM (0)
May 30, 7-8 AM (0)
May 30, 8-9 AM (0)
May 30, 9-10 AM (0)
May 30, 10-11 AM (0)
May 30, 11-12 PM (1)
May 30, 12-1 PM (0)
May 30, 1-2 PM (0)
May 30, 2-3 PM (0)
May 30, 3-4 PM (0)
May 30, 4-5 PM (0)
May 30, 5-6 PM (0)
May 30, 6-7 PM (0)
May 30, 7-8 PM (0)
May 30, 8-9 PM (0)
May 30, 9-10 PM (0)
May 30, 10-11 PM (0)
May 30, 11-12 AM (1)
May 31, 12-1 AM (0)
May 31, 1-2 AM (0)
May 31, 2-3 AM (0)
May 31, 3-4 AM (0)
May 31, 4-5 AM (0)
May 31, 5-6 AM (0)
May 31, 6-7 AM (0)
May 31, 7-8 AM (0)
May 31, 8-9 AM (0)
May 31, 9-10 AM (0)
May 31, 10-11 AM (0)
May 31, 11-12 PM (0)
May 31, 12-1 PM (0)
May 31, 1-2 PM (0)
May 31, 2-3 PM (0)
May 31, 3-4 PM (0)
May 31, 4-5 PM (0)
May 31, 5-6 PM (0)
May 31, 6-7 PM (0)
May 31, 7-8 PM (0)
May 31, 8-9 PM (0)
May 31, 9-10 PM (0)
May 31, 10-11 PM (0)
May 31, 11-12 AM (0)
Jun 01, 12-1 AM (0)
Jun 01, 1-2 AM (1)
Jun 01, 2-3 AM (1)
Jun 01, 3-4 AM (0)
Jun 01, 4-5 AM (0)
Jun 01, 5-6 AM (0)
Jun 01, 6-7 AM (0)
Jun 01, 7-8 AM (0)
Jun 01, 8-9 AM (30)
Jun 01, 9-10 AM (3)
Jun 01, 10-11 AM (2)
Jun 01, 11-12 PM (0)
Jun 01, 12-1 PM (0)
Jun 01, 1-2 PM (1)
Jun 01, 2-3 PM (0)
Jun 01, 3-4 PM (0)
Jun 01, 4-5 PM (1)
Jun 01, 5-6 PM (2)
Jun 01, 6-7 PM (0)
Jun 01, 7-8 PM (0)
Jun 01, 8-9 PM (0)
158 commits this week May 25, 2026 - Jun 01, 2026
cardano-node, cardano-tracer: track hermod-tracing PR; rename suiEra -> suiLatestSupportedEra
cabal.project: add source-repository-package stanza for hermod-tracing PR #9
  (Rename NodeStartupInfo.suiEra to suiLatestSupportedEra), commit 4a3baa5e

NodeStartupInfo.hs: update documentFor to reflect new field name and meaning
EraSettings.hs: update suiEra -> suiLatestSupportedEra at call site
fix(generate-release-changelog-links): replace turtle with plain IO
turtle ^>= 1.6.x requires optparse-applicative < 0.19, conflicting with
the rest of the project. allow-newer would satisfy the solver but turtle
1.6.x fails to compile against 0.19 because of the breaking Doc type
change (ansi-wl-pprint -> prettyprinter).

Replace turtle usage with standard IO:
- Shell monad -> plain list IO with mapM/concat
- options/optPath/argPath/argText -> execParser/strOption/argument directly
- Pattern URL parser -> Text.breakOn/stripPrefix in Maybe monad
- printf/format -> Text concatenation and hPutStrLn stderr
- die -> exitFailure helper

Also drops foldl and prettyprinter which were only needed via turtle.
cardano-tracer, grafana-datasource: /nodes returns {nodeName, slug} objects; slug-based node API
TimeseriesServer.hs:
- /timeseries/nodes: return [{nodeName, slug}] from RouteDictionary instead of bare slugs
- Import Text.Slugify removed (slugs come directly from RouteDictionary keys)

grafana-datasource:
- NodeEntry type: {nodeName, slug} mirroring server response
- fetchNodes: two-column frame (Node Name, Slug)
- metricFindQuery: {text: nodeName, value: slug} so variable displays name, passes slug
- Rename query field nodeName -> nodeNameSlug throughout (types, datasource, QueryEditor, dashboard)
- Dashboard variable node_name -> node_name_slug
- QueryEditor: label "Node Name (slug)", tooltip, updated placeholder
cardano-timeseries-io | cardano-tracer: fix bugs and style issues from code review
- Elab.hs: fix copy-paste error in binary arithmetic op elab (rhs hole was
  unified against lhsTy instead of rhsTy); rename evalBinaryArithmethicOpElabProblem
  to evalBinaryArithmeticOpElabProblem (typo)
- Elab.hs: elaborate `metrics` as List Text (was Text); add Str elab case
- Elab/Typing.hs, Resolve.hs, Unify.hs: add List Ty to support metrics type
- Interp.hs: guard avg/min/max against empty instant vector; fix rate to
  error on single-point timeseries instead of dividing by zero
- Interp/Value.hs: use showFFloat in Show instance for Scalar to avoid
  scientific notation in JSON output
- TimeseriesServer.hs: fix minimumRetentionMillis units (seconds → ms);
  remove unused RecordWildCards pragma; align sleep delay with Monitoring.hs
- Acceptors/Utils.hs: align new imports with surrounding import block
cardano-tracer: add node info/startup/state HTTP endpoints to timeseries server
New routes on the timeseries server:
  GET /timeseries/nodes                        — list connected node IDs
  GET /timeseries/node/{id}/info               — NodeInfo + uptimeSeconds
  GET /timeseries/node/{id}/startup            — NodeStartupInfo
  GET /timeseries/node/{id}/state  (RTVIEW)    — sync progress %

The server now receives TracerEnv instead of individual fields so it can
access teDPRequestors, teCurrentDPLock, and teConnectedNodes.

The /state endpoint uses data point key "NodeAddBlock" (the namespace
cardano-node actually stores the NodeState data point under) rather than
"NodeState", which was always empty.
cardano-tracer, grafana-datasource: extend series labels, rename node-state endpoint, misc
- Acceptors/Utils.hs: include node_name alongside node_id in SeriesIdentifier
- Component.hs: generalise insert to accept SeriesIdentifier directly; fix
  pruning period default (was 3600 ms ≈ 3.6 s, now 15 min)
- Component/Trace.hs: update TimeseriesTraceInsert to carry SeriesIdentifier;
  emit query_text/query_result only at DDetailed; lower Prune severity to Debug
- TimeseriesServer.hs: rename node/state → node/sync-progress; remove #if RTVIEW
  guard (endpoint is now unconditionally available); return JSON objects from
  GET config/retention and GET config/pruning instead of plain text
- Utils.hs: move NodeStateWrapper (and its FromJSON instance) here from
  RTView/Update/NodeState.hs so it can be shared without the RTVIEW flag;
  move vector from rtview-only to unconditional build-depends
- RTView/Update/NodeState.hs: remove NodeStateWrapper definition (now in Utils)
- grafana-datasource: rename node-state → node-sync-progress throughout
  (QueryEditor, datasource, types, dashboard); rename dashboard to rtview-port
- grafana-datasource: add README with build and run instructions
- grafana-datasource: expose SeriesIdentifier labels as proper Grafana field
  labels instead of baking them into the frame name string; add legendFormat
  field to queries so users can control the legend via {{label_name}} syntax
cardano-tracer, grafana-datasource: node_name as sole series label; slug-based node API
TimeseriesServer.hs:
- Thread RouteDictionary to timeseriesApp and runTimeseriesServer
- /timeseries/nodes: return slugified node names from RouteDictionary (was raw NodeIds from teConnectedNodes)
- /timeseries/node/{slug}/*: accept slug, resolve to NodeId via RouteDictionary + Bimap reverse-lookup; 404 on unknown slug
- Servers.hs: drop const wrapper; pass shared IO RouteDictionary to runTimeseriesServer

Acceptors/Utils.hs:
- Insert with {node_name} label only; drop node_id label

grafana-datasource:
- Rename nodeId -> nodeName throughout (types, datasource, QueryEditor, dashboard)
- Dashboard variable node_id -> node_name; panel titles and repeats updated
grafana-datasource: add node info/startup/state/uptime query types and dashboard panels
New query types in the datasource plugin:
  nodes       — lists all connected node IDs (used by $node_id variable)
  node-info   — name, protocol, version, commit, start time, uptime
  node-startup — era, slot length, epoch length, KES period
  node-state  — sync progress %

New panels in rtview.json (all repeat by $node_id variable):
  Connected Nodes table, Node Info table, Startup table,
  Sync % stat, Uptime stat

metricFindQuery populates the $node_id query variable automatically
from /timeseries/nodes.

$__from/$__to in timeseries queries are pre-processed to valid
timestamp expressions before template variable expansion.
bench | grafana-datasource: provisioned RTView dashboard; enable RTView in ci-bench-timeseries
- Add provisioned Grafana dashboard mimicking RTView's four sections:
  Resources, Blockchain, Leadership, Transactions (26 panels, row-based
  collapsible sections, byte units for memory/mempool panels)
- Pin datasource uid in provisioning so dashboard references are stable
- Mount dashboards directory in docker-compose
- Enable RTView (hasRTView, port 3300) in ci-bench-timeseries profile
  alongside the existing timeseries endpoint
timeseries: give the elaborator metric-name awareness for better errors
St now carries availableMetrics :: Set MetricIdentifier, populated at
the call site via metrics store (or Set.empty in metric-free contexts
like the elab test suite).

The fallback Variable case — previously an unconditional metric assumption
— now checks membership in availableMetrics and throws "Undefined name: <v>"
when the name appears neither in the local context nor in the store,
replacing the confusing downstream type-mismatch error that occurred before.
bench | grafana-datasource: align query API with Prometheus conventions
- POST /timeseries/query now accepts JSON body {"query": "...", "time": <optional Unix seconds>}
- Success response wrapped in {"status":"success","data":...} envelope
- Error responses use {"status":"error","errorType":"...","error":"..."} format
- errorType mirrors Prometheus: "parse", "bad_data", "execution"
- Plugin updated to send application/json body and unwrap response envelope
- Remove ConfigEditor.tsx (Grafana's built-in URL field suffices)
bench | timeseries: add RangeVector/Scalar arithmetic; fix typing.txt inconsistencies
Implements pointwise arithmetic (add, sub, mul, div) between RangeVector Scalar
and Scalar, following the existing InstantVector/Scalar pattern. This enables
queries like 'metric[now - 1h; now] / 1048576' in Grafana panels.

Fixes ten inconsistencies found in typing.txt: missing List type in grammar,
filter_by_label argument order, A->B type formation rule conclusion, := vs ≔
notation, 'Syntax hugar' typo, map variable name mismatch, RangeVector missing
type parameter in quantile_over_time, four missing instant_vector_scalar relation
rules, mul_instant_vector_scalar missing arguments, and stale metrics return type
(Text -> List Text).

Adds a precondition note to 'interp' that the input expression must be well-typed.
timeseries: expand elab test suite to ~110 tests
Replaces the 7-test skeleton with a comprehensive suite covering all
elaborator code paths: literals, duration literals, arithmetic
(well-typed and ill-typed), comparisons, boolean operators, let/lambda,
pairs/projections, to_scalar, abs/round, metrics builtin, range
vectors, instant-vector operations, and metric-name resolution (known
metric, undefined name, Levenshtein suggestions).

Notes two elaborator bidirectionality constraints discovered via
test failures:
- `Duration + Duration` requires the result type to be driven by
  a containing expression (tested via `now + (1s + 2s)`).
- `\x -> x + 1` leaves `x`'s type unconstrained; replaced with
  `\x -> now + x` which forces `x : Duration` via the Timestamp+?
  noncanonical rule.
bench | timeseries: JSON API, Grafana datasource plugin, ci-bench-timeseries profile
**cardano-tracer / cardano-timeseries-io**
- Add `Cardano.Timeseries.JSON` with `ToJSON` instances for `Value`, `Instant`,
  `Timeseries` and `SeriesIdentifier` (orphan module, imported for side-effects)
- Switch `POST /timeseries/query` response from plain text to `application/json`

**cardano-profile**
- Add `timeseries :: Bool` field to `Tracer`
- Add `tracerTimeseries` primitive
- Add `ci-bench-timeseries` profile: 2-node local cluster with timeseries endpoint
  enabled, no shutdown condition, generator runs for 100 000 epochs (effectively
  indefinite) — intended for interactive exploration via Grafana
- Regenerate `all-profiles-coay.json` and `wb_profiles.mk`; update all test fixtures

**Nix**
- `cardano-tracer-service-workbench.nix`: add `timeseries` option → `hasTimeseries`
- `cardano-tracer-service.nix`: add `timeseriesEnable/Host/Port` NixOS options
- `tracer.nix`: wire `profile.tracer.timeseries` → `{epHost, epPort = 3400}`
- `supervisor.sh`: replace hanging `netstat -pltn` with `lsof -nP -iTCP:9001
  -sTCP:LISTEN` for macOS compatibility

**bench/grafana-datasource** (new)
- TypeScript Grafana datasource plugin (`iog-cardanotimeseries-datasource`)
- Sends `POST /timeseries/query` via Grafana server-side proxy (avoids CORS)
- Converts `Value` tagged-union JSON to Grafana `DataFrame[]`
- `docker-compose.yaml` for local development; datasource auto-provisioned at
  `http://host.docker.internal:3400`; Colima-compatible (`extra_hosts`)