2.9 KiB
073 — Track and surface ingestion-to-engine-processing lag (high watermark)
Summary
Wishlist feedback, verbatim:
There needs to be a ingstion to parsing latency on frontend. Basically when a log is read, it gets what would be the
ottyl_tsvalue. However, the engine can lag on ingestion. That lag needs to be tracked as a high watermark. We can have a collection that stores say 5 highest values within the last 5 seconds. If a value in that collection is older than the 5s window, it gets replaced. If a value is higher than the minimum current, it gets replaced. The frontend will display the highest single value (humantime duration lag, or ms lag) alongside where it displays the logs and allocation size.
Confirmed the mechanism this is about: ingest.rs stamps
timestamp: Timestamp::now() at read time (this becomes ottyl_ts,
e.g. ingest.rs:25/:107) before sending EngineMessage::Ingest
over the mpsc channel to the engine actor task. The engine only
processes it whenever the actor's message loop gets scheduled to it —
under load (large backlog, slow query in flight, etc.) that gap can
grow. Today nothing measures (engine processing time) - (ottyl_ts),
so there's no visibility into ingest backpressure.
The "allocation size" reference point is approx_bytes_total
(src/dto.rs:80, ticket 011), currently shown in
webapp/src/components/NavMenu.tsx:104 in the stats popover — that's
the existing display location the lag figure should sit alongside.
Scope
- In the engine actor's ingest handling (where
EngineMessage::Ingestis received,engine.rs), computelag = Timestamp::now() - message.timestampat the moment of processing. - Maintain a small rolling high-watermark collection per the spec above: keep up to 5 entries, each valid only within the last 5 seconds; a new lag value replaces the current minimum-held entry if it's larger, and any entry older than the 5s window is evicted (replaced) regardless of magnitude. Expose the current max of that collection.
- Add this figure to whatever stats DTO backs the popover
approx_bytes_totalcomes from, and to the corresponding stats query/response path inapi.rs. - Display it in
NavMenu.tsxnext toapprox_bytes_total(:104), formatted as a humantime-style duration for larger lag and plain ms for small values — match whatever precedent this codebase already uses for duration formatting (checkwebapp/src/libfor an existing humanize helper before writing a new one).
Acceptance criteria
- Under normal (non-lagged) ingestion, the displayed value stays near zero.
- Artificially delaying engine processing (e.g. a slow query saturating the actor's message loop, or a synthetic test) causes the displayed high-watermark to rise and correctly decays out of the rolling 5s window afterward.
- The value is visible in the same UI location as
approx_bytes_total.
Depends on
None.