From 5f74df10b64d69a2ac79f53545498b96d6299a27 Mon Sep 17 00:00:00 2001 From: Riten Gupta Date: Mon, 26 Aug 2024 14:07:23 -0700 Subject: [PATCH] Add network path model update events to qlog Summary: Several "Network Path Model" parameters are described in Sec. 2.9 of the BBRv2 IETF draft. These quantities evolve throughout the connection and they are useful to analyze BBRv2 performance. This diff adds inflight_hi, inflight_lo, bandwidth_hi, and bandwidth_lo to the qlog. Reviewed By: mjoras Differential Revision: D61414936 fbshipit-source-id: 2862db2a6aab336fd8a60e4ae5b358e9ab5588b4 --- quic/congestion_control/Bbr2.cpp | 9 ++++++++ quic/logging/FileQLogger.cpp | 19 +++++++++++++++++ quic/logging/FileQLogger.h | 8 ++++++- quic/logging/QLogger.h | 8 ++++++- quic/logging/QLoggerTypes.cpp | 36 ++++++++++++++++++++++++++++++++ quic/logging/QLoggerTypes.h | 25 +++++++++++++++++++++- quic/logging/test/Mocks.h | 9 ++++++++ 7 files changed, 111 insertions(+), 3 deletions(-) diff --git a/quic/congestion_control/Bbr2.cpp b/quic/congestion_control/Bbr2.cpp index ab18e5c7c..473e5b83c 100644 --- a/quic/congestion_control/Bbr2.cpp +++ b/quic/congestion_control/Bbr2.cpp @@ -106,6 +106,15 @@ void Bbr2CongestionController::onPacketAckOrLoss( getCongestionWindow(), kCongestionPacketAck, bbr2StateToString(state_)); + conn_.qLogger->addNetworkPathModelUpdate( + inflightHi_.value_or(0), + inflightLo_.value_or(0), + bandwidthHi_.has_value() ? bandwidthHi_->units : 0, + bandwidthHi_.has_value() ? bandwidthHi_->interval + : std::chrono::microseconds(1), + bandwidthLo_.has_value() ? bandwidthLo_->units : 0, + bandwidthLo_.has_value() ? bandwidthLo_->interval + : std::chrono::microseconds(1)); } if (ackEvent) { subtractAndCheckUnderflow( diff --git a/quic/logging/FileQLogger.cpp b/quic/logging/FileQLogger.cpp index f41349f6f..03339a122 100644 --- a/quic/logging/FileQLogger.cpp +++ b/quic/logging/FileQLogger.cpp @@ -509,6 +509,25 @@ void FileQLogger::addL4sWeightUpdate( l4sWeight, newEct1, newCe, refTime)); } +void FileQLogger::addNetworkPathModelUpdate( + uint64_t inflightHi, + uint64_t inflightLo, + uint64_t bandwidthHiBytes, + std::chrono::microseconds bandwidthHiInterval, + uint64_t bandwidthLoBytes, + std::chrono::microseconds bandwidthLoInterval) { + auto refTime = std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()); + handleEvent(std::make_unique( + inflightHi, + inflightLo, + bandwidthHiBytes, + bandwidthHiInterval, + bandwidthLoBytes, + bandwidthLoInterval, + refTime)); +} + void FileQLogger::outputLogsToFile(const std::string& path, bool prettyJson) { if (streaming_) { return; diff --git a/quic/logging/FileQLogger.h b/quic/logging/FileQLogger.h index c00d00d80..79761372b 100644 --- a/quic/logging/FileQLogger.h +++ b/quic/logging/FileQLogger.h @@ -113,7 +113,13 @@ class FileQLogger : public BaseQLogger { bool incremental) override; void addL4sWeightUpdate(double l4sWeight, uint32_t newEct1, uint32_t newCe) override; - + void addNetworkPathModelUpdate( + uint64_t inflightHi, + uint64_t inflightLo, + uint64_t bandwidthHiBytes, + std::chrono::microseconds bandwidthHiInterval, + uint64_t bandwidthLoBytes, + std::chrono::microseconds bandwidthLoInterval) override; void outputLogsToFile(const std::string& path, bool prettyJson); folly::dynamic toDynamic() const; folly::dynamic toDynamicBase() const; diff --git a/quic/logging/QLogger.h b/quic/logging/QLogger.h index 9ba88d750..17476ec92 100644 --- a/quic/logging/QLogger.h +++ b/quic/logging/QLogger.h @@ -124,7 +124,13 @@ class QLogger { bool incremental) = 0; virtual void addL4sWeightUpdate(double l4sWeight, uint32_t newEct1, uint32_t newCe) = 0; - + virtual void addNetworkPathModelUpdate( + uint64_t inflightHi, + uint64_t inflightLo, + uint64_t bandwidthHiBytes, + std::chrono::microseconds bandwidthHiInterval, + uint64_t bandwidthLoBytes, + std::chrono::microseconds bandwidthLoInterval) = 0; virtual void setDcid(Optional connID) = 0; virtual void setScid(Optional connID) = 0; }; diff --git a/quic/logging/QLoggerTypes.cpp b/quic/logging/QLoggerTypes.cpp index afcef421d..626b0bfc6 100644 --- a/quic/logging/QLoggerTypes.cpp +++ b/quic/logging/QLoggerTypes.cpp @@ -982,6 +982,40 @@ folly::dynamic QLogL4sWeightUpdateEvent::toDynamic() const { return d; } +QLogNetworkPathModelUpdateEvent::QLogNetworkPathModelUpdateEvent( + uint64_t inflightHi, + uint64_t inflightLo, + uint64_t bandwidthHiBytes, + std::chrono::microseconds bandwidthHiInterval, + uint64_t bandwidthLoBytes, + std::chrono::microseconds bandwidthLoInterval, + std::chrono::microseconds refTimeIn) + : inflightHi_(inflightHi), + inflightLo_(inflightLo), + bandwidthHiBytes_(bandwidthHiBytes), + bandwidthHiInterval_(bandwidthHiInterval), + bandwidthLoBytes_(bandwidthLoBytes), + bandwidthLoInterval_(bandwidthLoInterval) { + eventType = QLogEventType::NetworkPathModelUpdate; + refTime = refTimeIn; +} + +folly::dynamic QLogNetworkPathModelUpdateEvent::toDynamic() const { + folly::dynamic d = folly::dynamic::array( + folly::to(refTime.count()), + "metric_update", + toString(eventType)); + folly::dynamic data = folly::dynamic::object(); + data["inflight_hi"] = inflightHi_; + data["inflight_lo"] = inflightLo_; + data["bandwidth_hi_bytes"] = bandwidthHiBytes_; + data["bandwidth_hi_interval"] = bandwidthHiInterval_.count(); + data["bandwidth_lo_bytes"] = bandwidthLoBytes_; + data["bandwidth_lo_interval"] = bandwidthLoInterval_.count(); + d.push_back(std::move(data)); + return d; +} + folly::StringPiece toString(QLogEventType type) { switch (type) { case QLogEventType::PacketSent: @@ -1030,6 +1064,8 @@ folly::StringPiece toString(QLogEventType type) { return "priority"; case QLogEventType::L4sWeightUpdate: return "l4s_weight_update"; + case QLogEventType::NetworkPathModelUpdate: + return "network_path_model_update"; } folly::assume_unreachable(); } diff --git a/quic/logging/QLoggerTypes.h b/quic/logging/QLoggerTypes.h index 647f7e871..d380d2ff3 100644 --- a/quic/logging/QLoggerTypes.h +++ b/quic/logging/QLoggerTypes.h @@ -395,7 +395,8 @@ enum class QLogEventType : uint32_t { ConnectionMigration, PathValidation, PriorityUpdate, - L4sWeightUpdate + L4sWeightUpdate, + NetworkPathModelUpdate }; folly::StringPiece toString(QLogEventType type); @@ -778,4 +779,26 @@ class QLogL4sWeightUpdateEvent : public QLogEvent { uint32_t newCEEchoed_; }; +class QLogNetworkPathModelUpdateEvent : public QLogEvent { + public: + explicit QLogNetworkPathModelUpdateEvent( + uint64_t inflightHi, + uint64_t inflightLo, + uint64_t bandwidthHiBytes, + std::chrono::microseconds bandwidthHiInterval, + uint64_t bandwidthLoBytes, + std::chrono::microseconds bandwidthLoInterval, + std::chrono::microseconds refTimeIn); + ~QLogNetworkPathModelUpdateEvent() override = default; + + FOLLY_NODISCARD folly::dynamic toDynamic() const override; + + uint64_t inflightHi_; + uint64_t inflightLo_; + uint64_t bandwidthHiBytes_; + std::chrono::microseconds bandwidthHiInterval_; + uint64_t bandwidthLoBytes_; + std::chrono::microseconds bandwidthLoInterval_; +}; + } // namespace quic diff --git a/quic/logging/test/Mocks.h b/quic/logging/test/Mocks.h index f2eb3c7f9..70b5a9197 100644 --- a/quic/logging/test/Mocks.h +++ b/quic/logging/test/Mocks.h @@ -70,5 +70,14 @@ class MockQLogger : public QLogger { void, addL4sWeightUpdate, (double l4sWeight, uint32_t newEct1, uint32_t newCe)); + MOCK_METHOD( + void, + addNetworkPathModelUpdate, + (uint64_t inflightHi, + uint64_t inflightLo, + uint64_t bandwidthHiBytes, + std::chrono::microseconds bandwidthHiInterval, + uint64_t bandwidthLoBytes, + std::chrono::microseconds bandwidthLoInterval)); }; } // namespace quic::test