Skip to content
Draft
Show file tree
Hide file tree
Changes from 54 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
96914b9
feat(telemetry): scaffold fresh-node sync diagnostics (WP-A0)
pratikmankawde Jul 24, 2026
7568457
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 25, 2026
188de0a
feat(telemetry): add pre-quorum bootstrap sync diagnostics (WP-A1)
pratikmankawde Jul 25, 2026
18106e1
fix(telemetry): correct handshake throw and quorum sentinel (WP-A1)
pratikmankawde Jul 25, 2026
7c7509d
feat(telemetry): add sync-state diagnostics (WP-A2)
pratikmankawde Jul 25, 2026
3e2a1ea
feat(telemetry): add ledger-acquire and SHAMap fetch diagnostics (WP-A3)
pratikmankawde Jul 25, 2026
4115617
feat(telemetry): add job-queue occupancy and saturation gauges (WP-A4)
pratikmankawde Jul 25, 2026
e99370d
feat(telemetry): add peer-supply, serve and amendment diagnostics (WP…
pratikmankawde Jul 25, 2026
dd2fed2
feat(telemetry): add quorum, publish and back-fill diagnostics (WP-A5…
pratikmankawde Jul 25, 2026
c0f223e
fix(telemetry): always finalize the ledger.acquire span (WP-B1)
pratikmankawde Jul 25, 2026
827525c
feat(telemetry): wire A5-A7 and B1 signals through the pipeline
pratikmankawde Jul 25, 2026
92729ba
feat(telemetry): render, assert and document the quorum signals (WP-A5)
pratikmankawde Jul 25, 2026
ce7e119
feat(telemetry): add tx-set, acquire-phase, dial and serve spans (WP-B2)
pratikmankawde Jul 25, 2026
41b818b
feat(telemetry): join a ledger's spans into one trace, add round hist…
pratikmankawde Jul 25, 2026
0aa7652
feat(telemetry): join ledger.acquire into the per-ledger trace
pratikmankawde Jul 25, 2026
22fd5e8
feat(telemetry): make the sync board readable, and time real node wri…
pratikmankawde Jul 27, 2026
295ee1a
refactor(telemetry): name metrics with constants, and make CI require…
pratikmankawde Jul 27, 2026
c5655cd
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 27, 2026
c000417
test(telemetry): fix three assertions the first real test run exposed
pratikmankawde Jul 27, 2026
c9b90ec
test(nodestore): assert store() times itself, now that it does
pratikmankawde Jul 27, 2026
371f109
fix(telemetry): correct five signals that would have misled an operator
pratikmankawde Jul 27, 2026
8633df7
feat(telemetry): expose the sweep-trim and rotation costs (WP-B5)
pratikmankawde Jul 27, 2026
2d36baf
fix: clear the clang-tidy errors CI reported on this branch
pratikmankawde Jul 27, 2026
445e20f
fix(test): assert the derived mean is positive, not unsigned >= 0
pratikmankawde Jul 27, 2026
6bfc25d
fix(test): brace assertion bodies gcc reads as a dangling else
pratikmankawde Jul 27, 2026
a050e0f
fix(json): add missing iterator traits to Value iterators
pratikmankawde Jul 24, 2026
1b4ef56
test(json): drop redundant iterator_traits test
pratikmankawde Jul 24, 2026
8fe6645
fix(telemetry): label mode-transition series with both ends of the edge
pratikmankawde Jul 27, 2026
c7cacfb
fix(telemetry): plot peer supply window as margins, not absolute sequ…
pratikmankawde Jul 27, 2026
b0b02a5
fix(telemetry): repair broken acquire-outcome query and stat-panel le…
pratikmankawde Jul 27, 2026
d13f2fe
fix(telemetry): show discrete sync events as counts, not per-second r…
pratikmankawde Jul 27, 2026
96ccbad
fix(telemetry): finish the count conversion and split panel 66's two …
pratikmankawde Jul 28, 2026
70ae3ff
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
05f337c
fix(tests): follow ConsensusSpanNames.h to its libxrpl location
pratikmankawde Jul 28, 2026
c4e434d
refactor(telemetry): retire the duplicate nodestore_latency gauge
pratikmankawde Jul 28, 2026
36e8cf1
fix(peerfinder): include the header that declares SlotCensus
pratikmankawde Jul 28, 2026
7551d57
fix(telemetry): apply the panel-audit findings on ledger-sync-health
pratikmankawde Jul 28, 2026
206d362
fix(telemetry): repair the remaining audited panel defects
pratikmankawde Jul 28, 2026
fddf785
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
df01ba5
fix(ledger): stop the sweeper deleting acquires that are still being …
pratikmankawde Jul 28, 2026
d6ec23d
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
9f209db
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
da58bae
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
0ddb4e2
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
f649670
fix(telemetry): address the PR review findings
pratikmankawde Jul 28, 2026
b9497d0
fix(telemetry): correct the dial-outcome diagnosis and harden the sit…
pratikmankawde Jul 28, 2026
bbc5496
style(telemetry): satisfy clang-tidy on the fee table and registry in…
pratikmankawde Jul 28, 2026
85f4592
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
35e0c07
fix(telemetry): park the span panels in their own row, tighten the si…
pratikmankawde Jul 28, 2026
d5ed811
test(peerfinder): assert the slot census against real Logic state
pratikmankawde Jul 28, 2026
78411c6
fix(core): drop the unused Config forward declaration from HashRouter.h
pratikmankawde Jul 28, 2026
018ee55
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
0975ccd
Merge branch 'pratik/otel-phase9-metric-gap-fill' into pratik/otel-sy…
pratikmankawde Jul 28, 2026
6ac3726
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 28, 2026
2f31a74
fix(telemetry): record rejected validations, and use the label constants
pratikmankawde Jul 28, 2026
862051c
fix(telemetry): sync the Alloy spanmetrics dimensions with the collec…
pratikmankawde Jul 28, 2026
555be61
docs(telemetry): say in the Alloy env example what it cannot set
pratikmankawde Jul 28, 2026
de3c972
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 29, 2026
533568b
Merge branch 'pratik/otel-phase10-workload-validation' into pratik/ot…
pratikmankawde Jul 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .cspell.config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ dictionaries:
ignoreRegExpList:
- /\b[rs][1-9A-HJ-NP-Za-km-z]{25,34}/g # addresses and seeds
- /\bC[A-Z0-9]{15}/g # CTIDs
- /\bXRPL_METRIC_[A-Z_]+/g # telemetry macro names; the splitter emits subwords like ISTOGRAM
- /\b(XRPL|BEAST)_[A-Z_0-9]+_H_INCLUDED+/g # include guards
- /\b(XRPL|BEAST)_[A-Z_0-9]+_H+/g # include guards
- /::[a-z:_]+/g # things from other namespaces
Expand Down Expand Up @@ -351,6 +352,7 @@ words:
- txns
- txqueue
- txs
- txset
- ubsan
- UBSAN
- ufdio
Expand Down
2 changes: 1 addition & 1 deletion .github/scripts/levelization/results/loops.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ Loop: xrpld.overlay xrpld.rpc
xrpld.rpc ~= xrpld.overlay

Loop: xrpld.overlay xrpld.telemetry
xrpld.telemetry ~= xrpld.overlay
xrpld.overlay > xrpld.telemetry

2 changes: 2 additions & 0 deletions .github/scripts/levelization/results/ordering.txt
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ tests.libxrpl > xrpl.config
tests.libxrpl > xrpl.consensus
tests.libxrpl > xrpl.core
tests.libxrpl > xrpld.app
tests.libxrpl > xrpld.overlay
tests.libxrpl > xrpld.telemetry
tests.libxrpl > xrpl.json
tests.libxrpl > xrpl.ledger
Expand Down Expand Up @@ -334,6 +335,7 @@ xrpld.telemetry > xrpl.consensus
xrpld.telemetry > xrpl.core
xrpld.telemetry > xrpld.core
xrpld.telemetry > xrpl.json
xrpld.telemetry > xrpl.ledger
xrpld.telemetry > xrpl.nodestore
xrpld.telemetry > xrpl.protocol
xrpld.telemetry > xrpl.rdb
Expand Down
30 changes: 21 additions & 9 deletions .github/scripts/otel-naming/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,29 @@ hardcoded allowlist:
constants passed there (`xrpl.network.*`). A dotted key that is _declared_ in a
header but never set as a resource attr is a span attribute in resource
clothing — a Rule-A violation, even if it lives in the base `SpanNames.h`.
- **L1-metrics** — instrument names, label keys and bounded label values come
from the `namespace metric` / `namespace label` / `namespace lval` blocks of
every `*MetricNames.h`, read as `inline constexpr char NAME[] = "wire";`.
These headers deliberately do **not** use the `makeStr`/`StaticStr` DSL the
span headers use: the OTel C++ API takes `nostd::string_view`, which
constructs from `char const*` but has no constructor from
`std::string_view`, so a `StaticStr` will not compile in an instrument-name
or label-key position.

### Rules (each fails the build, when its inputs are present)

| Rule | Check |
| ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A | No stray dotted span-attribute key (only the derived resource keys may be dotted). |
| G | Attribute keys are `lower_snake_case` (`^[a-z][a-z0-9_]*$` per dot-segment) — no camelCase, UPPERCASE, or spaces. |
| F | No string literals as attribute keys or span-name arguments in `setAttribute`/`addEvent`/`span`/`rootSpan`/`childSpan` (`rootSpan` shares `span`'s `(cat, prefix, name)` signature). Attribute _values_ are exempt (runtime data); `*SpanNames.h` definitions and test files are exempt. |
| B | Every collector `spanmetrics.dimensions` name exists in the L1 key set. |
| C | Every Tempo span-filter tag exists in the L1 key set. |
| D | Every dashboard label resolves to an L1 span attribute, a native-metric label (L6, emitted by MetricsRegistry), or a Prometheus/Grafana builtin. TraceQL scope prefixes (`span.`/`resource.`/…) are stripped before the L1 lookup. |
| E | No dotted `xrpl.<domain>.<field>` attribute key in the runbook (only the L1 resource attrs `xrpl.network.*` may be dotted). Span names, filenames, OTel-standard keys, and metric labels are not flagged. |
| Rule | Check |
| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| A | No stray dotted span-attribute key (only the derived resource keys may be dotted). |
| G | Attribute keys are `lower_snake_case` (`^[a-z][a-z0-9_]*$` per dot-segment) — no camelCase, UPPERCASE, or spaces. |
| F | No string literals as attribute keys or span-name arguments in `setAttribute`/`addEvent`/`span`/`rootSpan`/`childSpan` (`rootSpan` shares `span`'s `(cat, prefix, name)` signature). Attribute _values_ are exempt (runtime data); `*SpanNames.h` definitions and test files are exempt. |
| B | Every collector `spanmetrics.dimensions` name exists in the L1 key set. |
| C | Every Tempo span-filter tag exists in the L1 key set. |
| D | Every dashboard label resolves to an L1 span attribute, a native-metric label (L6, emitted by MetricsRegistry), or a Prometheus/Grafana builtin. TraceQL scope prefixes (`span.`/`resource.`/…) are stripped before the L1 lookup. |
| E | No dotted `xrpl.<domain>.<field>` attribute key in the runbook (only the L1 resource attrs `xrpl.network.*` may be dotted). Span names, filenames, OTel-standard keys, and metric labels are not flagged. |
| I | No string literals as **metric** instrument names or label keys — the mirror of Rule F. Applies to the name passed to an `XRPL_METRIC_*` macro or a `meter->Create*` factory and to the label _keys_ in its label set. Label _values_, descriptions, `*MetricNames.h`, `MetricMacros.h` and test files are exempt. Scoped by metric **family** (first underscore segment): declaring a constant opts that family in, so the metric surface can be converted subsystem by subsystem. Unconverted families warn as Rule L. |
| J | Metric instrument names follow the suffix conventions: `lower_snake_case`, no `xrpld_`/`xrpl_` prefix (the exporter adds it), a counter ends `_total`, a histogram ends `_us`/`_ms`/`_seconds`, a gauge does not end `_total`. The instrument **kind** is read from the emit site, never guessed from words in the name — so a multi-series gauge carrying units in its label values (e.g. `nodestore_state` observing `write_mean_us`) is not a violation. A name created through two different factories is itself reported as a kind conflict, since no suffix can be correct for both. |
| K | Every metric named in `docker/telemetry/workload/expected_metrics.json` resolves to a declared constant, so a rename in code cannot leave the workload validator asserting a name nothing emits. PromQL selectors (`m{label="v"}`) and exporter-appended histogram suffixes (`_bucket`/`_count`/`_sum`) are normalized away first; groups fed by another emit path (`statsd_gauges`, `statsd_counters`, `spanmetrics`) are out of scope by design. |

Rule F runs **unconditionally** (it is a purely syntactic check on the
call-sites and needs no `*SpanNames.h`), so a code path that calls
Expand All @@ -58,6 +69,7 @@ still caught.
| Rule | Check |
| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| H | A namespace-qualified constant (e.g. `foo::bar::myKey`) used at a telemetry call-site is not defined in any `*SpanNames.h`. The constant should live in the proper header; defining it in-place bypasses rules A/G/F. Warns rather than fails — the argument may be a legitimately dynamic value, and the header may live on a later branch. Bare locals and `std::` names are not warned. |
| L | A literal metric name in a family that has no `*MetricNames.h` constants yet. Rule I's ratchet defers these instead of failing the build on the whole pre-existing metric surface at once; the warning keeps the outstanding conversion work visible rather than silently accepted. |

## Presence-gated

Expand Down
Loading
Loading