diff --git a/.betterer.results b/.betterer.results index 6c886a6c36f..26340dde4ef 100644 --- a/.betterer.results +++ b/.betterer.results @@ -868,8 +868,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"], [0, 0, 0, "Do not use any type assertions.", "4"], - [0, 0, 0, "Do not use any type assertions.", "5"], - [0, 0, 0, "Do not use any type assertions.", "6"] + [0, 0, 0, "Do not use any type assertions.", "5"] ], "packages/grafana-toolkit/src/cli/tasks/task.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], diff --git a/docs/sources/developers/kinds/core/dashboard/schema-reference.md b/docs/sources/developers/kinds/core/dashboard/schema-reference.md index 53ebc27df99..17b617d931f 100644 --- a/docs/sources/developers/kinds/core/dashboard/schema-reference.md +++ b/docs/sources/developers/kinds/core/dashboard/schema-reference.md @@ -274,10 +274,10 @@ Thresholds configuration for the panel User-defined value for a metric that triggers visual changes in a panel when this value is met or exceeded They are used to conditionally style and color visualizations based on query results , and can be applied to most visualizations. -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `color` | string | **Yes** | | Color represents the color of the visual change that will occur in the dashboard when the threshold value is met or exceeded. | -| `value` | number | **Yes** | | Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded.
Nulls currently appear here when serializing -Infinity to JSON. | +| Property | Type | Required | Default | Description | +|----------|----------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `color` | string | **Yes** | | Color represents the color of the visual change that will occur in the dashboard when the threshold value is met or exceeded. | +| `value` | number or null | **Yes** | | Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded.
Nulls currently appear here when serializing -Infinity to JSON. | ### ValueMapping @@ -301,11 +301,11 @@ For example, if a value is within a certain range, you can configure a range val Range to match against and the result to apply when the value is within the range -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------|----------|---------|-----------------------------------------------------------------------| -| `from` | number | **Yes** | | Min value of the range. It can be null which means -Infinity | -| `result` | [ValueMappingResult](#valuemappingresult) | **Yes** | | Result used as replacement with text and color when the value matches | -| `to` | number | **Yes** | | Max value of the range. It can be null which means +Infinity | +| Property | Type | Required | Default | Description | +|----------|-------------------------------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `from` | number or null | **Yes** | | Min value of the range. It can be null which means -Infinity
Constraint: `>=-1.797693134862315708145274237317043567981E+308 & <=1.797693134862315708145274237317043567981E+308`. | +| `result` | [ValueMappingResult](#valuemappingresult) | **Yes** | | Result used as replacement with text and color when the value matches | +| `to` | number or null | **Yes** | | Max value of the range. It can be null which means +Infinity
Constraint: `>=-1.797693134862315708145274237317043567981E+308 & <=1.797693134862315708145274237317043567981E+308`. | ### ValueMappingResult diff --git a/kinds/dashboard/dashboard_kind.cue b/kinds/dashboard/dashboard_kind.cue index 30d7205553c..6be812f7220 100644 --- a/kinds/dashboard/dashboard_kind.cue +++ b/kinds/dashboard/dashboard_kind.cue @@ -197,7 +197,7 @@ lineage: schemas: [{ name: string // Optional display name label?: string - // Visibility configuration for the variable + // Visibility configuration for the variable hide: #VariableHide // Whether the variable value should be managed by URL query params or not skipUrlSync: bool | *false @@ -231,8 +231,8 @@ lineage: schemas: [{ // Options to config when to refresh a variable // `0`: Never refresh the variable - // `1`: Queries the data source every time the dashboard loads. - // `2`: Queries the data source when the dashboard time range changes. + // `1`: Queries the data source every time the dashboard loads. + // `2`: Queries the data source when the dashboard time range changes. #VariableRefresh: 0 | 1 | 2 @cuetsy(kind="enum",memberNames="never|onDashboardLoad|onTimeRangeChanged") // Determine if the variable shows on dashboard @@ -291,17 +291,17 @@ lineage: schemas: [{ #DashboardLinkType: "link" | "dashboards" @cuetsy(kind="type") // Dashboard variable type - // `query`: Query-generated list of values such as metric names, server names, sensor IDs, data centers, and so on. + // `query`: Query-generated list of values such as metric names, server names, sensor IDs, data centers, and so on. // `adhoc`: Key/value filters that are automatically added to all metric queries for a data source (Prometheus, Loki, InfluxDB, and Elasticsearch only). // `constant`: Define a hidden constant. - // `datasource`: Quickly change the data source for an entire dashboard. + // `datasource`: Quickly change the data source for an entire dashboard. // `interval`: Interval variables represent time spans. // `textbox`: Display a free text input field with an optional default value. // `custom`: Define the variable options manually using a comma-separated list. // `system`: Variables defined by Grafana. See: https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables #VariableType: "query" | "adhoc" | "constant" | "datasource" | "interval" | "textbox" | "custom" | "system" @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview) - // Color mode for a field. You can specify a single color, or select a continuous (gradient) color schemes, based on a value. + // Color mode for a field. You can specify a single color, or select a continuous (gradient) color schemes, based on a value. // Continuous color interpolates a color using the percentage of a value relative to min and max. // Accepted values are: // `thresholds`: From thresholds. Informs Grafana to take the color from the matching threshold @@ -353,10 +353,10 @@ lineage: schemas: [{ #Threshold: { // Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded. // Nulls currently appear here when serializing -Infinity to JSON. - value: number @grafanamaturity(NeedsExpertReview) + value: number | null @grafanamaturity(NeedsExpertReview) // Color represents the color of the visual change that will occur in the dashboard when the threshold value is met or exceeded. color: string @grafanamaturity(NeedsExpertReview) - } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview) + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // Thresholds can either be `absolute` (specific number) or `percentage` (relative to min or max, it will be values between 0 and 1). #ThresholdsMode: "absolute" | "percentage" @cuetsy(kind="enum",memberNames="Absolute|Percentage") @@ -368,10 +368,10 @@ lineage: schemas: [{ // Must be sorted by 'value', first value is always -Infinity steps: [...#Threshold] @grafanamaturity(NeedsExpertReview) - } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview) + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) // Allow to transform the visual representation of specific data values in a visualization, irrespective of their original units - #ValueMapping: #ValueMap | #RangeMap | #RegexMap | #SpecialValueMap @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview) @grafana(TSVeneer="type") + #ValueMapping: #ValueMap | #RangeMap | #RegexMap | #SpecialValueMap @cuetsy(kind="type") @grafanamaturity(NeedsExpertReview) // Supported value mapping types // `value`: Maps text values to a color or different display text and color. For example, you can configure a value mapping so that all instances of the value 10 appear as Perfection! rather than the number. @@ -380,7 +380,7 @@ lineage: schemas: [{ // `special`: Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. See SpecialValueMatch to see the list of special values. For example, you can configure a special value mapping so that null values appear as N/A. #MappingType: "value" | "range" | "regex" | "special" @cuetsy(kind="enum",memberNames="ValueToText|RangeToText|RegexToText|SpecialValue") @grafanamaturity(NeedsExpertReview) - // Maps text values to a color or different display text and color. + // Maps text values to a color or different display text and color. // For example, you can configure a value mapping so that all instances of the value 10 appear as Perfection! rather than the number. #ValueMap: { type: #MappingType & "value" @@ -388,22 +388,22 @@ lineage: schemas: [{ options: [string]: #ValueMappingResult } @cuetsy(kind="interface") - // Maps numerical ranges to a display text and color. + // Maps numerical ranges to a display text and color. // For example, if a value is within a certain range, you can configure a range value mapping to display Low or High rather than the number. #RangeMap: { type: #MappingType & "range" // Range to match against and the result to apply when the value is within the range options: { // Min value of the range. It can be null which means -Infinity - from: float64 + from: float64 | null // Max value of the range. It can be null which means +Infinity - to: float64 + to: float64 | null // Config to apply when the value is within the range result: #ValueMappingResult } - } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview) + } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) - // Maps regular expressions to replacement text and a color. + // Maps regular expressions to replacement text and a color. // For example, if a value is www.example.com, you can configure a regex value mapping so that Grafana displays www and truncates the domain. #RegexMap: { type: #MappingType & "regex" @@ -416,8 +416,8 @@ lineage: schemas: [{ } } @cuetsy(kind="interface") @grafanamaturity(NeedsExpertReview) - // Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. - // See SpecialValueMatch to see the list of special values. + // Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. + // See SpecialValueMatch to see the list of special values. // For example, you can configure a special value mapping so that null values appear as N/A. #SpecialValueMap: { type: #MappingType & "special" @@ -444,8 +444,8 @@ lineage: schemas: [{ index?: int32 } @cuetsy(kind="interface") - // Transformations allow to manipulate data returned by a query before the system applies a visualization. - // Using transformations you can: rename fields, join time series data, perform mathematical operations across queries, + // Transformations allow to manipulate data returned by a query before the system applies a visualization. + // Using transformations you can: rename fields, join time series data, perform mathematical operations across queries, // use the output of one transformation as the input to another transformation, etc. #DataTransformerConfig: { // Unique identifier of transformer @@ -503,7 +503,7 @@ lineage: schemas: [{ userId: uint32 @grafanamaturity(NeedsExpertReview) } @grafanamaturity(NeedsExpertReview) - // Dashboard panels are the basic visualization building blocks. + // Dashboard panels are the basic visualization building blocks. #Panel: { // The panel plugin type id. This is used to find the plugin to display the panel. type: string & strings.MinRunes(1) @@ -552,27 +552,27 @@ lineage: schemas: [{ maxDataPoints?: number // List of transformations that are applied to the panel data before rendering. - // When there are multiple transformations, Grafana applies them in the order they are listed. + // When there are multiple transformations, Grafana applies them in the order they are listed. // Each transformation creates a result set that then passes on to the next transformation in the processing pipeline. transformations: [...#DataTransformerConfig] // The min time interval setting defines a lower limit for the $__interval and $__interval_ms variables. - // This value must be formatted as a number followed by a valid time + // This value must be formatted as a number followed by a valid time // identifier like: "40s", "3d", etc. // See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options interval?: string - // Overrides the relative time range for individual panels, - // which causes them to be different than what is selected in - // the dashboard time picker in the top-right corner of the dashboard. You can use this to show metrics from different + // Overrides the relative time range for individual panels, + // which causes them to be different than what is selected in + // the dashboard time picker in the top-right corner of the dashboard. You can use this to show metrics from different // time periods or days on the same dashboard. - // The value is formatted as time operation like: `now-5m` (Last 5 minutes), `now/d` (the day so far), + // The value is formatted as time operation like: `now-5m` (Last 5 minutes), `now/d` (the day so far), // `now-5d/d`(Last 5 days), `now/w` (This week so far), `now-2y/y` (Last 2 years). // Note: Panel time overrides have no effect when the dashboard’s time range is absolute. // See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options timeFrom?: string - // Overrides the time range for individual panels by shifting its start and end relative to the time picker. + // Overrides the time range for individual panels by shifting its start and end relative to the time picker. // For example, you can shift the time range for the panel to be two hours earlier than the dashboard time picker setting `2h`. // Note: Panel time overrides have no effect when the dashboard’s time range is absolute. // See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options @@ -588,7 +588,7 @@ lineage: schemas: [{ fieldConfig: #FieldConfigSource } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview) - // The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results. + // The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results. // Each column within this structure is called a field. A field can represent a single time series or table column. // Field options allow you to change how the data is displayed in your visualizations. #FieldConfigSource: { @@ -601,8 +601,8 @@ lineage: schemas: [{ }] @grafanamaturity(NeedsExpertReview) } @cuetsy(kind="interface") @grafana(TSVeneer="type") @grafanamaturity(NeedsExpertReview) - // A library panel is a reusable panel that you can use in any dashboard. - // When you make a change to a library panel, that change propagates to all instances of where the panel is used. + // A library panel is a reusable panel that you can use in any dashboard. + // When you make a change to a library panel, that change propagates to all instances of where the panel is used. // Library panels streamline reuse of panels across multiple dashboards. #LibraryPanelRef: { // Library panel name @@ -625,7 +625,7 @@ lineage: schemas: [{ value?: _ @grafanamaturity(NeedsExpertReview) } - // The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results. + // The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results. // Each column within this structure is called a field. A field can represent a single time series or table column. // Field options allow you to change how the data is displayed in your visualizations. #FieldConfig: { @@ -664,8 +664,8 @@ lineage: schemas: [{ // `currency:` for custom a currency unit. unit?: string @grafanamaturity(NeedsExpertReview) - // Specify the number of decimals Grafana includes in the rendered value. - // If you leave this field blank, Grafana automatically truncates the number of decimals based on the value. + // Specify the number of decimals Grafana includes in the rendered value. + // If you leave this field blank, Grafana automatically truncates the number of decimals based on the value. // For example 1.1234 will display as 1.12 and 100.456 will display as 100. // To display all decimals, set the unit to `String`. decimals?: number @grafanamaturity(NeedsExpertReview) diff --git a/packages/grafana-schema/src/index.gen.ts b/packages/grafana-schema/src/index.gen.ts index 9039c55ae90..d768fcc5bd6 100644 --- a/packages/grafana-schema/src/index.gen.ts +++ b/packages/grafana-schema/src/index.gen.ts @@ -29,7 +29,11 @@ export type { FieldColorSeriesByMode, FieldColor, GridPos, + Threshold, + ThresholdsConfig, + ValueMapping, ValueMap, + RangeMap, RegexMap, SpecialValueMap, ValueMappingResult, @@ -49,6 +53,7 @@ export { FieldColorModeId, defaultGridPos, ThresholdsMode, + defaultThresholdsConfig, MappingType, SpecialValueMatch, DashboardCursorSync, @@ -70,10 +75,6 @@ export type { AnnotationQuery, VariableModel, DataSourceRef, - Threshold, - ThresholdsConfig, - ValueMapping, - RangeMap, DataTransformerConfig, Panel, FieldConfigSource, @@ -97,7 +98,6 @@ export { defaultAnnotationQuery, defaultVariableModel, VariableHide, - defaultThresholdsConfig, defaultPanel, defaultFieldConfigSource, defaultMatcherConfig, diff --git a/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts b/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts index bd48c6183d3..b67e646f01f 100644 --- a/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts +++ b/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts @@ -449,7 +449,7 @@ export interface Threshold { * Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded. * Nulls currently appear here when serializing -Infinity to JSON. */ - value: number; + value: (number | null); } /** @@ -521,11 +521,11 @@ export interface RangeMap { /** * Min value of the range. It can be null which means -Infinity */ - from: number; + from: (number | null); /** * Max value of the range. It can be null which means +Infinity */ - to: number; + to: (number | null); /** * Config to apply when the value is within the range */ diff --git a/packages/grafana-schema/src/veneer/dashboard.types.ts b/packages/grafana-schema/src/veneer/dashboard.types.ts index 5cb121762af..e9226e10bbb 100644 --- a/packages/grafana-schema/src/veneer/dashboard.types.ts +++ b/packages/grafana-schema/src/veneer/dashboard.types.ts @@ -26,10 +26,9 @@ export interface VariableModel extends Omit { +export interface Dashboard extends Omit { panels?: Array; annotations?: AnnotationContainer; - thresholds?: ThresholdsConfig; templating?: { list?: VariableModel[]; }; @@ -45,33 +44,8 @@ export interface AnnotationContainer extends Omit { - // Value represents a lower bound of a threshold. This triggers a visual change in the dashboard when a graphed value is within the bounds of a threshold. - // Nulls currently appear here when serializing -Infinity to JSON. - value: number | null; -} - -export interface ThresholdsConfig extends Omit { - steps: Threshold[]; -} - -export interface FieldConfig> extends Omit { +export interface FieldConfig> extends raw.FieldConfig { custom?: TOptions & Record; - mappings?: ValueMapping[]; -} - -export type ValueMapping = raw.ValueMap | RangeMap | raw.RegexMap | raw.SpecialValueMap; - -export interface RangeMap extends Omit { - // Range to match against and the result to apply when the value is within the range - options: { - // Min value of the range. It can be null which means -Infinity - from: number | null; - // Max value of the range. It can be null which means +Infinity - to: number | null; - // Config to apply when the value is within the range - result: raw.ValueMappingResult; - }; } export interface FieldConfigSource> extends Omit { @@ -101,4 +75,3 @@ export const defaultMatcherConfig: Partial = raw.defaultMatcherCo export const defaultAnnotationQuery: Partial = raw.defaultAnnotationQuery as AnnotationQuery; export const defaultAnnotationContainer: Partial = raw.defaultAnnotationContainer as AnnotationContainer; -export const defaultThresholdsConfig: Partial = raw.defaultThresholdsConfig as ThresholdsConfig; diff --git a/pkg/kinds/dashboard/dashboard_spec_gen.go b/pkg/kinds/dashboard/dashboard_spec_gen.go index c037f38d060..dfeac2c4409 100644 --- a/pkg/kinds/dashboard/dashboard_spec_gen.go +++ b/pkg/kinds/dashboard/dashboard_spec_gen.go @@ -612,13 +612,13 @@ type RangeMap struct { // Range to match against and the result to apply when the value is within the range Options struct { // Min value of the range. It can be null which means -Infinity - From float64 `json:"from"` + From *float32 `json:"from"` // Result used as replacement with text and color when the value matches Result ValueMappingResult `json:"result"` // Max value of the range. It can be null which means +Infinity - To float64 `json:"to"` + To *float32 `json:"to"` } `json:"options"` Type RangeMapType `json:"type"` } @@ -866,7 +866,7 @@ type Threshold struct { // Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded. // Nulls currently appear here when serializing -Infinity to JSON. - Value float32 `json:"value"` + Value *float32 `json:"value"` } // Thresholds configuration for the panel diff --git a/public/app/features/dashboard/state/DashboardMigrator.test.ts b/public/app/features/dashboard/state/DashboardMigrator.test.ts index 9b405a49535..95583e0f8ae 100644 --- a/public/app/features/dashboard/state/DashboardMigrator.test.ts +++ b/public/app/features/dashboard/state/DashboardMigrator.test.ts @@ -1162,7 +1162,6 @@ describe('DashboardModel', () => { steps: [ { color: 'green', - // @ts-expect-error value: null, }, {