mirror of
https://github.com/XRPLF/rippled.git
synced 2026-07-23 15:10:34 +00:00
P95 of second-scale spans was a meaningless interpolation. The spanmetrics histogram topped out at [.. 1s, 5s], so consensus.round (~3.9s) and consensus.establish (~1.9s) all fell into one 1s-5s bucket and histogram_quantile interpolated linearly across that 4s-wide gap — the "Build vs Close" / "Ledger Close Duration" panels' P95 read ~4800ms purely as an artifact (verified: sum/count avg = 3824ms). ledger.acquire was worse: ~17% of samples exceeded the 5s ceiling, so its p95/p99 were unmeasurable. Add 2s, 3s, 4s (resolve the 1-5s pile-up) and 10s, 30s (give the ledger.acquire catch-up tail a measurable home). All ten existing boundaries are preserved and the list stays strictly ascending (the connector binary-searches buckets and silently misbuckets otherwise). Pin unit=ms so a future collector default-unit flip can't rename the metric to _seconds. Buckets chosen from the live mainnet distribution, not guessed. Native beast::insight histograms (ms-scale RPC/IO timers in Telemetry.cpp) are 100% under 5s, so they keep the original buckets — this is collector-only. Applies on collector restart (cumulative series reset once, handled by rate()). Runbook and regression-threshold bucket notes updated to match. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>