From d3955d363943183a048c54d9cae0d533e4bfc00e Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Thu, 4 Jun 2026 15:53:53 +0100 Subject: [PATCH] fix(telemetry): emit real diverged-peer count for peers_insane_count MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The xrpld_peer_quality{metric="peers_insane_count"} gauge was hardcoded to 0.0 with a TODO, leaving the "Insane/Diverged Peers" panel permanently empty. PeerImp::json() already exposes the peer's tracking state via the "track" field (set to "diverged" when tracking_ == Tracking::Diverged). The peer-quality callback already iterates peer->json() for latency and version, so count peers whose "track" field equals "diverged" in the same loop — no change to the abstract Peer interface required. Co-Authored-By: Claude Opus 4.8 --- src/xrpld/telemetry/MetricsRegistry.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/xrpld/telemetry/MetricsRegistry.cpp b/src/xrpld/telemetry/MetricsRegistry.cpp index 79e76ea737..b7f30b6004 100644 --- a/src/xrpld/telemetry/MetricsRegistry.cpp +++ b/src/xrpld/telemetry/MetricsRegistry.cpp @@ -1000,10 +1000,12 @@ MetricsRegistry::registerPeerQualityGauge() ->Observe(value, {{"metric", name}}); }; - // Collect latencies and version info from each peer's JSON. + // Collect latencies, version info, and tracking state from + // each peer's JSON. std::vector latencies; int higherVersionCount = 0; int totalPeers = 0; + int divergedCount = 0; auto const ownVersion = std::string(BuildInfo::getVersionString()); app.getOverlay().foreach([&](std::shared_ptr const& peer) { @@ -1019,6 +1021,11 @@ MetricsRegistry::registerPeerQualityGauge() if (!pv.empty() && pv > ownVersion) ++higherVersionCount; } + // PeerImp::json() sets "track" to "diverged" when the peer's + // tracking state is Tracking::Diverged (i.e. it is following + // a different ledger chain than us). + if (pj.isMember(jss::track) && pj[jss::track].asString() == "diverged") + ++divergedCount; }); // P90 latency across connected peers. @@ -1041,13 +1048,11 @@ MetricsRegistry::registerPeerQualityGauge() : 0.0; observe("peers_higher_version_pct", higherPct); - // Count peers that are insane/diverged (tracking == - // Tracking::diverged). Not directly available from the Peer - // interface, so we count peers with negative or zero latency - // as a proxy for unreachable/diverged state. - // TODO: expose PeerImp::tracking_ via the Peer interface for - // a precise count. - observe("peers_insane_count", 0.0); + // Count peers diverged from our ledger chain, read from the + // peer's "track" JSON field (set by PeerImp::json()). Diverged + // peers are following a different chain and are a leading + // indicator of local sync trouble. + observe("peers_insane_count", static_cast(divergedCount)); // Binary flag: recommend upgrade if >60% run a newer version. observe("upgrade_recommended", higherPct > 60.0 ? 1.0 : 0.0);