From fd0c19a36e9ddf0d2f6831f37e97ae3f100b6d8b Mon Sep 17 00:00:00 2001 From: Richard Holland Date: Fri, 29 Nov 2024 13:13:59 +1100 Subject: [PATCH] improved stats --- src/ripple/app/misc/DatagramMonitor.h | 99 +++++++++++++++------------ 1 file changed, 56 insertions(+), 43 deletions(-) diff --git a/src/ripple/app/misc/DatagramMonitor.h b/src/ripple/app/misc/DatagramMonitor.h index 13d627c75..54417bbbb 100644 --- a/src/ripple/app/misc/DatagramMonitor.h +++ b/src/ripple/app/misc/DatagramMonitor.h @@ -33,7 +33,7 @@ constexpr uint32_t WARNING_AMENDMENT_WARNED = 1 << 2; constexpr uint32_t WARNING_NOT_SYNCED = 1 << 3; // Time window statistics for rates -struct RateStats +struct MetricRates { double rate_1m; // Average rate over last minute double rate_5m; // Average rate over last 5 minutes @@ -41,6 +41,14 @@ struct RateStats double rate_24h; // Average rate over last 24 hours }; +struct AllRates +{ + MetricRates network_in; + MetricRates network_out; + MetricRates disk_read; + MetricRates disk_write; +}; + // Structure to represent a ledger sequence range struct LgrRange { @@ -92,10 +100,10 @@ struct ServerInfoHeader { // Network and disk rates struct { - RateStats network_in; - RateStats network_out; - RateStats disk_read; - RateStats disk_write; + MetricRates network_in; + MetricRates network_out; + MetricRates disk_read; + MetricRates disk_write; } rates; }; @@ -124,40 +132,45 @@ private: size_t index_1m{0}, index_5m{0}, index_1h{0}, index_24h{0}; std::chrono::system_clock::time_point last_24h_sample{}; - RateStats - calculateRates( + + double + calculateRate( const SystemMetrics& current, const std::vector& samples, size_t window_size, - double time_period_seconds) + double time_period_seconds, + std::function metric_getter) { - RateStats stats{0.0, 0.0, 0.0, 0.0}; if (window_size == 0) - return stats; + return 0.0; auto oldest = samples[window_size - 1]; - double elapsed = (current.timestamp - oldest.timestamp) / - 1000000.0; // Convert microseconds to seconds + double elapsed = (current.timestamp - oldest.timestamp) / 1000000.0; // Convert microseconds to seconds if (elapsed <= 0) - return stats; + return 0.0; - uint64_t net_in_diff = - current.network_bytes_in - oldest.network_bytes_in; - uint64_t net_out_diff = - current.network_bytes_out - oldest.network_bytes_out; - uint64_t disk_read_diff = - current.disk_bytes_read - oldest.disk_bytes_read; - uint64_t disk_write_diff = - current.disk_bytes_written - oldest.disk_bytes_written; + uint64_t current_value = metric_getter(current); + uint64_t oldest_value = metric_getter(oldest); + uint64_t diff = current_value - oldest_value; - return { - static_cast(net_in_diff) / elapsed, - static_cast(net_out_diff) / elapsed, - static_cast(disk_read_diff) / elapsed, - static_cast(disk_write_diff) / elapsed}; + return static_cast(diff) / elapsed; } + MetricRates + calculateMetricRates( + const SystemMetrics& current, + std::function metric_getter) + { + MetricRates rates; + rates.rate_1m = calculateRate(current, samples_1m, std::min(index_1m, SAMPLES_1M), 60, metric_getter); + rates.rate_5m = calculateRate(current, samples_5m, std::min(index_5m, SAMPLES_5M), 300, metric_getter); + rates.rate_1h = calculateRate(current, samples_1h, std::min(index_1h, SAMPLES_1H), 3600, metric_getter); + rates.rate_24h = calculateRate(current, samples_24h, std::min(index_24h, SAMPLES_24H), 86400, metric_getter); + return rates; + } + public: + void addSample(const SystemMetrics& metrics) { @@ -180,19 +193,20 @@ public: } } - std::tuple + AllRates getRates(const SystemMetrics& current) { - return { - calculateRates( - current, samples_1m, std::min(index_1m, SAMPLES_1M), 60), - calculateRates( - current, samples_5m, std::min(index_5m, SAMPLES_5M), 300), - calculateRates( - current, samples_1h, std::min(index_1h, SAMPLES_1H), 3600), - calculateRates( - current, samples_24h, std::min(index_24h, SAMPLES_24H), 86400)}; - } + AllRates rates; + rates.network_in = calculateMetricRates(current, + [](const SystemMetrics& m) { return m.network_bytes_in; }); + rates.network_out = calculateMetricRates(current, + [](const SystemMetrics& m) { return m.network_bytes_out; }); + rates.disk_read = calculateMetricRates(current, + [](const SystemMetrics& m) { return m.disk_bytes_read; }); + rates.disk_write = calculateMetricRates(current, + [](const SystemMetrics& m) { return m.disk_bytes_written; }); + return rates; + } }; class DatagramMonitor @@ -475,12 +489,11 @@ private: } // Get rate statistics - auto [rates_1m, rates_5m, rates_1h, rates_24h] = - metrics_tracker_.getRates(currentMetrics); - header->rates.network_in = rates_1m; - header->rates.network_out = rates_5m; - header->rates.disk_read = rates_1h; - header->rates.disk_write = rates_24h; + auto rates = metrics_tracker_.getRates(currentMetrics); + header->rates.network_in = rates.network_in; + header->rates.network_out = rates.network_out; + header->rates.disk_read = rates.disk_read; + header->rates.disk_write = rates.disk_write; // Pack ledger info and ranges auto lpClosed = ledgerMaster.getValidatedLedger();