diff --git a/pkg/coremodel/dashboard/coremodel.cue b/pkg/coremodel/dashboard/coremodel.cue index c6ff050c2fb..a21fd17acbd 100644 --- a/pkg/coremodel/dashboard/coremodel.cue +++ b/pkg/coremodel/dashboard/coremodel.cue @@ -24,21 +24,21 @@ seqs: [ // Description of dashboard. description?: string - gnetId?: string @reviewme() + gnetId?: string @grafanamaturity(NeedsExpertReview) // Tags associated with dashboard. - tags?: [...string] @reviewme() + tags?: [...string] @grafanamaturity(NeedsExpertReview) // Theme of dashboard. - style: "light" | *"dark" @reviewme() + style: "light" | *"dark" @grafanamaturity(NeedsExpertReview) // Timezone of dashboard, - timezone?: *"browser" | "utc" | "" @reviewme() + timezone?: *"browser" | "utc" | "" @grafanamaturity(NeedsExpertReview) // Whether a dashboard is editable or not. editable: bool | *true - graphTooltip: #DashboardCursorSync @reviewme() + graphTooltip: #DashboardCursorSync @grafanamaturity(NeedsExpertReview) // Time range for dashboard, e.g. last 6 hours, last 7 days, etc time?: { from: string | *"now-6h" to: string | *"now" - } @reviewme() + } @grafanamaturity(NeedsExpertReview) // TODO docs // 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"] // TODO docs time_options: [...string] | *["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - } @reviewme() + } @grafanamaturity(NeedsExpertReview) // TODO docs - fiscalYearStartMonth?: uint8 & <13 @reviewme() + fiscalYearStartMonth?: uint8 & <13 @grafanamaturity(NeedsExpertReview) // TODO docs - liveNow?: bool @reviewme() + liveNow?: bool @grafanamaturity(NeedsExpertReview) // TODO docs - weekStart?: string @reviewme() + weekStart?: string @grafanamaturity(NeedsExpertReview) // TODO docs - refresh?: string | false @reviewme() + refresh?: string | false @grafanamaturity(NeedsExpertReview) // Version of the JSON schema, incremented each time a Grafana update brings // changes to said schema. // 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?: uint32 @reviewme() - panels?: [...(#Panel | #RowPanel | #GraphPanel | #HeatmapPanel)] @reviewme() + version?: uint32 @grafanamaturity(NeedsExpertReview) + panels?: [...(#Panel | #RowPanel | #GraphPanel | #HeatmapPanel)] @grafanamaturity(NeedsExpertReview) // TODO docs templating?: { - list: [...#VariableModel] @reviewme() + list: [...#VariableModel] @grafanamaturity(NeedsExpertReview) } // TODO docs annotations?: { - list: [...#AnnotationQuery] @reviewme() + list: [...#AnnotationQuery] @grafanamaturity(NeedsExpertReview) } // TODO docs - links?: [...#DashboardLink] @reviewme() + links?: [...#DashboardLink] @grafanamaturity(NeedsExpertReview) /////////////////////////////////////// // Definitions (referenced above) are declared below @@ -91,22 +91,22 @@ seqs: [ datasource: { type?: string uid?: string - } @reviewme() + } @grafanamaturity(NeedsExpertReview) // Whether annotation is enabled. - enable: bool | *true @reviewme() + enable: bool | *true @grafanamaturity(NeedsExpertReview) // Name of annotation. - name?: string @reviewme() - builtIn: uint8 | *0 @reviewme() // TODO should this be persisted at all? + name?: string @grafanamaturity(NeedsExpertReview) + builtIn: uint8 | *0 @grafanamaturity(NeedsExpertReview) // TODO should this be persisted at all? // Whether to hide annotation. - hide?: bool | *false @reviewme() + hide?: bool | *false @grafanamaturity(NeedsExpertReview) // Annotation icon color. - iconColor?: string @reviewme() - type: string | *"dashboard" @reviewme() + iconColor?: string @grafanamaturity(NeedsExpertReview) + type: string | *"dashboard" @grafanamaturity(NeedsExpertReview) // Query for annotation data. - rawQuery?: string @reviewme() - showIn: uint8 | *0 @reviewme() - target?: #Target @reviewme() // TODO currently a generic in AnnotationQuery + rawQuery?: string @grafanamaturity(NeedsExpertReview) + showIn: uint8 | *0 @grafanamaturity(NeedsExpertReview) + target?: #Target @grafanamaturity(NeedsExpertReview) // TODO currently a generic in AnnotationQuery } @cuetsy(kind="interface") // FROM: packages/grafana-data/src/types/templateVars.ts @@ -118,36 +118,36 @@ seqs: [ name: string label?: string ... - } @cuetsy(kind="interface") @reviewme() + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // FROM public/app/features/dashboard/state/DashboardModels.ts - ish // TODO docs #DashboardLink: { - title: string @reviewme() - type: #DashboardLinkType @reviewme() - icon?: string @reviewme() - tooltip?: string @reviewme() - url?: string @reviewme() - tags: [...string] @reviewme() - asDropdown: bool | *false @reviewme() - targetBlank: bool | *false @reviewme() - includeVars: bool | *false @reviewme() - keepTime: bool | *false @reviewme() + title: string @grafanamaturity(NeedsExpertReview) + type: #DashboardLinkType @grafanamaturity(NeedsExpertReview) + icon?: string @grafanamaturity(NeedsExpertReview) + tooltip?: string @grafanamaturity(NeedsExpertReview) + url?: string @grafanamaturity(NeedsExpertReview) + tags: [...string] @grafanamaturity(NeedsExpertReview) + asDropdown: bool | *false @grafanamaturity(NeedsExpertReview) + targetBlank: bool | *false @grafanamaturity(NeedsExpertReview) + includeVars: bool | *false @grafanamaturity(NeedsExpertReview) + keepTime: bool | *false @grafanamaturity(NeedsExpertReview) } @cuetsy(kind="interface") // 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 // TODO docs // 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 - #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 - #FieldColorSeriesByMode: "min" | "max" | "last" @cuetsy(kind="type") @reviewme() + #FieldColorSeriesByMode: "min" | "max" | "last" @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview) // TODO docs #FieldColor: { @@ -157,48 +157,48 @@ seqs: [ fixedColor?: string // Some visualizations need to know how to assign a series color from by value color schemes seriesBy?: #FieldColorSeriesByMode - } @cuetsy(kind="interface") @reviewme() + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) #GridPos: { // Panel - h: uint32 & >0 | *9 @reviewme() + h: uint32 & >0 | *9 @grafanamaturity(NeedsExpertReview) // Panel - w: uint32 & >0 & <=24 | *12 @reviewme() + w: uint32 & >0 & <=24 | *12 @grafanamaturity(NeedsExpertReview) // Panel x - x: uint32 & >=0 & <24 | *0 @reviewme() + x: uint32 & >=0 & <24 | *0 @grafanamaturity(NeedsExpertReview) // Panel y - y: uint32 & >=0 | *0 @reviewme() + y: uint32 & >=0 | *0 @grafanamaturity(NeedsExpertReview) // true if fixed - static?: bool @reviewme() + static?: bool @grafanamaturity(NeedsExpertReview) } @cuetsy(kind="interface") // TODO docs #Threshold: { // TODO docs // 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 - color: string @reviewme() + color: string @grafanamaturity(NeedsExpertReview) // TODO docs // TODO are the values here enumerable into a disjunction? // Some seem to be listed in typescript comment - state?: string @reviewme() - } @cuetsy(kind="interface") @reviewme() + state?: string @grafanamaturity(NeedsExpertReview) + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) - #ThresholdsMode: "absolute" | "percentage" @cuetsy(kind="enum") @reviewme() + #ThresholdsMode: "absolute" | "percentage" @cuetsy(kind="enum") @grafanamaturity(NeedsExpertReview) #ThresholdsConfig: { - mode: #ThresholdsMode @reviewme() + mode: #ThresholdsMode @grafanamaturity(NeedsExpertReview) // Must be sorted by 'value', first value is always -Infinity - steps: [...#Threshold] @reviewme() - } @cuetsy(kind="interface") @reviewme() + steps: [...#Threshold] @grafanamaturity(NeedsExpertReview) + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // TODO docs - #ValueMapping: #ValueMap | #RangeMap | #RegexMap | #SpecialValueMap @cuetsy(kind="type") @reviewme() + #ValueMapping: #ValueMap | #RangeMap | #RegexMap | #SpecialValueMap @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview) // 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 #ValueMap: { @@ -211,11 +211,11 @@ seqs: [ type: #MappingType & "range" options: { // to and from are `number | null` in current ts, really not sure what to do - from: int32 @reviewme() - to: int32 @reviewme() + from: int32 @grafanamaturity(NeedsExpertReview) + to: int32 @grafanamaturity(NeedsExpertReview) result: #ValueMappingResult } - } @cuetsy(kind="interface") @reviewme() + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // TODO docs #RegexMap: { @@ -224,7 +224,7 @@ seqs: [ pattern: string result: #ValueMappingResult } - } @cuetsy(kind="interface") @reviewme() + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // TODO docs #SpecialValueMap: { @@ -234,7 +234,7 @@ seqs: [ pattern: string result: #ValueMappingResult } - } @cuetsy(kind="interface") @reviewme() + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // TODO docs #SpecialValueMatch: "true" | "false" | "null" | "nan" | "null+nan" | "empty" @cuetsy(kind="enum",memberNames="True|False|Null|NaN|NullAndNan|Empty") @@ -252,12 +252,12 @@ seqs: [ #Transformation: { id: string options: {...} - } @cuetsy(kind="interface") @reviewme() + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // 0 for no shared crosshair or tooltip (default). // 1 for shared crosshair. // 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 // plugins. We use a placeholder definition, which the Go @@ -266,182 +266,182 @@ seqs: [ // with types derived from plugins in the Instance variant. // When working directly from CUE, importers can extend this // type directly to achieve the same effect. - #Target: {...} @reviewme() + #Target: {...} @grafanamaturity(NeedsExpertReview) // Dashboard panels. Panels are canonically defined inline // because they share a version timeline with the dashboard // schema; they do not evolve independently. #Panel: { // The panel plugin type id. May not be empty. - type: string & strings.MinRunes(1) @reviewme() + type: string & strings.MinRunes(1) @grafanamaturity(NeedsExpertReview) // TODO docs - id?: uint32 @reviewme() + id?: uint32 @grafanamaturity(NeedsExpertReview) // FIXME this almost certainly has to be changed in favor of scuemata versions - pluginVersion?: string @reviewme() + pluginVersion?: string @grafanamaturity(NeedsExpertReview) // TODO docs - tags?: [...string] @reviewme() + tags?: [...string] @grafanamaturity(NeedsExpertReview) // TODO docs - targets?: [...#Target] @reviewme() + targets?: [...#Target] @grafanamaturity(NeedsExpertReview) // Panel title. - title?: string @reviewme() + title?: string @grafanamaturity(NeedsExpertReview) // Description. - description?: string @reviewme() + description?: string @grafanamaturity(NeedsExpertReview) // Whether to display the panel without a background. - transparent: bool | *false @reviewme() + transparent: bool | *false @grafanamaturity(NeedsExpertReview) // The datasource used in all targets. datasource?: { type?: string uid?: string - } @reviewme() + } @grafanamaturity(NeedsExpertReview) // Grid position. gridPos?: #GridPos // Panel links. // TODO fill this out - seems there are a couple variants? - links?: [...#DashboardLink] @reviewme() + links?: [...#DashboardLink] @grafanamaturity(NeedsExpertReview) // Name of template variable to repeat for. - repeat?: string @reviewme() + repeat?: string @grafanamaturity(NeedsExpertReview) // Direction to repeat in if 'repeat' is set. // "h" for horizontal, "v" for vertical. - repeatDirection: *"h" | "v" @reviewme() + repeatDirection: *"h" | "v" @grafanamaturity(NeedsExpertReview) // TODO docs - maxDataPoints?: number @reviewme() + maxDataPoints?: number @grafanamaturity(NeedsExpertReview) // TODO docs - seems to be an old field from old dashboard alerts? - thresholds?: [...] @reviewme() + thresholds?: [...] @grafanamaturity(NeedsExpertReview) // TODO docs - timeRegions?: [...] @reviewme() + timeRegions?: [...] @grafanamaturity(NeedsExpertReview) - transformations: [...#Transformation] @reviewme() + transformations: [...#Transformation] @grafanamaturity(NeedsExpertReview) // TODO docs // TODO tighter constraint - interval?: string @reviewme() + interval?: string @grafanamaturity(NeedsExpertReview) // TODO docs // TODO tighter constraint - timeFrom?: string @reviewme() + timeFrom?: string @grafanamaturity(NeedsExpertReview) // TODO docs // TODO tighter constraint - timeShift?: string @reviewme() + timeShift?: string @grafanamaturity(NeedsExpertReview) // options is specified by the PanelOptions field in panel // plugin schemas. - options: {...} @reviewme() + options: {...} @grafanamaturity(NeedsExpertReview) fieldConfig: #FieldConfigSource - } @cuetsy(kind="interface") @grafana(TSVeneer="type") @reviewme() + } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview) #FieldConfigSource: { defaults: #FieldConfig overrides: [...{ matcher: #MatcherConfig properties: [...#DynamicConfigValue] - }] @reviewme() - } @cuetsy(kind="interface") @grafana(TSVeneer="type") @reviewme() + }] @grafanamaturity(NeedsExpertReview) + } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview) #MatcherConfig: { - id: string | *"" @reviewme() - options?: _ @reviewme() + id: string | *"" @grafanamaturity(NeedsExpertReview) + options?: _ @grafanamaturity(NeedsExpertReview) } @cuetsy(kind="interface") #DynamicConfigValue: { - id: string | *"" @reviewme() - value?: _ @reviewme() + id: string | *"" @grafanamaturity(NeedsExpertReview) + value?: _ @grafanamaturity(NeedsExpertReview) } #FieldConfig: { // 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 // 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 - description?: string @reviewme() + description?: string @grafanamaturity(NeedsExpertReview) // 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} // // When defined, this value can be used as an identifier within the datasource scope, and // 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 - writeable?: bool @reviewme() + writeable?: bool @grafanamaturity(NeedsExpertReview) // True if data source field supports ad-hoc filters - filterable?: bool @reviewme() + filterable?: bool @grafanamaturity(NeedsExpertReview) // Numeric Options - unit?: string @reviewme() + unit?: string @grafanamaturity(NeedsExpertReview) // Significant digits (for display) - decimals?: number @reviewme() + decimals?: number @grafanamaturity(NeedsExpertReview) - min?: number @reviewme() - max?: number @reviewme() + min?: number @grafanamaturity(NeedsExpertReview) + max?: number @grafanamaturity(NeedsExpertReview) // Convert input values into a display string - mappings?: [...#ValueMapping] @reviewme() + mappings?: [...#ValueMapping] @grafanamaturity(NeedsExpertReview) // Map numeric values to states - thresholds?: #ThresholdsConfig @reviewme() + thresholds?: #ThresholdsConfig @grafanamaturity(NeedsExpertReview) // Map values to a display color - color?: #FieldColor @reviewme() + color?: #FieldColor @grafanamaturity(NeedsExpertReview) // Used when reducing field values // nullValueMode?: NullValueMode // The behavior when clicking on a result - links?: [...] @reviewme() + links?: [...] @grafanamaturity(NeedsExpertReview) // Alternative to empty string - noValue?: string @reviewme() + noValue?: string @grafanamaturity(NeedsExpertReview) // custom is specified by the PanelFieldConfig field // in panel plugin schemas. - custom?: {...} @reviewme() - } @cuetsy(kind="interface") @grafana(TSVeneer="type") @reviewme() + custom?: {...} @grafanamaturity(NeedsExpertReview) + } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview) // Row panel #RowPanel: { - type: "row" @reviewme() - collapsed: bool | *false @reviewme() - title?: string @reviewme() + type: "row" @grafanamaturity(NeedsExpertReview) + collapsed: bool | *false @grafanamaturity(NeedsExpertReview) + title?: string @grafanamaturity(NeedsExpertReview) // Name of default datasource. datasource?: { - type?: string @reviewme() - uid?: string @reviewme() - } @reviewme() + type?: string @grafanamaturity(NeedsExpertReview) + uid?: string @grafanamaturity(NeedsExpertReview) + } @grafanamaturity(NeedsExpertReview) gridPos?: #GridPos - id: uint32 @reviewme() - panels: [...(#Panel | #GraphPanel | #HeatmapPanel)] @reviewme() + id: uint32 @grafanamaturity(NeedsExpertReview) + panels: [...(#Panel | #GraphPanel | #HeatmapPanel)] @grafanamaturity(NeedsExpertReview) // Name of template variable to repeat for. - repeat?: string @reviewme() - } @cuetsy(kind="interface") @reviewme() + repeat?: string @grafanamaturity(NeedsExpertReview) + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // Support for legacy graph and heatmap panels. #GraphPanel: { - type: "graph" @reviewme() + type: "graph" @grafanamaturity(NeedsExpertReview) ... - } @reviewme() + } @grafanamaturity(NeedsExpertReview) #HeatmapPanel: { - type: "heatmap" @reviewme() + type: "heatmap" @grafanamaturity(NeedsExpertReview) ... - } @reviewme() + } @grafanamaturity(NeedsExpertReview) }, ] },