1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-09 10:00:57 +03:00
Files
mvfst/quic/logging/QLoggerTypes.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

716 lines
20 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 <folly/Portability.h>
#include <folly/dynamic.h>
#include <quic/codec/Types.h>
#include <quic/logging/QLoggerConstants.h>
#include <memory>
#include <string>
#include <vector>
namespace quic {
class QLogFrame {
public:
QLogFrame() = default;
virtual ~QLogFrame() = default;
virtual folly::dynamic toDynamic() const = 0;
};
class PaddingFrameLog : public QLogFrame {
public:
uint64_t numFrames;
explicit PaddingFrameLog(uint64_t numFramesIn) : numFrames{numFramesIn} {}
~PaddingFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class RstStreamFrameLog : public QLogFrame {
public:
StreamId streamId;
ApplicationErrorCode errorCode;
uint64_t offset;
RstStreamFrameLog(
StreamId streamIdIn,
ApplicationErrorCode errorCodeIn,
uint64_t offsetIn)
: streamId{streamIdIn}, errorCode{errorCodeIn}, offset{offsetIn} {}
~RstStreamFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class ConnectionCloseFrameLog : public QLogFrame {
public:
QuicErrorCode errorCode;
std::string reasonPhrase;
FrameType closingFrameType;
ConnectionCloseFrameLog(
QuicErrorCode errorCodeIn,
std::string reasonPhraseIn,
FrameType closingFrameTypeIn)
: errorCode{std::move(errorCodeIn)},
reasonPhrase{std::move(reasonPhraseIn)},
closingFrameType{closingFrameTypeIn} {}
~ConnectionCloseFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class MaxDataFrameLog : public QLogFrame {
public:
uint64_t maximumData;
explicit MaxDataFrameLog(uint64_t maximumDataIn)
: maximumData{maximumDataIn} {}
~MaxDataFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class MaxStreamDataFrameLog : public QLogFrame {
public:
StreamId streamId;
uint64_t maximumData;
MaxStreamDataFrameLog(StreamId streamIdIn, uint64_t maximumDataIn)
: streamId{streamIdIn}, maximumData{maximumDataIn} {}
~MaxStreamDataFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class MaxStreamsFrameLog : public QLogFrame {
public:
uint64_t maxStreams;
bool isForBidirectional;
MaxStreamsFrameLog(uint64_t maxStreamsIn, bool isForBidirectionalIn)
: maxStreams{maxStreamsIn}, isForBidirectional{isForBidirectionalIn} {}
~MaxStreamsFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class StreamsBlockedFrameLog : public QLogFrame {
public:
uint64_t streamLimit;
bool isForBidirectional;
StreamsBlockedFrameLog(uint64_t streamLimitIn, bool isForBidirectionalIn)
: streamLimit{streamLimitIn}, isForBidirectional{isForBidirectionalIn} {}
~StreamsBlockedFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class PingFrameLog : public QLogFrame {
public:
PingFrameLog() = default;
~PingFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class DataBlockedFrameLog : public QLogFrame {
public:
uint64_t dataLimit;
explicit DataBlockedFrameLog(uint64_t dataLimitIn) : dataLimit{dataLimitIn} {}
~DataBlockedFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class NewTokenFrameLog : public QLogFrame {
public:
std::string token;
explicit NewTokenFrameLog(std::string tokenIn) : token(std::move(tokenIn)) {}
~NewTokenFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class KnobFrameLog : public QLogFrame {
public:
uint64_t knobSpace;
uint64_t knobId;
size_t knobBlobLen;
explicit KnobFrameLog(
uint64_t knobSpaceIn,
uint64_t knobIdIn,
size_t knobBlobLenIn)
: knobSpace(knobSpaceIn), knobId(knobIdIn), knobBlobLen(knobBlobLenIn) {}
~KnobFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class AckFrequencyFrameLog : public QLogFrame {
public:
uint64_t sequenceNumber;
uint64_t packetTolerance;
uint64_t updateMaxAckDelay;
bool ignoreOrder;
explicit AckFrequencyFrameLog(
uint64_t sequenceNumberIn,
uint64_t packetToleranceIn,
uint64_t updateMaxAckDelayIn,
bool ignoreOrderIn)
: sequenceNumber(sequenceNumberIn),
packetTolerance(packetToleranceIn),
updateMaxAckDelay(updateMaxAckDelayIn),
ignoreOrder(ignoreOrderIn) {}
~AckFrequencyFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class StreamDataBlockedFrameLog : public QLogFrame {
public:
StreamId streamId;
uint64_t dataLimit;
StreamDataBlockedFrameLog(StreamId streamIdIn, uint64_t dataLimitIn)
: streamId{streamIdIn}, dataLimit{dataLimitIn} {}
~StreamDataBlockedFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class ReadAckFrameLog : public QLogFrame {
public:
ReadAckFrame::Vec ackBlocks;
std::chrono::microseconds ackDelay;
ReadAckFrameLog(
const ReadAckFrame::Vec& ackBlocksIn,
std::chrono::microseconds ackDelayIn)
: ackBlocks{ackBlocksIn}, ackDelay{ackDelayIn} {}
~ReadAckFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class WriteAckFrameLog : public QLogFrame {
public:
WriteAckFrame::AckBlockVec ackBlocks;
std::chrono::microseconds ackDelay;
WriteAckFrameLog(
const WriteAckFrame::AckBlockVec& ackBlocksIn,
std::chrono::microseconds ackDelayIn)
: ackBlocks{ackBlocksIn}, ackDelay{ackDelayIn} {}
~WriteAckFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class StreamFrameLog : public QLogFrame {
public:
StreamId streamId;
uint64_t offset;
uint64_t len;
bool fin;
StreamFrameLog(
StreamId streamIdIn,
uint64_t offsetIn,
uint64_t lenIn,
bool finIn)
: streamId{streamIdIn}, offset{offsetIn}, len{lenIn}, fin{finIn} {}
~StreamFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class CryptoFrameLog : public QLogFrame {
public:
uint64_t offset;
uint64_t len;
CryptoFrameLog(uint64_t offsetIn, uint64_t lenIn)
: offset{offsetIn}, len{lenIn} {}
~CryptoFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class StopSendingFrameLog : public QLogFrame {
public:
StreamId streamId;
ApplicationErrorCode errorCode;
StopSendingFrameLog(StreamId streamIdIn, ApplicationErrorCode errorCodeIn)
: streamId{streamIdIn}, errorCode{errorCodeIn} {}
~StopSendingFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class PathChallengeFrameLog : public QLogFrame {
public:
uint64_t pathData;
explicit PathChallengeFrameLog(uint64_t pathDataIn) : pathData{pathDataIn} {}
~PathChallengeFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class PathResponseFrameLog : public QLogFrame {
public:
uint64_t pathData;
explicit PathResponseFrameLog(uint64_t pathDataIn) : pathData{pathDataIn} {}
~PathResponseFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class NewConnectionIdFrameLog : public QLogFrame {
public:
uint16_t sequence;
StatelessResetToken token;
NewConnectionIdFrameLog(uint16_t sequenceIn, StatelessResetToken tokenIn)
: sequence{sequenceIn}, token{tokenIn} {}
~NewConnectionIdFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class RetireConnectionIdFrameLog : public QLogFrame {
public:
uint64_t sequence;
RetireConnectionIdFrameLog(uint64_t sequenceIn) : sequence(sequenceIn) {}
~RetireConnectionIdFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class ReadNewTokenFrameLog : public QLogFrame {
public:
ReadNewTokenFrameLog() = default;
~ReadNewTokenFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class HandshakeDoneFrameLog : public QLogFrame {
public:
HandshakeDoneFrameLog() = default;
~HandshakeDoneFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class DatagramFrameLog : public QLogFrame {
public:
uint64_t len;
explicit DatagramFrameLog(uint64_t lenIn) : len(lenIn) {}
~DatagramFrameLog() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class VersionNegotiationLog {
public:
std::vector<QuicVersion> versions;
explicit VersionNegotiationLog(const std::vector<QuicVersion>& versionsIn)
: versions{versionsIn} {}
~VersionNegotiationLog() = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const;
};
enum class QLogEventType : uint32_t {
PacketReceived,
PacketSent,
ConnectionClose,
TransportSummary,
CongestionMetricUpdate,
PacingMetricUpdate,
AppIdleUpdate,
PacketDrop,
DatagramReceived,
LossAlarm,
PacketsLost,
TransportStateUpdate,
PacketBuffered,
PacketAck,
MetricUpdate,
StreamStateUpdate,
PacingObservation,
AppLimitedUpdate,
BandwidthEstUpdate,
ConnectionMigration,
PathValidation,
PriorityUpdate
};
folly::StringPiece toString(QLogEventType type);
class QLogEvent {
public:
QLogEvent() = default;
virtual ~QLogEvent() = default;
virtual folly::dynamic toDynamic() const = 0;
std::chrono::microseconds refTime;
QLogEventType eventType;
};
class QLogPacketEvent : public QLogEvent {
public:
QLogPacketEvent() = default;
~QLogPacketEvent() override = default;
std::vector<std::unique_ptr<QLogFrame>> frames;
std::string packetType;
PacketNum packetNum{0};
uint64_t packetSize{0};
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogVersionNegotiationEvent : public QLogEvent {
public:
QLogVersionNegotiationEvent() = default;
~QLogVersionNegotiationEvent() override = default;
std::unique_ptr<VersionNegotiationLog> versionLog;
std::string packetType;
uint64_t packetSize{0};
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogRetryEvent : public QLogEvent {
public:
QLogRetryEvent() = default;
~QLogRetryEvent() override = default;
std::string packetType;
uint64_t packetSize{0};
uint64_t tokenSize{0};
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogConnectionCloseEvent : public QLogEvent {
public:
QLogConnectionCloseEvent(
std::string errorIn,
std::string reasonIn,
bool drainConnectionIn,
bool sendCloseImmediatelyIn,
std::chrono::microseconds refTimeIn);
~QLogConnectionCloseEvent() override = default;
std::string error;
std::string reason;
bool drainConnection;
bool sendCloseImmediately;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogTransportSummaryEvent : public QLogEvent {
public:
QLogTransportSummaryEvent(
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 version,
uint64_t dsrPacketCount,
std::chrono::microseconds refTimeIn);
~QLogTransportSummaryEvent() override = default;
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;
uint64_t dsrPacketCount;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogCongestionMetricUpdateEvent : public QLogEvent {
public:
QLogCongestionMetricUpdateEvent(
uint64_t bytesInFlight,
uint64_t currentCwnd,
std::string congestionEvent,
std::string state,
std::string recoveryState,
std::chrono::microseconds refTimeIn);
~QLogCongestionMetricUpdateEvent() override = default;
uint64_t bytesInFlight;
uint64_t currentCwnd;
std::string congestionEvent;
std::string state;
std::string recoveryState;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogAppLimitedUpdateEvent : public QLogEvent {
public:
explicit QLogAppLimitedUpdateEvent(
bool limitedIn,
std::chrono::microseconds refTimeIn);
~QLogAppLimitedUpdateEvent() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
bool limited;
};
class QLogBandwidthEstUpdateEvent : public QLogEvent {
public:
explicit QLogBandwidthEstUpdateEvent(
uint64_t bytes,
std::chrono::microseconds interval,
std::chrono::microseconds refTimeIn);
~QLogBandwidthEstUpdateEvent() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
uint64_t bytes;
std::chrono::microseconds interval;
};
class QLogPacingMetricUpdateEvent : public QLogEvent {
public:
QLogPacingMetricUpdateEvent(
uint64_t pacingBurstSize,
std::chrono::microseconds pacingInterval,
std::chrono::microseconds refTime);
~QLogPacingMetricUpdateEvent() override = default;
uint64_t pacingBurstSize;
std::chrono::microseconds pacingInterval;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogPacingObservationEvent : public QLogEvent {
public:
QLogPacingObservationEvent(
std::string actualIn,
std::string expectIn,
std::string conclusionIn,
std::chrono::microseconds refTimeIn);
std::string actual;
std::string expect;
std::string conclusion;
~QLogPacingObservationEvent() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogAppIdleUpdateEvent : public QLogEvent {
public:
QLogAppIdleUpdateEvent(
std::string idleEvent,
bool idle,
std::chrono::microseconds refTime);
~QLogAppIdleUpdateEvent() override = default;
std::string idleEvent;
bool idle;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogPacketDropEvent : public QLogEvent {
public:
QLogPacketDropEvent(
size_t packetSize,
std::string dropReason,
std::chrono::microseconds refTime);
~QLogPacketDropEvent() override = default;
size_t packetSize;
std::string dropReason;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogDatagramReceivedEvent : public QLogEvent {
public:
QLogDatagramReceivedEvent(
uint64_t dataLen,
std::chrono::microseconds refTime);
~QLogDatagramReceivedEvent() override = default;
uint64_t dataLen;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogLossAlarmEvent : public QLogEvent {
public:
QLogLossAlarmEvent(
PacketNum largestSent,
uint64_t alarmCount,
uint64_t outstandingPackets,
std::string type,
std::chrono::microseconds refTime);
~QLogLossAlarmEvent() override = default;
PacketNum largestSent;
uint64_t alarmCount;
uint64_t outstandingPackets;
std::string type;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogPacketsLostEvent : public QLogEvent {
public:
QLogPacketsLostEvent(
PacketNum largestLostPacketNum,
uint64_t lostBytes,
uint64_t lostPackets,
std::chrono::microseconds refTime);
~QLogPacketsLostEvent() override = default;
PacketNum largestLostPacketNum;
uint64_t lostBytes;
uint64_t lostPackets;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogTransportStateUpdateEvent : public QLogEvent {
public:
QLogTransportStateUpdateEvent(
std::string update,
std::chrono::microseconds refTime);
~QLogTransportStateUpdateEvent() override = default;
std::string update;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogPacketBufferedEvent : public QLogEvent {
public:
QLogPacketBufferedEvent(
ProtectionType protectionType,
uint64_t packetSize,
std::chrono::microseconds refTime);
~QLogPacketBufferedEvent() override = default;
ProtectionType protectionType;
uint64_t packetSize;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogPacketAckEvent : public QLogEvent {
public:
QLogPacketAckEvent(
PacketNumberSpace packetNumSpace,
PacketNum packetNum,
std::chrono::microseconds refTime);
~QLogPacketAckEvent() override = default;
PacketNumberSpace packetNumSpace;
PacketNum packetNum;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogMetricUpdateEvent : public QLogEvent {
public:
QLogMetricUpdateEvent(
std::chrono::microseconds latestRtt,
std::chrono::microseconds mrtt,
std::chrono::microseconds srtt,
std::chrono::microseconds ackDelay,
std::chrono::microseconds refTime);
~QLogMetricUpdateEvent() override = default;
std::chrono::microseconds latestRtt;
std::chrono::microseconds mrtt;
std::chrono::microseconds srtt;
std::chrono::microseconds ackDelay;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
};
class QLogStreamStateUpdateEvent : public QLogEvent {
public:
QLogStreamStateUpdateEvent(
StreamId id,
std::string update,
folly::Optional<std::chrono::milliseconds> timeSinceStreamCreation,
VantagePoint vantagePoint,
std::chrono::microseconds refTime);
~QLogStreamStateUpdateEvent() override = default;
StreamId id;
std::string update;
folly::Optional<std::chrono::milliseconds> timeSinceStreamCreation;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
private:
VantagePoint vantagePoint_;
};
class QLogConnectionMigrationEvent : public QLogEvent {
public:
QLogConnectionMigrationEvent(
bool intentionalMigration,
VantagePoint vantagePoint,
std::chrono::microseconds refTime);
~QLogConnectionMigrationEvent() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
bool intentionalMigration_;
VantagePoint vantagePoint_;
};
class QLogPathValidationEvent : public QLogEvent {
public:
// The VantagePoint represents who initiates the path validation (sends out
// Path Challenge).
QLogPathValidationEvent(
bool success,
VantagePoint vantagePoint,
std::chrono::microseconds refTime);
~QLogPathValidationEvent() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
bool success_;
VantagePoint vantagePoint_;
};
class QLogPriorityUpdateEvent : public QLogEvent {
public:
explicit QLogPriorityUpdateEvent(
StreamId id,
uint8_t urgency,
bool incremental,
std::chrono::microseconds refTimeIn);
~QLogPriorityUpdateEvent() override = default;
FOLLY_NODISCARD folly::dynamic toDynamic() const override;
private:
StreamId streamId_;
uint8_t urgency_;
bool incremental_;
};
} // namespace quic