dashboards: Use @grafanamaturity(NeedsExpertReview) in schema (#56888)

This commit is contained in:
sam boyer 2022-10-14 05:10:39 -04:00 committed by GitHub
parent b374b01260
commit 7767002e12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -24,21 +24,21 @@ seqs: [
// Description of dashboard. // Description of dashboard.
description?: string description?: string
gnetId?: string @reviewme() gnetId?: string @grafanamaturity(NeedsExpertReview)
// Tags associated with dashboard. // Tags associated with dashboard.
tags?: [...string] @reviewme() tags?: [...string] @grafanamaturity(NeedsExpertReview)
// Theme of dashboard. // Theme of dashboard.
style: "light" | *"dark" @reviewme() style: "light" | *"dark" @grafanamaturity(NeedsExpertReview)
// Timezone of dashboard, // Timezone of dashboard,
timezone?: *"browser" | "utc" | "" @reviewme() timezone?: *"browser" | "utc" | "" @grafanamaturity(NeedsExpertReview)
// Whether a dashboard is editable or not. // Whether a dashboard is editable or not.
editable: bool | *true editable: bool | *true
graphTooltip: #DashboardCursorSync @reviewme() graphTooltip: #DashboardCursorSync @grafanamaturity(NeedsExpertReview)
// Time range for dashboard, e.g. last 6 hours, last 7 days, etc // Time range for dashboard, e.g. last 6 hours, last 7 days, etc
time?: { time?: {
from: string | *"now-6h" from: string | *"now-6h"
to: string | *"now" to: string | *"now"
} @reviewme() } @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
// TODO this appears to be spread all over in the frontend. Concepts will likely need tidying in tandem with schema changes // TODO this appears to be spread all over in the frontend. Concepts will likely need tidying in tandem with schema changes
@ -53,33 +53,33 @@ seqs: [
refresh_intervals: [...string] | *["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"] refresh_intervals: [...string] | *["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"]
// TODO docs // TODO docs
time_options: [...string] | *["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] time_options: [...string] | *["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"]
} @reviewme() } @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
fiscalYearStartMonth?: uint8 & <13 @reviewme() fiscalYearStartMonth?: uint8 & <13 @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
liveNow?: bool @reviewme() liveNow?: bool @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
weekStart?: string @reviewme() weekStart?: string @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
refresh?: string | false @reviewme() refresh?: string | false @grafanamaturity(NeedsExpertReview)
// Version of the JSON schema, incremented each time a Grafana update brings // Version of the JSON schema, incremented each time a Grafana update brings
// changes to said schema. // changes to said schema.
// TODO this is the existing schema numbering system. It will be replaced by Thema's themaVersion // TODO this is the existing schema numbering system. It will be replaced by Thema's themaVersion
schemaVersion: uint16 | *36 @reviewme() schemaVersion: uint16 | *36
// Version of the dashboard, incremented each time the dashboard is updated. // Version of the dashboard, incremented each time the dashboard is updated.
version?: uint32 @reviewme() version?: uint32 @grafanamaturity(NeedsExpertReview)
panels?: [...(#Panel | #RowPanel | #GraphPanel | #HeatmapPanel)] @reviewme() panels?: [...(#Panel | #RowPanel | #GraphPanel | #HeatmapPanel)] @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
templating?: { templating?: {
list: [...#VariableModel] @reviewme() list: [...#VariableModel] @grafanamaturity(NeedsExpertReview)
} }
// TODO docs // TODO docs
annotations?: { annotations?: {
list: [...#AnnotationQuery] @reviewme() list: [...#AnnotationQuery] @grafanamaturity(NeedsExpertReview)
} }
// TODO docs // TODO docs
links?: [...#DashboardLink] @reviewme() links?: [...#DashboardLink] @grafanamaturity(NeedsExpertReview)
/////////////////////////////////////// ///////////////////////////////////////
// Definitions (referenced above) are declared below // Definitions (referenced above) are declared below
@ -91,22 +91,22 @@ seqs: [
datasource: { datasource: {
type?: string type?: string
uid?: string uid?: string
} @reviewme() } @grafanamaturity(NeedsExpertReview)
// Whether annotation is enabled. // Whether annotation is enabled.
enable: bool | *true @reviewme() enable: bool | *true @grafanamaturity(NeedsExpertReview)
// Name of annotation. // Name of annotation.
name?: string @reviewme() name?: string @grafanamaturity(NeedsExpertReview)
builtIn: uint8 | *0 @reviewme() // TODO should this be persisted at all? builtIn: uint8 | *0 @grafanamaturity(NeedsExpertReview) // TODO should this be persisted at all?
// Whether to hide annotation. // Whether to hide annotation.
hide?: bool | *false @reviewme() hide?: bool | *false @grafanamaturity(NeedsExpertReview)
// Annotation icon color. // Annotation icon color.
iconColor?: string @reviewme() iconColor?: string @grafanamaturity(NeedsExpertReview)
type: string | *"dashboard" @reviewme() type: string | *"dashboard" @grafanamaturity(NeedsExpertReview)
// Query for annotation data. // Query for annotation data.
rawQuery?: string @reviewme() rawQuery?: string @grafanamaturity(NeedsExpertReview)
showIn: uint8 | *0 @reviewme() showIn: uint8 | *0 @grafanamaturity(NeedsExpertReview)
target?: #Target @reviewme() // TODO currently a generic in AnnotationQuery target?: #Target @grafanamaturity(NeedsExpertReview) // TODO currently a generic in AnnotationQuery
} @cuetsy(kind="interface") } @cuetsy(kind="interface")
// FROM: packages/grafana-data/src/types/templateVars.ts // FROM: packages/grafana-data/src/types/templateVars.ts
@ -118,36 +118,36 @@ seqs: [
name: string name: string
label?: string label?: string
... ...
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
// FROM public/app/features/dashboard/state/DashboardModels.ts - ish // FROM public/app/features/dashboard/state/DashboardModels.ts - ish
// TODO docs // TODO docs
#DashboardLink: { #DashboardLink: {
title: string @reviewme() title: string @grafanamaturity(NeedsExpertReview)
type: #DashboardLinkType @reviewme() type: #DashboardLinkType @grafanamaturity(NeedsExpertReview)
icon?: string @reviewme() icon?: string @grafanamaturity(NeedsExpertReview)
tooltip?: string @reviewme() tooltip?: string @grafanamaturity(NeedsExpertReview)
url?: string @reviewme() url?: string @grafanamaturity(NeedsExpertReview)
tags: [...string] @reviewme() tags: [...string] @grafanamaturity(NeedsExpertReview)
asDropdown: bool | *false @reviewme() asDropdown: bool | *false @grafanamaturity(NeedsExpertReview)
targetBlank: bool | *false @reviewme() targetBlank: bool | *false @grafanamaturity(NeedsExpertReview)
includeVars: bool | *false @reviewme() includeVars: bool | *false @grafanamaturity(NeedsExpertReview)
keepTime: bool | *false @reviewme() keepTime: bool | *false @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface") } @cuetsy(kind="interface")
// TODO docs // TODO docs
#DashboardLinkType: "link" | "dashboards" @cuetsy(kind="type") @reviewme() #DashboardLinkType: "link" | "dashboards" @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview)
// FROM: packages/grafana-data/src/types/templateVars.ts // FROM: packages/grafana-data/src/types/templateVars.ts
// TODO docs // TODO docs
// TODO this implies some wider pattern/discriminated union, probably? // TODO this implies some wider pattern/discriminated union, probably?
#VariableType: "query" | "adhoc" | "constant" | "datasource" | "interval" | "textbox" | "custom" | "system" @cuetsy(kind="type") @reviewme() #VariableType: "query" | "adhoc" | "constant" | "datasource" | "interval" | "textbox" | "custom" | "system" @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#FieldColorModeId: "thresholds" | "palette-classic" | "palette-saturated" | "continuous-GrYlRd" | "fixed" @cuetsy(kind="enum",memberNames="Thresholds|PaletteClassic|PaletteSaturated|ContinuousGrYlRd|Fixed") @reviewme() #FieldColorModeId: "thresholds" | "palette-classic" | "palette-saturated" | "continuous-GrYlRd" | "fixed" @cuetsy(kind="enum",memberNames="Thresholds|PaletteClassic|PaletteSaturated|ContinuousGrYlRd|Fixed") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#FieldColorSeriesByMode: "min" | "max" | "last" @cuetsy(kind="type") @reviewme() #FieldColorSeriesByMode: "min" | "max" | "last" @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#FieldColor: { #FieldColor: {
@ -157,48 +157,48 @@ seqs: [
fixedColor?: string fixedColor?: string
// Some visualizations need to know how to assign a series color from by value color schemes // Some visualizations need to know how to assign a series color from by value color schemes
seriesBy?: #FieldColorSeriesByMode seriesBy?: #FieldColorSeriesByMode
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
#GridPos: { #GridPos: {
// Panel // Panel
h: uint32 & >0 | *9 @reviewme() h: uint32 & >0 | *9 @grafanamaturity(NeedsExpertReview)
// Panel // Panel
w: uint32 & >0 & <=24 | *12 @reviewme() w: uint32 & >0 & <=24 | *12 @grafanamaturity(NeedsExpertReview)
// Panel x // Panel x
x: uint32 & >=0 & <24 | *0 @reviewme() x: uint32 & >=0 & <24 | *0 @grafanamaturity(NeedsExpertReview)
// Panel y // Panel y
y: uint32 & >=0 | *0 @reviewme() y: uint32 & >=0 | *0 @grafanamaturity(NeedsExpertReview)
// true if fixed // true if fixed
static?: bool @reviewme() static?: bool @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface") } @cuetsy(kind="interface")
// TODO docs // TODO docs
#Threshold: { #Threshold: {
// TODO docs // TODO docs
// FIXME the corresponding typescript field is required/non-optional, but nulls currently appear here when serializing -Infinity to JSON // FIXME the corresponding typescript field is required/non-optional, but nulls currently appear here when serializing -Infinity to JSON
value?: number @reviewme() value?: number @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
color: string @reviewme() color: string @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
// TODO are the values here enumerable into a disjunction? // TODO are the values here enumerable into a disjunction?
// Some seem to be listed in typescript comment // Some seem to be listed in typescript comment
state?: string @reviewme() state?: string @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
#ThresholdsMode: "absolute" | "percentage" @cuetsy(kind="enum") @reviewme() #ThresholdsMode: "absolute" | "percentage" @cuetsy(kind="enum") @grafanamaturity(NeedsExpertReview)
#ThresholdsConfig: { #ThresholdsConfig: {
mode: #ThresholdsMode @reviewme() mode: #ThresholdsMode @grafanamaturity(NeedsExpertReview)
// Must be sorted by 'value', first value is always -Infinity // Must be sorted by 'value', first value is always -Infinity
steps: [...#Threshold] @reviewme() steps: [...#Threshold] @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#ValueMapping: #ValueMap | #RangeMap | #RegexMap | #SpecialValueMap @cuetsy(kind="type") @reviewme() #ValueMapping: #ValueMap | #RangeMap | #RegexMap | #SpecialValueMap @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#MappingType: "value" | "range" | "regex" | "special" @cuetsy(kind="enum",memberNames="ValueToText|RangeToText|RegexToText|SpecialValue") @reviewme() #MappingType: "value" | "range" | "regex" | "special" @cuetsy(kind="enum",memberNames="ValueToText|RangeToText|RegexToText|SpecialValue") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#ValueMap: { #ValueMap: {
@ -211,11 +211,11 @@ seqs: [
type: #MappingType & "range" type: #MappingType & "range"
options: { options: {
// to and from are `number | null` in current ts, really not sure what to do // to and from are `number | null` in current ts, really not sure what to do
from: int32 @reviewme() from: int32 @grafanamaturity(NeedsExpertReview)
to: int32 @reviewme() to: int32 @grafanamaturity(NeedsExpertReview)
result: #ValueMappingResult result: #ValueMappingResult
} }
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#RegexMap: { #RegexMap: {
@ -224,7 +224,7 @@ seqs: [
pattern: string pattern: string
result: #ValueMappingResult result: #ValueMappingResult
} }
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#SpecialValueMap: { #SpecialValueMap: {
@ -234,7 +234,7 @@ seqs: [
pattern: string pattern: string
result: #ValueMappingResult result: #ValueMappingResult
} }
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
#SpecialValueMatch: "true" | "false" | "null" | "nan" | "null+nan" | "empty" @cuetsy(kind="enum",memberNames="True|False|Null|NaN|NullAndNan|Empty") #SpecialValueMatch: "true" | "false" | "null" | "nan" | "null+nan" | "empty" @cuetsy(kind="enum",memberNames="True|False|Null|NaN|NullAndNan|Empty")
@ -252,12 +252,12 @@ seqs: [
#Transformation: { #Transformation: {
id: string id: string
options: {...} options: {...}
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
// 0 for no shared crosshair or tooltip (default). // 0 for no shared crosshair or tooltip (default).
// 1 for shared crosshair. // 1 for shared crosshair.
// 2 for shared crosshair AND shared tooltip. // 2 for shared crosshair AND shared tooltip.
#DashboardCursorSync: *0 | 1 | 2 @cuetsy(kind="enum",memberNames="Off|Crosshair|Tooltip") @reviewme() #DashboardCursorSync: *0 | 1 | 2 @cuetsy(kind="enum",memberNames="Off|Crosshair|Tooltip") @grafanamaturity(NeedsExpertReview)
// Schema for panel targets is specified by datasource // Schema for panel targets is specified by datasource
// plugins. We use a placeholder definition, which the Go // plugins. We use a placeholder definition, which the Go
@ -266,182 +266,182 @@ seqs: [
// with types derived from plugins in the Instance variant. // with types derived from plugins in the Instance variant.
// When working directly from CUE, importers can extend this // When working directly from CUE, importers can extend this
// type directly to achieve the same effect. // type directly to achieve the same effect.
#Target: {...} @reviewme() #Target: {...} @grafanamaturity(NeedsExpertReview)
// Dashboard panels. Panels are canonically defined inline // Dashboard panels. Panels are canonically defined inline
// because they share a version timeline with the dashboard // because they share a version timeline with the dashboard
// schema; they do not evolve independently. // schema; they do not evolve independently.
#Panel: { #Panel: {
// The panel plugin type id. May not be empty. // The panel plugin type id. May not be empty.
type: string & strings.MinRunes(1) @reviewme() type: string & strings.MinRunes(1) @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
id?: uint32 @reviewme() id?: uint32 @grafanamaturity(NeedsExpertReview)
// FIXME this almost certainly has to be changed in favor of scuemata versions // FIXME this almost certainly has to be changed in favor of scuemata versions
pluginVersion?: string @reviewme() pluginVersion?: string @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
tags?: [...string] @reviewme() tags?: [...string] @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
targets?: [...#Target] @reviewme() targets?: [...#Target] @grafanamaturity(NeedsExpertReview)
// Panel title. // Panel title.
title?: string @reviewme() title?: string @grafanamaturity(NeedsExpertReview)
// Description. // Description.
description?: string @reviewme() description?: string @grafanamaturity(NeedsExpertReview)
// Whether to display the panel without a background. // Whether to display the panel without a background.
transparent: bool | *false @reviewme() transparent: bool | *false @grafanamaturity(NeedsExpertReview)
// The datasource used in all targets. // The datasource used in all targets.
datasource?: { datasource?: {
type?: string type?: string
uid?: string uid?: string
} @reviewme() } @grafanamaturity(NeedsExpertReview)
// Grid position. // Grid position.
gridPos?: #GridPos gridPos?: #GridPos
// Panel links. // Panel links.
// TODO fill this out - seems there are a couple variants? // TODO fill this out - seems there are a couple variants?
links?: [...#DashboardLink] @reviewme() links?: [...#DashboardLink] @grafanamaturity(NeedsExpertReview)
// Name of template variable to repeat for. // Name of template variable to repeat for.
repeat?: string @reviewme() repeat?: string @grafanamaturity(NeedsExpertReview)
// Direction to repeat in if 'repeat' is set. // Direction to repeat in if 'repeat' is set.
// "h" for horizontal, "v" for vertical. // "h" for horizontal, "v" for vertical.
repeatDirection: *"h" | "v" @reviewme() repeatDirection: *"h" | "v" @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
maxDataPoints?: number @reviewme() maxDataPoints?: number @grafanamaturity(NeedsExpertReview)
// TODO docs - seems to be an old field from old dashboard alerts? // TODO docs - seems to be an old field from old dashboard alerts?
thresholds?: [...] @reviewme() thresholds?: [...] @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
timeRegions?: [...] @reviewme() timeRegions?: [...] @grafanamaturity(NeedsExpertReview)
transformations: [...#Transformation] @reviewme() transformations: [...#Transformation] @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
// TODO tighter constraint // TODO tighter constraint
interval?: string @reviewme() interval?: string @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
// TODO tighter constraint // TODO tighter constraint
timeFrom?: string @reviewme() timeFrom?: string @grafanamaturity(NeedsExpertReview)
// TODO docs // TODO docs
// TODO tighter constraint // TODO tighter constraint
timeShift?: string @reviewme() timeShift?: string @grafanamaturity(NeedsExpertReview)
// options is specified by the PanelOptions field in panel // options is specified by the PanelOptions field in panel
// plugin schemas. // plugin schemas.
options: {...} @reviewme() options: {...} @grafanamaturity(NeedsExpertReview)
fieldConfig: #FieldConfigSource fieldConfig: #FieldConfigSource
} @cuetsy(kind="interface") @grafana(TSVeneer="type") @reviewme() } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview)
#FieldConfigSource: { #FieldConfigSource: {
defaults: #FieldConfig defaults: #FieldConfig
overrides: [...{ overrides: [...{
matcher: #MatcherConfig matcher: #MatcherConfig
properties: [...#DynamicConfigValue] properties: [...#DynamicConfigValue]
}] @reviewme() }] @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface") @grafana(TSVeneer="type") @reviewme() } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview)
#MatcherConfig: { #MatcherConfig: {
id: string | *"" @reviewme() id: string | *"" @grafanamaturity(NeedsExpertReview)
options?: _ @reviewme() options?: _ @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface") } @cuetsy(kind="interface")
#DynamicConfigValue: { #DynamicConfigValue: {
id: string | *"" @reviewme() id: string | *"" @grafanamaturity(NeedsExpertReview)
value?: _ @reviewme() value?: _ @grafanamaturity(NeedsExpertReview)
} }
#FieldConfig: { #FieldConfig: {
// The display value for this field. This supports template variables blank is auto // The display value for this field. This supports template variables blank is auto
displayName?: string @reviewme() displayName?: string @grafanamaturity(NeedsExpertReview)
// This can be used by data sources that return and explicit naming structure for values and labels // This can be used by data sources that return and explicit naming structure for values and labels
// When this property is configured, this value is used rather than the default naming strategy. // When this property is configured, this value is used rather than the default naming strategy.
displayNameFromDS?: string @reviewme() displayNameFromDS?: string @grafanamaturity(NeedsExpertReview)
// Human readable field metadata // Human readable field metadata
description?: string @reviewme() description?: string @grafanamaturity(NeedsExpertReview)
// An explict path to the field in the datasource. When the frame meta includes a path, // An explict path to the field in the datasource. When the frame meta includes a path,
// This will default to `${frame.meta.path}/${field.name} // This will default to `${frame.meta.path}/${field.name}
// //
// When defined, this value can be used as an identifier within the datasource scope, and // When defined, this value can be used as an identifier within the datasource scope, and
// may be used to update the results // may be used to update the results
path?: string @reviewme() path?: string @grafanamaturity(NeedsExpertReview)
// True if data source can write a value to the path. Auth/authz are supported separately // True if data source can write a value to the path. Auth/authz are supported separately
writeable?: bool @reviewme() writeable?: bool @grafanamaturity(NeedsExpertReview)
// True if data source field supports ad-hoc filters // True if data source field supports ad-hoc filters
filterable?: bool @reviewme() filterable?: bool @grafanamaturity(NeedsExpertReview)
// Numeric Options // Numeric Options
unit?: string @reviewme() unit?: string @grafanamaturity(NeedsExpertReview)
// Significant digits (for display) // Significant digits (for display)
decimals?: number @reviewme() decimals?: number @grafanamaturity(NeedsExpertReview)
min?: number @reviewme() min?: number @grafanamaturity(NeedsExpertReview)
max?: number @reviewme() max?: number @grafanamaturity(NeedsExpertReview)
// Convert input values into a display string // Convert input values into a display string
mappings?: [...#ValueMapping] @reviewme() mappings?: [...#ValueMapping] @grafanamaturity(NeedsExpertReview)
// Map numeric values to states // Map numeric values to states
thresholds?: #ThresholdsConfig @reviewme() thresholds?: #ThresholdsConfig @grafanamaturity(NeedsExpertReview)
// Map values to a display color // Map values to a display color
color?: #FieldColor @reviewme() color?: #FieldColor @grafanamaturity(NeedsExpertReview)
// Used when reducing field values // Used when reducing field values
// nullValueMode?: NullValueMode // nullValueMode?: NullValueMode
// The behavior when clicking on a result // The behavior when clicking on a result
links?: [...] @reviewme() links?: [...] @grafanamaturity(NeedsExpertReview)
// Alternative to empty string // Alternative to empty string
noValue?: string @reviewme() noValue?: string @grafanamaturity(NeedsExpertReview)
// custom is specified by the PanelFieldConfig field // custom is specified by the PanelFieldConfig field
// in panel plugin schemas. // in panel plugin schemas.
custom?: {...} @reviewme() custom?: {...} @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface") @grafana(TSVeneer="type") @reviewme() } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview)
// Row panel // Row panel
#RowPanel: { #RowPanel: {
type: "row" @reviewme() type: "row" @grafanamaturity(NeedsExpertReview)
collapsed: bool | *false @reviewme() collapsed: bool | *false @grafanamaturity(NeedsExpertReview)
title?: string @reviewme() title?: string @grafanamaturity(NeedsExpertReview)
// Name of default datasource. // Name of default datasource.
datasource?: { datasource?: {
type?: string @reviewme() type?: string @grafanamaturity(NeedsExpertReview)
uid?: string @reviewme() uid?: string @grafanamaturity(NeedsExpertReview)
} @reviewme() } @grafanamaturity(NeedsExpertReview)
gridPos?: #GridPos gridPos?: #GridPos
id: uint32 @reviewme() id: uint32 @grafanamaturity(NeedsExpertReview)
panels: [...(#Panel | #GraphPanel | #HeatmapPanel)] @reviewme() panels: [...(#Panel | #GraphPanel | #HeatmapPanel)] @grafanamaturity(NeedsExpertReview)
// Name of template variable to repeat for. // Name of template variable to repeat for.
repeat?: string @reviewme() repeat?: string @grafanamaturity(NeedsExpertReview)
} @cuetsy(kind="interface") @reviewme() } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview)
// Support for legacy graph and heatmap panels. // Support for legacy graph and heatmap panels.
#GraphPanel: { #GraphPanel: {
type: "graph" @reviewme() type: "graph" @grafanamaturity(NeedsExpertReview)
... ...
} @reviewme() } @grafanamaturity(NeedsExpertReview)
#HeatmapPanel: { #HeatmapPanel: {
type: "heatmap" @reviewme() type: "heatmap" @grafanamaturity(NeedsExpertReview)
... ...
} @reviewme() } @grafanamaturity(NeedsExpertReview)
}, },
] ]
}, },