Dashboard Get started

Custom Dashboards

Build any visualisation from your telemetry data by writing SQL and choosing a chart type. Dashboards are saved to your tenant's D1 database and shared across your team.

Screenshot needed

Dashboards list page: 3 dashboard cards in a grid. Card 1: 'Production Overview', 5 panels, updated 2h ago. Card 2: 'Payment Service', 3 panels, updated 1d ago. Card 3: 'API Performance', 2 panels. Each card has a Trash icon in top-right corner (visible on hover). '+ New Dashboard' button in top right.

Creating a dashboard

Click + New Dashboard, type a name, and press Enter or click Create. The empty dashboard opens immediately — add your first panel.

Adding panels

Click + Add panel to open the panel editor. Give it a title, optionally a description (shown as a tooltip on the panel header), pick a starter template or write your own SQL, choose a chart type, and size it on the 12-column grid.

Screenshot needed

Panel editor modal: Title field='P99 Latency by Service', SQL textarea showing a SELECT query with AVG(p99) grouped by service, Chart type buttons showing 'line' selected (cyan), Width buttons showing 'Full' selected. Preview button at bottom. Small preview table showing results: api-gateway 342ms, payment-service 1840ms.

Quick-start templates

The panel editor has a row of one-click templates for common queries — click one to fill in the SQL and switch to a matching chart type, then tweak it however you like:

TemplateWhat it showsChart
Request rate over timeRequests per hour, by serviceline
Error rate by servicePercentage of requests that errored, per servicebar
P99 latency by serviceFrom reported metrics, last 24hbar
Total errors todaySingle number — errors in the last 24hstat
Slowest spansTop 10 slowest spans in the last hourtable
Memory usage over timeHeap used (MB), by servicearea
Uptime check latencyResponse time per check, last 24hline
Known servicesEvery service ever seen, with lifetime error ratetable

Schema browser

Click Schema next to the SQL editor to open a sidebar listing every queryable table and column — click any column to insert it into your query. The same list, kept in sync with the actual database schema, is reproduced below.

Panel SQL

Any SELECT query against your hot index tables works:

sql
-- Request rate over time
SELECT
  (timestamp / 3600000) * 3600000 AS bucket,
  service,
  COUNT(*) AS requests
FROM recent_spans
WHERE timestamp > 1785150241875
GROUP BY bucket, service
ORDER BY bucket ASC
LIMIT 500

-- Error rate by service
SELECT
  service,
  COUNT(*) AS total,
  SUM(is_error) AS errors,
  ROUND(SUM(is_error) * 100.0 / COUNT(*), 1) AS error_pct
FROM recent_spans
GROUP BY service
ORDER BY error_pct DESC
LIMIT 100

-- p99 latency from metrics
SELECT
  service,
  AVG(p99) AS avg_p99,
  MAX(p99) AS max_p99
FROM metrics_samples
WHERE metric_name = 'http.server.request.duration'
  AND timestamp > 1785085441875
GROUP BY service
LIMIT 100
Every query needs a LIMIT clause — the query API rejects anything without one (max 1000) to prevent accidental full-table scans.
Click Run preview before saving to run the SQL and see the first rows. The chart renders live in the modal, and once it returns at least one numeric series you can pick a color per series.

Chart types

TypeBest for
LineTime-series data — latency, request rate over time
BarComparing values across categories — errors per service
AreaVolume over time — memory usage, throughput
StatSingle large number — current error count, total requests today
TableRaw tabular data — top 10 slowest spans, recent errors

Display options

Line, bar, and area panels support additional display config:

OptionEffect
UnitFormats axis ticks and tooltip values as ms, %, count (k/M), or bytes (KB/MB/GB)
Axis labelAdds a label to the Y axis
StackingBar and area charts only — stacks series instead of overlapping/grouping them
Series colorsOverride the default palette per series, once a preview has run

Screenshot needed

Dashboard with 2 panels: top-left full-width line chart 'Request Rate' with 3 service lines (api-gateway=cyan, payment-service=purple, user-service=emerald). Bottom: stat panel on left showing '847' (total errors today) and table panel on right showing 5 rows of slowest spans.

Saving

After adding or editing panels, click Save in the top right. The dashboard is saved to D1 and immediately available to all team members.

Dashboard panels refetch their SQL every 60 seconds automatically. To force a refresh, navigate away and back.

Full schema reference

Every table available to panel SQL, and every column on it:

