Files
ottyl/tickets/020-file-input-ingestion.md
T

40 lines
1.8 KiB
Markdown

# 020 — File input for ingestion, with restart-safe tailing
## Summary
`ingest.rs` only reads stdin today. The wishlist asks for an optional file path as
an alternative input source, plus resilience to the log file being recreated (e.g.
the host process being tailed restarts and truncates/recreates its log file) —
ottyl should keep tailing rather than treating that as EOF-and-done.
## Scope
- New `clap` arg (e.g. `--file <path>`), mutually exclusive-in-spirit with stdin:
when given, ingest reads from the file instead of stdin; when absent, behavior is
unchanged (stdin, as today).
- File-mode ingestion must behave like `tail -f`: keep reading as new lines are
appended, don't exit on reaching current EOF.
- Detect file recreation (the common "log rotated / process restarted and reopened
the path" case) — e.g. by tracking the inode/file id and re-opening when it
changes, or noticing truncation (current read offset > file size) — and resume
tailing the new file from its start rather than exiting or getting stuck.
- Sequence numbers continue incrementing across a recreation event (per
`IndexKey::IngestedLog`, sequence is ottyl's own line counter, not tied to the
source file).
- Reuse the existing `IngestedLine` / `EngineMessage::Ingest` plumbing — this only
changes where lines come from, not how they're indexed.
## Acceptance criteria
- `ottyl --file some.log` ingests existing content and then picks up appended
lines live.
- Deleting and recreating the file at the same path (simulating a host restart)
does not kill ottyl or stop ingestion — new content from the recreated file
continues to be ingested.
- Running with no `--file` is unchanged: stdin ingestion as today.
## Depends on
None — parallels the existing `ingest::run`, doesn't require any of the metrics/
filter machinery.