Skip to content

feat(ets): add ETS pillar with gated content previews; System as default page#53

Merged
thiagoesteves merged 3 commits into
mainfrom
thiagoesteves/ets-browser
Jul 9, 2026
Merged

feat(ets): add ETS pillar with gated content previews; System as default page#53
thiagoesteves merged 3 commits into
mainfrom
thiagoesteves/ets-browser

Conversation

@thiagoesteves

@thiagoesteves thiagoesteves commented Jul 9, 2026

Copy link
Copy Markdown
Owner

Summary

PR 3 of the observer_cli / OTP-observer gap-closing plan: an ETS table browser, plus the agreed follow-up making System the default landing page.

ETS pillar (new page)

  • Every table on the selected node: name, type, protection, owner (registered name when there is one), object count, memory - searchable (debounced) and sortable (memory/size/name), with count and total-memory summary badges.
  • One RPC round trip per refresh via :observer_backend.get_table_list/2 (runtime_tools) - same stdlib-only convention as the Processes and System pillars, no observer_web version coupling.
  • System and private tables included: their metadata is what an operator needs even when contents are unreadable.

Content previews - safe by default

DETAILS always shows metadata. Previewing contents is a different risk class (live production data), so it's:

  • Disabled by default, gated behind config :observer_web, ets_content_inspection: true (documented in the installation guide with an explicit warning about dashboard access).
  • Read-only and bounded even when enabled: at most 50 objects per request, each rendered with inspect limits.
  • Private/vanished tables degrade to a "not accessible" notice.

System as default landing page

/observer (and the logo link) now lands on the System page instead of Tracing - a read-only node snapshot is a better entry point than an armed tracing page, and System already leads the nav.

Risk assessment

Area Change Risk Mitigation
Production data exposure Content previews can show live table data High as a product concern, mitigated by design Off by default; explicit config opt-in; read-only; 50-object cap + inspect truncation; documented warning; tests assert the disabled default and the gate
Data transfer on preview Objects are copied from the observed node before truncation Low-medium Object-count cap; documented in the moduledoc; per-request RPC timeout
Default landing page change /observer now lands on System, not Tracing Low-medium - visible behavior change for bookmarked users Explicit /observer/tracing URLs unaffected; agreed follow-up from the nav reordering; test updated
get_table_list/2 coupling Positional/proplist decode of a runtime_tools API Low Same stable-contract approach as etop_collect (PR #50); defensive decode skips unexpected entries
Private table handling rpc read raises on the remote Low Degrades to :not_accessible, tested with a real private table owned by another process
Nav/layout wiring One new entry + logo link target Low Existing nav tests; full web suite green

Checklist

  • mix format, credo --strict, dialyzer, sobelow clean
  • Full suite: 345 tests green across 3 random seeds
  • README + guides/overview entries; opt-in flag documented with warning in the installation guide
  • guides/static/ets_dash.png screenshot (needs a capture from a dev node before merge)

🤖 Generated with Claude Code

…ult page

Adds a new ETS pillar: every table on a selected node with its owner
(labeled with the registered name when there is one), protection, type,
object count and memory footprint - searchable, sortable and collected
in a single RPC round trip via :observer_backend.get_table_list/2
(runtime_tools, present on every node). System and private tables are
included: their metadata is exactly what an operator needs, even when
contents are unreadable.

Table contents are live production data, so the DETAILS preview is
disabled by default and gated behind an explicit opt-in
(ets_content_inspection, documented with a warning in the installation
guide). Even enabled, previews are read-only and bounded: at most 50
objects per request, each rendered with inspect limits; private or
vanished tables report as not accessible instead of crashing.

Also makes the System page the default landing page (and the logo
link target) now that it leads the nav - a node snapshot is a better
entry point than an armed tracing page.
Same pattern as the scheduler utilization toggle - enabled by default
for development (the flag is read at request time, so put_env after
boot is enough here), disabled with
OBSERVER_WEB_ETS_CONTENT_INSPECTION=false.
@thiagoesteves thiagoesteves self-assigned this Jul 9, 2026
@thiagoesteves thiagoesteves merged commit 23e6c0f into main Jul 9, 2026
3 checks passed
@thiagoesteves thiagoesteves deleted the thiagoesteves/ets-browser branch July 9, 2026 19:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant