56template <std::
size_t Capacity = 256>
58 static_assert((Capacity & (Capacity - 1)) == 0,
"Capacity must be a power of 2.");
59 static constexpr std::size_t Mask = Capacity - 1;
66 std::size_t eventTypeId,
67 const char* eventName,
69 uint64_t dispatchTimeNs,
70 uint64_t finishTimeNs,
74 const std::size_t idx = _writeIndex.fetch_add(1, std::memory_order_relaxed);
77 entry.
eventName = eventName ? eventName :
"UnknownEvent";
87 return _writeIndex.load(std::memory_order_relaxed);
91 [[nodiscard]]
constexpr std::size_t
capacity() const noexcept
99 return _records[index & Mask];
103 template <
typename Callback>
106 const uint64_t current = _writeIndex.load(std::memory_order_acquire);
107 const std::size_t count = current < Capacity ? static_cast<std::size_t>(current) : Capacity;
108 const uint64_t start = current < Capacity ? 0 : current - Capacity;
110 for (std::size_t i = 0; i < count; ++i) {
111 cb(_records[(start + i) & Mask]);
122 if (!first) os <<
",\n";
126 const double postUs =
static_cast<double>(rec.
postTimestampNs) / 1000.0;
132 <<
"]\", \"cat\": \"corium\", \"ph\": \"X\", \"ts\": " << postUs
133 <<
", \"dur\": " << queueDurationUs <<
", \"pid\": 1, \"tid\": 1, \"args\": {\"prio\": "
134 <<
static_cast<int>(rec.
priority) <<
"}},\n";
138 <<
"]\", \"cat\": \"corium\", \"ph\": \"X\", \"ts\": " << dispatchUs
139 <<
", \"dur\": " << execDurationUs <<
", \"pid\": 1, \"tid\": 1, \"args\": {\"type_id\": "
147 std::atomic<uint64_t> _writeIndex{0};
148 std::array<FlightRecord, Capacity> _records{};
Zero-heap circular flight recorder storing the last N event telemetry records. Thread-safe for multip...
Definition FlightRecorder.hpp:57
void record(std::size_t eventTypeId, const char *eventName, uint64_t postTimeNs, uint64_t dispatchTimeNs, uint64_t finishTimeNs, uint8_t priority) noexcept
Record a completed event execution into the circular buffer.
Definition FlightRecorder.hpp:65
constexpr std::size_t capacity() const noexcept
Get buffer capacity.
Definition FlightRecorder.hpp:91
void exportChromeTracingJson(std::ostream &os) const
Export recorded flight logs in Chrome Tracing JSON format (supported by chrome://tracing and Perfetto...
Definition FlightRecorder.hpp:116
FlightRecord recordAt(std::size_t index) const noexcept
Read a record by logical historical index (0 is oldest available in current window).
Definition FlightRecorder.hpp:97
uint64_t totalRecorded() const noexcept
Get total number of recorded events since creation.
Definition FlightRecorder.hpp:85
void forEach(Callback &&cb) const
Iterate through available historical records in chronological order.
Definition FlightRecorder.hpp:104
Definition FlightRecorder.hpp:16
std::chrono::steady_clock ProfilerClock
Timestamp clock used by the profiler (steady clock in nanoseconds).
Definition FlightRecorder.hpp:19
Represents a single traced event record in the circular flight recorder.
Definition FlightRecorder.hpp:22
uint64_t dispatchTimestampNs
Definition FlightRecorder.hpp:26
double queueLatencyUs() const noexcept
Calculate latency spent waiting in queue before dispatch in microseconds.
Definition FlightRecorder.hpp:31
uint64_t postTimestampNs
Definition FlightRecorder.hpp:25
uint64_t finishTimestampNs
Definition FlightRecorder.hpp:27
uint8_t priority
Definition FlightRecorder.hpp:28
std::size_t eventTypeId
Definition FlightRecorder.hpp:23
const char * eventName
Definition FlightRecorder.hpp:24
double totalDurationUs() const noexcept
Calculate total turnaround time from post to finish in microseconds.
Definition FlightRecorder.hpp:45
double executionDurationUs() const noexcept
Calculate duration of handler execution in microseconds.
Definition FlightRecorder.hpp:38