From 8e15a81f960f324497b0dd59a8d97bce759e6be1 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:34:07 +0100 Subject: [PATCH 1/4] docs(telemetry): follow the close-time attr rename in the ledger attr table The emitted key is close_time_ripple_epoch_s, which names its unit and epoch. Update the ledger attribute table to match. ledger_index and ledger_tx_count in the same table belong to a separate rename and are left as they are. --- OpenTelemetryPlan/02-design-decisions.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/OpenTelemetryPlan/02-design-decisions.md b/OpenTelemetryPlan/02-design-decisions.md index f3289c68e9..c7930454e5 100644 --- a/OpenTelemetryPlan/02-design-decisions.md +++ b/OpenTelemetryPlan/02-design-decisions.md @@ -286,15 +286,15 @@ keys (the dotted form is reserved for resource scope per §2.3.3). #### Ledger & Job Attributes -| Key | Type | Description | -| ----------------- | ------- | --------------------- | -| `ledger_hash` | string | Ledger hash | -| `ledger_index` | int64 | Ledger sequence/index | -| `close_time` | int64 | Close time (epoch) | -| `ledger_tx_count` | int64 | Transaction count | -| `job_type` | string | Job type name | -| `job_queue_ms` | float64 | Time spent in queue | -| `job_worker` | int64 | Worker thread ID | +| Key | Type | Description | +| --------------------------- | ------- | --------------------------------- | +| `ledger_hash` | string | Ledger hash | +| `ledger_index` | int64 | Ledger sequence/index | +| `close_time_ripple_epoch_s` | int64 | Close time (Ripple epoch seconds) | +| `ledger_tx_count` | int64 | Transaction count | +| `job_type` | string | Job type name | +| `job_queue_ms` | float64 | Time spent in queue | +| `job_worker` | int64 | Worker thread ID | #### PathFinding Attributes From 372fba129fac092ac800f1bd2e661e17c5d78b21 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:35:25 +0100 Subject: [PATCH 2/4] docs(telemetry): follow the close-time attr rename in the phase-4 docs The emitted keys are close_time_ripple_epoch_s, parent_close_time_ripple_epoch_s and close_time_self_ripple_epoch_s. Update the consensus.accept.apply attribute tables and the close-time attribute descriptions to match. --- OpenTelemetryPlan/06-implementation-phases.md | 16 +++++++-------- OpenTelemetryPlan/Phase4_taskList.md | 20 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/OpenTelemetryPlan/06-implementation-phases.md b/OpenTelemetryPlan/06-implementation-phases.md index 8aba7836ad..bd8e8147eb 100644 --- a/OpenTelemetryPlan/06-implementation-phases.md +++ b/OpenTelemetryPlan/06-implementation-phases.md @@ -179,14 +179,14 @@ SHAMap tracing are not implemented. ### Spans Produced -| Span Name | Location | Attributes | -| --------------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `consensus.phase.open` | `Consensus.h` | _(none)_ | -| `consensus.proposal.send` | `RCLConsensus.cpp` | `consensus_round` | -| `consensus.ledger_close` | `RCLConsensus.cpp` | `ledger_seq`, `consensus_mode` | -| `consensus.accept` | `RCLConsensus.cpp` | `proposers`, `round_time_ms`, `quorum` | -| `consensus.accept.apply` | `RCLConsensus.cpp` | `close_time`, `close_time_correct`, `close_resolution_ms`, `consensus_state`, `proposing`, `round_time_ms`, `ledger_seq`, `parent_close_time`, `close_time_self`, `close_time_vote_bins`, `resolution_direction` | -| `consensus.validation.send` | `RCLConsensus.cpp` | `ledger_seq`, `proposing` | +| Span Name | Location | Attributes | +| --------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `consensus.phase.open` | `Consensus.h` | _(none)_ | +| `consensus.proposal.send` | `RCLConsensus.cpp` | `consensus_round` | +| `consensus.ledger_close` | `RCLConsensus.cpp` | `ledger_seq`, `consensus_mode` | +| `consensus.accept` | `RCLConsensus.cpp` | `proposers`, `round_time_ms`, `quorum` | +| `consensus.accept.apply` | `RCLConsensus.cpp` | `close_time_ripple_epoch_s`, `close_time_correct`, `close_resolution_ms`, `consensus_state`, `proposing`, `round_time_ms`, `ledger_seq`, `parent_close_time_ripple_epoch_s`, `close_time_self_ripple_epoch_s`, `close_time_vote_bins`, `resolution_direction` | +| `consensus.validation.send` | `RCLConsensus.cpp` | `ledger_seq`, `proposing` | ### Exit Criteria diff --git a/OpenTelemetryPlan/Phase4_taskList.md b/OpenTelemetryPlan/Phase4_taskList.md index 2629ae82fd..a20385e664 100644 --- a/OpenTelemetryPlan/Phase4_taskList.md +++ b/OpenTelemetryPlan/Phase4_taskList.md @@ -320,27 +320,27 @@ Phase 7's `ValidationTracker` builds metric-level aggregation (1h/24h agreement ### Implemented Spans -| Span Name | Method | Key Attributes | -| --------------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `consensus.proposal.send` | `Adaptor::propose` | `xrpl.consensus.round`, `is_bow_out` | -| `consensus.ledger_close` | `Adaptor::onClose` | `xrpl.ledger.seq`, `xrpl.consensus.mode` | -| `consensus.accept` | `Adaptor::onAccept` | `proposers`, `round_time_ms`, `quorum`, `disputes_count`, `consensus_state` | -| `consensus.accept.apply` | `Adaptor::doAccept` | `close_time`, `close_time_correct`, `close_resolution_ms`, `consensus_state`, `proposing`, `round_time_ms`, `xrpl.ledger.seq`, `parent_close_time`, `close_time_self`, `close_time_vote_bins`, `resolution_direction` | -| `consensus.validation.send` | `Adaptor::onAccept` (via validate) | `proposing`, `ledger_hash`, `ledger_seq`, `full_validation`, `validation_sign_time` | +| Span Name | Method | Key Attributes | +| --------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `consensus.proposal.send` | `Adaptor::propose` | `xrpl.consensus.round`, `is_bow_out` | +| `consensus.ledger_close` | `Adaptor::onClose` | `xrpl.ledger.seq`, `xrpl.consensus.mode` | +| `consensus.accept` | `Adaptor::onAccept` | `proposers`, `round_time_ms`, `quorum`, `disputes_count`, `consensus_state` | +| `consensus.accept.apply` | `Adaptor::doAccept` | `close_time_ripple_epoch_s`, `close_time_correct`, `close_resolution_ms`, `consensus_state`, `proposing`, `round_time_ms`, `xrpl.ledger.seq`, `parent_close_time_ripple_epoch_s`, `close_time_self_ripple_epoch_s`, `close_time_vote_bins`, `resolution_direction` | +| `consensus.validation.send` | `Adaptor::onAccept` (via validate) | `proposing`, `ledger_hash`, `ledger_seq`, `full_validation`, `validation_sign_time` | #### Close Time Attributes (consensus.accept.apply) The `consensus.accept.apply` span captures ledger close time agreement details driven by `avCT_CONSENSUS_PCT` (75% validator agreement threshold): -- **`close_time`** — Agreed-upon ledger close time (epoch seconds). When validators disagree (`consensusCloseTime == epoch`), this is synthetically set to `prevCloseTime + 1s`. +- **`close_time_ripple_epoch_s`** — Agreed-upon ledger close time (Ripple epoch seconds). When validators disagree (`consensusCloseTime == epoch`), this is synthetically set to `prevCloseTime + 1s`. - **`close_time_correct`** — `true` if validators reached agreement, `false` if they "agreed to disagree" (close time forced to prev+1s). - **`close_resolution_ms`** — Rounding granularity for close time (starts at 30s, decreases as ledger interval stabilizes). - **`consensus_state`** — `"finished"` (normal) or `"moved_on"` (consensus failed, adopted best available). - **`proposing`** — Whether this node was proposing. - **`round_time_ms`** — Total consensus round duration. -- **`parent_close_time`** — Previous ledger's close time (epoch seconds). Enables computing close-time deltas across consecutive rounds without correlating separate spans. -- **`close_time_self`** — This node's own proposed close time before consensus voting. +- **`parent_close_time_ripple_epoch_s`** — Previous ledger's close time (Ripple epoch seconds). Enables computing close-time deltas across consecutive rounds without correlating separate spans. +- **`close_time_self_ripple_epoch_s`** — This node's own proposed close time before consensus voting. - **`close_time_vote_bins`** — Number of distinct close-time vote bins from peer proposals. Higher values indicate less agreement among validators. - **`resolution_direction`** — Whether close-time resolution `"increased"` (coarser), `"decreased"` (finer), or stayed `"unchanged"` relative to the previous ledger. From 1afa35d54d89dfc2dcdf6c96e04c959c178380dd Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:35:59 +0100 Subject: [PATCH 3/4] docs(telemetry): follow the close-time attr rename in the runbook The consensus.accept.apply row listed close_time, parent_close_time and close_time_self. The emitted keys carry the unit and epoch suffix, so update the row to match. --- docs/telemetry-runbook.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/telemetry-runbook.md b/docs/telemetry-runbook.md index 6e6bff0757..da42154054 100644 --- a/docs/telemetry-runbook.md +++ b/docs/telemetry-runbook.md @@ -111,21 +111,21 @@ lifecycle spans be joined to the ledger trace it targeted (`span.current_ledger_ ### Consensus Spans -| Span Name | Source File | Attributes | Description | -| ------------------------------ | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| `consensus.round` | RCLConsensus.cpp | `consensus_ledger_id`, `ledger_seq`, `consensus_mode`, `trace_strategy`, `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 | `consensus_round`, `is_bow_out` | Consensus proposal broadcast | -| `consensus.ledger_close` | RCLConsensus.cpp | `ledger_seq`, `consensus_mode` | Ledger close event | -| `consensus.establish` | Consensus.h | `converge_percent`, `establish_count`, `proposers`, `disputes_count` (all overwritten each iteration); `close_time_avalanche_state` (terminal regime, set once when the span ends) | Establish phase duration (child of round) | -| `consensus.update_positions` | Consensus.h | `converge_percent`, `proposers`, `disputes_count` | Position update and dispute resolution (see Events below) | -| `consensus.check` | Consensus.h | `agree_count`, `disagree_count`, `converge_percent`, `have_close_time_consensus`, `threshold_percent`, `proposers_finished`, `consensus_stalled`, `establish_count`, `consensus_result` | Consensus threshold check | -| `consensus.accept` | RCLConsensus.cpp | `proposers`, `round_time_ms`, `quorum`, `disputes_count`, `consensus_state` | Ledger accepted by consensus | -| `consensus.accept.apply` | RCLConsensus.cpp | `ledger_seq`, `close_time`, `close_time_correct`, `close_resolution_ms`, `consensus_state`, `proposing`, `round_time_ms`, `parent_close_time`, `close_time_self`, `close_time_vote_bins`, `resolution_direction`, `tx_count` | Ledger application with close time details (see Events below) | -| `consensus.validation.send` | RCLConsensus.cpp | `ledger_seq`, `proposing`, `ledger_hash`, `full_validation`, `validation_sign_time` | Validation sent after accept (follows-from link) | -| `consensus.mode_change` | RCLConsensus.cpp | `mode_old`, `mode_new` | Consensus mode transition | -| `consensus.proposal.receive` | PeerImp.cpp | `proposal_trusted`, `consensus_round` | Proposal received from peer (extracts parent context from TraceContext when present; falls back to standalone span for older peers) | -| `consensus.validation.receive` | PeerImp.cpp | `validation_trusted`, `ledger_seq` | Validation received from peer (extracts parent context from TraceContext when present; falls back to standalone span for older peers) | +| Span Name | Source File | Attributes | Description | +| ------------------------------ | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `consensus.round` | RCLConsensus.cpp | `consensus_ledger_id`, `ledger_seq`, `consensus_mode`, `trace_strategy`, `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 | `consensus_round`, `is_bow_out` | Consensus proposal broadcast | +| `consensus.ledger_close` | RCLConsensus.cpp | `ledger_seq`, `consensus_mode` | Ledger close event | +| `consensus.establish` | Consensus.h | `converge_percent`, `establish_count`, `proposers`, `disputes_count` (all overwritten each iteration); `close_time_avalanche_state` (terminal regime, set once when the span ends) | Establish phase duration (child of round) | +| `consensus.update_positions` | Consensus.h | `converge_percent`, `proposers`, `disputes_count` | Position update and dispute resolution (see Events below) | +| `consensus.check` | Consensus.h | `agree_count`, `disagree_count`, `converge_percent`, `have_close_time_consensus`, `threshold_percent`, `proposers_finished`, `consensus_stalled`, `establish_count`, `consensus_result` | Consensus threshold check | +| `consensus.accept` | RCLConsensus.cpp | `proposers`, `round_time_ms`, `quorum`, `disputes_count`, `consensus_state` | Ledger accepted by consensus | +| `consensus.accept.apply` | RCLConsensus.cpp | `ledger_seq`, `close_time_ripple_epoch_s`, `close_time_correct`, `close_resolution_ms`, `consensus_state`, `proposing`, `round_time_ms`, `parent_close_time_ripple_epoch_s`, `close_time_self_ripple_epoch_s`, `close_time_vote_bins`, `resolution_direction`, `tx_count` | Ledger application with close time details (see Events below) | +| `consensus.validation.send` | RCLConsensus.cpp | `ledger_seq`, `proposing`, `ledger_hash`, `full_validation`, `validation_sign_time` | Validation sent after accept (follows-from link) | +| `consensus.mode_change` | RCLConsensus.cpp | `mode_old`, `mode_new` | Consensus mode transition | +| `consensus.proposal.receive` | PeerImp.cpp | `proposal_trusted`, `consensus_round` | Proposal received from peer (extracts parent context from TraceContext when present; falls back to standalone span for older peers) | +| `consensus.validation.receive` | PeerImp.cpp | `validation_trusted`, `ledger_seq` | Validation received from peer (extracts parent context from TraceContext when present; falls back to standalone span for older peers) | #### Consensus Span Events From ca22f5791918f3bc6ef257299ea0c6a198a7fd63 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:37:19 +0100 Subject: [PATCH 4/4] docs(telemetry): follow the close-time attr rename in the data reference The emitted keys carry the unit and epoch suffix. Update the consensus and ledger attribute tables and the ledger.build span row to match. The Close Time Drift panel row is left alone: phase-7 removes that whole table, so editing it here would only conflict on the way forward. --- .../09-data-collection-reference.md | 108 +++++++++--------- docs/telemetry-runbook.md | 10 +- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/OpenTelemetryPlan/09-data-collection-reference.md b/OpenTelemetryPlan/09-data-collection-reference.md index e1010a0242..9507f1c7d8 100644 --- a/OpenTelemetryPlan/09-data-collection-reference.md +++ b/OpenTelemetryPlan/09-data-collection-reference.md @@ -346,51 +346,51 @@ Join a transaction's work to its ledger with `{span.current_ledger_seq=}`. #### Consensus Attributes -| Attribute | Type | Set On | Description | -| ---------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | -| `consensus_ledger_id` | string | `consensus.round` | Previous ledger hash (used for deterministic trace ID) | -| `ledger_seq` | int64 | `consensus.round`, `consensus.ledger_close`, `consensus.accept`, `consensus.validation.send`, `consensus.accept.apply` | Ledger sequence number | -| `consensus_mode` | string | `consensus.round`, `consensus.proposal.send`, `consensus.ledger_close` | Node mode via `toDisplayString()`: `"Proposing"`, `"Observing"`, etc. | -| `consensus_round` | int64 | `consensus.proposal.send` | Consensus round number | -| `proposers` | int64 | `consensus.proposal.send`, `consensus.accept` | Number of proposers in the round | -| `round_time_ms` | int64 | `consensus.accept`, `consensus.accept.apply` | Total consensus round duration in milliseconds | -| `proposing` | boolean | `consensus.validation.send` | Whether this node was a proposer | -| `consensus_state` | string | `consensus.accept.apply` | Consensus outcome: `"finished"` or `"moved_on"` | -| `close_time` | int64 | `consensus.accept.apply` | Agreed-upon ledger close time (epoch seconds) | -| `close_time_correct` | boolean | `consensus.accept.apply` | Whether validators reached agreement on close time | -| `close_resolution_ms` | int64 | `consensus.accept.apply` | Close time rounding granularity in milliseconds | -| `parent_close_time` | int64 | `consensus.accept.apply` | Parent ledger's close time (epoch seconds) | -| `close_time_self` | int64 | `consensus.accept.apply` | This node's proposed close time | -| `close_time_vote_bins` | string | `consensus.accept.apply` | Histogram of close time votes from validators | -| `resolution_direction` | string | `consensus.accept.apply` | Resolution change: `"increased"`, `"decreased"`, or `"unchanged"` | -| `converge_percent` | int64 | `consensus.establish` | Convergence percentage threshold | -| `establish_count` | int64 | `consensus.establish` | Number of establish iterations completed | -| `proposers_agreed` | int64 | `consensus.establish` | Number of proposers that agreed on this round | -| `avalanche_threshold` | int64 | `consensus.update_positions` | Avalanche threshold for dispute resolution | -| `start_reason` | string | `consensus.phase.open` | Entry path: `"initial"` or `"recovered"` | -| `previous_close_agree` | bool | `consensus.phase.open` | Whether the prior ledger's close time was agreed | -| `peer_positions_at_open` | int64 | `consensus.phase.open` | Positions held after buffered proposals are replayed | -| `early_close_triggered` | bool | `consensus.phase.open` | Round skipped the timer because peers had already closed | -| `tx_sets_acquired` | int64 | `consensus.phase.open` | Peer transaction sets held at close, excluding our own | -| `close_reason` | string | `consensus.phase.open` | `"anomaly"`, `"others_closed"`, `"idle"`, or `"normal"` | -| `proposers_validated` | int64 | `consensus.phase.open` | Trusted validators of the previous ledger, at close | -| `close_time_avalanche_state` | string | `consensus.establish` | Terminal regime: `"init"`, `"mid"`, `"late"`, or `"stuck"` | -| `close_time_threshold` | int64 | `consensus.update_positions` | Close time agreement threshold | -| `have_close_time_consensus` | boolean | `consensus.update_positions` | Whether close time consensus has been reached | -| `agree_count` | int64 | `consensus.check` | Number of proposers that agree with our position | -| `disagree_count` | int64 | `consensus.check` | Number of proposers that disagree with our position | -| `threshold_percent` | int64 | `consensus.check` | Required agreement threshold percentage | -| `consensus_result` | string | `consensus.check` | Check result: `"yes"`, `"no"`, or `"expired"` | -| `quorum` | int64 | `consensus.check` | Required quorum for validation | -| `validation_count` | int64 | `consensus.check` | Number of validations received | -| `trace_strategy` | string | `consensus.round` | Trace sampling strategy used for this round | -| `consensus_round_id` | int64 | `consensus.round` | Deterministic round identifier (previous ledger seq + 1) | -| `mode_old` | string | `consensus.mode_change` | Previous consensus mode | -| `mode_new` | string | `consensus.mode_change` | New consensus mode | -| `tx_id` | string | `consensus.update_positions` | Disputed transaction ID | -| `dispute_our_vote` | boolean | `consensus.update_positions` | Our vote on the disputed transaction | -| `dispute_yays` | int64 | `consensus.update_positions` | Number of proposers voting to include | -| `dispute_nays` | int64 | `consensus.update_positions` | Number of proposers voting to exclude | +| Attribute | Type | Set On | Description | +| ---------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | +| `consensus_ledger_id` | string | `consensus.round` | Previous ledger hash (used for deterministic trace ID) | +| `ledger_seq` | int64 | `consensus.round`, `consensus.ledger_close`, `consensus.accept`, `consensus.validation.send`, `consensus.accept.apply` | Ledger sequence number | +| `consensus_mode` | string | `consensus.round`, `consensus.proposal.send`, `consensus.ledger_close` | Node mode via `toDisplayString()`: `"Proposing"`, `"Observing"`, etc. | +| `consensus_round` | int64 | `consensus.proposal.send` | Consensus round number | +| `proposers` | int64 | `consensus.proposal.send`, `consensus.accept` | Number of proposers in the round | +| `round_time_ms` | int64 | `consensus.accept`, `consensus.accept.apply` | Total consensus round duration in milliseconds | +| `proposing` | boolean | `consensus.validation.send` | Whether this node was a proposer | +| `consensus_state` | string | `consensus.accept.apply` | Consensus outcome: `"finished"` or `"moved_on"` | +| `close_time_ripple_epoch_s` | int64 | `consensus.accept.apply` | Agreed-upon ledger close time (Ripple epoch seconds) | +| `close_time_correct` | boolean | `consensus.accept.apply` | Whether validators reached agreement on close time | +| `close_resolution_ms` | int64 | `consensus.accept.apply` | Close time rounding granularity in milliseconds | +| `parent_close_time_ripple_epoch_s` | int64 | `consensus.accept.apply` | Parent ledger's close time (Ripple epoch seconds) | +| `close_time_self_ripple_epoch_s` | int64 | `consensus.accept.apply` | This node's proposed close time (Ripple epoch seconds) | +| `close_time_vote_bins` | string | `consensus.accept.apply` | Histogram of close time votes from validators | +| `resolution_direction` | string | `consensus.accept.apply` | Resolution change: `"increased"`, `"decreased"`, or `"unchanged"` | +| `converge_percent` | int64 | `consensus.establish` | Convergence percentage threshold | +| `establish_count` | int64 | `consensus.establish` | Number of establish iterations completed | +| `proposers_agreed` | int64 | `consensus.establish` | Number of proposers that agreed on this round | +| `avalanche_threshold` | int64 | `consensus.update_positions` | Avalanche threshold for dispute resolution | +| `start_reason` | string | `consensus.phase.open` | Entry path: `"initial"` or `"recovered"` | +| `previous_close_agree` | bool | `consensus.phase.open` | Whether the prior ledger's close time was agreed | +| `peer_positions_at_open` | int64 | `consensus.phase.open` | Positions held after buffered proposals are replayed | +| `early_close_triggered` | bool | `consensus.phase.open` | Round skipped the timer because peers had already closed | +| `tx_sets_acquired` | int64 | `consensus.phase.open` | Peer transaction sets held at close, excluding our own | +| `close_reason` | string | `consensus.phase.open` | `"anomaly"`, `"others_closed"`, `"idle"`, or `"normal"` | +| `proposers_validated` | int64 | `consensus.phase.open` | Trusted validators of the previous ledger, at close | +| `close_time_avalanche_state` | string | `consensus.establish` | Terminal regime: `"init"`, `"mid"`, `"late"`, or `"stuck"` | +| `close_time_threshold` | int64 | `consensus.update_positions` | Close time agreement threshold | +| `have_close_time_consensus` | boolean | `consensus.update_positions` | Whether close time consensus has been reached | +| `agree_count` | int64 | `consensus.check` | Number of proposers that agree with our position | +| `disagree_count` | int64 | `consensus.check` | Number of proposers that disagree with our position | +| `threshold_percent` | int64 | `consensus.check` | Required agreement threshold percentage | +| `consensus_result` | string | `consensus.check` | Check result: `"yes"`, `"no"`, or `"expired"` | +| `quorum` | int64 | `consensus.check` | Required quorum for validation | +| `validation_count` | int64 | `consensus.check` | Number of validations received | +| `trace_strategy` | string | `consensus.round` | Trace sampling strategy used for this round | +| `consensus_round_id` | int64 | `consensus.round` | Deterministic round identifier (previous ledger seq + 1) | +| `mode_old` | string | `consensus.mode_change` | Previous consensus mode | +| `mode_new` | string | `consensus.mode_change` | New consensus mode | +| `tx_id` | string | `consensus.update_positions` | Disputed transaction ID | +| `dispute_our_vote` | boolean | `consensus.update_positions` | Our vote on the disputed transaction | +| `dispute_yays` | int64 | `consensus.update_positions` | Number of proposers voting to include | +| `dispute_nays` | int64 | `consensus.update_positions` | Number of proposers voting to exclude | **Tempo query**: `{span.consensus_mode="Proposing"}` to find rounds where node was proposing. @@ -398,15 +398,15 @@ Join a transaction's work to its ledger with `{span.current_ledger_seq=}`. #### Ledger Attributes -| Attribute | Type | Set On | Description | -| --------------------- | ------- | ------------------------------------------------------------- | ------------------------------------------------ | -| `ledger_seq` | int64 | `ledger.build`, `ledger.validate`, `ledger.store`, `tx.apply` | Ledger sequence number | -| `close_time` | int64 | `ledger.build` | Ledger close time (epoch seconds) | -| `close_time_correct` | boolean | `ledger.build` | Whether close time was agreed upon by validators | -| `close_resolution_ms` | int64 | `ledger.build` | Close time rounding granularity in milliseconds | -| `tx_count` | int64 | `ledger.build`, `tx.apply` | Transactions in the ledger | -| `tx_failed` | int64 | `ledger.build`, `tx.apply` | Failed transactions in the ledger | -| `validations` | int64 | `ledger.validate` | Number of validations received for this ledger | +| Attribute | Type | Set On | Description | +| --------------------------- | ------- | ------------------------------------------------------------- | ------------------------------------------------ | +| `ledger_seq` | int64 | `ledger.build`, `ledger.validate`, `ledger.store`, `tx.apply` | Ledger sequence number | +| `close_time_ripple_epoch_s` | int64 | `ledger.build` | Ledger close time (Ripple epoch seconds) | +| `close_time_correct` | boolean | `ledger.build` | Whether close time was agreed upon by validators | +| `close_resolution_ms` | int64 | `ledger.build` | Close time rounding granularity in milliseconds | +| `tx_count` | int64 | `ledger.build`, `tx.apply` | Transactions in the ledger | +| `tx_failed` | int64 | `ledger.build`, `tx.apply` | Failed transactions in the ledger | +| `validations` | int64 | `ledger.validate` | Number of validations received for this ledger | **Tempo query**: `{span.ledger_seq=12345}` to find all spans for a specific ledger. diff --git a/docs/telemetry-runbook.md b/docs/telemetry-runbook.md index 0b3e7222fd..a315cf40d8 100644 --- a/docs/telemetry-runbook.md +++ b/docs/telemetry-runbook.md @@ -172,11 +172,11 @@ hash); `tx.preflight` is stateless and omits both. ### Ledger Spans -| Span Name | Source File | Attributes | Description | -| ----------------- | ---------------- | ----------------------------------------------------------------------- | ----------------------------- | -| `ledger.build` | BuildLedger.cpp | `ledger_seq`, `close_time`, `close_time_correct`, `close_resolution_ms` | Ledger build during consensus | -| `ledger.validate` | LedgerMaster.cpp | `ledger_seq`, `validations` | Ledger promoted to validated | -| `ledger.store` | LedgerMaster.cpp | `ledger_seq` | Ledger stored in history | +| Span Name | Source File | Attributes | Description | +| ----------------- | ---------------- | -------------------------------------------------------------------------------------- | ----------------------------- | +| `ledger.build` | BuildLedger.cpp | `ledger_seq`, `close_time_ripple_epoch_s`, `close_time_correct`, `close_resolution_ms` | Ledger build during consensus | +| `ledger.validate` | LedgerMaster.cpp | `ledger_seq`, `validations` | Ledger promoted to validated | +| `ledger.store` | LedgerMaster.cpp | `ledger_seq` | Ledger stored in history | ### Peer Spans