quic/logging/QLogger.h (123 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and 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