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