recent_spans

Hot index of traces/logs — last 48h only (older data lives in R2 cold storage).

ColumnTypeDescription
trace_idTEXTDistributed trace ID — groups spans belonging to one request.
span_idTEXTUnique ID for this span.
parent_span_idTEXTParent span ID, or NULL for a root span.
serviceTEXTService name that emitted this span.
span_nameTEXTOperation name, e.g. "GET /api/users".
span_kindINTEGEROTel span.kind — 1=INTERNAL, 2=SERVER, 3=CLIENT, 4=PRODUCER, 5=CONSUMER.
status_codeINTEGERHTTP status code, if applicable.
duration_msREALSpan duration in milliseconds.
is_errorINTEGER1 if this span is an error, 0 otherwise.
severityTEXTLog level: TRACE, DEBUG, INFO, WARN, ERROR, FATAL.
timestampINTEGERUnix epoch milliseconds.
environmentTEXTDeployment environment, e.g. production.
bodyTEXTLog message body (for log-type spans).
host_nameTEXTHost the span was emitted from.
pod_nameTEXTKubernetes pod name, if applicable.
node_nameTEXTKubernetes node name, if applicable.
db_systemTEXTDatabase system for CLIENT spans, e.g. postgresql, redis.
peer_serviceTEXTDownstream service name for CLIENT spans.
scope_nameTEXTOTel instrumentation scope, e.g. @opentelemetry/instrumentation-fetch.
attrs_jsonTEXTExtra span attributes as JSON (capped at 2048 bytes).

metrics_samples

OTel metrics — 7 day TTL.

ColumnTypeDescription
idINTEGERRow ID.
metric_nameTEXTOTel metric name, e.g. http.server.request.duration.
metric_typeTEXTgauge, sum, or histogram.
serviceTEXTService that reported this sample.
environmentTEXTDeployment environment.
host_nameTEXTHost the sample was reported from.
valueREALSample value (gauges/sums).
countINTEGERSample count (histograms).
p50REALMedian value (histograms).
p99REAL99th percentile value (histograms).
labels_jsonTEXTExtra metric labels as JSON.
timestampINTEGERUnix epoch milliseconds.

services

Persistent registry of every service seen — survives the 48h recent_spans TTL.

ColumnTypeDescription
nameTEXTService name (primary key).
environmentTEXTDeployment environment.
first_seenINTEGERUnix epoch seconds — first span ever seen.
last_seenINTEGERUnix epoch seconds — most recent span seen.
total_spansINTEGERLifetime span count.
error_spansINTEGERLifetime error span count.

uptime_checks

Configured uptime monitors.

ColumnTypeDescription
idTEXTCheck ID.
nameTEXTDisplay name.
urlTEXTURL being monitored.
interval_minutesINTEGERHow often the check runs.
expected_statusINTEGERHTTP status considered "up".
enabledINTEGER1 if the check is active.
notify_on_downINTEGER1 if a status change should notify.
last_statusTEXT'up', 'down', or NULL if never checked.
created_atINTEGERUnix epoch milliseconds.

uptime_results

Historical probe results for each uptime check.

ColumnTypeDescription
idINTEGERRow ID.
check_idTEXTReferences uptime_checks.id.
timestampINTEGERUnix epoch milliseconds.
status_codeINTEGERHTTP status code returned, if any.
latency_msINTEGERResponse latency in milliseconds.
is_upINTEGER1 if the check passed.
error_messageTEXTFailure reason, if any.

alert_rules

Configured alert rules.

ColumnTypeDescription
idTEXTRule ID.
nameTEXTDisplay name.
metricTEXTMetric name being evaluated.
serviceTEXTService filter, or NULL for all.
operatorTEXT'gt', 'lt', or 'anomaly'.
thresholdREALThreshold value for gt/lt rules.
z_thresholdREALZ-score threshold for anomaly rules.
window_minutesINTEGEREvaluation window.
stateTEXT'ok', 'pending', 'firing', 'cooldown', or 'resolved'.
last_fired_atINTEGERUnix epoch milliseconds, or NULL.
notification_channelsTEXTJSON array of notification channels.

dashboards

Saved custom dashboards.

ColumnTypeDescription
idTEXTDashboard ID.
nameTEXTDisplay name.
panels_jsonTEXTJSON array of panel definitions.
created_atINTEGERUnix epoch seconds.
updated_atINTEGERUnix epoch seconds.