Hugh KaznowskiandClaude Sonnet 5 9fc7540a5b Resolve tickets 071-074, 076: log-stream contamination, sort, ottyl_fmt column, ingest lag
- 076: gate auto-declared log-stream column/message params
  (`ParamDeclaration::log_stream_gated`) behind `is_log_stream_line` at
  extraction time, since their fixed-offset regex has no content anchor
  and previously extracted garbage from continuation lines and the
  header row itself (the regex crate doesn't support lookaround, so
  this couldn't be baked into the regex text).
- 074: end-to-end regression test confirms sorting a real `log stream`
  capture by a log-stream column (e.g. PID) now actually reorders
  results, since 076's fix removes the garbage values that were
  corrupting the sort helper index; also add a "Building sort
  index…" indicator in the timeline UI for a slow first-time sort.
- 072: attach the reserved `ottyl_fmt` pseudo-param to each
  `LogEntryDto`'s params so it can be picked as a Log Preview column
  (previously listed as pickable but always blank).
- 073: track a rolling 5s high-watermark of ingestion-to-engine-processing
  lag and surface it in the nav stats popover next to approx_bytes_total.
- 071: group the regex(...) help button back with the filter bar's other
  controls, and restructure the Filtering docs section into scannable
  per-feature subsections (also fixes stale log_type/process/pid mention).

Tickets 070 (CLI scoping) and 075 (API unresponsiveness investigation)
are left in place per their own scope — both are explicitly
conversation/investigation tasks, not implementation tickets.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1ZJ3SrayzLzVndhVq9BmS
2026-09-06 15:12:07 +01:00
2026-09-06 09:30:38 +01:00
2026-09-05 21:41:11 +01:00
2026-09-06 14:37:03 +01:00

ottyl

Observability for any command's terminal output — no logging backend, no agents, no config to ship.

your_app --verbose | ottyl

Pipe a program's stdout into ottyl and turn it into a searchable log timeline, ad-hoc metrics extracted from the log lines themselves, and Grafana-style dashboards — served from a single local binary, for the lifetime of that process:

  • Search: A syntax-aware filter bar over your logs — regex matches and metric comparisons like latency_ms[value]<200, with relative (5h, -3m) and absolute datetimes.
  • Log timeline: A bucketed bar chart of message volume over time, Kibana-style. Drag across it to set the active time range.
  • Metrics from logs: Declare a metric by matching a regex against your log lines and extracting a value. It applies retroactively to everything already ingested, and to everything that follows.
  • Dashboards: Bar, line, and pie chart panels driven by PromQL-style queries over your declared metrics.
  • Mixed sources: Poll an existing Prometheus/OpenMetrics endpoint alongside log ingestion, in the same dashboard.
  • Profiles: Parsing rules and dashboards are saved per app, so they're there again next time that app runs through ottyl.

Use cases

  • Debugging a noisy CLI or long-running script, instead of scrolling a terminal buffer.
  • Getting metrics and charts out of a program that only ever prints text.
  • Local dashboards without standing up a metrics stack.
  • Combining scraped Prometheus metrics with log-derived ones during a debugging session.

Get started

Requires Rust and Node.js. The webapp is built and embedded into the binary, so the result is a single self-contained executable.

git clone <this-repo>
cd ottyl
make build
your_app --verbose | ottyl

Or point it at a log file instead of stdin, and mix in a Prometheus/OpenMetrics endpoint:

ottyl --file /var/log/your_app.log --metrics-url http://localhost:9090/metrics

ottyl prints the URL of the local web server it starts (an OS-assigned free port by default; pin one with --port). See ottyl --help for the rest, including where settings and profiles live (--settings-path).

Full documentation — filtering syntax, parameters, metrics, dashboards — is built into the app itself, under the nav menu's docs section.

Development

make dev    # frontend dev server with hot reload, proxying to a separately running `cargo run` backend
make test   # backend + frontend tests
make lint   # clippy + oxlint
S
Description
Observability dashboard from terminal output
Readme
1.2 MiB
0.1.0 release
Latest
2026-09-05 20:44:51 +00:00
Languages
Rust 70.4%
TypeScript 27.7%
CSS 1.8%
Makefile 0.1%