From 9515177e299465c7d82942bbcc4a177b0b8f728e Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Wed, 29 Apr 2026 12:20:18 +0100 Subject: [PATCH 1/3] docs(telemetry): add missing config options to xrpld-example.cfg Document service_instance_id, use_tls, tls_ca_cert, batch_size, batch_delay_ms, and max_queue_size in the [telemetry] section. Co-Authored-By: Claude Opus 4.6 --- cfg/xrpld-example.cfg | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/cfg/xrpld-example.cfg b/cfg/xrpld-example.cfg index 04a7b4f81e..8ddc30e2f3 100644 --- a/cfg/xrpld-example.cfg +++ b/cfg/xrpld-example.cfg @@ -1619,12 +1619,28 @@ validators.txt # The node's network ID (from [network_id]) is automatically added # as the `xrpl.network.id` and `xrpl.network.type` resource attributes. # +# service_instance_id= +# +# OTel resource attribute `service.instance.id`. Uniquely identifies +# this node. Default: the node's public key (auto-detected). +# # endpoint=http://localhost:4318/v1/traces # # The OTLP/HTTP exporter endpoint. The server sends trace data as # protobuf-encoded HTTP POST requests to this URL. # Default: http://localhost:4318/v1/traces. # +# --- TLS settings for the OTLP exporter connection --- +# +# use_tls=0 +# +# Enable TLS for the OTLP/HTTP exporter connection. Default: 0 (off). +# +# tls_ca_cert= +# +# Path to a PEM-encoded CA certificate bundle for TLS verification. +# Only used when use_tls=1. Default: empty (system CA store). +# # sampling_ratio=1.0 # # Head-based sampling ratio using TraceIdRatioBasedSampler. The decision @@ -1660,3 +1676,19 @@ validators.txt # Enable tracing for ledger close and accept operations — ledger # building, state hashing, and write-back to the node store. Default: 1. # +# --- Batch processor tuning --- +# +# batch_size=512 +# +# Maximum number of spans exported in a single batch. Default: 512. +# +# batch_delay_ms=5000 +# +# Maximum delay (milliseconds) before a partial batch is flushed. +# Default: 5000 (5 seconds). +# +# max_queue_size=2048 +# +# Maximum number of spans queued in memory before drops occur. +# Default: 2048. +# From e07391fe78aaf67a16e416820cc3723a9d5970f4 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Wed, 29 Apr 2026 12:25:03 +0100 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20apply=20rename=20script=20(rippled?= =?UTF-8?q?=20=E2=86=92=20xrpld)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- include/xrpl/protocol/README.md | 2 +- src/xrpld/app/misc/SHAMapStoreImp.h | 2 +- src/xrpld/core/detail/Config.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/xrpl/protocol/README.md b/include/xrpl/protocol/README.md index d679c583d4..f435a4dec3 100644 --- a/include/xrpl/protocol/README.md +++ b/include/xrpl/protocol/README.md @@ -33,7 +33,7 @@ or may not hold a value. For things not guaranteed to exist, you use `x[~sfFoo]` because you want such a container. It avoids having to look something up twice, once just to see if it exists and a second time to get/set its value. -([Real example](https://github.com/XRPLF/rippled/blob/35f4698aed5dce02f771b34cfbb690495cb5efcc/src/ripple/app/tx/impl/PayChan.cpp#L229-L236)) +([Real example](https://github.com/XRPLF/rippled/blob/35f4698aed5dce02f771b34cfbb690495cb5efcc/src/xrpld/app/tx/impl/PayChan.cpp#L229-L236)) The source of this "type magic" is in [SField.h](./SField.h#L296-L302). diff --git a/src/xrpld/app/misc/SHAMapStoreImp.h b/src/xrpld/app/misc/SHAMapStoreImp.h index 08e3dd70eb..3c847cf434 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.h +++ b/src/xrpld/app/misc/SHAMapStoreImp.h @@ -53,7 +53,7 @@ private: // name of state database std::string const dbName_ = "state"; // prefix of on-disk nodestore backend instances - std::string const dbPrefix_ = "rippledb"; // cspell: disable-line + std::string const dbPrefix_ = "xrpldb"; // cspell: disable-line // check health/stop status as records are copied std::uint64_t const checkHealthInterval_ = 1000; // minimum # of ledgers to maintain for health of network diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index b7063287bb..7c55f08c81 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -249,7 +249,7 @@ getSingleSection( //------------------------------------------------------------------------------ char const* const Config::configFileName = "xrpld.cfg"; -char const* const Config::configLegacyName = "rippled.cfg"; +char const* const Config::configLegacyName = "xrpld.cfg"; char const* const Config::databaseDirName = "db"; char const* const Config::validatorsFileName = "validators.txt"; From 21dad9a17d625c8d63bb5f0eb26827eb72fb8a7a Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Wed, 29 Apr 2026 12:29:53 +0100 Subject: [PATCH 3/3] docs(telemetry): sync runbook, dashboards, and configs with code - Add 14 missing spans to runbook (6 TxQ + 8 consensus) - Fix tx.receive attributes and config table in runbook - Document dispute.resolve and tx.included span events - Add spanmetrics dimensions for close_time_correct and tx.suppressed - Fix Close Time Agreement and TX Receive vs Suppressed panel PromQL - Wire $consensus_mode template variable to all consensus panels - Add 10 Tempo search filters for operational attributes - Apply rename script artifacts Co-Authored-By: Claude Opus 4.6 --- .github/scripts/rename/README.md | 12 +- .../grafana/dashboards/consensus-health.json | 18 +-- .../dashboards/transaction-overview.json | 4 +- .../provisioning/datasources/tempo.yaml | 51 +++++++ docker/telemetry/otel-collector-config.yaml | 2 + docs/telemetry-runbook.md | 126 ++++++++++++------ include/xrpl/protocol/README.md | 2 +- src/xrpld/app/misc/SHAMapStoreImp.h | 2 +- src/xrpld/core/detail/Config.cpp | 2 +- 9 files changed, 160 insertions(+), 59 deletions(-) diff --git a/.github/scripts/rename/README.md b/.github/scripts/rename/README.md index ab685bb0c3..123881094e 100644 --- a/.github/scripts/rename/README.md +++ b/.github/scripts/rename/README.md @@ -1,11 +1,11 @@ ## Renaming ripple(d) to xrpl(d) In the initial phases of development of the XRPL, the open source codebase was -called "rippled" and it remains with that name even today. Today, over 1000 +called "xrpld" and it remains with that name even today. Today, over 1000 nodes run the application, and code contributions have been submitted by developers located around the world. The XRPL community is larger than ever. In light of the decentralized and diversified nature of XRPL, we will rename any -references to `ripple` and `rippled` to `xrpl` and `xrpld`, when appropriate. +references to `ripple` and `xrpld` to `xrpl` and `xrpld`, when appropriate. See [here](https://xls.xrpl.org/xls/XLS-0095-rename-rippled-to-xrpld.html) for more information. @@ -22,17 +22,17 @@ run from the repository root. 2. `.github/scripts/rename/copyright.sh`: This script will remove superfluous copyright notices. 3. `.github/scripts/rename/cmake.sh`: This script will rename all CMake files - from `RippleXXX.cmake` or `RippledXXX.cmake` to `XrplXXX.cmake`, and any - references to `ripple` and `rippled` (with or without capital letters) to + from `RippleXXX.cmake` or `XrpldXXX.cmake` to `XrplXXX.cmake`, and any + references to `ripple` and `xrpld` (with or without capital letters) to `xrpl` and `xrpld`, respectively. The name of the binary will remain as-is, and will only be renamed to `xrpld` by a later script. 4. `.github/scripts/rename/binary.sh`: This script will rename the binary from - `rippled` to `xrpld`, and reverses the symlink so that `rippled` points to + `xrpld` to `xrpld`, and reverses the symlink so that `xrpld` points to the `xrpld` binary. 5. `.github/scripts/rename/namespace.sh`: This script will rename the C++ namespaces from `ripple` to `xrpl`. 6. `.github/scripts/rename/config.sh`: This script will rename the config from - `rippled.cfg` to `xrpld.cfg`, and updating the code accordingly. The old + `xrpld.cfg` to `xrpld.cfg`, and updating the code accordingly. The old filename will still be accepted. 7. `.github/scripts/rename/docs.sh`: This script will rename any lingering references of `ripple(d)` to `xrpl(d)` in code, comments, and documentation. diff --git a/docker/telemetry/grafana/dashboards/consensus-health.json b/docker/telemetry/grafana/dashboards/consensus-health.json index ef202e7353..987b8f29ac 100644 --- a/docker/telemetry/grafana/dashboards/consensus-health.json +++ b/docker/telemetry/grafana/dashboards/consensus-health.json @@ -22,14 +22,14 @@ "datasource": { "type": "prometheus" }, - "expr": "histogram_quantile(0.95, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", span_name=\"consensus.accept\"}[5m])))", + "expr": "histogram_quantile(0.95, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", xrpl_consensus_mode=~\"$consensus_mode\", span_name=\"consensus.accept\"}[5m])))", "legendFormat": "P95 Round Duration" }, { "datasource": { "type": "prometheus" }, - "expr": "histogram_quantile(0.50, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", span_name=\"consensus.accept\"}[5m])))", + "expr": "histogram_quantile(0.50, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", xrpl_consensus_mode=~\"$consensus_mode\", span_name=\"consensus.accept\"}[5m])))", "legendFormat": "P50 Round Duration" } ], @@ -54,7 +54,7 @@ "datasource": { "type": "prometheus" }, - "expr": "sum(rate(traces_span_metrics_calls_total{exported_instance=~\"$node\", span_name=\"consensus.proposal.send\"}[5m]))", + "expr": "sum(rate(traces_span_metrics_calls_total{exported_instance=~\"$node\", xrpl_consensus_mode=~\"$consensus_mode\", span_name=\"consensus.proposal.send\"}[5m]))", "legendFormat": "Proposals / Sec" } ], @@ -79,7 +79,7 @@ "datasource": { "type": "prometheus" }, - "expr": "histogram_quantile(0.95, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", span_name=\"consensus.ledger_close\"}[5m])))", + "expr": "histogram_quantile(0.95, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", xrpl_consensus_mode=~\"$consensus_mode\", span_name=\"consensus.ledger_close\"}[5m])))", "legendFormat": "P95 Close Duration" } ], @@ -104,7 +104,7 @@ "datasource": { "type": "prometheus" }, - "expr": "sum(rate(traces_span_metrics_calls_total{exported_instance=~\"$node\", span_name=\"consensus.validation.send\"}[5m]))", + "expr": "sum(rate(traces_span_metrics_calls_total{exported_instance=~\"$node\", xrpl_consensus_mode=~\"$consensus_mode\", span_name=\"consensus.validation.send\"}[5m]))", "legendFormat": "Validations / Sec" } ], @@ -130,14 +130,14 @@ "datasource": { "type": "prometheus" }, - "expr": "histogram_quantile(0.95, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", span_name=\"consensus.accept.apply\"}[5m])))", + "expr": "histogram_quantile(0.95, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", xrpl_consensus_mode=~\"$consensus_mode\", span_name=\"consensus.accept.apply\"}[5m])))", "legendFormat": "P95 Apply Duration" }, { "datasource": { "type": "prometheus" }, - "expr": "histogram_quantile(0.50, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", span_name=\"consensus.accept.apply\"}[5m])))", + "expr": "histogram_quantile(0.50, sum by (le) (rate(traces_span_metrics_duration_milliseconds_bucket{exported_instance=~\"$node\", xrpl_consensus_mode=~\"$consensus_mode\", span_name=\"consensus.accept.apply\"}[5m])))", "legendFormat": "P50 Apply Duration" } ], @@ -170,8 +170,8 @@ "datasource": { "type": "prometheus" }, - "expr": "sum(rate(traces_span_metrics_calls_total{exported_instance=~\"$node\", span_name=\"consensus.accept.apply\"}[5m]))", - "legendFormat": "Total Rounds / Sec" + "expr": "sum by (xrpl_consensus_close_time_correct, exported_instance) (rate(traces_span_metrics_calls_total{span_name=\"consensus.accept.apply\", xrpl_consensus_mode=~\"$consensus_mode\", exported_instance=~\"$node\"}[$__rate_interval]))", + "legendFormat": "close_time_correct={{xrpl_consensus_close_time_correct}}" } ], "fieldConfig": { diff --git a/docker/telemetry/grafana/dashboards/transaction-overview.json b/docker/telemetry/grafana/dashboards/transaction-overview.json index b5f008972f..1c71829419 100644 --- a/docker/telemetry/grafana/dashboards/transaction-overview.json +++ b/docker/telemetry/grafana/dashboards/transaction-overview.json @@ -105,8 +105,8 @@ "datasource": { "type": "prometheus" }, - "expr": "sum(rate(traces_span_metrics_calls_total{exported_instance=~\"$node\", span_name=\"tx.receive\"}[5m]))", - "legendFormat": "total received" + "expr": "sum by (xrpl_tx_suppressed, exported_instance) (rate(traces_span_metrics_calls_total{span_name=\"tx.receive\", exported_instance=~\"$node\"}[$__rate_interval]))", + "legendFormat": "suppressed={{xrpl_tx_suppressed}}" } ], "fieldConfig": { diff --git a/docker/telemetry/grafana/provisioning/datasources/tempo.yaml b/docker/telemetry/grafana/provisioning/datasources/tempo.yaml index 45196a3a9a..83b7e80c65 100644 --- a/docker/telemetry/grafana/provisioning/datasources/tempo.yaml +++ b/docker/telemetry/grafana/provisioning/datasources/tempo.yaml @@ -166,3 +166,54 @@ datasources: operator: "=" scope: span type: dynamic + - id: consensus-proposers + tag: xrpl.consensus.proposers + operator: "=" + scope: span + type: dynamic + - id: consensus-result + tag: xrpl.consensus.result + operator: "=" + scope: span + type: dynamic + - id: consensus-mode-old + tag: xrpl.consensus.mode.old + operator: "=" + scope: span + type: dynamic + - id: consensus-mode-new + tag: xrpl.consensus.mode.new + operator: "=" + scope: span + type: dynamic + - id: consensus-ledger-id + tag: xrpl.consensus.ledger_id + operator: "=" + scope: span + type: static + # Phase 3/4: Additional transaction and queue filters + - id: tx-path + tag: xrpl.tx.path + operator: "=" + scope: span + type: dynamic + - id: tx-suppressed + tag: xrpl.tx.suppressed + operator: "=" + scope: span + type: dynamic + - id: peer-version + tag: xrpl.peer.version + operator: "=" + scope: span + type: dynamic + - id: txq-status + tag: xrpl.txq.status + operator: "=" + scope: span + type: dynamic + - id: txq-ter-code + tag: xrpl.txq.ter_code + operator: "=" + scope: span + type: dynamic diff --git a/docker/telemetry/otel-collector-config.yaml b/docker/telemetry/otel-collector-config.yaml index d3b97ae00c..266d4714b8 100644 --- a/docker/telemetry/otel-collector-config.yaml +++ b/docker/telemetry/otel-collector-config.yaml @@ -34,7 +34,9 @@ connectors: - name: xrpl.rpc.command - name: xrpl.rpc.status - name: xrpl.consensus.mode + - name: xrpl.consensus.close_time_correct - name: xrpl.tx.local + - name: xrpl.tx.suppressed exporters: debug: diff --git a/docs/telemetry-runbook.md b/docs/telemetry-runbook.md index 532c3a4d5a..87a8c619fa 100644 --- a/docs/telemetry-runbook.md +++ b/docs/telemetry-runbook.md @@ -39,22 +39,24 @@ cmake --build --preset default ## Configuration Reference -| Option | Default | Description | -| -------------------- | --------------------------------- | ----------------------------------------- | -| `enabled` | `0` | Master switch for telemetry | -| `endpoint` | `http://localhost:4318/v1/traces` | OTLP/HTTP endpoint | -| `exporter` | `otlp_http` | Exporter type | -| `sampling_ratio` | `1.0` | Head-based sampling ratio (0.0–1.0) | -| `trace_rpc` | `1` | Enable RPC request tracing | -| `trace_transactions` | `1` | Enable transaction tracing | -| `trace_consensus` | `1` | Enable consensus tracing | -| `trace_peer` | `0` | Enable peer message tracing (high volume) | -| `trace_ledger` | `1` | Enable ledger tracing | -| `batch_size` | `512` | Max spans per batch export | -| `batch_delay_ms` | `5000` | Delay between batch exports | -| `max_queue_size` | `2048` | Max spans queued before dropping | -| `use_tls` | `0` | Use TLS for exporter connection | -| `tls_ca_cert` | (empty) | Path to CA certificate bundle | +| Option | Default | Description | +| -------------------------- | --------------------------------- | --------------------------------------------------------- | +| `enabled` | `0` | Master switch for telemetry | +| `endpoint` | `http://localhost:4318/v1/traces` | OTLP/HTTP endpoint | +| `service_name` | `xrpld` | OpenTelemetry service name resource attribute | +| `service_instance_id` | node public key | OpenTelemetry service instance ID resource attribute | +| `sampling_ratio` | `1.0` | Head-based sampling ratio (0.0--1.0) | +| `trace_rpc` | `1` | Enable RPC request tracing | +| `trace_transactions` | `1` | Enable transaction tracing | +| `trace_consensus` | `1` | Enable consensus tracing | +| `trace_peer` | `0` | Enable peer message tracing (high volume) | +| `trace_ledger` | `1` | Enable ledger tracing | +| `consensus_trace_strategy` | `deterministic` | Consensus trace ID strategy (`deterministic` or `random`) | +| `batch_size` | `512` | Max spans per batch export | +| `batch_delay_ms` | `5000` | Delay between batch exports | +| `max_queue_size` | `2048` | Max spans queued before dropping | +| `use_tls` | `0` | Use TLS for exporter connection | +| `tls_ca_cert` | (empty) | Path to CA certificate bundle | ## Span Reference @@ -71,20 +73,46 @@ All spans instrumented in xrpld, grouped by subsystem: ### Transaction Spans (Phase 3) -| Span Name | Source File | Attributes | Description | -| ------------ | ------------------- | ----------------------------------------------- | ------------------------------------- | -| `tx.process` | NetworkOPs.cpp:1227 | `xrpl.tx.hash`, `xrpl.tx.local`, `xrpl.tx.path` | Transaction submission and processing | -| `tx.receive` | PeerImp.cpp:1273 | `xrpl.peer.id` | Transaction received from peer relay | +| Span Name | Source File | Attributes | Description | +| ------------ | ------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------- | +| `tx.process` | NetworkOPs.cpp:1227 | `xrpl.tx.hash`, `xrpl.tx.local`, `xrpl.tx.path` | Transaction submission and processing | +| `tx.receive` | PeerImp.cpp:1273 | `xrpl.peer.id`, `xrpl.tx.hash`, `xrpl.peer.version`, `xrpl.tx.suppressed`, `xrpl.tx.status` | Transaction received from peer relay | + +### Transaction Queue Spans (Phase 3) + +| Span Name | Source File | Attributes | Description | +| ------------------ | ----------- | --------------------------------------------------------------------- | -------------------------------------------------- | +| `txq.enqueue` | TxQ.cpp | `xrpl.txq.tx_hash` | Transaction enqueue decision (child of tx.process) | +| `txq.apply_direct` | TxQ.cpp | -- | Direct apply attempt (bypassing queue) | +| `txq.batch_clear` | TxQ.cpp | -- | Batch clear of queued transactions for an account | +| `txq.accept` | TxQ.cpp | `xrpl.txq.queue_size` | Ledger-close accept loop over queued transactions | +| `txq.accept_tx` | TxQ.cpp | `xrpl.txq.tx_hash`, `xrpl.txq.retries_remaining`, `xrpl.txq.ter_code` | Per-transaction apply during accept | +| `txq.cleanup` | TxQ.cpp | `xrpl.txq.ledger_seq` | Post-close cleanup of expired queue entries | ### Consensus Spans (Phase 4) -| Span Name | Source File | Attributes | Description | -| --------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | -| `consensus.proposal.send` | RCLConsensus.cpp:177 | `xrpl.consensus.round` | Consensus proposal broadcast | -| `consensus.ledger_close` | RCLConsensus.cpp:282 | `xrpl.consensus.ledger.seq`, `xrpl.consensus.mode` | Ledger close event | -| `consensus.accept` | RCLConsensus.cpp:395 | `xrpl.consensus.proposers`, `xrpl.consensus.round_time_ms` | Ledger accepted by consensus | -| `consensus.validation.send` | RCLConsensus.cpp:753 | `xrpl.consensus.ledger.seq`, `xrpl.consensus.proposing` | Validation sent after accept | -| `consensus.accept.apply` | RCLConsensus.cpp:453 | `xrpl.consensus.close_time`, `close_time_correct`, `close_resolution_ms`, `state`, `proposing`, `round_time_ms`, `ledger.seq` | Ledger application with close time details | +| Span Name | Source File | Attributes | Description | +| ------------------------------ | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | +| `consensus.round` | RCLConsensus.cpp | `xrpl.consensus.ledger_id`, `xrpl.consensus.ledger.seq`, `xrpl.consensus.mode`, `xrpl.consensus.trace_strategy`, `xrpl.consensus.round_id` | Root span for a consensus round (deterministic or random trace ID) | +| `consensus.phase.open` | Consensus.h | -- | Open phase duration (child of round) | +| `consensus.proposal.send` | RCLConsensus.cpp | `xrpl.consensus.round` | Consensus proposal broadcast | +| `consensus.ledger_close` | RCLConsensus.cpp | `xrpl.consensus.ledger.seq`, `xrpl.consensus.mode` | Ledger close event | +| `consensus.establish` | Consensus.h | `xrpl.consensus.converge_percent`, `xrpl.consensus.establish_count`, `xrpl.consensus.proposers` | Establish phase duration (child of round) | +| `consensus.update_positions` | Consensus.h | `xrpl.consensus.converge_percent`, `xrpl.consensus.proposers`, `xrpl.consensus.disputes_count` | Position update and dispute resolution (see Events below) | +| `consensus.check` | Consensus.h | `xrpl.consensus.agree_count`, `xrpl.consensus.disagree_count`, `xrpl.consensus.converge_percent`, `xrpl.consensus.have_close_time_consensus`, `xrpl.consensus.threshold_percent`, `xrpl.consensus.result` | Consensus threshold check | +| `consensus.accept` | RCLConsensus.cpp | `xrpl.consensus.proposers`, `xrpl.consensus.round_time_ms` | Ledger accepted by consensus | +| `consensus.accept.apply` | RCLConsensus.cpp | `xrpl.consensus.ledger.seq`, `xrpl.consensus.close_time`, `xrpl.consensus.close_time_correct`, `xrpl.consensus.close_resolution_ms`, `xrpl.consensus.state`, `xrpl.consensus.proposing`, `xrpl.consensus.round_time_ms`, `xrpl.consensus.parent_close_time`, `xrpl.consensus.close_time_self`, `xrpl.consensus.close_time_vote_bins`, `xrpl.consensus.resolution_direction`, `xrpl.consensus.tx_count` | Ledger application with close time details (see Events below) | +| `consensus.validation.send` | RCLConsensus.cpp | `xrpl.consensus.ledger.seq`, `xrpl.consensus.proposing` | Validation sent after accept (follows-from link) | +| `consensus.mode_change` | RCLConsensus.cpp | `xrpl.consensus.mode.old`, `xrpl.consensus.mode.new` | Consensus mode transition | +| `consensus.proposal.receive` | PeerImp.cpp | `xrpl.consensus.trusted`, `xrpl.consensus.round` | Proposal received from peer (standalone span) | +| `consensus.validation.receive` | PeerImp.cpp | `xrpl.consensus.trusted`, `xrpl.consensus.ledger.seq` | Validation received from peer (standalone span) | + +#### Consensus Span Events + +| Parent Span | Event Name | Event Attributes | Description | +| ---------------------------- | ----------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------- | +| `consensus.update_positions` | `dispute.resolve` | `xrpl.tx.id`, `xrpl.dispute.our_vote`, `xrpl.dispute.yays`, `xrpl.dispute.nays` | Emitted per dispute when votes are tallied | +| `consensus.accept.apply` | `tx.included` | `xrpl.tx.id` | Emitted per transaction included in the accepted ledger | #### Close Time Queries (Tempo TraceQL) @@ -100,6 +128,12 @@ All spans instrumented in xrpld, grouped by subsystem: # Find specific ledger's consensus details {name="consensus.accept.apply"} | xrpl.consensus.ledger.seq = 92345678 + +# Find all spans in a consensus round (deterministic trace strategy) +{name="consensus.round"} | xrpl.consensus.round_id = "" + +# Find dispute resolutions +{name="consensus.update_positions"} >> {event:name="dispute.resolve"} ``` ## Prometheus Metrics (Spanmetrics) @@ -178,18 +212,32 @@ Three dashboards are pre-provisioned in `docker/telemetry/grafana/dashboards/`: ### Span → Metric → Dashboard Summary -| Span Name | Prometheus Metric Filter | Grafana Dashboard | -| --------------------------- | ----------------------------------------- | --------------------------------------------- | -| `rpc.request` | `{span_name="rpc.request"}` | — (available but not paneled) | -| `rpc.process` | `{span_name="rpc.process"}` | — (available but not paneled) | -| `rpc.command.*` | `{span_name=~"rpc.command.*"}` | RPC Performance (all 4 panels) | -| `tx.process` | `{span_name="tx.process"}` | Transaction Overview (3 panels) | -| `tx.receive` | `{span_name="tx.receive"}` | Transaction Overview (2 panels) | -| `consensus.accept` | `{span_name="consensus.accept"}` | Consensus Health (Round Duration) | -| `consensus.proposal.send` | `{span_name="consensus.proposal.send"}` | Consensus Health (Proposals Rate) | -| `consensus.ledger_close` | `{span_name="consensus.ledger_close"}` | Consensus Health (Close Duration) | -| `consensus.validation.send` | `{span_name="consensus.validation.send"}` | Consensus Health (Validation Rate) | -| `consensus.accept.apply` | `{span_name="consensus.accept.apply"}` | Consensus Health (Apply Duration, Close Time) | +| Span Name | Prometheus Metric Filter | Grafana Dashboard | +| ------------------------------ | -------------------------------------------- | --------------------------------------------- | +| `rpc.request` | `{span_name="rpc.request"}` | -- (available but not paneled) | +| `rpc.process` | `{span_name="rpc.process"}` | -- (available but not paneled) | +| `rpc.command.*` | `{span_name=~"rpc.command.*"}` | RPC Performance (all 4 panels) | +| `tx.process` | `{span_name="tx.process"}` | Transaction Overview (3 panels) | +| `tx.receive` | `{span_name="tx.receive"}` | Transaction Overview (2 panels) | +| `txq.enqueue` | `{span_name="txq.enqueue"}` | -- (available but not paneled) | +| `txq.apply_direct` | `{span_name="txq.apply_direct"}` | -- (available but not paneled) | +| `txq.batch_clear` | `{span_name="txq.batch_clear"}` | -- (available but not paneled) | +| `txq.accept` | `{span_name="txq.accept"}` | -- (available but not paneled) | +| `txq.accept_tx` | `{span_name="txq.accept_tx"}` | -- (available but not paneled) | +| `txq.cleanup` | `{span_name="txq.cleanup"}` | -- (available but not paneled) | +| `consensus.round` | `{span_name="consensus.round"}` | -- (available but not paneled) | +| `consensus.phase.open` | `{span_name="consensus.phase.open"}` | -- (available but not paneled) | +| `consensus.establish` | `{span_name="consensus.establish"}` | -- (available but not paneled) | +| `consensus.update_positions` | `{span_name="consensus.update_positions"}` | -- (available but not paneled) | +| `consensus.check` | `{span_name="consensus.check"}` | -- (available but not paneled) | +| `consensus.accept` | `{span_name="consensus.accept"}` | Consensus Health (Round Duration) | +| `consensus.proposal.send` | `{span_name="consensus.proposal.send"}` | Consensus Health (Proposals Rate) | +| `consensus.ledger_close` | `{span_name="consensus.ledger_close"}` | Consensus Health (Close Duration) | +| `consensus.validation.send` | `{span_name="consensus.validation.send"}` | Consensus Health (Validation Rate) | +| `consensus.accept.apply` | `{span_name="consensus.accept.apply"}` | Consensus Health (Apply Duration, Close Time) | +| `consensus.mode_change` | `{span_name="consensus.mode_change"}` | -- (available but not paneled) | +| `consensus.proposal.receive` | `{span_name="consensus.proposal.receive"}` | -- (available but not paneled) | +| `consensus.validation.receive` | `{span_name="consensus.validation.receive"}` | -- (available but not paneled) | ## Troubleshooting diff --git a/include/xrpl/protocol/README.md b/include/xrpl/protocol/README.md index d679c583d4..f435a4dec3 100644 --- a/include/xrpl/protocol/README.md +++ b/include/xrpl/protocol/README.md @@ -33,7 +33,7 @@ or may not hold a value. For things not guaranteed to exist, you use `x[~sfFoo]` because you want such a container. It avoids having to look something up twice, once just to see if it exists and a second time to get/set its value. -([Real example](https://github.com/XRPLF/rippled/blob/35f4698aed5dce02f771b34cfbb690495cb5efcc/src/ripple/app/tx/impl/PayChan.cpp#L229-L236)) +([Real example](https://github.com/XRPLF/rippled/blob/35f4698aed5dce02f771b34cfbb690495cb5efcc/src/xrpld/app/tx/impl/PayChan.cpp#L229-L236)) The source of this "type magic" is in [SField.h](./SField.h#L296-L302). diff --git a/src/xrpld/app/misc/SHAMapStoreImp.h b/src/xrpld/app/misc/SHAMapStoreImp.h index 08e3dd70eb..3c847cf434 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.h +++ b/src/xrpld/app/misc/SHAMapStoreImp.h @@ -53,7 +53,7 @@ private: // name of state database std::string const dbName_ = "state"; // prefix of on-disk nodestore backend instances - std::string const dbPrefix_ = "rippledb"; // cspell: disable-line + std::string const dbPrefix_ = "xrpldb"; // cspell: disable-line // check health/stop status as records are copied std::uint64_t const checkHealthInterval_ = 1000; // minimum # of ledgers to maintain for health of network diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index b7063287bb..7c55f08c81 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -249,7 +249,7 @@ getSingleSection( //------------------------------------------------------------------------------ char const* const Config::configFileName = "xrpld.cfg"; -char const* const Config::configLegacyName = "rippled.cfg"; +char const* const Config::configLegacyName = "xrpld.cfg"; char const* const Config::databaseDirName = "db"; char const* const Config::validatorsFileName = "validators.txt";