mirror of https://github.com/grafana/grafana
Dashboard Schemas (#28793)
* cue mod init github.com/grafana/grafana/dashboard-schemas * dashboard-schemas: Document exporting to OpenAPI Signed-off-by: Arve Knudsen <arve.knudsen@gmail.com> Co-authored-by: Arve Knudsen <arve.knudsen@gmail.com>pull/29326/head
parent
d29f73b197
commit
a6eebc22e8
@ -0,0 +1,68 @@ |
||||
package main |
||||
|
||||
#Dashboard: { |
||||
// Unique numeric identifier for the dashboard. (generated by the db) |
||||
id: int |
||||
// Unique dashboard identifier that can be generated by anyone. string (8-40) |
||||
uid: string |
||||
// Title of dashboard. |
||||
title?: string |
||||
// Description of dashboard. |
||||
description?: string |
||||
// Tags associated with dashboard. |
||||
tags?: [...string] |
||||
// Theme of dashboard. |
||||
style: *"light" | "dark" |
||||
// Timezone of dashboard, |
||||
timezone?: *"browser" | "utc" |
||||
// Whether a dashboard is editable or not. |
||||
editable: bool | *true |
||||
// 0 for no shared crosshair or tooltip (default). |
||||
// 1 for shared crosshair. |
||||
// 2 for shared crosshair AND shared tooltip. |
||||
graphTooltip: int & >=0 & <=2 | *0 |
||||
// Time range for dashboard, e.g. last 6 hours, last 7 days, etc |
||||
time?: { |
||||
from: string | *"now-6h" |
||||
to: string | *"now" |
||||
} |
||||
// Timepicker metadata. |
||||
timepicker?: { |
||||
// Whether timepicker is collapsed or not. |
||||
collapse: bool | *false |
||||
// Whether timepicker is enabled or not. |
||||
enable: bool | *true |
||||
// Whether timepicker is visible or not. |
||||
hidden: bool | *false |
||||
// Selectable intervals for auto-refresh. |
||||
refresh_intervals: [...string] | *["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"] |
||||
} |
||||
// Templating. |
||||
templating?: list: [...{}] |
||||
// Annotations. |
||||
annotations?: list: [...{ |
||||
builtIn: int | *0 |
||||
// Datasource to use for annotation. |
||||
datasource: string |
||||
// Whether annotation is enabled. |
||||
enable?: bool | *true |
||||
// Whether to hide annotation. |
||||
hide?: bool | *false |
||||
// Annotation icon color. |
||||
iconColor?: string |
||||
// Name of annotation. |
||||
name?: string |
||||
// Query for annotation data. |
||||
rawQuery: string |
||||
showIn: int | *0 |
||||
}] | *[] |
||||
// Auto-refresh interval. |
||||
refresh: string |
||||
// Version of the JSON schema, incremented each time a Grafana update brings |
||||
// changes to said schema. |
||||
schemaVersion: int | *25 |
||||
// Version of the dashboard, incremented each time the dashboard is updated. |
||||
version: string |
||||
// Dashboard panels. |
||||
panels?: [...{}] |
||||
} |
||||
@ -0,0 +1,71 @@ |
||||
# Dashboard Schemas |
||||
|
||||
Schema description documents for [Grafana Dashboard |
||||
JSON](https://grafana.com/docs/grafana/latest/reference/dashboard/) and core |
||||
panels. |
||||
|
||||
> **Note:** This directory is experimental. The schemas are not currently |
||||
> implemented or enforced in Grafana. |
||||
|
||||
Schemas are defined in [Cue](https://cuelang.org/). Cue was chosen because it |
||||
strongly facilitates our primary use cases - [schema |
||||
definition](https://cuelang.org/docs/usecases/datadef/), [data |
||||
validation](https://cuelang.org/docs/usecases/validation/), and [code |
||||
generation/extraction](https://cuelang.org/docs/usecases/generate/). |
||||
|
||||
## Schema Organization |
||||
|
||||
Each schema describes part of a dashboard. `Dashboard.cue` is the main dashboard |
||||
schema object. All other schemas describe nested objects within a dashboard. |
||||
They are grouped in the following directories: |
||||
|
||||
* `panels` - schemas for |
||||
[panels](https://grafana.com/docs/grafana/latest/panels/panels-overview/). |
||||
* `targets` - targets represent |
||||
[queries](https://grafana.com/docs/grafana/latest/panels/queries/). Each [data |
||||
source](https://grafana.com/docs/grafana/latest/datasources/) type has a |
||||
unique target schema. |
||||
* `variables` - schemas for |
||||
[variables](https://grafana.com/docs/grafana/latest/variables/variable-types/). |
||||
* `transformations` - schemas for |
||||
[transformations](https://grafana.com/docs/grafana/latest/panels/transformations/types-options/). |
||||
|
||||
The following somewhat conveys how they fit together when constructing a |
||||
dashboard: |
||||
|
||||
``` |
||||
+-----------+ +-----------+ |
||||
| Dashboard +------> Variables | |
||||
+---------+-+ +-----------+ |
||||
| +--------+ +---------+ |
||||
+----> Panels +----> Targets | |
||||
+------+-+ +---------+ |
||||
| +-----------------+ |
||||
+------> Transformations | |
||||
+-----------------+ |
||||
``` |
||||
|
||||
## Definitions |
||||
|
||||
All schemas are [Cue |
||||
definitions](https://cuelang.org/docs/references/spec/#definitions-and-hidden-fields). |
||||
Schemas intended to be exported must begin with a capital letter. For example, |
||||
[Gauge](./panels/Gauge.cue). Definitions beginning with a lowercase letter will |
||||
not be exported. These are reusable components for constructing the exported |
||||
definitions. For example, [`#panel`](./panels/panel.cue) is intended to |
||||
be a base schema for panels. `#Gauge` extends `#panel` with the following: |
||||
|
||||
``` |
||||
#Gauge: panel & { |
||||
... |
||||
} |
||||
``` |
||||
|
||||
## Exporting OpenAPI |
||||
|
||||
[OpenAPI](https://swagger.io/specification/) schemas can be exported from these CUE sources. Use the `cue` |
||||
command as follows, to generate OpenAPI JSON to stdout: |
||||
|
||||
``` |
||||
cue export --out openapi -o - ./dashboard-schemas/... |
||||
``` |
||||
@ -0,0 +1 @@ |
||||
module: "github.com/grafana/grafana/dashboard-schemas" |
||||
@ -0,0 +1,74 @@ |
||||
package panels |
||||
|
||||
// Gauge is a single value panel that can repeat a gauge for every series, |
||||
// column or row. |
||||
#Gauge: panel & { |
||||
// Field config. |
||||
fieldConfig: { |
||||
// Defaults. |
||||
defaults: { |
||||
// Custom. |
||||
custom: {} |
||||
// Unit. |
||||
unit: string |
||||
// Min. |
||||
min: int |
||||
// Max. |
||||
max: int |
||||
// Decimals. |
||||
decimals: int |
||||
// Change the field or series name. |
||||
displayName: string |
||||
// What to show when there is no value. |
||||
noValue: string |
||||
// Threshold config. |
||||
thresholds: thresholds |
||||
// Mappings. |
||||
mappings: [...mapping] |
||||
// Data Links. |
||||
links: [...dataLink] |
||||
} |
||||
// Overrides. |
||||
overrides: [...override] |
||||
} |
||||
// Options. |
||||
options: { |
||||
// Reduce options. |
||||
reduceOptions: { |
||||
// * `true` - Show a calculated value based on all rows. |
||||
// * `false` - Show a separate stat for every row. |
||||
values: bool | *false |
||||
// If values is false, sets max number of rows to |
||||
// display. |
||||
limit: int |
||||
// Reducer function/calculation. |
||||
calcs: [ |
||||
"allIsZero", |
||||
"allIsNull", |
||||
"changeCount", |
||||
"count", |
||||
"delta", |
||||
"diff", |
||||
"distinctCount", |
||||
"first", |
||||
"firstNotNull", |
||||
"lastNotNull", |
||||
"last", |
||||
"logmin", |
||||
"max", |
||||
"min", |
||||
"range", |
||||
"step", |
||||
"sum", |
||||
] | *["mean"] |
||||
// Fields that should be included in the panel. |
||||
fields: string | *"" |
||||
} |
||||
// Render the threshold values around the gauge bar. |
||||
showThresholdLabels: bool | *false |
||||
// Render the thresholds as an outer bar. |
||||
showThresholdMarkers: bool | *true |
||||
} |
||||
// Panel type. |
||||
type: string | *"gauge" |
||||
} |
||||
@ -0,0 +1,192 @@ |
||||
package panels |
||||
|
||||
#Graph: panel & { |
||||
// Display values as a bar chart. |
||||
bars: bool | *false |
||||
// Dashed line length. |
||||
dashLength: int | *10 |
||||
// Show line with dashes. |
||||
dashes: bool | *false |
||||
// Dashed line spacing when `dashes` is true. |
||||
spaceLength: int | *10 |
||||
// Controls how many decimals are displayed for legend values and graph hover |
||||
// tooltips. |
||||
decimals: int |
||||
// Field config. |
||||
fieldConfig: { |
||||
// Defaults. |
||||
defaults: custom: {} |
||||
// Overrides. |
||||
overrides: [...override] |
||||
} |
||||
// Amount of color fill for a series. Expects a value between 0 and 1. |
||||
fill: number & >=0 & <=1 | *1 |
||||
// Degree of gradient on the area fill. 0 is no gradient, 10 is a steep |
||||
// gradient. |
||||
fillGradient: int & >=0 & <=10 | *0 |
||||
// Hide the series. |
||||
hiddenSeries: bool | *false |
||||
// Lengend options. |
||||
legend: { |
||||
// Whether to display legend in table. |
||||
alignAsTable: bool | *false |
||||
// Average of all values returned from the metric query. |
||||
avg: bool | *false |
||||
// Last value returned from the metric query. |
||||
current: bool | *false |
||||
// Maximum of all values returned from the metric query. |
||||
max: bool | *false |
||||
// Minimum of all values returned from the metric query. |
||||
min: bool | *false |
||||
// Display legend to the right. |
||||
rightSide: bool | *false |
||||
// Show or hide the legend. |
||||
show: bool | *true |
||||
// Available when `rightSide` is true. The minimum width for the legend in |
||||
// pixels. |
||||
sideWidth?: int |
||||
// Sum of all values returned from the metric query. |
||||
total: bool | *false |
||||
// Values. |
||||
values: bool | *true |
||||
} |
||||
// Display values as a line graph. |
||||
lines: bool | *true |
||||
// The width of the line for a series. |
||||
linewidth: int | *1 |
||||
// How null values are displayed. |
||||
// * 'null' - If there is a gap in the series, meaning a null value, then the |
||||
// line in the graph will be broken and show the gap. |
||||
// * 'null as zero' - If there is a gap in the series, meaning a null value, |
||||
// then it will be displayed as a zero value in the graph panel. |
||||
// * 'connected' - If there is a gap in the series, meaning a null value or |
||||
// values, then the line will skip the gap and connect to the next non-null |
||||
// value. |
||||
nullPointMode: string | *"null" |
||||
// Options. |
||||
options: { |
||||
// Data links. |
||||
dataLinks: [...dataLink] |
||||
} |
||||
// Available when `stack` is true. Each series is drawn as a percentage of the |
||||
// total of all series. |
||||
percentage: bool | *false |
||||
// Controls how large the points are. |
||||
pointradius: int |
||||
// Display points for values. |
||||
points: bool | *true |
||||
// Renderer. |
||||
renderer: string | *"flot" |
||||
// Series overrides allow a series in a graph panel to be rendered |
||||
// differently from the others. You can customize display options on a |
||||
// per-series bases or by using regex rules. For example, one series can have |
||||
// a thicker line width to make it stand out or be moved to the right Y-axis. |
||||
seriesOverrides: [...{ |
||||
// Alias or regex matching the series you'd like to target. |
||||
alias?: string |
||||
bars?: bool |
||||
lines?: bool |
||||
fill?: int |
||||
fillGradient?: int |
||||
linewidth?: int |
||||
nullPointMode?: string |
||||
fillBelowTo?: string |
||||
steppedLine?: bool |
||||
dashes?: bool |
||||
hiddenSeries?: bool |
||||
dashLength?: int |
||||
spaceLength?: int |
||||
points?: bool |
||||
pointradius?: int |
||||
stack?: int |
||||
color?: string |
||||
yaxis?: int |
||||
zindex?: int |
||||
transform?: string |
||||
legend?: bool |
||||
hideTooltip?: bool |
||||
}] |
||||
// Each series is stacked on top of another. |
||||
stack: bool | *false |
||||
// Draws adjacent points as staircase. |
||||
steppedLine: bool | *false |
||||
// Threshold config. |
||||
thresholds: thresholds |
||||
// Time from. |
||||
timeFrom: string |
||||
// Time regions. |
||||
timeRegions: [...string] |
||||
// Time shift |
||||
timeShift: string |
||||
// Tooltip settings. |
||||
tooltip: { |
||||
// * true - The hover tooltip shows all series in the graph. Grafana |
||||
// highlights the series that you are hovering over in bold in the series |
||||
// list in the tooltip. |
||||
// * false - The hover tooltip shows only a single series, the one that you |
||||
// are hovering over on the graph. |
||||
shared: bool | *true |
||||
// * 0 (none) - The order of the series in the tooltip is determined by the |
||||
// sort order in your query. For example, they could be alphabetically |
||||
// sorted by series name. |
||||
// * 1 (increasing) - The series in the hover tooltip are sorted by value |
||||
// and in increasing order, with the lowest value at the top of the list. |
||||
// * 2 (decreasing) - The series in the hover tooltip are sorted by value |
||||
// and in decreasing order, with the highest value at the top of the list. |
||||
sort: int & >=0 & <=2 | *2 |
||||
// Value type. |
||||
value_type: string | *"individual" |
||||
} |
||||
// Panel type. |
||||
type: string | *"graph" |
||||
xaxis: { |
||||
// Buckets. |
||||
buckets: string |
||||
// The display mode completely changes the visualization of the graph |
||||
// panel. It’s like three panels in one. The main mode is the time series |
||||
// mode with time on the X-axis. The other two modes are a basic bar chart |
||||
// mode with series on the X-axis instead of time and a histogram mode. |
||||
// * 'time' - The X-axis represents time and that the data is grouped by |
||||
// time (for example, by hour, or by minute). |
||||
// * 'series' - The data is grouped by series and not by time. The Y-axis |
||||
// still represents the value. |
||||
// * 'histogram' - Converts the graph into a histogram. A histogram is a |
||||
// kind of bar chart that groups numbers into ranges, often called buckets |
||||
// or bins. Taller bars show that more data falls in that range. |
||||
mode: string | *"time" |
||||
// Name. |
||||
name: string |
||||
// Show or hide the axis. |
||||
show: bool | *true |
||||
// Values |
||||
values: [...number] |
||||
} |
||||
yaxes: [...{ |
||||
// Defines how many decimals are displayed for Y value. |
||||
decimals: int |
||||
// The display unit for the Y value. |
||||
format: string | *"short" |
||||
// The Y axis label. |
||||
label: string |
||||
// The scale to use for the Y value - linear, or logarithmic. |
||||
// * 1 - linear |
||||
// * 2 - log (base 2) |
||||
// * 10 - log (base 10) |
||||
// * 32 - log (base 32) |
||||
// * 1024 - log (base 1024) |
||||
logBase: int | *1 |
||||
// The maximum Y value. |
||||
max?: int |
||||
// The minimum Y value. |
||||
min?: int |
||||
// Show or hide the axis. |
||||
show: bool | *true |
||||
}] |
||||
yaxis: { |
||||
// Align left and right Y-axes by value. |
||||
align: bool | *false |
||||
// Available when align is true. Value to use for alignment of left and |
||||
// right Y-axes, starting from Y=0. |
||||
alignLevel: int | *0 |
||||
} |
||||
} |
||||
@ -0,0 +1,24 @@ |
||||
package panels |
||||
|
||||
// A row is a logical divider within a dashboard. It is used |
||||
// to group panels together. |
||||
#Row: { |
||||
// Whether the row is collapsed or not. |
||||
collapsed: bool | *true |
||||
// Name of default data source. |
||||
datasource?: string |
||||
// Grid position. |
||||
gridPos?: gridPos |
||||
// Dashboard panels. |
||||
panels?: [...{}] |
||||
// Name of template variable to repeat for. |
||||
repeat?: string |
||||
// Whether to display the title. |
||||
showTitle: bool | *true |
||||
// Title. |
||||
title?: string |
||||
// Size of title. |
||||
titleSize: string | *"h6" |
||||
// Panel type. |
||||
type: string | *"row" |
||||
} |
||||
@ -0,0 +1,12 @@ |
||||
package panels |
||||
|
||||
gridPos: { |
||||
// Panel height. |
||||
h: int & >0 | *9 |
||||
// Panel width. |
||||
w: int & >0 <= 24 | 12 |
||||
// Panel x position. |
||||
x: int & >0 < 24 |
||||
// Panel y position. |
||||
y: int & >0 |
||||
} |
||||
@ -0,0 +1,14 @@ |
||||
package panels |
||||
|
||||
_link: { |
||||
// Link title. |
||||
title?: string |
||||
// Whether to open link in new browser tab. |
||||
targetBlank: bool | *true |
||||
// URL of link. |
||||
url: string |
||||
} |
||||
|
||||
panelLink: _link |
||||
|
||||
dataLink: _link |
||||
@ -0,0 +1,11 @@ |
||||
package panels |
||||
|
||||
mapping: { |
||||
id: int |
||||
from: string |
||||
operator: string |
||||
to: string |
||||
text: string |
||||
type: int |
||||
value: string |
||||
} |
||||
@ -0,0 +1,12 @@ |
||||
package panels |
||||
|
||||
override: { |
||||
matcher: { |
||||
id: string |
||||
options: string |
||||
} |
||||
properties: [...{ |
||||
id: string |
||||
value: int |
||||
}] |
||||
} |
||||
@ -0,0 +1,24 @@ |
||||
package panels |
||||
|
||||
panel: { |
||||
// Panel title. |
||||
title?: string |
||||
// Description. |
||||
description?: string |
||||
// Whether to display the panel without a background. |
||||
transparent: bool | *false |
||||
// Name of default datasource. |
||||
datasource?: string |
||||
// Grid position. |
||||
gridPos?: gridPos |
||||
// Panel links. |
||||
links?: [...panelLink] |
||||
// Name of template variable to repeat for. |
||||
repeat?: string |
||||
// Direction to repeat in if 'repeat' is set. |
||||
// "h" for horizontal, "v" for vertical. |
||||
repeatDirection: *"h" | "v" |
||||
// Panel targets - datasource and query configurations to use as |
||||
// a basis for vizualization. |
||||
targets?: [...{}] |
||||
} |
||||
@ -0,0 +1,11 @@ |
||||
package panels |
||||
|
||||
thresholds: { |
||||
// Threshold mode. |
||||
mode: string | *"absolute" |
||||
// Threshold steps. |
||||
steps: [...{ |
||||
color: string |
||||
value: number |
||||
}] |
||||
} |
||||
@ -0,0 +1,19 @@ |
||||
package targets |
||||
|
||||
#Prometheus: { |
||||
// Query expression. |
||||
expr: string |
||||
// Controls the name of the time series, using name or pattern. |
||||
legendFormat?: string |
||||
// Interval. |
||||
interval?: int | *1 |
||||
// Target reference ID. |
||||
refId: string |
||||
// Perform an “instant” query, to return only the latest value that |
||||
// Prometheus has scraped for the requested time series. |
||||
instant: bool | *false |
||||
// Resolution. |
||||
intervalFactor?: int |
||||
// Format. |
||||
format: *"time_series" | "table" | "heat_map" |
||||
} |
||||
@ -0,0 +1,39 @@ |
||||
package transformations |
||||
|
||||
// Add field from calculation. |
||||
#CalculateField: { |
||||
// Transformation ID. |
||||
id: string | *"calculateField" |
||||
// Configuration options. |
||||
options: { |
||||
// The name of your new field. If you leave this blank, then the field will |
||||
// be named to match the calculation. |
||||
alias: string |
||||
// Binary options. |
||||
binary: { |
||||
// Field or number for left side of equation. |
||||
left: string |
||||
// Field or number for right side of equation. |
||||
right: string |
||||
// Operator. |
||||
operator: string | *"+" |
||||
// Calculation to use. |
||||
reducer: string | *"sum" |
||||
} |
||||
// 'reduceRow' - apply selected calculation on each row of selected fields |
||||
// independently. |
||||
// 'binary' - apply basic math operation(sum, multiply, etc) on values in a |
||||
// single row from two selected fields. |
||||
mode: *"reduceRow" | "binary" |
||||
// Reduce options. |
||||
reduce: { |
||||
// Calculation to use. |
||||
reducer: string |
||||
// Fields to include in calculation. |
||||
include: [...string] |
||||
} |
||||
// Hide all other fields and display only your calculated field in the |
||||
// visualization. |
||||
replaceFields: bool | *false |
||||
} |
||||
} |
||||
@ -0,0 +1,16 @@ |
||||
package transformations |
||||
|
||||
// Reorder, hide, or rename fields/columns. |
||||
#Organize: { |
||||
// Transformation ID. |
||||
id: string | *"organize" |
||||
// Configuration options. |
||||
options: { |
||||
// Exclude fields by name. |
||||
excludeByName: {} |
||||
// Set field order by name. |
||||
indexByName: {} |
||||
// Rename a field by name. |
||||
renameByName: {} |
||||
} |
||||
} |
||||
@ -0,0 +1,9 @@ |
||||
package variables |
||||
|
||||
// Custom variables are for values that do not change. |
||||
#Custom: variable & { |
||||
// Options as comma separated values. |
||||
query: string |
||||
// Variable type. |
||||
type: string | *"custom" |
||||
} |
||||
@ -0,0 +1,18 @@ |
||||
package variables |
||||
|
||||
// Data source variables allow you to quickly change the data source for an |
||||
// entire dashboard. |
||||
#Datasource: variable & { |
||||
// Data source type. |
||||
query: string |
||||
// Query value. |
||||
queryValue: string | *"" |
||||
// Refresh. |
||||
refresh: int | *1 |
||||
// Regex filter for which data source instances to choose |
||||
// from in the variable value dropdown. Leave empty for |
||||
// all. |
||||
regex: string |
||||
// Variable type. |
||||
type: string | *"datasource" |
||||
} |
||||
@ -0,0 +1,30 @@ |
||||
package variables |
||||
|
||||
// Query variables allow you to write a data source query that can return a |
||||
// list of metric names, tag values, or keys. |
||||
#Query: variable & { |
||||
// Data source to use. |
||||
datasource: string |
||||
// Definition. |
||||
definition?: string |
||||
// Query. |
||||
query: string |
||||
// Refresh. |
||||
refresh: int | *1 |
||||
// Regex. |
||||
regex?: string |
||||
// * 0 - Disabled. |
||||
// * 1 - Alphabetical (asc). |
||||
// * 2 - Alphabetical (desc). |
||||
// * 3 - Numerical (asc). |
||||
// * 4 - Numerical (desc). |
||||
// * 5 - Alphabetical (case-insensitive, asc). |
||||
// * 6 - Alphabetical (case-insensitive, desc). |
||||
sort: int & >=0 & <=6 | *0 |
||||
tagValuesQuery?: string |
||||
tags: [...string] | *[] |
||||
tagsQuery?: string |
||||
// Variable type. |
||||
type: "query" |
||||
useTags: bool | *false |
||||
} |
||||
@ -0,0 +1,33 @@ |
||||
package variables |
||||
|
||||
variable: { |
||||
// Currently selected value. |
||||
current: { |
||||
selected: bool | *false |
||||
text: string | [...string] |
||||
value: string | [...string] |
||||
} |
||||
// Whether to hide the label and variable. |
||||
// * 0 - Show all. |
||||
// * 1 - Hide label. |
||||
// * 2 - Hide label and variable. |
||||
hide: int & >=0 & <=2 | *0 |
||||
// Enable include all option. |
||||
includeAll: bool | *false |
||||
// When includeAll is enabled, this sets its value. |
||||
allValue?: string |
||||
// Optional display name. |
||||
label?: string |
||||
// Allows mutltiple values to be selected at the same time. |
||||
multi: bool | *false |
||||
// Variable name. |
||||
name: string |
||||
// Options for variable. |
||||
options: [...{ |
||||
selected: bool |
||||
text: string |
||||
value: string |
||||
}] |
||||
// Skip URL sync. |
||||
skipUrlSync: bool | *false |
||||
} |
||||
Loading…
Reference in new issue