From 9376aa7c8808fe165dde270936bed4a652ef1b02 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Thu, 4 Jun 2026 16:14:33 +0100 Subject: [PATCH] feat(telemetry): add reduce-relay efficiency gauge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The transaction reduce-relay subsystem (selected vs suppressed peers, feature-disabled peers, missing-tx frequency) was computed in OverlayImpl's TxMetrics but only surfaced via the get_counts JSON RPC — invisible to Prometheus/Grafana, despite being the central efficiency KPI for the feature. Add an observable gauge xrpld_reduce_relay_metrics{metric} that reads Overlay::txMetrics() and parses its rolling-average fields: - selected_peers (txr_selected_cnt) - suppressed_peers (txr_suppressed_cnt) - not_enabled_peers (txr_not_enabled_cnt) - missing_tx_freq (txr_missing_tx_freq) The JSON values are decimal strings (std::to_string), parsed via std::stoll — the same JSON-reading pattern as registerNodeStoreGauge. No new Overlay accessor or core-interface change required. Co-Authored-By: Claude Opus 4.8 --- src/xrpld/telemetry/MetricsRegistry.cpp | 52 +++++++++++++++++++++++++ src/xrpld/telemetry/MetricsRegistry.h | 6 +++ 2 files changed, 58 insertions(+) diff --git a/src/xrpld/telemetry/MetricsRegistry.cpp b/src/xrpld/telemetry/MetricsRegistry.cpp index ea3553f12d..8ca0c15889 100644 --- a/src/xrpld/telemetry/MetricsRegistry.cpp +++ b/src/xrpld/telemetry/MetricsRegistry.cpp @@ -436,6 +436,7 @@ MetricsRegistry::registerAsyncGauges() registerDbMetricsGauge(); registerValidatorHealthGauge(); registerPeerQualityGauge(); + registerReduceRelayGauge(); registerLedgerEconomyGauge(); registerStateTrackingGauge(); registerStorageDetailGauge(); @@ -1072,6 +1073,57 @@ MetricsRegistry::registerPeerQualityGauge() this); } +void +MetricsRegistry::registerReduceRelayGauge() +{ + // Transaction reduce-relay efficiency. Overlay::txMetrics() exposes the + // rolling averages as a JSON object with string values (std::to_string), + // so parse each field. A high suppressed:selected ratio proves the + // feature is saving bandwidth; a high not_enabled count means stale peers + // force full relay. + reduceRelayGauge_ = meter_->CreateInt64ObservableGauge( + "xrpld_reduce_relay_metrics", "Transaction reduce-relay efficiency metrics"); + reduceRelayGauge_->AddCallback( + [](opentelemetry::metrics::ObserverResult result, void* state) { + auto* self = static_cast(state); + if (self->callbacksDetached_.load(std::memory_order_acquire)) + return; + auto& app = self->app_; + + try + { + auto const tm = app.getOverlay().txMetrics(); + + auto observe = [&](char const* name, int64_t value) { + opentelemetry::nostd::get>>(result) + ->Observe(value, {{"metric", name}}); + }; + + // Each field is a decimal string; emit when present and parseable. + auto observeField = [&](auto const& field, char const* name) { + if (tm.isMember(field)) + { + auto const s = tm[field].asString(); + if (!s.empty()) + observe(name, static_cast(std::stoll(s))); + } + }; + + observeField(jss::txr_selected_cnt, "selected_peers"); + observeField(jss::txr_suppressed_cnt, "suppressed_peers"); + observeField(jss::txr_not_enabled_cnt, "not_enabled_peers"); + observeField(jss::txr_missing_tx_freq, "missing_tx_freq"); + } + catch (...) // NOLINT(bugprone-empty-catch) + { + // Silently skip if services are not yet ready or a value is + // not parseable. + } + }, + this); +} + void MetricsRegistry::registerLedgerEconomyGauge() { diff --git a/src/xrpld/telemetry/MetricsRegistry.h b/src/xrpld/telemetry/MetricsRegistry.h index be623e4c53..a16b77de3d 100644 --- a/src/xrpld/telemetry/MetricsRegistry.h +++ b/src/xrpld/telemetry/MetricsRegistry.h @@ -478,6 +478,10 @@ private: /// insane peer count, version spread, upgrade recommendation). opentelemetry::nostd::shared_ptr peerQualityGauge_; + /// Observable gauge for transaction reduce-relay efficiency (selected vs + /// suppressed peers, feature-disabled peers, missing-tx frequency). + opentelemetry::nostd::shared_ptr + reduceRelayGauge_; /// Observable gauge for ledger economy metrics (base fee, reserve, /// reserve increment, ledger age). opentelemetry::nostd::shared_ptr @@ -563,6 +567,8 @@ private: void registerPeerQualityGauge(); // Task 7.10 void + registerReduceRelayGauge(); // Reduce-relay efficiency + void registerLedgerEconomyGauge(); // Task 7.11 void registerStateTrackingGauge(); // Task 7.12