Orkestia
Blog
Lumen

Dashboards in the Cockpit app

View, customize and import Lumen dashboards in the Cockpit app — the 12-column grid, panel types, variables and web compatibility

Dashboards in Lumen mode are the same documents as on lumen.orkestia.dev. A board you save in the app opens unchanged on the web, and the other way round.

Viewing

Open a dashboard from the Dashboards section of the sidebar, from ⌘K, or from the dashboards index. Each panel reads its endpoint for the toolbar's time range and refreshes on the dashboard's auto-refresh interval while the window is visible. A panel that fails shows its own error and a retry; the others keep working.

Panel menu (…)Does
View full screenOpens the panel large in a drawer
Explore in LumenOpens the matching explore page with the panel's metric, aggregation and project (see the table below)
Customize dashboard…Enters Customize mode (your own dashboards only)

If the dashboard declares variables that a panel uses, a bar above the grid lets you pick a value. See Variables.

Panel types

Every panel is one of seven types; the type fixes the query source.

TypeSourceParams you can setExplore link
KPI strip (stat_strip)dashboard.summaryprojectnone
Single stat (stat)metrics.aggregatemetric_name, agg, interval, project, filterMetrics
Time series (timeseries)metrics.aggregatesame, plus group_by (project or service_name) and max_groups (5, 10, 20)Metrics
Log pulse (log_pulse)logs.pulseinterval (auto, 1m, 5m, 15m, 1h, 1d), projectLogs
Error groups (error_groups)dashboard.top-error-groupslimit (5, 10, 20, 50), projectError groups
Activity feed (events)dashboard.eventslimit, projectnone
Projects (projects)dashboard.projectsnoneProjects

How the app turns a panel into a request:

  • window on KPI strip, Error groups and Projects, and from/to on Log pulse and metrics, always follow the selected time range.
  • interval: auto resolves from the range. Log pulse: 15m/1h → 1m, 6h → 5m, 24h → 15m, 7d → 1h. Metrics: 15m/1h/6h → 5m, 24h/7d → 1h (the metrics API only knows 5m, 1h, 1d).
  • A project of * means all projects; it is dropped from the request.
  • filter entries look like attrs.key:value or resource_attrs.key:value; they are sent as repeated filter parameters.

A Single stat reduces the buckets to one number: sum and count add every bucket, any other aggregation shows the last bucket. In a split Time series, a series named by an organization id shows the organization's name.

Customize mode

Choose Customize on a dashboard you own. The page gets an edit bar and the grid shows its guides.

ControlDoes
Drag a panel's title barMoves it on the 12-column grid
Drag a panel's cornerResizes it, within the minimum size for its type
Add panelOpens a gallery with one card per type, then the panel editor
SettingsName, default time range, auto-refresh, variables
Reset layoutPacks panels left to right at their default sizes
Cancel / EscLeaves edit mode; asks first if something changed
Save / ⌘SSaves. Disabled until something changed and while the document has problems; hover shows the first problem
Pencil / copy / trash on a panelEdit, duplicate (beside the original when it fits, else below) or remove it

The grid is 12 columns wide with 28 px rows and 12 px gaps. Default sizes (columns × rows): KPI strip 12×4, Log pulse 12×8, Projects 12×12, Error groups 7×10, Activity feed 5×10, Time series 6×9, Single stat 3×5. Below 720 px of width the grid stacks to one column in layout order. A layout change counts only when you finish a drag or resize, so the grid settling as it opens never marks a board as edited.

The panel editor

FieldApplies toNotes
TitleallAt most 80 characters
VisualizationallChanging it resets the params to that type's defaults; a title you customized, and the metric settings when both types read metrics, are kept
MetricSingle stat, Time seriesSuggestions come from GET /api/metrics/names. A metric is required
AggregationSingle stat, Time seriesavg, sum, min, max, count, p50, p90, p95, p99
Bucket sizeSingle stat, Time series, Log pulseauto unless you pin one
Split by / Show topTime seriesProject or service, and 5, 10 or 20 series; the rest combine as "other"
Rows shownError groups, Activity feed
Projectmost typesA project name, *, or a variable such as $project
Filtersmetrics panelsOne row per dimension : value; dimensions are service_name, project, attrs.<key>, resource_attrs.<key>; a value may be $variable

A live preview under the form shows the panel with your current settings.

Settings

SettingNotes
NameAt most 80 characters
Default time range15m, 1h, 6h, 24h, 7d. A board saved on the web with a fixed from/to window keeps it until you pick a preset
Auto-refreshOffered: 10 s, 30 s, 1 min, 5 min, 15 min. The API accepts 5 s to 1 h; a value outside the list is kept as is
Variablesname (letters, digits, underscores), dimension, default

The viewer never changes your toolbar range on its own. If the board's default differs, it shows "Dashboard default: last X · Use it".

Variables

A variable is declared once and used as $name (or ${name}) in a panel's project or filter values. Viewers pick its value above the dashboard; All (*) drops that filter. Checks the app makes before saving, mirroring the API:

  • the name matches [A-Za-z_][A-Za-z0-9_]* and is unique;
  • the dimension is project, service_name, attrs.<key> or resource_attrs.<key>;
  • every $name a panel uses is a declared variable;
  • a metrics panel has a metric; the dashboard has a name and at most 40 panels.

Only variables that some panel uses get a picker. A project variable's picker lists your projects; other variables take free text. A choice lasts for the visit, not across launches.

System dashboards

System dashboards (for example Home) come from the server and are read-only. Duplicate to customize makes an editable copy named <name> (copy), then (copy 2) and so on.

Dashboards index

The grid icon in the Dashboards section header opens a searchable list of every board, system ones first, with a home marker, panel count and "updated

ActionNotes
New dashboardName it, optionally start from an existing dashboard to copy its panels. An empty board opens in Customize mode; a copy opens for viewing
DuplicateAny board
DeleteYour own boards, after a confirmation. Cannot be undone
Import from GrafanaSee below

An organization can have at most 50 dashboards; the buttons disable at the limit.

Import from Grafana

Paste a dashboard's JSON model (Grafana: Dashboard settings → JSON Model, or Share → Export → Save to file) or choose the file, then Preview import. The app sends it to POST /api/import/grafana. Nothing is saved until you create the dashboard.

The preview says N of M panels imported and lists each Grafana panel with its mapped Lumen type and a tag:

TagMeaning
translatedThe panel and its Prometheus query map cleanly
approximatedImported with a best-effort query; the notes under the row say what differs
skippedNot imported; the reason is shown

Read the notes, rename the dashboard if you like, then Create dashboard. The button is disabled when no panel was imported.

Compatibility

The app saves each board with layout.grid (the 12-column placements) and layout.rows derived from it, so clients that only read rows still show a sensible order. A board that only has rows is read as a grid by splitting each row's width equally. Limits enforced on save: 40 panels per dashboard, 50 dashboards per organization, names and titles up to 80 characters; a slug is derived from the name and made unique.

Next: Explore and correlate, Query API.