quic/logging/FileQLogger.h (134 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 <fstream> #include <sstream> #include <folly/compression/Compression.h> #include <folly/dynamic.h> #include <folly/logging/AsyncFileWriter.h> #include <quic/codec/Types.h> #include <quic/logging/BaseQLogger.h> #include <quic/logging/QLoggerConstants.h> #include <quic/logging/QLoggerTypes.h> namespace quic { class FileQLogger : public BaseQLogger { const static uint64_t kCompressionBufferSize = 1024; // 1 KB public: inline const static std::string kQlogExtension = ".qlog"; inline const static std::string kCompressedQlogExtension = ".qlog.gz"; using QLogger::TransportSummaryArgs; std::vector<std::unique_ptr<QLogEvent>> logs; FileQLogger( VantagePoint vantagePointIn, std::string protocolTypeIn = kHTTP3ProtocolType, std::string path = "", bool prettyJson = true, bool streaming = false, bool compress = false) : BaseQLogger(vantagePointIn, std::move(protocolTypeIn)), path_(std::move(path)), prettyJson_(prettyJson), streaming_(streaming), compress_{compress} {} ~FileQLogger() override { if (streaming_ && dcid.hasValue()) { finishStream(); } } void addPacket(const RegularQuicPacket& regularPacket, uint64_t packetSize) override; void addPacket( const VersionNegotiationPacket& versionPacket, uint64_t packetSize, bool isPacketRecvd) override; void addPacket(const RegularQuicWritePacket& writePacket, uint64_t packetSize) override; void addPacket( const RetryPacket& retryPacket, uint64_t packetSize, bool isPacketRecvd) override; void addConnectionClose( std::string error, std::string reason, bool drainConnection, bool sendCloseImmediately) override; void addTransportSummary(const TransportSummaryArgs& args) override; void addCongestionMetricUpdate( uint64_t bytesInFlight, uint64_t currentCwnd, std::string congestionEvent, std::string state = "", std::string recoveryState = "") override; void addPacingMetricUpdate( uint64_t pacingBurstSizeIn, std::chrono::microseconds pacingIntervalIn) override; void addPacingObservation( std::string actual, std::string expected, std::string conclusion) override; void addBandwidthEstUpdate(uint64_t bytes, std::chrono::microseconds interval) override; void addAppLimitedUpdate() override; void addAppUnlimitedUpdate() override; void addAppIdleUpdate(std::string idleEvent, bool idle) override; void addPacketDrop(size_t packetSize, std::string dropReasonIn) override; void addDatagramReceived(uint64_t dataLen) override; void addLossAlarm( PacketNum largestSent, uint64_t alarmCount, uint64_t outstandingPackets, std::string type) override; void addPacketsLost( PacketNum largestLostPacketNum, uint64_t lostBytes, uint64_t lostPackets) override; void addTransportStateUpdate(std::string update) override; void addPacketBuffered(ProtectionType protectionType, uint64_t packetSize) override; void addMetricUpdate( std::chrono::microseconds latestRtt, std::chrono::microseconds mrtt, std::chrono::microseconds srtt, std::chrono::microseconds ackDelay) override; void addStreamStateUpdate( StreamId id, std::string update, folly::Optional<std::chrono::milliseconds> timeSinceStreamCreation) override; virtual void addConnectionMigrationUpdate(bool intentionalMigration) override; virtual void addPathValidationEvent(bool success) override; void addPriorityUpdate( quic::StreamId streamId, uint8_t urgency, bool incremental) override; void outputLogsToFile(const std::string& path, bool prettyJson); folly::dynamic toDynamic() const; folly::dynamic toDynamicBase() const; folly::dynamic generateSummary( size_t numEvents, std::chrono::microseconds startTime, std::chrono::microseconds endTime) const; void setDcid(folly::Optional<ConnectionId> connID) override; void setScid(folly::Optional<ConnectionId> connID) override; private: void setupStream(); void writeToStream(folly::StringPiece message); void finishStream(); void handleEvent(std::unique_ptr<QLogEvent> event); std::unique_ptr<folly::AsyncFileWriter> writer_; std::unique_ptr<folly::io::StreamCodec> compressionCodec_; std::unique_ptr<folly::IOBuf> compressionBuffer_; std::string path_; std::string basePadding_ = " "; std::string eventsPadding_ = ""; std::string eventLine_; std::string token_; std::string endLine_; std::stringstream baseJson_; bool prettyJson_; bool streaming_; bool compress_; int numEvents_ = 0; std::chrono::microseconds startTime_ = std::chrono::microseconds::zero(); std::chrono::microseconds endTime_; size_t pos_; }; } // namespace quic