1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-09 10:00:57 +03:00
Files
mvfst/quic/logging/QLogger.h
Joseph Beshay a73eade468 Add more fields to Qlog Transport Summary to track spurious retransmissions
Summary:
Add three new fields to the qlog transport summary to help analyze spurious transmissions and how they are affected by using adaptive loss thresholds.

Sample transport summary with added fields:
```
          "transport_summary",
          {
            "current_conn_flow_control": 1068498609,
            "current_writable_bytes": 106330,
            "dsr_packet_count": 0,
            "final_packet_loss_reordering_threshold": 77,
            "final_packet_loss_time_reordering_threshold_dividend": 29,
            "quic_version": 4207849474,
            "sum_cur_stream_buffer_len": 0,
            "sum_cur_write_offset": 5243215,
            "sum_max_observed_offset": 67,
            "total_bytes_cloned": 0,
            "total_bytes_recvd": 38157,
            "total_bytes_retransmitted": 244982,
            "total_bytes_sent": 5605121,
            "total_crypto_data_recvd": 342,
            "total_crypto_data_written": 1548,
            "total_packets_spuriously_marked_lost": 203,
            "total_stream_bytes_cloned": 0,
            "used_zero_rtt": false
          }
```

Reviewed By: afrind, mjoras

Differential Revision: D33354583

fbshipit-source-id: 55d9880ef02f6914b74c1b6508863bea7807950b
2022-01-07 18:42:12 -08:00

145 lines
4.8 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
#pragma once
#include <quic/codec/QuicConnectionId.h>
#include <quic/codec/Types.h>
#include <quic/logging/QLoggerConstants.h>
namespace quic {
struct PacingObserver {
PacingObserver() = default;
virtual ~PacingObserver() = default;
virtual void onNewPacingRate(
uint64_t packetsPerInterval,
std::chrono::microseconds interval) = 0;
virtual void onPacketSent() = 0;
};
class QLogger {
public:
explicit QLogger(VantagePoint vantagePointIn, std::string protocolTypeIn)
: vantagePoint(vantagePointIn), protocolType(std::move(protocolTypeIn)) {}
folly::Optional<ConnectionId> dcid;
folly::Optional<ConnectionId> scid;
VantagePoint vantagePoint;
std::string protocolType;
QLogger() = delete;
virtual ~QLogger() = default;
virtual void addPacket(
const RegularQuicPacket& regularPacket,
uint64_t packetSize) = 0;
virtual void addPacket(
const VersionNegotiationPacket& versionPacket,
uint64_t packetSize,
bool isPacketRecvd) = 0;
virtual void addPacket(
const RegularQuicWritePacket& writePacket,
uint64_t packetSize) = 0;
virtual void addPacket(
const RetryPacket& retryPacket,
uint64_t packetSize,
bool isPacketRecvd) = 0;
virtual void addConnectionClose(
std::string error,
std::string reason,
bool drainConnection,
bool sendCloseImmediately) = 0;
struct TransportSummaryArgs {
uint64_t totalBytesSent{};
uint64_t totalBytesRecvd{};
uint64_t sumCurWriteOffset{};
uint64_t sumMaxObservedOffset{};
uint64_t sumCurStreamBufferLen{};
uint64_t totalBytesRetransmitted{};
uint64_t totalStreamBytesCloned{};
uint64_t totalBytesCloned{};
uint64_t totalCryptoDataWritten{};
uint64_t totalCryptoDataRecvd{};
uint64_t currentWritableBytes{};
uint64_t currentConnFlowControl{};
uint64_t totalPacketsSpuriouslyMarkedLost{};
uint64_t finalPacketLossReorderingThreshold{};
uint64_t finalPacketLossTimeReorderingThreshDividend{};
bool usedZeroRtt{};
QuicVersion quicVersion{QuicVersion::MVFST_INVALID};
uint64_t dsrPacketCount{};
};
virtual void addTransportSummary(const TransportSummaryArgs& args) = 0;
virtual void addCongestionMetricUpdate(
uint64_t bytesInFlight,
uint64_t currentCwnd,
std::string congestionEvent,
std::string state = "",
std::string recoveryState = "") = 0;
virtual void addBandwidthEstUpdate(
uint64_t bytes,
std::chrono::microseconds interval) = 0;
virtual void addAppLimitedUpdate() = 0;
virtual void addAppUnlimitedUpdate() = 0;
virtual void addPacingMetricUpdate(
uint64_t pacingBurstSizeIn,
std::chrono::microseconds pacingIntervalIn) = 0;
virtual void addPacingObservation(
std::string actual,
std::string expected,
std::string conclusion) = 0;
virtual void addAppIdleUpdate(std::string idleEvent, bool idle) = 0;
virtual void addPacketDrop(size_t packetSize, std::string dropReasonIn) = 0;
virtual void addDatagramReceived(uint64_t dataLen) = 0;
virtual void addLossAlarm(
PacketNum largestSent,
uint64_t alarmCount,
uint64_t outstandingPackets,
std::string type) = 0;
virtual void addPacketsLost(
PacketNum largestLostPacketNum,
uint64_t lostBytes,
uint64_t lostPackets) = 0;
virtual void addTransportStateUpdate(std::string update) = 0;
virtual void addPacketBuffered(
ProtectionType protectionType,
uint64_t packetSize) = 0;
virtual void addMetricUpdate(
std::chrono::microseconds latestRtt,
std::chrono::microseconds mrtt,
std::chrono::microseconds srtt,
std::chrono::microseconds ackDelay) = 0;
virtual void addStreamStateUpdate(
quic::StreamId streamId,
std::string update,
folly::Optional<std::chrono::milliseconds> timeSinceStreamCreation) = 0;
virtual void addConnectionMigrationUpdate(bool intentionalMigration) = 0;
virtual void addPathValidationEvent(bool success) = 0;
virtual void addPriorityUpdate(
quic::StreamId streamId,
uint8_t urgency,
bool incremental) = 0;
virtual void setDcid(folly::Optional<ConnectionId> connID) = 0;
virtual void setScid(folly::Optional<ConnectionId> connID) = 0;
};
std::string getFlowControlEvent(int offset);
std::string
getRxStreamWU(StreamId streamId, PacketNum packetNum, uint64_t maximumData);
std::string getRxConnWU(PacketNum packetNum, uint64_t maximumData);
std::string getPeerClose(const std::string& errMsg);
std::string getFlowControlWindowAvailable(uint64_t windowAvailable);
std::string getClosingStream(const std::string& streamId);
} // namespace quic