Dashboard
Field reference and a complete example manifest for the Dashboard Kind.
Dashboard
A panel-and-layout dashboard, git as its only write path by design; there is no console dashboard builder and there never will be one. metadata.name is the natural key, unique per organization.
The spec shape adopts Perses' panel, layout and datasource structure under up0.io/v1, not Perses' own apiVersion and not Perses' own datasource plugins. upzero's data lives behind its own APIs, not behind Prometheus, Tempo or Loki, so two upzero-native query plugins stand in: Up0MonitorUptimeQuery and Up0TelemetryQuery. Panels render through upzero's own chart renderer, not an embedded Perses server.
Fields
Generated from up0 schema explain Dashboard --version v1 --output json against a live deployment.
| Field | Type | Required | Default | Meaning |
|---|---|---|---|---|
display | object | no | {} | { name: "..." }, the dashboard's own title. |
datasources | object | no | {} | Keyed by an id you choose. Today this is always { kind: Up0DataSource, spec: {} }, this organization's own data; there is no configurable external datasource. |
layouts | array of object | no | [] | Grid placement: each item positions a panel by x/y/width/height, referencing it with $ref: "#/spec/panels/<key>". |
panels | object | no | {} | Keyed by the same id layouts[].content.$ref points at. Each panel has a display.name and a plugin. Only TimeSeriesChart is supported today. |
Example
# up0/dashboards/service-overview.yaml
apiVersion: up0.io/v1
kind: Dashboard
metadata:
name: service-overview
labels:
team: platform
spec:
display:
name: Service Overview
datasources:
default:
display:
name: upzero data
default: true
plugin:
kind: Up0DataSource
spec: {}
layouts:
- kind: Grid
spec:
items:
- x: 0
y: 0
width: 12
height: 6
content:
$ref: "#/spec/panels/api_throughput"
panels:
api_throughput:
kind: Panel
spec:
display:
name: production-api request throughput (24h)
plugin:
kind: TimeSeriesChart
spec:
queries:
- kind: Up0TelemetryQuery
spec:
signal: metrics
serviceName: production-api
metricName: http.server.request.count
aggregation: throughputUp0TelemetryQuery.spec.signal is fixed to metrics; aggregation is one of errorRate, latencyP50, latencyP95, latencyP99, throughput, and metricName is required for all of them.
No direct apply path outside a sync
Dashboard has no REST create or update endpoint, deliberately; git is its only write path, not a temporary gap. The example above validates against the live schema; applying it needs a connected repository, which the local walk that verified this page's other examples could not complete (see Connect a repository).