Skip to content

Console

modak-console.jar is a strict superset of the worker binary: the same daemon and CLI, plus an embedded web console served on MODAK_CONSOLE_PORT (default 9090). The local stack runs it at http://localhost:9090. Zero build step, zero external services: plain HTML/CSS/JS with Apache ECharts and CodeMirror bundled as WebJars, served from the jar.

The demo walks through the console live: tiering, cross-tier SQL, the delta fold, and an on-demand maintenance pass.

Overview

Console overview

The fleet at a glance: per-table mode, cut-line, mirror lag, delta backlog, read pins, partition states, in-flight initial copies, and a lake column with each table's headline file count, size, and any active health warnings, refreshed live.

Charts for mirror lag, delta backlog, slot WAL, and lake commit rate draw from an in-process ring buffer (about 11 hours of history at the default sweep interval), so no Prometheus is required for a useful picture.

A storage-profiles table lists the configured warehouse bindings (name, format, warehouse, credential ref, default flag), and each table's detail page shows which profile it registered against. See Storage profiles.

Table detail

Drill into any table: its partitions and lifecycle states, the operation journal (tiering/compaction/maintenance phases), and replication slot detail for mirrored tables.

The lake health panel shows whatever the format plugin reports: its counters (files, delete files, snapshots, manifests, ...), active health warnings, the maintenance policy in force, and what the last maintenance pass did, with file-count and size charts alongside. The panel is format-agnostic by design, a future Hudi or Paimon plugin fills the same panel with its own numbers. See Lake maintenance.

A Run maintenance button next to the last-maintenance table files a request (modak.maintenance_requests, requested_by = 'console'); the leader claims it within its cycle interval, and the pass's counters appear in the panel once journaled. The button is disabled while a request is pending.

SQL playground

SQL playground

A schema browser, a CodeMirror SQL editor with snippets and history, and a results grid. Statements run with transparent reads on, so tiered tables read as your users see them, merged across both tiers, with a query timeout and a row cap applied. Use it to create tables, inspect modak.*, or sanity-check what a two-tier read returns.

The Explain button runs modak_explain on the statement instead of executing it, and shows where rows will come from or go to: which tiers a read spans, whether a write passes through or splits into hot and cold halves, and what would be rejected.

The playground is a superuser surface

Statements execute with the worker's Postgres credentials. Set MODAK_CONSOLE_SQL=false to disable the query endpoint, or deploy the headless modak-worker.jar, which has no console at all. Either way, keep the port internal: the console has no TLS and no auth by design.

JSON API

Everything the UI shows is fetchable directly. The full spec is served by the console itself at /api/openapi.yaml (also linked from the footer):

Endpoint Returns
GET /api/v1/overview Fleet summary: tables, cutlines, backlogs, slots, copies, lake headlines
GET /api/v1/tables/{id} One table: partitions, journal, slot detail, lake health, pending maintenance
POST /api/v1/tables/{id}/maintenance Files a maintenance request for the leader's next cycle
GET /api/v1/series The chart ring buffers, key -> [[ts, value], ...]
GET /api/v1/storage-profiles The configured storage profiles
POST /api/v1/storage-profiles Create a storage profile (only non-secret fields cross the wire)
GET /api/v1/schema Schema tree for the playground browser
POST /api/v1/query Run a SQL statement (disabled when MODAK_CONSOLE_SQL=false)
POST /api/v1/explain Explain a SQL statement, returns the modak_explain report lines
POST /api/load/{schema}.{table} Stream load a labeled micro-batch (see Stream load)
GET /metrics Prometheus text format, same as the headless worker

/metrics is served by both binaries, so Prometheus scrapes either the same way.

In SQL instead

The same per-table picture is available without the console:

SELECT * FROM modak.status;
--  table_id | schema_name | table_name | mode | cutline_t | cutline_s |
--  mirror_frontier | delta_backlog | read_pins | copying | partition_states