diff --git a/.betterer.eslint.config.js b/.betterer.eslint.config.js
index 349ee612837..32f06b160a4 100644
--- a/.betterer.eslint.config.js
+++ b/.betterer.eslint.config.js
@@ -112,7 +112,16 @@ module.exports = [
files: ['public/**/*.tsx', 'packages/grafana-ui/**/*.tsx'],
ignores: ['public/app/plugins/**', '**/*.story.tsx', '**/*.{test,spec}.{ts,tsx}', '**/__mocks__/', 'public/test'],
rules: {
- '@grafana/no-untranslated-strings': 'error',
+ '@grafana/no-untranslated-strings': [
+ 'error',
+ {
+ forceFix: [
+ // Add paths here that are happy to be auto fixed by this rule,
+ // for example
+ // 'public/app/features/alerting'
+ ],
+ },
+ ],
'@grafana/no-translation-top-level': 'error',
},
},
diff --git a/.betterer.results b/.betterer.results
index 1e0cc343e3b..52b3e8a45c2 100644
--- a/.betterer.results
+++ b/.betterer.results
@@ -5,6 +5,12 @@
//
exports[`better eslint`] = {
value: `{
+ "apps/dashboard/tshack/v0alpha1_spec_gen.ts:5381": [
+ [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
+ ],
+ "apps/dashboard/tshack/v1alpha1_spec_gen.ts:5381": [
+ [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
+ ],
"e2e/old-arch/utils/support/types.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@@ -549,11 +555,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
- "packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx:5381": [
- [0, 0, 0, "Do not use the t() function outside of a component or function", "0"],
- [0, 0, 0, "Do not use the t() function outside of a component or function", "1"],
- [0, 0, 0, "Do not use the t() function outside of a component or function", "2"]
- ],
"packages/grafana-ui/src/components/DataSourceSettings/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@@ -615,16 +616,6 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
- "packages/grafana-ui/src/components/PageLayout/PageToolbar.tsx:5381": [
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"]
- ],
- "packages/grafana-ui/src/components/Pagination/Pagination.tsx:5381": [
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
- ],
"packages/grafana-ui/src/components/PanelChrome/PanelContext.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@@ -896,7 +887,8 @@ exports[`better eslint`] = {
"public/app/app.ts:5381": [
[0, 0, 0, "\'@grafana/runtime/src/components/PanelDataErrorView\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "\'@grafana/runtime/src/components/PanelRenderer\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/runtime/src/components/PluginPage\' import is restricted from being used by a pattern. Import from the public export instead.", "2"]
+ [0, 0, 0, "\'@grafana/runtime/src/components/PluginPage\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
+ [0, 0, 0, "\'@grafana/runtime/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "3"]
],
"public/app/core/TableModel.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@@ -943,9 +935,6 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
- "public/app/core/components/AppChrome/TopBar/TopSearchBarCommandPaletteTrigger.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/themes/mixins\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/core/components/Breadcrumbs/Breadcrumbs.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
@@ -974,26 +963,18 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/core/components/GraphNG/GraphNG.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/Plot\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotConfigBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotScaleBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "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.", "7"],
- [0, 0, 0, "Do not use any type assertions.", "8"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "9"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "10"]
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "Do not use any type assertions.", "1"],
+ [0, 0, 0, "Do not use any type assertions.", "2"],
+ [0, 0, 0, "Do not use any type assertions.", "3"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "4"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "5"]
],
"public/app/core/components/GraphNG/utils.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToUndefThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "2"]
],
- "public/app/core/components/Indent/Indent.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Layout/utils/responsiveness\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/core/components/Layers/LayerDragDropList.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
@@ -1010,25 +991,14 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
- "public/app/core/components/NestedFolderPicker/NestedFolderList.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Text/Text\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/core/components/NestedFolderPicker/Trigger.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/themes/mixins\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/core/components/OptionsUI/color.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/ColorPicker/ColorSwatch\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/core/components/OptionsUI/fieldColor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/core/components/OptionsUI/registry.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/field/overrides/processors\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
- ],
- "public/app/core/components/OptionsUI/slider.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Slider/styles\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "\'@grafana/data/src/field/overrides/processors\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/core/components/OptionsUI/units.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -1040,9 +1010,6 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
- "public/app/core/components/PasswordField/PasswordField.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Input/Input\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/core/components/PluginHelp/PluginHelp.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
@@ -1050,23 +1017,16 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/core/components/RolePicker/RoleMenuGroupOption.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Select/getSelectStyles\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/core/components/RolePicker/RoleMenuOption.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Select/getSelectStyles\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
- ],
- "public/app/core/components/RolePicker/RolePickerInput.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/themes/mixins\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/core/components/RolePicker/RolePickerMenu.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Select/getSelectStyles\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/core/components/RolePicker/RolePickerSubMenu.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Select/getSelectStyles\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/core/components/RolePickerDrawer/RolePickerBadges.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -1116,19 +1076,10 @@ exports[`better eslint`] = {
"public/app/core/components/TagFilter/TagOption.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
- "public/app/core/components/TimeSeries/TimeSeries.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/PlotLegend\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotConfigBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/themes/ThemeContext\' import is restricted from being used by a pattern. Import from the public export instead.", "2"]
- ],
"public/app/core/components/TimeSeries/utils.ts:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotConfigBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/gradientFills\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/internal\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "Do not use any type assertions.", "4"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "6"]
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"public/app/core/components/TimelineChart/timeline.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -1136,16 +1087,12 @@ exports[`better eslint`] = {
"public/app/core/components/TimelineChart/utils.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToValue\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "3"]
+ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToValue\' import is restricted from being used by a pattern. Import from the public export instead.", "2"]
],
"public/app/core/config.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`Settings\`)", "0"],
[0, 0, 0, "Do not re-export imported variable (\`config\`)", "1"]
],
- "public/app/core/context/ModalsContextProvider.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Modal/ModalsContext\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/core/core.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`JsonExplorer\`)", "0"],
[0, 0, 0, "Do not re-export imported variable (\`TimeSeries\`)", "1"],
@@ -1263,32 +1210,16 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/features/actions/ActionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Forms/Field\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/Forms/InlineField\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/Forms/InlineFieldRow\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/components/JSONFormatter/JSONFormatter\' import is restricted from being used by a pattern. Import from the public export instead.", "4"],
- [0, 0, 0, "\'@grafana/ui/src/themes\' import is restricted from being used by a pattern. Import from the public export instead.", "5"],
- [0, 0, 0, "\'@grafana/ui/src/utils/i18n\' import is restricted from being used by a pattern. Import from the public export instead.", "6"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "8"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "9"]
- ],
- "public/app/features/actions/ActionEditorModalContent.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Button\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/Modal/Modal\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"]
],
"public/app/features/actions/ParamsEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/IconButton/IconButton\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/Input/Input\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/Layout/Stack/Stack\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/Select/Select\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/themes\' import is restricted from being used by a pattern. Import from the public export instead.", "4"],
- [0, 0, 0, "Do not use any type assertions.", "5"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "8"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "9"]
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"]
],
"public/app/features/admin/AdminEditOrgPage.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -1301,12 +1232,8 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/admin/AdminOrgsTable.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"]
- ],
- "public/app/features/admin/AdminSettingsTable.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
"public/app/features/admin/OrgRolePicker.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -1496,10 +1423,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/alerting/unified/Settings.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -1515,8 +1439,7 @@ exports[`better eslint`] = {
],
"public/app/features/alerting/unified/components/AlertLabels.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/alerting/unified/components/AnnotationDetailsField.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -1532,15 +1455,11 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/alerting/unified/components/InvalidIntervalWarning.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/alerting/unified/components/MoreButton.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -1555,9 +1474,7 @@ exports[`better eslint`] = {
"public/app/features/alerting/unified/components/Provisioning.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/alerting/unified/components/RuleLocation.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -1598,10 +1515,7 @@ exports[`better eslint`] = {
"public/app/features/alerting/unified/components/alert-groups/MatcherFilter.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/alerting/unified/components/alertmanager-entities/MuteTimingsSelector.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -1681,10 +1595,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/alerting/unified/components/export/GrafanaModifyExport.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -1735,8 +1646,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "11"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "12"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "13"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "12"]
],
"public/app/features/alerting/unified/components/extensions/AlertInstanceExtensionPoint.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -1862,8 +1772,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
],
"public/app/features/alerting/unified/components/panel-alerts-tab/NewRuleFromPanelButton.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -1907,9 +1816,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "12"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "10"]
],
"public/app/features/alerting/unified/components/receivers/TemplateForm.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -1990,9 +1897,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/alerting/unified/components/receivers/form/fields/KeyValueMapInput.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -2045,8 +1950,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
],
"public/app/features/alerting/unified/components/rule-editor/AnnotationKeyInput.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -2089,11 +1993,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "12"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "13"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "14"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "15"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "11"]
],
"public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -2107,9 +2007,6 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"]
],
- "public/app/features/alerting/unified/components/rule-editor/GrafanaAlertStatePicker.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Select/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/alerting/unified/components/rule-editor/GrafanaEvaluationBehavior.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
@@ -2142,12 +2039,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "12"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "13"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
],
"public/app/features/alerting/unified/components/rule-editor/PreviewRule.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -2178,9 +2070,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/alerting/unified/components/rule-editor/RecordingRuleEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -2197,9 +2087,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/alerting/unified/components/rule-editor/VizWrapper.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -2230,18 +2118,13 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
"public/app/features/alerting/unified/components/rule-editor/alert-rule-form/simplifiedRouting/route-settings/RouteSettings.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Select/MultiValue\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
],
"public/app/features/alerting/unified/components/rule-editor/dag.test.ts:5381": [
[0, 0, 0, "\'@grafana/runtime/src/utils/DataSourceWithBackend\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -2326,16 +2209,13 @@ exports[`better eslint`] = {
[0, 0, 0, "\'@grafana/runtime/src/services/__mocks__/dataSourceSrv\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/features/alerting/unified/components/rule-editor/rule-types/GrafanaManagedAlert.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/alerting/unified/components/rule-editor/rule-types/MimirOrLokiAlert.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/alerting/unified/components/rule-editor/rule-types/MimirOrLokiRecordingRule.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -2385,16 +2265,12 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/alerting/unified/components/rules/CloudRules.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/alerting/unified/components/rules/EditRuleGroupModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -2462,9 +2338,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
"public/app/features/alerting/unified/components/rules/RuleConfigStatus.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/alerting/unified/components/rules/RuleDetails.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -2494,10 +2368,7 @@ exports[`better eslint`] = {
],
"public/app/features/alerting/unified/components/rules/RuleDetailsMatchingInstances.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/alerting/unified/components/rules/RuleHealth.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -2510,13 +2381,10 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
],
"public/app/features/alerting/unified/components/rules/RuleListStateSection.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/alerting/unified/components/rules/RuleState.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -2556,18 +2424,14 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "20"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "21"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "22"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "23"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "24"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "25"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "26"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "23"]
],
"public/app/features/alerting/unified/components/rules/central-state-history/utils.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/field/fieldComparers\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/features/alerting/unified/components/rules/state-history/LogRecordViewer.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/alerting/unified/components/rules/state-history/LokiStateHistory.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -2577,16 +2441,14 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
],
"public/app/features/alerting/unified/components/rules/state-history/StateHistory.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/alerting/unified/components/rules/state-history/useRuleHistoryRecords.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/field/fieldComparers\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -2680,8 +2542,7 @@ exports[`better eslint`] = {
"public/app/features/alerting/unified/components/silences/SilencesFilter.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/alerting/unified/components/silences/SilencesTable.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -2708,11 +2569,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "12"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "13"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "14"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "15"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "16"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "17"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "18"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "19"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "15"]
],
"public/app/features/alerting/unified/home/Home.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -2721,8 +2578,7 @@ exports[`better eslint`] = {
],
"public/app/features/alerting/unified/home/Insights.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/alerting/unified/home/PluginIntegrations.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -2763,9 +2619,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "4"],
[0, 0, 0, "Unexpected any. Specify a different type.", "5"]
],
- "public/app/features/alerting/unified/plugins/PluginOriginBadge.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Icon/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/alerting/unified/rule-editor/CloneRuleEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
@@ -2865,8 +2718,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/annotations/events_processing.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@@ -2918,16 +2770,12 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
],
"public/app/features/auth-config/AuthProvidersListPage.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/auth-config/ProviderConfigForm.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -2954,11 +2802,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/auth-config/index.ts:5381": [
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"]
@@ -2966,6 +2810,9 @@ exports[`better eslint`] = {
"public/app/features/auth-config/utils/data.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
+ "public/app/features/bookmarks/BookmarksPage.tsx:5381": [
+ [0, 0, 0, "\'@grafana/runtime/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ ],
"public/app/features/browse-dashboards/api/browseDashboardsAPI.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`@reduxjs/toolkit/query/react\`)", "0"]
],
@@ -2976,8 +2823,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/browse-dashboards/components/NameCell.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Icon/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/browse-dashboards/state/index.ts:5381": [
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"],
@@ -2987,10 +2833,6 @@ exports[`better eslint`] = {
"public/app/features/canvas/element.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
- "public/app/features/canvas/elements/metricValue.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
- ],
"public/app/features/canvas/elements/notFound.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
@@ -3013,11 +2855,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"]
],
"public/app/features/connections/pages/DataSourceDetailsPage.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/connections/pages/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./AddNewConnectionPage\`)", "0"],
@@ -3041,9 +2879,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/connections/tabs/ConnectData/NoAccessModal/index.tsx:5381": [
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"]
@@ -3105,11 +2941,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "13"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "14"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "15"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "16"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "17"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "18"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "19"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "20"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "16"]
],
"public/app/features/dashboard-scene/inspect/HelpWizard/utils.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -3189,8 +3021,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
],
"public/app/features/dashboard-scene/saving/DashboardPrompt.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3226,7 +3057,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "9"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "10"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "11"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "12"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "12"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "13"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "14"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "15"],
@@ -3237,11 +3068,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard-scene/saving/getDashboardChanges.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -3249,7 +3076,8 @@ 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, "Unexpected any. Specify a different type.", "5"]
+ [0, 0, 0, "Do not use any type assertions.", "5"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "6"]
],
"public/app/features/dashboard-scene/saving/shared.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3297,10 +3125,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard-scene/settings/JsonModelEditView.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3308,9 +3133,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
],
"public/app/features/dashboard-scene/settings/annotations/AnnotationSettingsEdit.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3410,9 +3233,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3438,10 +3259,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/dashboard-scene/settings/variables/components/SelectionOptionsForm.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3469,8 +3287,7 @@ exports[`better eslint`] = {
],
"public/app/features/dashboard-scene/settings/version-history/RevertDashboardModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/dashboard-scene/settings/version-history/VersionHistoryButtons.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -3480,9 +3297,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard-scene/settings/version-history/VersionHistoryHeader.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3507,24 +3322,14 @@ exports[`better eslint`] = {
"public/app/features/dashboard-scene/sharing/ShareButton/ShareButton.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
- "public/app/features/dashboard-scene/sharing/ShareButton/share-externally/EmailShare/ConfigEmailSharing/ConfigEmailSharing.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Input/Input\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/dashboard-scene/sharing/ShareButton/share-externally/EmailShare/ConfigEmailSharing/EmailListConfiguration.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
- "public/app/features/dashboard-scene/sharing/ShareButton/share-externally/ShareConfiguration.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Switch/Switch\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/dashboard-scene/sharing/ShareButton/share-snapshot/ShareSnapshot.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/features/dashboard-scene/sharing/ShareButton/share-snapshot/UpsertSnapshot.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Input/Input\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
- ],
- "public/app/features/dashboard-scene/sharing/ShareDrawer/ShareDrawerConfirmAction.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/ConfirmModal/ConfirmContent\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/features/dashboard-scene/sharing/public-dashboards/ConfigPublicDashboard.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -3654,9 +3459,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard/components/DashboardRow/index.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./DashboardRow\`)", "0"]
@@ -3679,8 +3482,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard/components/GenAI/MinimalisticPagination.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3701,9 +3503,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "11"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "12"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "13"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "14"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "15"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "13"]
],
"public/app/features/dashboard/components/Inspector/PanelInspector.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -3727,10 +3527,9 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard/components/PanelEditor/OverrideCategoryTitle.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"]
+ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"]
],
"public/app/features/dashboard/components/PanelEditor/PanelEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
@@ -3751,20 +3550,16 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/features/dashboard/components/PanelEditor/PanelNotSupported.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Layout/Layout\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'Layout\' import from \'@grafana/ui/src/components/Layout/Layout\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
- [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/dashboard/components/PanelEditor/VisualizationButton.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
"public/app/features/dashboard/components/PanelEditor/VisualizationSelectPane.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Forms/Field\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"]
+ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"]
],
"public/app/features/dashboard/components/PanelEditor/getFieldOverrideElements.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3812,8 +3607,9 @@ exports[`better eslint`] = {
],
"public/app/features/dashboard/components/SaveDashboard/SaveDashboardDiff.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard/components/SaveDashboard/SaveDashboardDrawer.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3827,12 +3623,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "12"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
],
"public/app/features/dashboard/components/SaveDashboard/UnsavedChangesModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3866,11 +3657,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@@ -3879,21 +3666,17 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/ConfigPublicDashboard.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Layout/Layout\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui/src\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
- [0, 0, 0, "\'Layout\' import from \'@grafana/ui/src/components/Layout/Layout\' is restricted from being used by a pattern. Use Stack component instead.", "2"]
+ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/Configuration.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Layout/Layout\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'Layout\' import from \'@grafana/ui/src/components/Layout/Layout\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
- [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui/src\' is restricted from being used by a pattern. Use Stack component instead.", "2"]
+ [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/EmailSharingConfiguration.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/features/dashboard/components/ShareModal/SharePublicDashboard/CreatePublicDashboard/AcknowledgeCheckboxes.tsx:5381": [
- [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui/src\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
- [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui/src\' is restricted from being used by a pattern. Use Stack component instead.", "1"]
+ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
+ [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"]
],
"public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -3904,18 +3687,14 @@ exports[`better eslint`] = {
"public/app/features/dashboard/components/ShareModal/ViewJsonModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
- "public/app/features/dashboard/components/SubMenu/AnnotationPicker.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/PanelChrome/LoadingIndicator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/text/sanitize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/text/sanitize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/Button\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "Do not use any type assertions.", "2"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "4"]
+ [0, 0, 0, "Do not use any type assertions.", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"public/app/features/dashboard/components/SubMenu/SubMenu.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -3942,9 +3721,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/dashboard/components/TransformationsEditor/TransformationPickerNg.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3963,16 +3740,13 @@ exports[`better eslint`] = {
],
"public/app/features/dashboard/components/VersionHistory/RevertDashboardModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/dashboard/components/VersionHistory/VersionHistoryComparison.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dashboard/components/VersionHistory/VersionHistoryTable.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -3998,8 +3772,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/dashboard/containers/NewDashboardWithDS.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/dashboard/containers/PublicDashboardPage.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -4008,9 +3781,6 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
- "public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderNotice.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/themes/mixins\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/dashboard/dashgrid/PanelLinks.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
@@ -4039,11 +3809,11 @@ exports[`better eslint`] = {
"public/app/features/dashboard/state/DashboardMigrator.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/labelsToFields\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/merge\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/Table/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
+ [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, "Unexpected any. Specify a different type.", "6"],
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
[0, 0, 0, "Unexpected any. Specify a different type.", "8"],
[0, 0, 0, "Unexpected any. Specify a different type.", "9"],
@@ -4066,8 +3836,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "26"],
[0, 0, 0, "Unexpected any. Specify a different type.", "27"],
[0, 0, 0, "Unexpected any. Specify a different type.", "28"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "29"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "30"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "29"]
],
"public/app/features/dashboard/state/DashboardModel.repeat.test.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@@ -4183,11 +3952,7 @@ exports[`better eslint`] = {
[0, 0, 0, "\'@grafana/data/src/types/config\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/datasources/components/DashboardsTable.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -4265,9 +4030,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
- "public/app/features/dimensions/editors/ColorDimensionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/dimensions/editors/FileUploader.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
@@ -4277,17 +4039,15 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
"public/app/features/dimensions/editors/ResourceDimensionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "Do not use any type assertions.", "1"],
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/dimensions/editors/ResourcePicker.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/utils/closePopover\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/dimensions/editors/ResourcePickerPopover.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -4296,24 +4056,21 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/dimensions/editors/ScalarDimensionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
+ ],
+ "public/app/features/dimensions/editors/ScaleDimensionEditor.tsx:5381": [
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"]
],
- "public/app/features/dimensions/editors/ScaleDimensionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"]
- ],
"public/app/features/dimensions/editors/TextDimensionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
- [0, 0, 0, "Do not use any type assertions.", "2"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"]
],
"public/app/features/dimensions/editors/ThresholdsEditor/ThresholdsEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -4346,9 +4103,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
],
"public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditorModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -4388,8 +4143,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/explore/ContentOutline/ContentOutlineItemButton.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Tooltip\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/features/explore/CorrelationEditorModeBar.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -4406,8 +4160,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "10"]
],
"public/app/features/explore/CorrelationTransformationAddModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -4428,7 +4181,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/explore/Explore.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Table/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
@@ -4436,8 +4189,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "8"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "9"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "8"]
],
"public/app/features/explore/ExploreRunQueryButton.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -4448,8 +4200,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/explore/FeatureTogglePage.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/explore/LiveTailButton.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -4459,14 +4210,13 @@ exports[`better eslint`] = {
"public/app/features/explore/Logs/LiveLogs.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/explore/Logs/Logs.test.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/features/explore/Logs/Logs.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/VizLegend/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
@@ -4475,9 +4225,8 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "8"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "11"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "10"]
],
"public/app/features/explore/Logs/LogsColumnSearch.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -4509,9 +4258,6 @@ exports[`better eslint`] = {
"public/app/features/explore/Logs/LogsTable.test.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/organize\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
- "public/app/features/explore/Logs/LogsTable.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Table/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/explore/Logs/LogsTableAvailableFields.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
@@ -4520,8 +4266,7 @@ exports[`better eslint`] = {
],
"public/app/features/explore/Logs/LogsTableMultiSelect.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/explore/Logs/LogsTableNavField.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -4555,8 +4300,7 @@ exports[`better eslint`] = {
],
"public/app/features/explore/NodeGraph/NodeGraphContainer.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/explore/PrometheusListView/RawListContainer.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -4565,8 +4309,7 @@ exports[`better eslint`] = {
],
"public/app/features/explore/PrometheusListView/RawListItem.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/explore/PrometheusListView/RawListItemAttributes.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -4603,26 +4346,23 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Button\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
],
"public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/TracePageSearchBar.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Button\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
],
"public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
@@ -4663,16 +4403,13 @@ exports[`better eslint`] = {
"public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/explore/TraceView/components/TracePageHeader/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./TracePageHeader\`)", "0"]
],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBar.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -4680,21 +4417,16 @@ exports[`better eslint`] = {
"public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianText.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/SpanFlameGraph.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -4869,12 +4601,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "11"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "12"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "13"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "14"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "15"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "16"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "17"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "18"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "19"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "14"]
],
"public/app/features/expressions/components/Reduce.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -4898,8 +4625,7 @@ exports[`better eslint`] = {
],
"public/app/features/geo/editor/GazetteerPathEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/geo/editor/locationModeEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
@@ -4939,9 +4665,7 @@ exports[`better eslint`] = {
"public/app/features/inspector/InspectErrorTab.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/inspector/InspectJSONTab.tsx:5381": [
[0, 0, 0, "Do not use the t() function outside of a component or function", "0"],
@@ -4967,8 +4691,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "7"]
],
"public/app/features/invites/InviteeRow.tsx:5381": [
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
"public/app/features/invites/InviteesTable.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -4985,9 +4708,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "12"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "10"]
],
"public/app/features/library-panels/components/AddLibraryPanelModal/AddLibraryPanelModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -5001,12 +4722,10 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
],
"public/app/features/library-panels/components/LibraryPanelCard/LibraryPanelCard.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/library-panels/components/LibraryPanelInfo/LibraryPanelInfo.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/library-panels/components/LibraryPanelsSearch/LibraryPanelsSearch.tsx:5381": [
[0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
@@ -5023,8 +4742,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
],
"public/app/features/live/LiveConnectionWarning.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -5082,9 +4800,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"]
],
"public/app/features/logs/components/LogLabelStats.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/logs/components/LogRowMenuCell.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -5139,15 +4855,11 @@ exports[`better eslint`] = {
"public/app/features/manage-dashboards/components/ImportDashboardOverview.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/manage-dashboards/components/SnapshotListTable.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
],
- "public/app/features/manage-dashboards/components/SnapshotListTableRow.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/manage-dashboards/state/actions.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@@ -5170,13 +4882,9 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"]
],
"public/app/features/migrate-to-cloud/onprem/NameCell.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Icon/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
- ],
- "public/app/features/migrate-to-cloud/shared/AlertWithTraceID.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Alert/Alert\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/notifications/StoredNotifications.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -5205,9 +4913,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
],
"public/app/features/org/UserInvitePage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -5225,8 +4931,7 @@ exports[`better eslint`] = {
"public/app/features/panel/components/PanelPluginError.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/panel/components/PanelRenderer.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -5235,10 +4940,9 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/panel/components/VizTypePicker/PanelTypeCard.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"]
+ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"]
],
"public/app/features/panel/components/VizTypePicker/VisualizationSuggestions.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -5253,16 +4957,10 @@ exports[`better eslint`] = {
"public/app/features/panel/panellinks/link_srv.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
- "public/app/features/playlist/PlaylistCard.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/playlist/PlaylistForm.tsx:5381": [
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"]
],
- "public/app/features/playlist/PlaylistPageList.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/playlist/PlaylistTableRows.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
@@ -5345,9 +5043,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
],
"public/app/features/plugins/admin/components/InstallControls/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./InstallControlsButton\`)", "0"],
@@ -5364,15 +5060,11 @@ exports[`better eslint`] = {
[0, 0, 0, "\'@grafana/runtime/src/components/PluginPage\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/plugins/admin/components/PluginDetailsDeprecatedWarning.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/plugins/admin/components/PluginDetailsDisabledError.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -5390,10 +5082,7 @@ exports[`better eslint`] = {
"public/app/features/plugins/admin/components/PluginDetailsPage.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/plugins/admin/components/PluginDetailsPanel.tsx:5381": [
[0, 0, 0, "\'@grafana/runtime/src/components/PluginPage\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -5405,20 +5094,17 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
],
"public/app/features/plugins/admin/components/PluginListItem.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/plugins/admin/components/PluginSignatureDetailsBadge.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/plugins/admin/components/PluginUsage.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/plugins/admin/components/SearchField.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -5444,9 +5130,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "9"]
],
"public/app/features/plugins/admin/state/actions.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -5533,8 +5217,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "3"]
],
"public/app/features/profile/FeatureTogglePage.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/profile/UserOrganizations.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -5563,12 +5246,10 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "4"]
+ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"]
],
"public/app/features/query/components/QueryErrorAlert.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/query/components/QueryGroup.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
@@ -5608,27 +5289,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "22"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "23"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "24"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "25"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "26"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "27"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "28"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "29"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "30"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "31"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "32"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "33"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "34"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "35"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "36"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "37"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "38"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "39"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "40"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "41"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "42"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "43"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "44"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "45"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "25"]
],
"public/app/features/query/state/DashboardQueryRunner/AnnotationsQueryRunner.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -5677,27 +5338,18 @@ exports[`better eslint`] = {
"public/app/features/query/state/updateQueries.ts:5381": [
[0, 0, 0, "\'@grafana/runtime/src/utils/DataSourceWithBackend\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
- "public/app/features/sandbox/BenchmarksPage.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/ThemeDemos/EmotionPerfTest\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/sandbox/TestStuffPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
- "public/app/features/scopes/index.ts:5381": [
- [0, 0, 0, "Do not re-export imported variable (\`./ScopesDashboards\`)", "0"],
- [0, 0, 0, "Do not re-export imported variable (\`./instance\`)", "1"]
- ],
"public/app/features/search/page/components/ActionRow.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
"public/app/features/search/page/components/SearchResultsTable.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Table/TableCell\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/Table/styles\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/search/page/components/columns.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -5793,14 +5445,13 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
],
"public/app/features/serviceaccounts/components/ServiceAccountsListItem.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
],
"public/app/features/serviceaccounts/state/reducers.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -5932,9 +5583,6 @@ exports[`better eslint`] = {
[0, 0, 0, "\'@grafana/data/src/datetime/rangeutil\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
- "public/app/features/trails/DataTrailsHome.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Text/Text\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/trails/MetricScene.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
@@ -5950,8 +5598,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
],
"public/app/features/trails/MetricsHeader.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
@@ -5962,8 +5609,7 @@ exports[`better eslint`] = {
],
"public/app/features/trails/TrailStore/utils.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"]
],
"public/app/features/trails/banners/NativeHistogramBanner.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"]
@@ -6017,8 +5663,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"]
],
"public/app/features/transformers/calculateHeatmap/editor/helper.ts:5381": [
- [0, 0, 0, "\'@grafana/ui/src/options/builder\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/transformers/calculateHeatmap/heatmap.test.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -6093,9 +5738,9 @@ exports[`better eslint`] = {
],
"public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldTypeMatcherEditor\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "Do not use any type assertions.", "3"],
+ [0, 0, 0, "Do not use any type assertions.", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"],
@@ -6109,9 +5754,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "14"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "15"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "16"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "17"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "18"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "19"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "17"]
],
"public/app/features/transformers/editors/EnumMappingEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -6140,10 +5783,9 @@ exports[`better eslint`] = {
],
"public/app/features/transformers/editors/FormatStringTransformerEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/formatString\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"]
],
"public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/formatTime\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -6152,9 +5794,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
],
"public/app/features/transformers/editors/GroupByTransformerEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/groupBy\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -6186,10 +5826,9 @@ exports[`better eslint`] = {
],
"public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinByField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"]
],
"public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/labelsToFields\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -6249,9 +5888,9 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"]
],
"public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
- [0, 0, 0, "Do not use any type assertions.", "2"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
@@ -6261,9 +5900,8 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "9"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "10"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "11"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "12"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "13"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "14"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "12"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "13"]
],
"public/app/features/transformers/extractFields/components/JSONPathEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -6272,8 +5910,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
],
"public/app/features/transformers/extractFields/extractFields.test.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -6318,10 +5955,9 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "9"]
],
"public/app/features/transformers/lookupGazetteer/FieldLookupTransformerEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "Do not use any type assertions.", "1"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"]
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"]
],
"public/app/features/transformers/lookupGazetteer/fieldLookup.test.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/dataframe/processDataFrame\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -6331,15 +5967,14 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/transformers/partitionByValues/PartitionByValuesEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
+ [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "7"]
],
"public/app/features/transformers/partitionByValues/partitionByValues.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/filterByName\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -6371,13 +6006,12 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/features/transformers/regression/regressionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "4"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "6"]
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "5"]
],
"public/app/features/transformers/spatial/optionsHelper.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -6394,12 +6028,10 @@ exports[`better eslint`] = {
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/ids\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
],
"public/app/features/transformers/suggestionsInput/SuggestionsInput.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/DataLinks/DataLinkSuggestions\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/Input/Input\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "Do not use any type assertions.", "1"],
[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.", "3"]
],
"public/app/features/transformers/timeSeriesTable/TimeSeriesTableTransformEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -6408,13 +6040,10 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "3"]
],
"public/app/features/users/TokenRevokedModal.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Modal/getModalStyles\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "1"],
+ [0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "3"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "4"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "6"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "3"]
],
"public/app/features/users/UsersActionBar.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
@@ -6548,14 +6177,10 @@ exports[`better eslint`] = {
"public/app/features/variables/pickers/index.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./OptionsPicker/OptionsPicker\`)", "0"]
],
- "public/app/features/variables/pickers/shared/VariableLink.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/PanelChrome/LoadingIndicator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/features/variables/pickers/shared/VariableOptions.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"],
- [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"]
+ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"]
],
"public/app/features/variables/query/QueryVariableEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@@ -6676,9 +6301,6 @@ exports[`better eslint`] = {
"public/app/features/visualization/data-hover/DataHoverView.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
- "public/app/features/visualization/data-hover/ExemplarHoverView.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipRow\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/datasource/alertmanager/DataSource.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@@ -6693,9 +6315,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"],
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "1"]
],
- "public/app/plugins/datasource/azuremonitor/azure_monitor/azure_monitor_datasource.ts:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"]
- ],
"public/app/plugins/datasource/azuremonitor/components/ArgQueryEditor/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./ArgQueryEditor\`)", "0"]
],
@@ -6729,9 +6348,6 @@ exports[`better eslint`] = {
"public/app/plugins/datasource/azuremonitor/components/VariableEditor/VariableEditor.test.tsx:5381": [
[0, 0, 0, "* import is invalid because \'Layout,HorizontalGroup,VerticalGroup\' from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
- "public/app/plugins/datasource/azuremonitor/components/shared/Field.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Forms/InlineField\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/datasource/azuremonitor/types/index.ts:5381": [
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"],
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "1"],
@@ -6745,6 +6361,9 @@ exports[`better eslint`] = {
"public/app/plugins/datasource/azuremonitor/types/templateVariables.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`../dataquery.gen\`)", "0"]
],
+ "public/app/plugins/datasource/azuremonitor/utils/common.ts:5381": [
+ [0, 0, 0, "Do not use any type assertions.", "0"]
+ ],
"public/app/plugins/datasource/azuremonitor/utils/messageFromError.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@@ -6836,12 +6455,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not re-export imported variable (\`./thirdArgAfterSearchQuery\`)", "4"],
[0, 0, 0, "Do not re-export imported variable (\`./withinStringQuery\`)", "5"]
],
- "public/app/plugins/datasource/cloudwatch/components/CheatSheet/LogsCheatSheet.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/slate-plugins/slate-prism\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/code-editors/PPLQueryEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Monaco/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.test.tsx:5381": [
[0, 0, 0, "* import is invalid because \'Layout,HorizontalGroup,VerticalGroup\' from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
@@ -6851,9 +6464,6 @@ exports[`better eslint`] = {
"public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.test.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./MetricsQueryEditor/SQLCodeEditor\`)", "0"]
],
- "public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupSelector.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Select/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/index.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./MetricStatEditor\`)", "0"]
],
@@ -7035,10 +6645,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
- "public/app/plugins/datasource/grafana/components/TimeRegionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOffset\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneTitle\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
- ],
"public/app/plugins/datasource/grafana/datasource.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
@@ -7211,15 +6817,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not re-export imported variable (\`Datasource\`)", "0"],
[0, 0, 0, "Do not re-export imported variable (\`MixedDatasource\`)", "1"]
],
- "public/app/plugins/datasource/mssql/azureauth/AzureAuthSettings.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/DataSourceSettings/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/datasource/mssql/types.ts:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/DataSourceSettings/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/datasource/opentsdb/datasource.d.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@@ -7246,12 +6843,6 @@ exports[`better eslint`] = {
"public/app/plugins/datasource/parca/webpack.config.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`config\`)", "0"]
],
- "public/app/plugins/datasource/prometheus/configuration/AzureAuthSettings.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/DataSourceSettings/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/datasource/prometheus/configuration/DataSourceHttpSettingsOverhaulPackage.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/DataSourceSettings/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/datasource/tempo/QueryField.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
@@ -7316,47 +6907,24 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not re-export imported variable (\`config\`)", "0"]
],
"public/app/plugins/panel/annolist/AnnoListPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/List/AbstractList\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "Do not use any type assertions.", "1"]
- ],
- "public/app/plugins/panel/barchart/BarChartLegend.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/panel/barchart/BarChartPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/plugins/panel/barchart/TickSpacingEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/plugins/panel/barchart/bars.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "Do not use any type assertions.", "3"]
- ],
- "public/app/plugins/panel/barchart/module.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/options/builder/tooltip\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/plugins/panel/barchart/quadtree.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/plugins/panel/barchart/utils.ts:5381": [
- [0, 0, 0, "\'@grafana/data/src/field/fieldState\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "2"]
- ],
- "public/app/plugins/panel/bargauge/BarGaugeLegend.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/panel/bargauge/BarGaugePanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/DataLinks/DataLinksContextMenu\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "\'@grafana/data/src/field/fieldState\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/candlestick/CandlestickPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/config/UPlotScaleBuilder\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "Do not use any type assertions.", "3"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "4"]
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/plugins/panel/candlestick/fields.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -7372,12 +6940,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not re-export imported variable (\`defaultCandlestickColors\`)", "7"]
],
"public/app/plugins/panel/canvas/components/CanvasTooltip.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/types/action\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipContent\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipFooter\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipHeader\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/types\' import is restricted from being used by a pattern. Import from the public export instead.", "4"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/CloseButton\' import is restricted from being used by a pattern. Import from the public export instead.", "5"]
+ [0, 0, 0, "\'@grafana/data/src/types/action\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/canvas/editor/connectionEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -7396,8 +6959,7 @@ exports[`better eslint`] = {
[0, 0, 0, "\'@grafana/data/src/panel/PanelPlugin\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/Menu/MenuDivider\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
+ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/debug/CursorView.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -7410,18 +6972,12 @@ exports[`better eslint`] = {
"public/app/plugins/panel/gauge/GaugeMigrations.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
- "public/app/plugins/panel/gauge/GaugePanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/DataLinks/DataLinksContextMenu\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/geomap/components/MarkersLegend.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/field/scale\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
- "public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldsByFrameRefIdMatcher\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@@ -7444,8 +7000,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "12"]
],
"public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldValueMatcher\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "Do not use any type assertions.", "1"]
+ [0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/plugins/panel/geomap/editor/layerEditor.tsx:5381": [
[0, 0, 0, "\'@grafana/data/src/utils/OptionsUIBuilders\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -7481,23 +7036,12 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/plugins/panel/heatmap/HeatmapPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "Do not use any type assertions.", "1"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "2"]
- ],
- "public/app/plugins/panel/heatmap/HeatmapTooltip.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipContent\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipFooter\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipHeader\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipWrapper\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/types\' import is restricted from being used by a pattern. Import from the public export instead.", "4"]
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/plugins/panel/heatmap/migrations.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
- "public/app/plugins/panel/heatmap/module.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/options/builder\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/heatmap/palettes.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@@ -7526,24 +7070,13 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "16"]
],
"public/app/plugins/panel/histogram/Histogram.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
+ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/histogram/HistogramPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
- ],
- "public/app/plugins/panel/histogram/HistogramTooltip.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipContent\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipFooter\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipHeader\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipWrapper\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/types\' import is restricted from being used by a pattern. Import from the public export instead.", "4"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "5"]
+ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/histogram/module.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/options/builder\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
+ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/histogram/utils.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/histogram\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -7560,9 +7093,6 @@ exports[`better eslint`] = {
"public/app/plugins/panel/logs/types.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./panelcfg.gen\`)", "0"]
],
- "public/app/plugins/panel/news/component/News.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/unstable\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/nodeGraph/Edge.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@@ -7577,9 +7107,6 @@ exports[`better eslint`] = {
[0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
- "public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/nodeGraph/index.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./NodeGraph\`)", "0"]
],
@@ -7589,48 +7116,22 @@ exports[`better eslint`] = {
"public/app/plugins/panel/nodeGraph/types.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./panelcfg.gen\`)", "0"]
],
- "public/app/plugins/panel/piechart/PieChart.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/themes/mixins\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/utils/useComponetInstanceId\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
- ],
"public/app/plugins/panel/piechart/migrations.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
- "public/app/plugins/panel/piechart/module.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/options/builder/tooltip\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/stat/StatMigrations.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/plugins/panel/stat/StatPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/field/fieldOverrides\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/DataLinks/DataLinksContextMenu\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
- ],
- "public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/panel/state-timeline/StateTimelineTooltip2.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipContent\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipFooter\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipHeader\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipWrapper\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/types\' import is restricted from being used by a pattern. Import from the public export instead.", "4"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "5"]
+ [0, 0, 0, "\'@grafana/data/src/field/fieldOverrides\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/state-timeline/migrations.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
- "public/app/plugins/panel/status-history/StatusHistoryPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/panel/table/TablePanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Table/types\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/table/cells/SparklineCellOptionsEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/Table/SparklineCell\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"]
+ [0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/plugins/panel/table/migrations.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/reduce\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
@@ -7651,17 +7152,6 @@ exports[`better eslint`] = {
"public/app/plugins/panel/timeseries/SpanNullsEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
- "public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
- "public/app/plugins/panel/timeseries/TimeSeriesTooltip.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipContent\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipFooter\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipHeader\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipWrapper\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/types\' import is restricted from being used by a pattern. Import from the public export instead.", "4"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "5"]
- ],
"public/app/plugins/panel/timeseries/migrations.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
@@ -7674,15 +7164,9 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "8"],
[0, 0, 0, "Unexpected any. Specify a different type.", "9"]
],
- "public/app/plugins/panel/timeseries/module.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/options/builder/tooltip\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin2.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
- "public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/internal\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
- ],
"public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@@ -7696,42 +7180,29 @@ exports[`better eslint`] = {
"public/app/plugins/panel/timeseries/utils.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/convertFieldType\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
[0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullInsertThreshold\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToValue\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/internal\' import is restricted from being used by a pattern. Import from the public export instead.", "3"]
+ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/nulls/nullToValue\' import is restricted from being used by a pattern. Import from the public export instead.", "2"]
],
"public/app/plugins/panel/trend/TrendPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "1"]
- ],
- "public/app/plugins/panel/trend/module.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/options/builder/tooltip\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
+ [0, 0, 0, "\'@grafana/data/src/transformations/transformers/joinDataFrames\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/xychart/SeriesEditor.tsx:5381": [
- [0, 0, 0, "\'@grafana/ui/src/components/MatchersUI/FieldNamePicker\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
+ [0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[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.", "3"]
],
"public/app/plugins/panel/xychart/XYChartPanel.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/utils\' import is restricted from being used by a pattern. Import from the public export instead.", "2"]
+ [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/xychart/XYChartTooltip.tsx:5381": [
- [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipContent\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipFooter\' import is restricted from being used by a pattern. Import from the public export instead.", "2"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipHeader\' import is restricted from being used by a pattern. Import from the public export instead.", "3"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/VizTooltipWrapper\' import is restricted from being used by a pattern. Import from the public export instead.", "4"],
- [0, 0, 0, "\'@grafana/ui/src/components/VizTooltip/types\' import is restricted from being used by a pattern. Import from the public export instead.", "5"]
+ [0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
],
"public/app/plugins/panel/xychart/migrations.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/plugins/panel/xychart/scatter.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/themes/colorManipulator\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/components/uPlot/types\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
+ [0, 0, 0, "Do not use any type assertions.", "1"],
[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"],
@@ -7745,11 +7216,10 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "12"],
[0, 0, 0, "Do not use any type assertions.", "13"],
[0, 0, 0, "Do not use any type assertions.", "14"],
- [0, 0, 0, "Do not use any type assertions.", "15"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "15"],
[0, 0, 0, "Unexpected any. Specify a different type.", "16"],
[0, 0, 0, "Unexpected any. Specify a different type.", "17"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "18"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "19"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "18"]
],
"public/app/plugins/panel/xychart/utils.ts:5381": [
[0, 0, 0, "\'@grafana/data/src/field/fieldState\' import is restricted from being used by a pattern. Import from the public export instead.", "0"]
@@ -7885,11 +7355,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
- ],
- "scripts/cli/generateSassVariableFiles.ts:5381": [
- [0, 0, 0, "\'@grafana/ui/src/themes/_variables.dark.scss.tmpl\' import is restricted from being used by a pattern. Import from the public export instead.", "0"],
- [0, 0, 0, "\'@grafana/ui/src/themes/_variables.light.scss.tmpl\' import is restricted from being used by a pattern. Import from the public export instead.", "1"],
- [0, 0, 0, "\'@grafana/ui/src/themes/_variables.scss.tmpl\' import is restricted from being used by a pattern. Import from the public export instead.", "2"]
]
}`
};
@@ -7961,12 +7426,6 @@ exports[`no undocumented stories`] = {
exports[`no gf-form usage`] = {
value: `{
- "e2e/old-arch/utils/flows/addDataSource.ts:5381": [
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"]
- ],
- "e2e/utils/flows/addDataSource.ts:5381": [
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"]
- ],
"packages/grafana-prometheus/src/components/PromExploreExtraField.tsx:5381": [
[0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
[0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
@@ -8029,29 +7488,6 @@ exports[`no gf-form usage`] = {
[0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
[0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"]
],
- "packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx:5381": [
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"]
- ],
- "packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.tsx:5381": [
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
- [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"]
- ],
"packages/grafana-ui/src/components/DataSourceSettings/SecureSocksProxySettings.tsx:5381": [
[0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
[0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"],
diff --git a/.bra.toml b/.bra.toml
index e3b7510804f..6572f9a6afb 100644
--- a/.bra.toml
+++ b/.bra.toml
@@ -1,6 +1,6 @@
[run]
init_cmds = [
- ["GO_BUILD_DEV=1", "make", "build-go"],
+ ["make","GO_BUILD_DEV=1", "build-go"],
["make", "gen-jsonnet"],
["./bin/grafana", "server", "-profile", "-profile-addr=127.0.0.1", "-profile-port=6000", "-profile-block-rate=1", "-profile-mutex-rate=5", "-packaging=dev", "cfg:app_mode=development"]
]
@@ -17,7 +17,7 @@ watch_exts = [".go", ".ini", ".toml", ".template.html"]
ignore_files = [".*_gen.go"]
build_delay = 1500
cmds = [
- ["GO_BUILD_DEV=1", "make", "build-go-fast"],
+ ["make", "GO_BUILD_DEV=1", "build-go-fast"],
["make", "gen-jsonnet"],
["./bin/grafana", "server", "-profile", "-profile-addr=127.0.0.1", "-profile-port=6000", "-profile-block-rate=1", "-profile-mutex-rate=5", "-packaging=dev", "cfg:app_mode=development"]
]
diff --git a/.drone.yml b/.drone.yml
index 491c607a83b..6340d739fd6 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -25,7 +25,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- ./bin/build verify-drone
@@ -75,7 +75,7 @@ steps:
- go install github.com/bazelbuild/buildtools/buildifier@latest
- buildifier --lint=warn -mode=check -r .
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: lint-starlark
trigger:
event:
@@ -437,7 +437,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -446,21 +446,21 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- apk add --update build-base shared-mime-info shared-mime-info-lang
- go list -f '{{.Dir}}/...' -m | xargs go test -short -covermode=atomic -timeout=5m
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: test-backend
- commands:
- apk add --update build-base
@@ -469,7 +469,7 @@ steps:
| grep -o '\(.*\)/' | sort -u)
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: test-backend-integration
trigger:
event:
@@ -524,7 +524,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- echo $(/usr/bin/github-app-external-token) > /github-app/token
@@ -569,16 +569,16 @@ steps:
- apk add --update make
- make gen-go
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- go run scripts/modowners/modowners.go check go.mod
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: validate-modfile
- commands:
- apk add --update make
- make swagger-validate
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: validate-openapi-spec
trigger:
event:
@@ -655,7 +655,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -665,7 +665,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -674,7 +674,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- yarn install --immutable || yarn install --immutable
@@ -712,7 +712,7 @@ steps:
- /src/grafana-build artifacts -a targz:grafana:linux/amd64 -a targz:grafana:linux/arm64
-a targz:grafana:linux/arm/v7 -a docker:grafana:linux/amd64 -a docker:grafana:linux/amd64:ubuntu
-a docker:grafana:linux/arm64 -a docker:grafana:linux/arm64:ubuntu -a docker:grafana:linux/arm/v7
- -a docker:grafana:linux/arm/v7:ubuntu --go-version=1.23.5 --yarn-cache=$$YARN_CACHE_FOLDER
+ -a docker:grafana:linux/arm/v7:ubuntu --go-version=1.24.1 --yarn-cache=$$YARN_CACHE_FOLDER
--build-id=$$DRONE_BUILD_NUMBER --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.21.3
--tag-format='{{ .version_base }}-{{ .buildID }}-{{ .arch }}' --ubuntu-tag-format='{{
.version_base }}-{{ .buildID }}-ubuntu-{{ .arch }}' --verify='false' --grafana-dir=$$PWD
@@ -1110,7 +1110,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- echo $DRONE_RUNNER_NAME
@@ -1124,7 +1124,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -1133,14 +1133,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- dockerize -wait tcp://postgres:5432 -timeout 120s
@@ -1161,7 +1161,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: postgres-integration-tests
- commands:
- dockerize -wait tcp://mysql80:3306 -timeout 120s
@@ -1182,7 +1182,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: mysql-8.0-integration-tests
- commands:
- dockerize -wait tcp://redis:6379 -timeout 120s
@@ -1198,7 +1198,7 @@ steps:
- wait-for-redis
environment:
REDIS_URL: redis://redis:6379/0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: redis-integration-tests
- commands:
- dockerize -wait tcp://memcached:11211 -timeout 120s
@@ -1214,7 +1214,7 @@ steps:
- wait-for-memcached
environment:
MEMCACHED_HOSTS: memcached:11211
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: memcached-integration-tests
- commands:
- dockerize -wait tcp://mimir_backend:8080 -timeout 120s
@@ -1230,7 +1230,7 @@ steps:
environment:
AM_TENANT_ID: test
AM_URL: http://mimir_backend:8080
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: remote-alertmanager-integration-tests
trigger:
event:
@@ -1312,7 +1312,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
trigger:
event:
@@ -1433,7 +1433,7 @@ steps:
&& return 1; fi
depends_on:
- clone-enterprise
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: swagger-gen
trigger:
event:
@@ -1538,7 +1538,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -1549,7 +1549,7 @@ steps:
- CODEGEN_VERIFY=1 make gen-cue
depends_on:
- clone-enterprise
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -1559,14 +1559,14 @@ steps:
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on:
- clone-enterprise
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- apk add --update build-base
@@ -1574,7 +1574,7 @@ steps:
- go test -v -run=^$ -benchmem -timeout=1h -count=8 -bench=. ${GO_PACKAGES}
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: sqlite-benchmark-integration-tests
- commands:
- apk add --update build-base
@@ -1586,7 +1586,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: postgres-benchmark-integration-tests
- commands:
- apk add --update build-base
@@ -1597,7 +1597,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: mysql-8.0-benchmark-integration-tests
trigger:
event:
@@ -1669,7 +1669,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
trigger:
branch: main
@@ -1852,7 +1852,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -1861,21 +1861,21 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- apk add --update build-base shared-mime-info shared-mime-info-lang
- go list -f '{{.Dir}}/...' -m | xargs go test -short -covermode=atomic -timeout=5m
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: test-backend
- commands:
- apk add --update build-base
@@ -1884,7 +1884,7 @@ steps:
| grep -o '\(.*\)/' | sort -u)
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: test-backend-integration
trigger:
branch: main
@@ -1929,22 +1929,22 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- apk add --update make
- make gen-go
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- go run scripts/modowners/modowners.go check go.mod
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: validate-modfile
- commands:
- apk add --update make
- make swagger-validate
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: validate-openapi-spec
- commands:
- ./bin/build verify-drone
@@ -2076,7 +2076,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -2086,7 +2086,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -2095,7 +2095,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- yarn install --immutable || yarn install --immutable
@@ -2132,7 +2132,7 @@ steps:
- /src/grafana-build artifacts -a targz:grafana:linux/amd64 -a targz:grafana:linux/arm64
-a targz:grafana:linux/arm/v7 -a docker:grafana:linux/amd64 -a docker:grafana:linux/amd64:ubuntu
-a docker:grafana:linux/arm64 -a docker:grafana:linux/arm64:ubuntu -a docker:grafana:linux/arm/v7
- -a docker:grafana:linux/arm/v7:ubuntu --go-version=1.23.5 --yarn-cache=$$YARN_CACHE_FOLDER
+ -a docker:grafana:linux/arm/v7:ubuntu --go-version=1.24.1 --yarn-cache=$$YARN_CACHE_FOLDER
--build-id=$$DRONE_BUILD_NUMBER --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.21.3
--tag-format='{{ .version_base }}-{{ .buildID }}-{{ .arch }}' --ubuntu-tag-format='{{
.version_base }}-{{ .buildID }}-ubuntu-{{ .arch }}' --verify='false' --grafana-dir=$$PWD
@@ -2607,7 +2607,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- echo $DRONE_RUNNER_NAME
@@ -2621,7 +2621,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -2630,14 +2630,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- dockerize -wait tcp://postgres:5432 -timeout 120s
@@ -2658,7 +2658,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: postgres-integration-tests
- commands:
- dockerize -wait tcp://mysql80:3306 -timeout 120s
@@ -2679,7 +2679,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: mysql-8.0-integration-tests
- commands:
- dockerize -wait tcp://redis:6379 -timeout 120s
@@ -2695,7 +2695,7 @@ steps:
- wait-for-redis
environment:
REDIS_URL: redis://redis:6379/0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: redis-integration-tests
- commands:
- dockerize -wait tcp://memcached:11211 -timeout 120s
@@ -2711,7 +2711,7 @@ steps:
- wait-for-memcached
environment:
MEMCACHED_HOSTS: memcached:11211
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: memcached-integration-tests
- commands:
- dockerize -wait tcp://mimir_backend:8080 -timeout 120s
@@ -2727,7 +2727,7 @@ steps:
environment:
AM_TENANT_ID: test
AM_URL: http://mimir_backend:8080
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: remote-alertmanager-integration-tests
trigger:
branch: main
@@ -2996,7 +2996,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -3005,21 +3005,21 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- apk add --update build-base shared-mime-info shared-mime-info-lang
- go list -f '{{.Dir}}/...' -m | xargs go test -short -covermode=atomic -timeout=5m
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: test-backend
- commands:
- apk add --update build-base
@@ -3028,7 +3028,7 @@ steps:
| grep -o '\(.*\)/' | sort -u)
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: test-backend-integration
trigger:
branch:
@@ -3071,22 +3071,22 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- apk add --update make
- make gen-go
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- go run scripts/modowners/modowners.go check go.mod
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: validate-modfile
- commands:
- apk add --update make
- make swagger-validate
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: validate-openapi-spec
trigger:
branch:
@@ -3165,7 +3165,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- echo $DRONE_RUNNER_NAME
@@ -3179,7 +3179,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -3188,14 +3188,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- dockerize -wait tcp://postgres:5432 -timeout 120s
@@ -3216,7 +3216,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: postgres-integration-tests
- commands:
- dockerize -wait tcp://mysql80:3306 -timeout 120s
@@ -3237,7 +3237,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: mysql-8.0-integration-tests
- commands:
- dockerize -wait tcp://redis:6379 -timeout 120s
@@ -3253,7 +3253,7 @@ steps:
- wait-for-redis
environment:
REDIS_URL: redis://redis:6379/0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: redis-integration-tests
- commands:
- dockerize -wait tcp://memcached:11211 -timeout 120s
@@ -3269,7 +3269,7 @@ steps:
- wait-for-memcached
environment:
MEMCACHED_HOSTS: memcached:11211
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: memcached-integration-tests
- commands:
- dockerize -wait tcp://mimir_backend:8080 -timeout 120s
@@ -3285,7 +3285,7 @@ steps:
environment:
AM_TENANT_ID: test
AM_URL: http://mimir_backend:8080
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: remote-alertmanager-integration-tests
trigger:
branch:
@@ -3385,7 +3385,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- ./bin/build artifacts docker fetch --edition oss
@@ -3517,7 +3517,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- ./bin/build artifacts docker fetch --edition oss
@@ -3658,7 +3658,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- ./bin/build artifacts packages --artifacts-editions=oss --tag $${DRONE_TAG} --src-bucket
@@ -3750,7 +3750,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- yarn install --immutable || yarn install --immutable
@@ -3850,7 +3850,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- depends_on:
- compile-build-cmd
@@ -3947,7 +3947,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: compile-build-cmd
- commands:
- ./bin/build publish grafana-com --edition oss ${DRONE_TAG}
@@ -4009,7 +4009,7 @@ steps:
from_secret: grafana_api_key
GCP_KEY_BASE64:
from_secret: gcp_key_base64
- GO_VERSION: 1.23.5
+ GO_VERSION: 1.24.1
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4084,7 +4084,7 @@ steps:
from_secret: grafana_api_key
GCP_KEY_BASE64:
from_secret: gcp_key_base64
- GO_VERSION: 1.23.5
+ GO_VERSION: 1.24.1
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4201,7 +4201,7 @@ steps:
from_secret: grafana_api_key
GCP_KEY_BASE64:
from_secret: gcp_key_base64
- GO_VERSION: 1.23.5
+ GO_VERSION: 1.24.1
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4352,7 +4352,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -4361,21 +4361,21 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- apk add --update build-base shared-mime-info shared-mime-info-lang
- go list -f '{{.Dir}}/...' -m | xargs go test -short -covermode=atomic -timeout=5m
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: test-backend
- commands:
- apk add --update build-base
@@ -4384,7 +4384,7 @@ steps:
| grep -o '\(.*\)/' | sort -u)
depends_on:
- wire-install
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: test-backend-integration
trigger:
cron:
@@ -4438,7 +4438,7 @@ steps:
from_secret: grafana_api_key
GCP_KEY_BASE64:
from_secret: gcp_key_base64
- GO_VERSION: 1.23.5
+ GO_VERSION: 1.24.1
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4582,7 +4582,7 @@ steps:
from_secret: grafana_api_key
GCP_KEY_BASE64:
from_secret: gcp_key_base64
- GO_VERSION: 1.23.5
+ GO_VERSION: 1.24.1
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4689,7 +4689,7 @@ steps:
- export GITHUB_TOKEN=$(cat /github-app/token)
- dagger run --silent /src/grafana-build artifacts -a $${ARTIFACTS} --grafana-ref=$${GRAFANA_REF}
--enterprise-ref=$${ENTERPRISE_REF} --grafana-repo=$${GRAFANA_REPO} --version=$${VERSION}
- --go-version=1.23.5
+ --go-version=1.24.1
depends_on:
- github-app-generate-token
environment:
@@ -4710,7 +4710,7 @@ steps:
from_secret: grafana_api_key
GCP_KEY_BASE64:
from_secret: gcp_key_base64
- GO_VERSION: 1.23.5
+ GO_VERSION: 1.24.1
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4848,7 +4848,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -4857,14 +4857,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: wire-install
- commands:
- dockerize -wait tcp://postgres:5432 -timeout 120s
@@ -4885,7 +4885,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: postgres-integration-tests
- commands:
- dockerize -wait tcp://mysql80:3306 -timeout 120s
@@ -4906,7 +4906,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: mysql-8.0-integration-tests
- commands:
- dockerize -wait tcp://redis:6379 -timeout 120s
@@ -4922,7 +4922,7 @@ steps:
- wait-for-redis
environment:
REDIS_URL: redis://redis:6379/0
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: redis-integration-tests
- commands:
- dockerize -wait tcp://memcached:11211 -timeout 120s
@@ -4938,7 +4938,7 @@ steps:
- wait-for-memcached
environment:
MEMCACHED_HOSTS: memcached:11211
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: memcached-integration-tests
- commands:
- dockerize -wait tcp://mimir_backend:8080 -timeout 120s
@@ -4954,7 +4954,7 @@ steps:
environment:
AM_TENANT_ID: test
AM_URL: http://mimir_backend:8080
- image: golang:1.23.5-alpine
+ image: golang:1.24.1-alpine
name: remote-alertmanager-integration-tests
trigger:
event:
@@ -5257,7 +5257,7 @@ steps:
- commands:
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM docker:27-cli
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM alpine/git:2.40.1
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM golang:1.23.5-alpine
+ - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM golang:1.24.1-alpine
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM node:22.11.0-alpine
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM node:22-bookworm
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM google/cloud-sdk:431.0.0
@@ -5295,7 +5295,7 @@ steps:
- commands:
- trivy --exit-code 1 --severity HIGH,CRITICAL docker:27-cli
- trivy --exit-code 1 --severity HIGH,CRITICAL alpine/git:2.40.1
- - trivy --exit-code 1 --severity HIGH,CRITICAL golang:1.23.5-alpine
+ - trivy --exit-code 1 --severity HIGH,CRITICAL golang:1.24.1-alpine
- trivy --exit-code 1 --severity HIGH,CRITICAL node:22.11.0-alpine
- trivy --exit-code 1 --severity HIGH,CRITICAL node:22-bookworm
- trivy --exit-code 1 --severity HIGH,CRITICAL google/cloud-sdk:431.0.0
@@ -5564,6 +5564,6 @@ kind: secret
name: gcr_credentials
---
kind: signature
-hmac: f16a4715c7a4e6a4ffb1fe041b42fb966310fd5da455239614e9a239493aff82
+hmac: f55fddb4c6faf30b232ae778ec6c022c9f3d32955879e8a764c715642712c5ea
...
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index d2fe4b77837..c8fd9fe2158 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -67,9 +67,11 @@
/hack/ @grafana/grafana-app-platform-squad
/pkg/apis/provisioning @grafana/grafana-git-ui-sync-team
+/public/app/features/provisioning @grafana/grafana-git-ui-sync-team
/pkg/registry/apis/provisioning @grafana/grafana-git-ui-sync-team
/apps/alerting/ @grafana/alerting-backend
+/apps/dashboard/ @grafana/grafana-app-platform-squad @grafana/dashboards-squad
/apps/playlist/ @grafana/grafana-app-platform-squad
/apps/investigations/ @fcjack @matryer @svennergr
/apps/advisor/ @grafana/plugins-platform-backend
@@ -77,6 +79,7 @@
/pkg/apis/ @grafana/grafana-app-platform-squad
/pkg/apis/query @grafana/grafana-datasources-core-services
/pkg/apis/userstorage @grafana/grafana-app-platform-squad @grafana/plugins-platform-backend
+/pkg/apis/secret @grafana/grafana-operator-experience-squad
/pkg/bus/ @grafana/grafana-search-and-storage
/pkg/cmd/ @grafana/grafana-backend-group
/pkg/cmd/grafana-cli/commands/install_command.go @grafana/plugins-platform-backend
@@ -500,7 +503,7 @@ playwright.config.ts @grafana/plugins-platform-frontend
/public/app/features/dimensions/ @grafana/dataviz-squad
/public/app/features/dataframe-import/ @grafana/dataviz-squad
/public/app/features/explore/ @grafana/observability-traces-and-profiling
-/public/app/features/expressions/ @grafana/observability-metrics
+/public/app/features/expressions/ @grafana/grafana-datasources-core-services
/public/app/features/folders/ @grafana/grafana-frontend-platform
/public/app/features/iam/ @grafana/grafana-frontend-platform
/public/app/features/inspector/ @grafana/dashboards-squad
@@ -754,9 +757,9 @@ embed.go @grafana/grafana-as-code
/.github/pr-checks.json @tolzhabayev
/.github/pr-commands.json @tolzhabayev
/.github/renovate.json5 @grafana/frontend-ops
-/.github/actions/report-coverage @grafana/grafana-backend-group
-/.github/actions/run-backend-tests @grafana/grafana-backend-group
-/.github/actions/setup-enterprise @grafana/grafana-backend-group
+/.github/actions/setup-enterprise/action.yml @grafana/grafana-backend-group
+/.github/actions/test-coverage-processor/action.yml @grafana/grafana-backend-group
+/.github/actions/setup-grafana-bench/ @Proximyst
/.github/workflows/add-to-whats-new.yml @grafana/docs-tooling
/.github/workflows/auto-triager/ @grafana/plugins-platform-frontend
/.github/workflows/alerting-swagger-gen.yml @grafana/alerting-backend
@@ -789,14 +792,18 @@ embed.go @grafana/grafana-as-code
/.github/workflows/pr-codeql-analysis-javascript.yml @DanCech
/.github/workflows/pr-codeql-analysis-python.yml @DanCech
/.github/workflows/pr-commands.yml @tolzhabayev
+/.github/workflows/pr-lint-build-docs.yml @grafana/docs-tooling
/.github/workflows/pr-patch-check.yml @grafana/grafana-developer-enablement-squad
-/.github/workflows/pr-test-backend.yml @grafana/grafana-backend-group
+/.github/workflows/pr-test-integration.yml @grafana/grafana-backend-group
+/.github/workflows/pr-backend-unit-tests.yml @grafana/grafana-backend-group
+/.github/workflows/pr-backend-coverage.yml @grafana/grafana-backend-group
/.github/workflows/sync-mirror.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/publish-technical-documentation-next.yml @grafana/docs-tooling
/.github/workflows/publish-technical-documentation-release.yml @grafana/docs-tooling
/.github/workflows/remove-milestone.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/scripts/json-file-to-job-output.js @grafana/plugins-platform-frontend
/.github/workflows/stale.yml @grafana/grafana-developer-enablement-squad
+/.github/workflows/storybook-verification.yml @grafana/grafana-frontend-platform
/.github/workflows/update-changelog.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/update-make-docs.yml @grafana/docs-tooling
/.github/workflows/scripts/kinds/verify-kinds.go @grafana/platform-monitoring
@@ -818,6 +825,8 @@ embed.go @grafana/grafana-as-code
/.github/workflows/changelog.yml @zserge
/.github/workflows/actions/changelog @zserge
/.github/workflows/frontend-unit-tests.yml @grafana/grafana-frontend-platform
+/.github/workflows/frontend-lint.yml @grafana/grafana-frontend-platform
+/.github/workflows/analytics-events-report.yml @grafana/grafana-frontend-platform
# Generated files not requiring owner approval
/packages/grafana-data/src/types/featureToggles.gen.ts @grafanabot
diff --git a/.github/actions/report-coverage/action.yml b/.github/actions/report-coverage/action.yml
deleted file mode 100644
index c84aa806d7e..00000000000
--- a/.github/actions/report-coverage/action.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-name: 'Report Coverage'
-description: 'Processes and uploads coverage reports from Go tests'
-
-inputs:
- unit-cov-path:
- description: 'Path to unit test coverage file'
- required: true
- integration-cov-path:
- description: 'Path to integration test coverage file'
- required: true
-
-runs:
- using: "composite"
- steps:
- - name: Join coverage outputs
- shell: bash
- run: |
- cp ${{ inputs.unit-cov-path }} backend.cov
- tail -n+2 ${{ inputs.integration-cov-path }} >> backend.cov
-
- - name: Convert coverage info to per-func stats
- shell: bash
- run: go tool cover -func backend.cov > backend-funcs.log
-
- - name: Convert coverage info to HTML
- shell: bash
- run: go tool cover -html backend.cov -o backend.html
-
- - name: Upload coverage file
- uses: actions/upload-artifact@v4
- with:
- name: backend-cov
- path: |
- backend.cov
- backend-funcs.log
- backend.html
- retention-days: 30
- compression-level: 9
-
- - name: Set summary to total coverage
- shell: bash
- run: |
- echo '# Coverage' >> $GITHUB_STEP_SUMMARY
- echo '```' >> $GITHUB_STEP_SUMMARY
- grep 'total:' backend-funcs.log | tr '\t' ' ' >> $GITHUB_STEP_SUMMARY
- echo '```' >> $GITHUB_STEP_SUMMARY
diff --git a/.github/actions/run-backend-tests/action.yml b/.github/actions/run-backend-tests/action.yml
deleted file mode 100644
index 6ae930fa489..00000000000
--- a/.github/actions/run-backend-tests/action.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-name: 'Run Backend Tests'
-description: 'Runs Grafana backend test suites'
-
-inputs:
- coverage-opts:
- description: 'Coverage options to pass to the test command (empty for no coverage)'
- required: false
- default: ''
- test-command:
- description: 'The test command to run'
- required: false
- default: 'make gen-go test-go-unit'
-
-runs:
- using: "composite"
- steps:
- - name: Run tests
- shell: bash
- run: |
- if [ -n "${{ inputs.coverage-opts }}" ]; then
- COVER_OPTS="${{ inputs.coverage-opts }}" ${{ inputs.test-command }}
- else
- ${{ inputs.test-command }}
- fi
diff --git a/.github/actions/setup-grafana-bench/action.yml b/.github/actions/setup-grafana-bench/action.yml
new file mode 100644
index 00000000000..624ad243b7b
--- /dev/null
+++ b/.github/actions/setup-grafana-bench/action.yml
@@ -0,0 +1,44 @@
+name: 'Setup Grafana Bench'
+description: 'Sets up and installs Grafana Bench'
+
+inputs:
+ github-app-name:
+ description: 'Name of the GitHub App in Vault'
+ required: false
+ default: 'grafana-ci-bot'
+ branch:
+ description: 'The branch to install from'
+ required: false
+ default: 'main'
+
+runs:
+ using: "composite"
+ steps:
+ - name: Retrieve GitHub App secrets
+ id: get-secrets
+ uses: grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets-v1.0.1
+ with:
+ repo_secrets: |
+ APP_ID=${{ inputs.github-app-name }}:app-id
+ APP_INSTALLATION_ID=${{ inputs.github-app-name }}:app-installation-id
+ PRIVATE_KEY=${{ inputs.github-app-name }}:private-key
+
+ - name: Generate GitHub App token
+ id: generate_token
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ env.APP_ID }}
+ private-key: ${{ env.PRIVATE_KEY }}
+ repositories: "grafana-bench"
+ owner: "grafana"
+
+ - name: Setup Bench
+ shell: bash
+ env:
+ GH_TOKEN: ${{ steps.generate_token.outputs.token }}
+ run: |
+ git clone https://x-access-token:${GH_TOKEN}@github.com/grafana/grafana-bench.git ../grafana-bench
+
+ cd ../grafana-bench
+ git switch ${{ inputs.branch }}
+ go install .
diff --git a/.github/actions/test-coverage-processor/action.yml b/.github/actions/test-coverage-processor/action.yml
new file mode 100644
index 00000000000..7560031e846
--- /dev/null
+++ b/.github/actions/test-coverage-processor/action.yml
@@ -0,0 +1,48 @@
+name: 'Go Coverage Processor'
+description: 'Process Go test coverage files and generate reports'
+
+inputs:
+ test-type:
+ description: 'Type of test (e.g., be-unit, be-integration)'
+ required: true
+ type: string
+ coverage-file:
+ description: 'Path to the Go coverage file (.cov)'
+ required: true
+ type: string
+ codecov-token:
+ description: 'Token for CodeCov (required for CodeCov reporting)'
+ required: false
+ default: ''
+ codecov-flag:
+ description: 'Flag to categorize the upload to CodeCov'
+ required: false
+ default: ''
+ codecov-name:
+ description: 'Custom name for the upload to CodeCov'
+ required: false
+ default: ''
+
+runs:
+ using: 'composite'
+ steps:
+ - name: Process Go coverage output
+ shell: bash
+ run: |
+ # Ensure valid coverage file even if empty
+ if [ ! -s ${{ inputs.coverage-file }} ]; then
+ echo "Coverage file is empty, creating a minimal valid file"
+ echo "mode: set" > ${{ inputs.coverage-file }}
+ fi
+
+ - name: Report coverage to CodeCov
+ uses: codecov/codecov-action@v5
+ if: inputs.codecov-token != ''
+ with:
+ files: ${{ inputs.coverage-file }}
+ flags: ${{ inputs.codecov-flag || inputs.test-type }}
+ name: ${{ inputs.codecov-name || inputs.test-type }}
+ slug: grafana/grafana
+ # This URL doesn't use the Google auth, but is much more locked down. As such, it requires OIDC or a CodeCov-provided token to do anything.
+ url: https://codecov-webhook.grafana-dev.net
+ token: ${{ inputs.codecov-token }}
diff --git a/.github/commands.json b/.github/commands.json
index f2896d61551..e6c2036d7cf 100644
--- a/.github/commands.json
+++ b/.github/commands.json
@@ -1115,14 +1115,6 @@
"url": "https://github.com/orgs/grafana/projects/202"
}
},
- {
- "type": "label",
- "name": "area/editor",
- "action": "addToProject",
- "addToProject": {
- "url": "https://github.com/grafana/grafana/projects/21"
- }
- },
{
"type": "label",
"name": "area/data/export",
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 0de94ce207d..dd2c234e3ff 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -11,6 +11,7 @@ updates:
- "/apps/investigations"
- "/pkg/aggregator"
- "/pkg/apimachinery"
+ - "/pkg/apis/secret"
- "/pkg/apiserver"
- "/pkg/build"
- "/pkg/build/wire"
diff --git a/.github/workflows/analytics-events-report.yml b/.github/workflows/analytics-events-report.yml
new file mode 100644
index 00000000000..9d4d6907256
--- /dev/null
+++ b/.github/workflows/analytics-events-report.yml
@@ -0,0 +1,23 @@
+name: Analytics Events Report
+
+on:
+ workflow_dispatch:
+
+jobs:
+ generate-report:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: '.nvmrc'
+ cache: 'yarn'
+
+ - name: Install dependencies
+ run: yarn install --frozen-lockfile
+
+ - name: Generate analytics report
+ run: yarn analytics-report
diff --git a/.github/workflows/auto-triager/labels.txt b/.github/workflows/auto-triager/labels.txt
index 6b7b9e37f8b..1a33cf676dc 100644
--- a/.github/workflows/auto-triager/labels.txt
+++ b/.github/workflows/auto-triager/labels.txt
@@ -32,7 +32,6 @@ area/dashboard/tv
area/dashboard/variable
area/dashboards/panel
area/data/export
-area/editor
area/explore
area/exploremetrics
area/expressions
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index c1f90ceb831..8c8b1abde50 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -8,7 +8,7 @@ name: "CodeQL"
on:
workflow_dispatch:
push:
- branches: [main, v1.8.x, v2.0.x, v2.1.x, v2.6.x, v3.0.x, v3.1.x, v4.0.x, v4.1.x, v4.2.x, v4.3.x, v4.4.x, v4.5.x, v4.6.x, v4.7.x, v5.0.x, v5.1.x, v5.2.x, v5.3.x, v5.4.x, v6.0.x, v6.1.x, v6.2.x, v6.3.x, v6.4.x, v6.5.x, v6.6.x, v6.7.x, v7.0.x, v7.1.x, v7.2.x]
+ branches: [main, v*.*.*]
paths-ignore:
- '**/*.cue'
- '**/*.json'
diff --git a/.github/workflows/frontend-lint.yml b/.github/workflows/frontend-lint.yml
new file mode 100644
index 00000000000..a9b65b247fb
--- /dev/null
+++ b/.github/workflows/frontend-lint.yml
@@ -0,0 +1,55 @@
+name: Lint Frontend
+on:
+ pull_request:
+ push:
+ branches:
+ - main
+ - release-*.*.*
+
+jobs:
+ verify-i18n:
+ name: Verify i18n
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version-file: '.nvmrc'
+ cache: 'yarn'
+ cache-dependency-path: 'yarn.lock'
+ - run: yarn install --immutable --check-cache
+ - run: |
+ extract_error_message='::error::Extraction failed. Make sure that you have no dynamic translation phrases, such as "t(`preferences.theme.{themeID}`, themeName)" and that no translation key is used twice. Search the output for '[warning]' to find the offending file.'
+ make i18n-extract || (echo "${extract_error_message}" && false)
+ - run: |
+ uncommited_error_message="::error::Translation extraction has not been committed. Please run 'make i18n-extract', commit the changes and push again."
+ file_diff=$(git diff --dirstat public/locales)
+ if [ -n "$file_diff" ]; then
+ echo $file_diff
+ echo "${uncommited_error_message}"
+ exit 1
+ fi
+ prettier:
+ name: Prettier
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version-file: '.nvmrc'
+ cache: 'yarn'
+ cache-dependency-path: 'yarn.lock'
+ - run: yarn install --immutable --check-cache
+ - run: yarn run prettier:check
+ typecheck:
+ name: Typecheck
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version-file: '.nvmrc'
+ cache: 'yarn'
+ cache-dependency-path: 'yarn.lock'
+ - run: yarn install --immutable --check-cache
+ - run: yarn run typecheck
diff --git a/.github/workflows/pr-backend-code-checks.yml b/.github/workflows/pr-backend-code-checks.yml
index bd26963ad39..37073dc28c4 100644
--- a/.github/workflows/pr-backend-code-checks.yml
+++ b/.github/workflows/pr-backend-code-checks.yml
@@ -21,8 +21,13 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v5
with:
- go-version: '1.23.5'
+ go-version-file: go.mod
cache: true
+
+ - name: Verify code generation
+ run: |
+ CODEGEN_VERIFY=1 make gen-cue
+ CODEGEN_VERIFY=1 make gen-jsonnet
- name: Validate go.mod
run: go run scripts/modowners/modowners.go check go.mod
diff --git a/.github/workflows/pr-backend-coverage.yml b/.github/workflows/pr-backend-coverage.yml
new file mode 100644
index 00000000000..7935860c798
--- /dev/null
+++ b/.github/workflows/pr-backend-coverage.yml
@@ -0,0 +1,69 @@
+name: Coverage
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - main
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+permissions:
+ contents: read
+ id-token: write
+
+env:
+ EDITION: 'oss'
+ WIRE_TAGS: 'oss'
+
+jobs:
+ main:
+ name: Backend Unit Tests
+ runs-on: ubuntu-latest-8-cores
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version-file: go.mod
+ cache: true
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y build-essential shared-mime-info
+ go install github.com/mfridman/tparse@c1754a1f484ac5cd422697b0fec635177ddc8507 # v0.17.0
+ - name: Generate Go code
+ run: make gen-go
+ - name: Run unit tests
+ run: COVER_OPTS="-coverprofile=be-unit.cov -coverpkg=github.com/grafana/grafana/..." GO_TEST_OUTPUT="/tmp/unit.log" make test-go-unit-cov
+ - name: Process and upload coverage
+ uses: ./.github/actions/test-coverage-processor
+ with:
+ test-type: 'be-unit'
+ # Needs to be named 'unit.cov' based on the Makefile command `make test-go-unit`
+ coverage-file: 'unit.cov'
+ codecov-token: ${{ secrets.CODECOV_TOKEN }}
+ codecov-flag: 'be-unit'
+ codecov-name: 'be-unit'
+
+ - name: Install Grafana Bench
+ # We can't allow forks here, as we need secret access.
+ if: ${{ github.event_name != 'pull_request' }}
+ uses: ./.github/actions/setup-grafana-bench
+
+ - name: Process output for Bench
+ if: ${{ github.event_name != 'pull_request' }}
+ run: |
+ grafana-bench report \
+ --trigger pr-backend-unit-tests-oss \
+ --report-input go \
+ --report-output log \
+ --grafana-version "$(git rev-parse HEAD)" \
+ --suite-name grafana-oss-unit-tests \
+ /tmp/unit.log
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: false
diff --git a/.github/workflows/pr-backend-unit-tests.yml b/.github/workflows/pr-backend-unit-tests.yml
new file mode 100644
index 00000000000..f81b9c8f6ac
--- /dev/null
+++ b/.github/workflows/pr-backend-unit-tests.yml
@@ -0,0 +1,104 @@
+name: Backend Unit Tests
+
+on:
+ pull_request:
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+ id-token: write
+
+jobs:
+ grafana:
+ # Run this workflow only for PRs from forks; if it gets merged into `main` or `release-*`,
+ # the `pr-backend-unit-tests-enterprise` workflow will run instead
+ if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == true
+ name: Grafana
+ runs-on: ubuntu-latest-8-cores
+ continue-on-error: true
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version-file: go.mod
+ - name: Restore GOCACHE
+ uses: actions/cache/restore@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}
+ restore-keys: |
+ go-test-cache-${{ github.base_ref }}
+ go-test-cache-main
+ path: /home/runner/.cache/go-build
+ - name: Generate Go code
+ run: make gen-go
+ - name: Run unit tests
+ run: make test-go-unit
+ - name: "Generate token"
+ id: generate_token
+ uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
+ with:
+ app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
+ private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
+ - name: Clear GOCACHE
+ run: gh cache delete go-test-cache-${{ github.ref_name }}
+ continue-on-error: true
+ env:
+ GH_TOKEN: ${{ steps.generate_token.outputs.token }}
+ - name: Save GOCACHE
+ uses: actions/cache/save@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}
+ path: /home/runner/.cache/go-build
+
+ grafana-enterprise:
+ # Run this workflow for non-PR events (like pushes to `main` or `release-*`) OR for internal PRs (PRs not from forks)
+ if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false
+ name: Grafana Enterprise
+ runs-on: ubuntu-latest-8-cores
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version-file: go.mod
+ - name: Restore GOCACHE
+ uses: actions/cache/restore@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}-enterprise
+ restore-keys: |
+ go-test-cache-${{ github.base_ref }}-enterprise
+ go-test-cache-main-enterprise
+ path: /home/runner/.cache/go-build
+ - name: Setup Enterprise
+ uses: ./.github/actions/setup-enterprise
+ with:
+ github-app-name: 'grafana-ci-bot'
+ - name: Generate Go code
+ run: make gen-go
+ - name: Run unit tests
+ run: make test-go-unit
+ - name: "Generate token"
+ id: generate_token
+ uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
+ with:
+ app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
+ private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
+ - name: Clear GOCACHE
+ run: gh cache delete go-test-cache-${{ github.ref_name }}-enterprise
+ continue-on-error: true
+ env:
+ GH_TOKEN: ${{ steps.generate_token.outputs.token }}
+ - name: Save GOCACHE
+ uses: actions/cache/save@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}-enterprise
+ path: /home/runner/.cache/go-build
diff --git a/.github/workflows/pr-codeql-analysis-go.yml b/.github/workflows/pr-codeql-analysis-go.yml
index ce9082f4400..46645b7fa3f 100644
--- a/.github/workflows/pr-codeql-analysis-go.yml
+++ b/.github/workflows/pr-codeql-analysis-go.yml
@@ -40,7 +40,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v2
+ uses: github/codeql-action/init@v3
with:
languages: "go"
@@ -50,4 +50,4 @@ jobs:
make build-go
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
+ uses: github/codeql-action/analyze@v3
diff --git a/.github/workflows/pr-codeql-analysis-javascript.yml b/.github/workflows/pr-codeql-analysis-javascript.yml
index 6c5264c926a..d24b7db9671 100644
--- a/.github/workflows/pr-codeql-analysis-javascript.yml
+++ b/.github/workflows/pr-codeql-analysis-javascript.yml
@@ -28,9 +28,9 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v2
+ uses: github/codeql-action/init@v3
with:
languages: "javascript"
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
+ uses: github/codeql-action/analyze@v3
diff --git a/.github/workflows/pr-codeql-analysis-python.yml b/.github/workflows/pr-codeql-analysis-python.yml
index aea55365afc..4e8b1b14747 100644
--- a/.github/workflows/pr-codeql-analysis-python.yml
+++ b/.github/workflows/pr-codeql-analysis-python.yml
@@ -26,9 +26,9 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v2
+ uses: github/codeql-action/init@v3
with:
languages: "python"
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
+ uses: github/codeql-action/analyze@v3
diff --git a/.github/workflows/pr-lint-build-docs.yml b/.github/workflows/pr-lint-build-docs.yml
new file mode 100644
index 00000000000..8ed36d3da9a
--- /dev/null
+++ b/.github/workflows/pr-lint-build-docs.yml
@@ -0,0 +1,52 @@
+name: Documentation
+
+on:
+ pull_request:
+ paths:
+ - '*.md'
+ - 'docs/**'
+ - 'packages/**/*.md'
+ - 'latest.json'
+
+jobs:
+ docs:
+ name: Build & Verify Docs
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22.11.0'
+ cache: 'yarn'
+
+ - name: Install dependencies
+ run: yarn install --immutable
+
+ - name: Lint docs
+ run: yarn run prettier:checkDocs
+ env:
+ # Increase memory for prettier due to large number of files
+ NODE_OPTIONS: --max_old_space_size=8192
+
+ - name: Build docs website
+ run: |
+ # Create and start a container from the docs-base image in detached mode
+ docker run -d --name docs-builder grafana/docs-base:latest tail -f /dev/null
+
+ # Create the directory structure inside the container
+ docker exec docs-builder mkdir -p /hugo/content/docs/grafana/latest
+
+ # Create the _index.md file
+ docker exec docs-builder /bin/sh -c "echo -e '---\nredirectURL: /docs/grafana/latest/\ntype: redirect\nversioned: true\n---\n' > /hugo/content/docs/grafana/_index.md"
+
+ # Copy the docs sources from the host to the container
+ docker cp docs/sources/. docs-builder:/hugo/content/docs/grafana/latest/
+
+ # Run the make prod command inside the container
+ docker exec -w /hugo docs-builder make prod || echo "Build completed with warnings"
+
+ # Clean up the container
+ docker rm -f docs-builder
diff --git a/.github/workflows/pr-test-backend.yml b/.github/workflows/pr-test-backend.yml
deleted file mode 100644
index da7e3450a54..00000000000
--- a/.github/workflows/pr-test-backend.yml
+++ /dev/null
@@ -1,106 +0,0 @@
-name: Test Backend
-
-on:
- workflow_dispatch:
- push:
- branches:
- - main
- paths-ignore:
- - 'docs/**'
- - '**/*.md'
- pull_request:
- paths-ignore:
- - 'docs/**'
- - '**/*.md'
-
-permissions:
- contents: read
- id-token: write
-
-env:
- EDITION: 'oss'
-
-jobs:
- test-backend:
- name: Test Backend
- runs-on: ubuntu-latest
- continue-on-error: true
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Setup Go
- uses: actions/setup-go@v5
- with:
- go-version: '1.23.5'
- cache: true
-
- - name: Install dependencies
- run: |
- sudo apt-get update
- sudo apt-get install -y build-essential shared-mime-info make
-
- - name: Get runner name
- run: echo ${{ runner.name }}
-
- - name: Setup Enterprise (PR only)
- if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == false
- uses: ./.github/actions/setup-enterprise
-
- - name: Verify CUE generation
- run: CODEGEN_VERIFY=1 make gen-cue
-
- - name: Verify Jsonnet generation
- run: CODEGEN_VERIFY=1 make gen-jsonnet
-
- - name: Check if coverage should be generated
- id: check-coverage
- env:
- GH_TOKEN: ${{ github.token }}
- run: |
- echo "Event: ${{ github.event_name }}"
- echo "Ref: ${{ github.ref }}"
-
- if [[ "${{ github.event_name }}" == "pull_request" ]]; then
- echo "PR changed files:"
- files=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --jq '.[].filename')
- echo "$files"
- if echo "$files" | grep -E "(pkg/|go\.)"; then
- echo "Coverage will be generated: true (PR changes)"
- echo "generate=true" >> $GITHUB_OUTPUT
- else
- echo "Coverage will be generated: false"
- echo "generate=false" >> $GITHUB_OUTPUT
- fi
- elif [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" == "refs/heads/main" ]] && \
- [[ "${{ github.event.head_commit.modified }}" =~ (pkg/|go\.|\.github/workflows/pr-test-backend\.yml) ]]; then
- echo "Coverage will be generated: true (push to main)"
- echo "generate=true" >> $GITHUB_OUTPUT
- else
- echo "Coverage will be generated: false"
- echo "generate=false" >> $GITHUB_OUTPUT
- fi
-
- - name: Run backend tests
- uses: ./.github/actions/run-backend-tests
- with:
- coverage-opts: ${{ steps.check-coverage.outputs.generate == 'true' && '-coverprofile=unit.cov -coverpkg=github.com/grafana/grafana/...' || '' }}
- test-command: 'make gen-go test-go-unit'
-
- - name: Run backend integration tests
- uses: ./.github/actions/run-backend-tests
- with:
- coverage-opts: ${{ steps.check-coverage.outputs.generate == 'true' && '-coverprofile=integration.cov -coverpkg=github.com/grafana/grafana/...' || '' }}
- test-command: 'make gen-go test-go-integration'
-
- - name: Generate Coverage Report
- if: steps.check-coverage.outputs.generate == 'true'
- uses: ./.github/actions/report-coverage
- with:
- unit-cov-path: unit.cov
- integration-cov-path: integration.cov
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
diff --git a/.github/workflows/pr-test-integration.yml b/.github/workflows/pr-test-integration.yml
new file mode 100644
index 00000000000..f0a5f0a7fa3
--- /dev/null
+++ b/.github/workflows/pr-test-integration.yml
@@ -0,0 +1,126 @@
+name: Integration Tests
+
+on:
+ push:
+ branches:
+ - main
+ - release-*.*.*
+ pull_request:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ sqlite:
+ name: Sqlite
+ runs-on: ubuntu-latest-8-cores
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version-file: go.mod
+ cache: true
+ - name: Restore GOCACHE
+ uses: actions/cache/restore@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}-sqlite
+ restore-keys: |
+ go-test-cache-${{ github.base_ref }}-sqlite
+ go-test-cache-main-sqlite
+ path: /home/runner/.cache/go-build
+ - run: |
+ make gen-go
+ go test -tags=sqlite -timeout=5m -run '^TestIntegration' $(find ./pkg -type f -name '*_test.go' -exec grep -l '^func TestIntegration' '{}' '+' | grep -o '\(.*\)/' | sort -u)
+ - name: Save GOCACHE
+ uses: actions/cache/save@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}-sqlite
+ path: /home/runner/.cache/go-build
+ mysql:
+ name: MySQL
+ runs-on: ubuntu-latest-8-cores
+ env:
+ GRAFANA_TEST_DB: mysql
+ MYSQL_HOST: 127.0.0.1
+ services:
+ mysql:
+ image: mysql:8.0.32
+ env:
+ MYSQL_ROOT_PASSWORD: rootpass
+ MYSQL_DATABASE: grafana_tests
+ MYSQL_USER: grafana
+ MYSQL_PASSWORD: password
+ options: --health-cmd="mysqladmin ping --silent" --health-interval=10s --health-timeout=5s --health-retries=3
+ ports:
+ - 3306:3306
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version-file: go.mod
+ cache: true
+ - name: Restore GOCACHE
+ uses: actions/cache/restore@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}-mysql
+ restore-keys: |
+ go-test-cache-${{ github.base_ref }}-mysql
+ go-test-cache-main-mysql
+ path: /home/runner/.cache/go-build
+ - run: |
+ sudo apt-get update -yq && sudo apt-get install mariadb-client
+ cat devenv/docker/blocks/mysql_tests/setup.sql | mariadb -h 127.0.0.1 -P 3306 -u root -prootpass --disable-ssl-verify-server-cert
+ make gen-go
+ go test -tags=mysql -p=1 -timeout=5m -run '^TestIntegration' $(find ./pkg -type f -name '*_test.go' -exec grep -l '^func TestIntegration' '{}' '+' | grep -o '\(.*\)/' | sort -u)
+ - name: Save GOCACHE
+ uses: actions/cache/save@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}-mysql
+ path: /home/runner/.cache/go-build
+ postgres:
+ name: Postgres
+ runs-on: ubuntu-latest-8-cores
+ services:
+ postgres:
+ image: postgres:12.3-alpine
+ env:
+ POSTGRES_USER: grafanatest
+ POSTGRES_PASSWORD: grafanatest
+ POSTGRES_DB: grafanatest
+ ports:
+ - 5432:5432
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version-file: go.mod
+ cache: true
+ - name: Restore GOCACHE
+ uses: actions/cache/restore@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}-postgres
+ restore-keys: |
+ go-test-cache-${{ github.base_ref }}-postgres
+ go-test-cache-main-postgres
+ path: /home/runner/.cache/go-build
+ - env:
+ GRAFANA_TEST_DB: postgres
+ PGPASSWORD: grafanatest
+ POSTGRES_HOST: 127.0.0.1
+ run: |
+ sudo apt-get update -yq && sudo apt-get install postgresql-client
+ psql -p 5432 -h 127.0.0.1 -U grafanatest -d grafanatest -f devenv/docker/blocks/postgres_tests/setup.sql
+ make gen-go
+ go test -p=1 -tags=postgres -timeout=5m -run '^TestIntegration' $(find ./pkg -type f -name '*_test.go' -exec grep -l '^func TestIntegration' '{}' '+' | grep -o '\(.*\)/' | sort -u)
+ - name: Save GOCACHE
+ uses: actions/cache/save@v4
+ with:
+ key: go-test-cache-${{ github.ref_name }}-postgres
+ path: /home/runner/.cache/go-build
diff --git a/.github/workflows/storybook-verification.yml b/.github/workflows/storybook-verification.yml
new file mode 100644
index 00000000000..72eb6a4ad4c
--- /dev/null
+++ b/.github/workflows/storybook-verification.yml
@@ -0,0 +1,40 @@
+name: Verify Storybook
+
+on:
+ pull_request:
+ paths:
+ - 'packages/grafana-ui/**'
+ - '.github/workflows/storybook-verification.yml'
+ - '!docs/**'
+ - '!*.md'
+
+jobs:
+ verify-storybook:
+ name: Verify Storybook
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: 'package.json'
+ cache: 'yarn'
+
+ - name: Install dependencies
+ run: yarn install --immutable
+
+ - name: Run Storybook and E2E tests
+ uses: cypress-io/github-action@v6
+ with:
+ browser: chrome
+ start: yarn storybook --quiet
+ wait-on: 'http://localhost:9001'
+ wait-on-timeout: 60
+ command: yarn e2e:storybook
+ install: false
+ env:
+ HOST: localhost
+ PORT: 9001
diff --git a/.gitignore b/.gitignore
index 1a8be100668..eabffd1dbf4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -68,6 +68,8 @@ public/css/*.min.css
.vscode/
!.vscode/launch.json
.vs/
+.cursor/
+
.eslintcache
.stylelintcache
diff --git a/.prettierignore b/.prettierignore
index 8bf9dc13276..23d9231bc49 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -19,6 +19,9 @@ vendor
# TS generate from cue by cuetsy
**/*.gen.ts
+# TS generated by grafana-app-sdk
+**/*_gen.ts
+
# Auto-generated theme files
theme.light.generated.json
theme.dark.generated.json
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 67c4f82699b..50393b02272 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -11,6 +11,11 @@
"cwd": "${workspaceFolder}",
"args": ["server", "--homepath", "${workspaceFolder}", "--packaging", "dev", "cfg:app_mode=development"]
},
+ {
+ "name": "Attach to Go Process",
+ "type": "go",
+ "request": "attach"
+ },
{
"name": "Attach to Test Process",
"type": "go",
diff --git a/Dockerfile b/Dockerfile
index 09cba46da26..f5e45b6259d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,7 +6,7 @@
ARG BASE_IMAGE=alpine:3.21
ARG JS_IMAGE=node:22-alpine
ARG JS_PLATFORM=linux/amd64
-ARG GO_IMAGE=golang:1.23.5-alpine
+ARG GO_IMAGE=golang:1.23.7-alpine
# Default to building locally
ARG GO_SRC=go-builder
@@ -48,13 +48,13 @@ ARG WIRE_TAGS="oss"
ARG BINGO="true"
RUN if grep -i -q alpine /etc/issue; then \
- apk add --no-cache \
- # This is required to allow building on arm64 due to https://github.com/golang/go/issues/22040
- binutils-gold \
- bash \
- # Install build dependencies
- gcc g++ make git; \
- fi
+ apk add --no-cache \
+ # This is required to allow building on arm64 due to https://github.com/golang/go/issues/22040
+ binutils-gold \
+ bash \
+ # Install build dependencies
+ gcc g++ make git; \
+ fi
WORKDIR /tmp/grafana
@@ -63,6 +63,7 @@ COPY .bingo .bingo
# Include vendored dependencies
COPY pkg/util/xorm pkg/util/xorm
+COPY pkg/apis/secret pkg/apis/secret
COPY pkg/apiserver pkg/apiserver
COPY pkg/apimachinery pkg/apimachinery
COPY pkg/build pkg/build
@@ -75,6 +76,7 @@ COPY pkg/aggregator pkg/aggregator
COPY apps/playlist apps/playlist
COPY apps/investigations apps/investigations
COPY apps/advisor apps/advisor
+COPY apps/dashboard apps/dashboard
COPY apps apps
COPY kindsv2 kindsv2
COPY apps/alerting/notifications apps/alerting/notifications
@@ -83,9 +85,9 @@ COPY pkg/plugins/codegen pkg/plugins/codegen
RUN go mod download
RUN if [[ "$BINGO" = "true" ]]; then \
- go install github.com/bwplotka/bingo@latest && \
- bingo get -v; \
- fi
+ go install github.com/bwplotka/bingo@latest && \
+ bingo get -v; \
+ fi
COPY embed.go Makefile build.go package.json ./
COPY cue.mod cue.mod
@@ -130,75 +132,75 @@ ARG GF_UID="472"
ARG GF_GID="0"
ENV PATH="/usr/share/grafana/bin:$PATH" \
- GF_PATHS_CONFIG="/etc/grafana/grafana.ini" \
- GF_PATHS_DATA="/var/lib/grafana" \
- GF_PATHS_HOME="/usr/share/grafana" \
- GF_PATHS_LOGS="/var/log/grafana" \
- GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \
- GF_PATHS_PROVISIONING="/etc/grafana/provisioning"
+ GF_PATHS_CONFIG="/etc/grafana/grafana.ini" \
+ GF_PATHS_DATA="/var/lib/grafana" \
+ GF_PATHS_HOME="/usr/share/grafana" \
+ GF_PATHS_LOGS="/var/log/grafana" \
+ GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \
+ GF_PATHS_PROVISIONING="/etc/grafana/provisioning"
WORKDIR $GF_PATHS_HOME
# Install dependencies
RUN if grep -i -q alpine /etc/issue; then \
- apk add --no-cache ca-certificates bash curl tzdata musl-utils && \
- apk info -vv | sort; \
- elif grep -i -q ubuntu /etc/issue; then \
- DEBIAN_FRONTEND=noninteractive && \
- apt-get update && \
- apt-get install -y ca-certificates curl tzdata musl && \
- apt-get autoremove -y && \
- rm -rf /var/lib/apt/lists/*; \
- else \
- echo 'ERROR: Unsupported base image' && /bin/false; \
- fi
+ apk add --no-cache ca-certificates bash curl tzdata musl-utils && \
+ apk info -vv | sort; \
+ elif grep -i -q ubuntu /etc/issue; then \
+ DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y ca-certificates curl tzdata musl && \
+ apt-get autoremove -y && \
+ rm -rf /var/lib/apt/lists/*; \
+ else \
+ echo 'ERROR: Unsupported base image' && /bin/false; \
+ fi
# glibc support for alpine x86_64 only
# docker run --rm --env STDOUT=1 sgerrand/glibc-builder 2.40 /usr/glibc-compat > glibc-bin-2.40.tar.gz
ARG GLIBC_VERSION=2.40
RUN if grep -i -q alpine /etc/issue && [ `arch` = "x86_64" ]; then \
- wget -qO- "https://dl.grafana.com/glibc/glibc-bin-$GLIBC_VERSION.tar.gz" | tar zxf - -C / \
- usr/glibc-compat/lib/ld-linux-x86-64.so.2 \
- usr/glibc-compat/lib/libc.so.6 \
- usr/glibc-compat/lib/libdl.so.2 \
- usr/glibc-compat/lib/libm.so.6 \
- usr/glibc-compat/lib/libpthread.so.0 \
- usr/glibc-compat/lib/librt.so.1 \
- usr/glibc-compat/lib/libresolv.so.2 && \
- mkdir /lib64 && \
- ln -s /usr/glibc-compat/lib/ld-linux-x86-64.so.2 /lib64; \
- fi
+ wget -qO- "https://dl.grafana.com/glibc/glibc-bin-$GLIBC_VERSION.tar.gz" | tar zxf - -C / \
+ usr/glibc-compat/lib/ld-linux-x86-64.so.2 \
+ usr/glibc-compat/lib/libc.so.6 \
+ usr/glibc-compat/lib/libdl.so.2 \
+ usr/glibc-compat/lib/libm.so.6 \
+ usr/glibc-compat/lib/libpthread.so.0 \
+ usr/glibc-compat/lib/librt.so.1 \
+ usr/glibc-compat/lib/libresolv.so.2 && \
+ mkdir /lib64 && \
+ ln -s /usr/glibc-compat/lib/ld-linux-x86-64.so.2 /lib64; \
+ fi
COPY --from=go-src /tmp/grafana/conf ./conf
RUN if [ ! $(getent group "$GF_GID") ]; then \
- if grep -i -q alpine /etc/issue; then \
- addgroup -S -g $GF_GID grafana; \
- else \
- addgroup --system --gid $GF_GID grafana; \
- fi; \
- fi && \
- GF_GID_NAME=$(getent group $GF_GID | cut -d':' -f1) && \
- mkdir -p "$GF_PATHS_HOME/.aws" && \
- if grep -i -q alpine /etc/issue; then \
- adduser -S -u $GF_UID -G "$GF_GID_NAME" grafana; \
- else \
- adduser --system --uid $GF_UID --ingroup "$GF_GID_NAME" grafana; \
- fi && \
- mkdir -p "$GF_PATHS_PROVISIONING/datasources" \
- "$GF_PATHS_PROVISIONING/dashboards" \
- "$GF_PATHS_PROVISIONING/notifiers" \
- "$GF_PATHS_PROVISIONING/plugins" \
- "$GF_PATHS_PROVISIONING/access-control" \
- "$GF_PATHS_PROVISIONING/alerting" \
- "$GF_PATHS_LOGS" \
- "$GF_PATHS_PLUGINS" \
- "$GF_PATHS_DATA" && \
- cp conf/sample.ini "$GF_PATHS_CONFIG" && \
- cp conf/ldap.toml /etc/grafana/ldap.toml && \
- chown -R "grafana:$GF_GID_NAME" "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" && \
- chmod -R 777 "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING"
+ if grep -i -q alpine /etc/issue; then \
+ addgroup -S -g $GF_GID grafana; \
+ else \
+ addgroup --system --gid $GF_GID grafana; \
+ fi; \
+ fi && \
+ GF_GID_NAME=$(getent group $GF_GID | cut -d':' -f1) && \
+ mkdir -p "$GF_PATHS_HOME/.aws" && \
+ if grep -i -q alpine /etc/issue; then \
+ adduser -S -u $GF_UID -G "$GF_GID_NAME" grafana; \
+ else \
+ adduser --system --uid $GF_UID --ingroup "$GF_GID_NAME" grafana; \
+ fi && \
+ mkdir -p "$GF_PATHS_PROVISIONING/datasources" \
+ "$GF_PATHS_PROVISIONING/dashboards" \
+ "$GF_PATHS_PROVISIONING/notifiers" \
+ "$GF_PATHS_PROVISIONING/plugins" \
+ "$GF_PATHS_PROVISIONING/access-control" \
+ "$GF_PATHS_PROVISIONING/alerting" \
+ "$GF_PATHS_LOGS" \
+ "$GF_PATHS_PLUGINS" \
+ "$GF_PATHS_DATA" && \
+ cp conf/sample.ini "$GF_PATHS_CONFIG" && \
+ cp conf/ldap.toml /etc/grafana/ldap.toml && \
+ chown -R "grafana:$GF_GID_NAME" "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" && \
+ chmod -R 777 "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING"
COPY --from=go-src /tmp/grafana/bin/grafana* /tmp/grafana/bin/*/grafana* ./bin/
COPY --from=js-src /tmp/grafana/public ./public
diff --git a/Makefile b/Makefile
index bfc5491e782..96839b5c323 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ WIRE_TAGS = "oss"
include .bingo/Variables.mk
GO = go
-GO_VERSION = 1.23.5
+GO_VERSION = 1.23.7
GO_LINT_FILES ?= $(shell ./scripts/go-workspace/golangci-lint-includes.sh)
GO_TEST_FILES ?= $(shell ./scripts/go-workspace/test-includes.sh)
SH_FILES ?= $(shell find ./scripts -name *.sh)
@@ -17,6 +17,10 @@ GO_RACE_FLAG := $(if $(GO_RACE),-race)
GO_BUILD_FLAGS += $(if $(GO_BUILD_DEV),-dev)
GO_BUILD_FLAGS += $(if $(GO_BUILD_TAGS),-build-tags=$(GO_BUILD_TAGS))
GO_BUILD_FLAGS += $(GO_RACE_FLAG)
+GO_TEST_OUTPUT := $(shell [ -n "$(GO_TEST_OUTPUT)" ] && echo '-json | tee $(GO_TEST_OUTPUT) | tparse -all')
+GO_UNIT_COVERAGE ?= true
+GO_UNIT_COVER_PROFILE ?= unit.cov
+GO_INTEGRATION_COVER_PROFILE ?= integration.cov
GIT_BASE = remotes/origin/main
# GNU xargs has flag -r, and BSD xargs (e.g. MacOS) has that behaviour by default
@@ -130,14 +134,12 @@ else
i18n-extract-enterprise:
@echo "Extracting i18n strings for Enterprise"
yarn run i18next --config public/locales/i18next-parser-enterprise.config.cjs
- node ./public/locales/pseudo.mjs --mode enterprise
endif
.PHONY: i18n-extract
i18n-extract: i18n-extract-enterprise
@echo "Extracting i18n strings for OSS"
yarn run i18next --config public/locales/i18next-parser.config.cjs
- node ./public/locales/pseudo.mjs --mode oss
##@ Building
.PHONY: gen-cue
@@ -247,8 +249,13 @@ test-go: test-go-unit test-go-integration
.PHONY: test-go-unit
test-go-unit: ## Run unit tests for backend with flags.
- @echo "test backend unit tests"
- $(GO) test $(GO_RACE_FLAG) -short -covermode=atomic -coverprofile=unit.cov -timeout=30m $(GO_TEST_FILES)
+ @echo "backend unit tests"
+ $(GO) test $(GO_RACE_FLAG) -v -short -timeout=30m $(GO_TEST_FILES) $(GO_TEST_OUTPUT)
+
+.PHONY: test-go-unit-cov
+test-go-unit-cov: ## Run unit tests for backend with flags and coverage
+ @echo "backend unit tests with coverage"
+ $(GO) test $(GO_RACE_FLAG) -v -short $(if $(filter true,$(GO_UNIT_COVERAGE)),-covermode=atomic -coverprofile=$(GO_UNIT_COVER_PROFILE) $(if $(GO_UNIT_TEST_COVERPKG),-coverpkg=$(GO_UNIT_TEST_COVERPKG)),) -timeout=30m $(GO_TEST_FILES) $(GO_TEST_OUTPUT)
.PHONY: test-go-unit-pretty
test-go-unit-pretty: check-tparse
@@ -261,7 +268,7 @@ test-go-unit-pretty: check-tparse
.PHONY: test-go-integration
test-go-integration: ## Run integration tests for backend with flags.
@echo "test backend integration tests"
- $(GO) test $(GO_RACE_FLAG) -count=1 -run "^TestIntegration" -covermode=atomic -coverprofile=integration.cov -timeout=5m $(GO_INTEGRATION_TESTS)
+ $(GO) test $(GO_RACE_FLAG) -count=1 -run "^TestIntegration" -covermode=atomic -coverprofile=$(GO_INTEGRATION_COVER_PROFILE) -timeout=5m $(GO_INTEGRATION_TESTS) $(GO_TEST_OUTPUT)
.PHONY: test-go-integration-alertmanager
test-go-integration-alertmanager: ## Run integration tests for the remote alertmanager (config taken from the mimir_backend block).
@@ -426,6 +433,7 @@ protobuf: ## Compile protobuf definitions
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.4.0
buf generate pkg/plugins/backendplugin/pluginextensionv2 --template pkg/plugins/backendplugin/pluginextensionv2/buf.gen.yaml
buf generate pkg/plugins/backendplugin/secretsmanagerplugin --template pkg/plugins/backendplugin/secretsmanagerplugin/buf.gen.yaml
+ buf generate pkg/apis/secret/v0alpha1/decrypt --template pkg/apis/secret/v0alpha1/decrypt/buf.gen.yaml
buf generate pkg/storage/unified/resource --template pkg/storage/unified/resource/buf.gen.yaml
buf generate pkg/services/authz/proto/v1 --template pkg/services/authz/proto/v1/buf.gen.yaml
buf generate pkg/services/ngalert/store/proto/v1 --template pkg/services/ngalert/store/proto/v1/buf.gen.yaml
diff --git a/apps/advisor/go.mod b/apps/advisor/go.mod
index df422dc8f68..917e2f985b4 100644
--- a/apps/advisor/go.mod
+++ b/apps/advisor/go.mod
@@ -1,10 +1,10 @@
module github.com/grafana/grafana/apps/advisor
-go 1.23.4
+go 1.23.7
require (
github.com/grafana/grafana-app-sdk v0.31.0
- k8s.io/apimachinery v0.32.0
+ k8s.io/apimachinery v0.32.1
k8s.io/klog/v2 v2.130.1
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f
)
@@ -31,7 +31,7 @@ require (
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
github.com/google/uuid v1.6.0 // indirect
- github.com/grafana/grafana-app-sdk/logging v0.29.0 // indirect
+ github.com/grafana/grafana-app-sdk/logging v0.30.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
@@ -53,31 +53,31 @@ require (
github.com/spf13/pflag v1.0.5 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.33.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 // indirect
- go.opentelemetry.io/otel/metric v1.33.0 // indirect
- go.opentelemetry.io/otel/sdk v1.33.0 // indirect
- go.opentelemetry.io/otel/trace v1.33.0 // indirect
+ go.opentelemetry.io/otel v1.34.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect
+ go.opentelemetry.io/otel/metric v1.34.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.34.0 // indirect
+ go.opentelemetry.io/otel/trace v1.34.0 // indirect
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
- golang.org/x/net v0.34.0 // indirect
+ golang.org/x/net v0.36.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
- golang.org/x/sync v0.10.0 // indirect
- golang.org/x/sys v0.29.0 // indirect
- golang.org/x/term v0.28.0 // indirect
- golang.org/x/text v0.21.0 // indirect
+ golang.org/x/sync v0.11.0 // indirect
+ golang.org/x/sys v0.30.0 // indirect
+ golang.org/x/term v0.29.0 // indirect
+ golang.org/x/text v0.22.0 // indirect
golang.org/x/time v0.9.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
google.golang.org/grpc v1.69.4 // indirect
- google.golang.org/protobuf v1.36.1 // indirect
+ google.golang.org/protobuf v1.36.3 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/api v0.32.0 // indirect
- k8s.io/apiextensions-apiserver v0.32.0 // indirect
- k8s.io/client-go v0.32.0 // indirect
+ k8s.io/api v0.32.1 // indirect
+ k8s.io/apiextensions-apiserver v0.32.1 // indirect
+ k8s.io/client-go v0.32.1 // indirect
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
diff --git a/apps/advisor/go.sum b/apps/advisor/go.sum
index 858c73dd4b4..cdf6cf446ed 100644
--- a/apps/advisor/go.sum
+++ b/apps/advisor/go.sum
@@ -51,8 +51,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/grafana/grafana-app-sdk v0.30.0 h1:Hqn2pETu2mQ4RpWkZYEQfu01P7xd1Z1Gj+HX/8aB0tw=
github.com/grafana/grafana-app-sdk v0.30.0/go.mod h1:jhfqNIovb+Mes2vdMf9iMCWQkp1GTNtyNuExONtiNuk=
+github.com/grafana/grafana-app-sdk v0.31.0/go.mod h1:Xw00NL7qpRLo5r3Gn48Bl1Xn2n4eUDI5pYf/wMufKWs=
github.com/grafana/grafana-app-sdk/logging v0.29.0 h1:mgbXaAf33aFwqwGVeaX30l8rkeAJH0iACgX5Rn6YkN4=
github.com/grafana/grafana-app-sdk/logging v0.29.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM=
+github.com/grafana/grafana-app-sdk/logging v0.30.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -126,20 +128,27 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw=
go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I=
+go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ=
go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M=
+go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM=
go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM=
+go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s=
go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck=
+go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -155,6 +164,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
+golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
+golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -162,17 +173,21 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
+golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -189,12 +204,15 @@ gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d h1:H8tOf8XM88HvKqLTxe755haY6r1fqqzLbEnfrmLXlSA=
google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d/go.mod h1:2v7Z7gP2ZUOGsaFyxATQSRoBnKygqVq2Cwnvom7QiqY=
+google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d h1:xJJRGY7TJcvIlpSrN3K6LAWgNFUILlO+OMAqtg9aqnw=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50=
google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A=
google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=
google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -206,12 +224,16 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
k8s.io/api v0.32.0 h1:OL9JpbvAU5ny9ga2fb24X8H6xQlVp+aJMFlgtQjR9CE=
k8s.io/api v0.32.0/go.mod h1:4LEwHZEf6Q/cG96F3dqR965sYOfmPM7rq81BLgsE0p0=
+k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k=
k8s.io/apiextensions-apiserver v0.32.0 h1:S0Xlqt51qzzqjKPxfgX1xh4HBZE+p8KKBq+k2SWNOE0=
k8s.io/apiextensions-apiserver v0.32.0/go.mod h1:86hblMvN5yxMvZrZFX2OhIHAuFIMJIZ19bTvzkP+Fmw=
+k8s.io/apiextensions-apiserver v0.32.1/go.mod h1:sxWIGuGiYov7Io1fAS2X06NjMIk5CbRHc2StSmbaQto=
k8s.io/apimachinery v0.32.0 h1:cFSE7N3rmEEtv4ei5X6DaJPHHX0C+upp+v5lVPiEwpg=
k8s.io/apimachinery v0.32.0/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
k8s.io/client-go v0.32.0 h1:DimtMcnN/JIKZcrSrstiwvvZvLjG0aSxy8PxN8IChp8=
k8s.io/client-go v0.32.0/go.mod h1:boDWvdM1Drk4NJj/VddSLnx59X3OPgwrOo0vGbtq9+8=
+k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
diff --git a/apps/advisor/pkg/app/app.go b/apps/advisor/pkg/app/app.go
index a640682b0fc..5b34db5a090 100644
--- a/apps/advisor/pkg/app/app.go
+++ b/apps/advisor/pkg/app/app.go
@@ -13,6 +13,8 @@ import (
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
"github.com/grafana/grafana/apps/advisor/pkg/app/checkscheduler"
"github.com/grafana/grafana/apps/advisor/pkg/app/checktyperegisterer"
+ "github.com/grafana/grafana/pkg/apimachinery/identity"
+ "github.com/grafana/grafana/pkg/infra/log"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/klog/v2"
)
@@ -24,6 +26,7 @@ func New(cfg app.Config) (app.App, error) {
return nil, fmt.Errorf("invalid config type")
}
checkRegistry := specificConfig.CheckRegistry
+ log := log.New("advisor.app")
// Prepare storage client
clientGenerator := k8s.NewClientRegistry(cfg.KubeConfig, k8s.ClientConfig{})
@@ -52,21 +55,29 @@ func New(cfg app.Config) (app.App, error) {
Validator: &simple.Validator{
ValidateFunc: func(ctx context.Context, req *app.AdmissionRequest) error {
if req.Object != nil {
- _, err := getCheck(req.Object, checkMap)
- return err
+ check, err := getCheck(req.Object, checkMap)
+ if err != nil {
+ return err
+ }
+ if req.Action == resource.AdmissionActionCreate {
+ go func() {
+ log.Debug("Processing check", "namespace", req.Object.GetNamespace())
+ requester, err := identity.GetRequester(ctx)
+ if err != nil {
+ log.Error("Error getting requester", "error", err)
+ return
+ }
+ ctx = identity.WithRequester(context.Background(), requester)
+ err = processCheck(ctx, client, req.Object, check)
+ if err != nil {
+ log.Error("Error processing check", "error", err)
+ }
+ }()
+ }
}
return nil
},
},
- Watcher: &simple.Watcher{
- AddFunc: func(ctx context.Context, obj resource.Object) error {
- check, err := getCheck(obj, checkMap)
- if err != nil {
- return err
- }
- return processCheck(ctx, client, obj, check)
- },
- },
},
{
Kind: advisorv0alpha1.CheckTypeKind(),
diff --git a/apps/advisor/pkg/app/checkregistry/checkregistry.go b/apps/advisor/pkg/app/checkregistry/checkregistry.go
index 335b9cc7567..31be8ae936e 100644
--- a/apps/advisor/pkg/app/checkregistry/checkregistry.go
+++ b/apps/advisor/pkg/app/checkregistry/checkregistry.go
@@ -11,6 +11,7 @@ import (
"github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext"
"github.com/grafana/grafana/pkg/services/pluginsintegration/plugininstaller"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
+ "github.com/grafana/grafana/pkg/services/pluginsintegration/provisionedplugins"
)
type CheckService interface {
@@ -25,11 +26,14 @@ type Service struct {
pluginRepo repo.Service
pluginPreinstall plugininstaller.Preinstall
managedPlugins managedplugins.Manager
+ provisionedPlugins provisionedplugins.Manager
}
func ProvideService(datasourceSvc datasources.DataSourceService, pluginStore pluginstore.Store,
pluginContextProvider *plugincontext.Provider, pluginClient plugins.Client,
- pluginRepo repo.Service, pluginPreinstall plugininstaller.Preinstall, managedPlugins managedplugins.Manager) *Service {
+ pluginRepo repo.Service, pluginPreinstall plugininstaller.Preinstall, managedPlugins managedplugins.Manager,
+ provisionedPlugins provisionedplugins.Manager,
+) *Service {
return &Service{
datasourceSvc: datasourceSvc,
pluginStore: pluginStore,
@@ -38,6 +42,7 @@ func ProvideService(datasourceSvc datasources.DataSourceService, pluginStore plu
pluginRepo: pluginRepo,
pluginPreinstall: pluginPreinstall,
managedPlugins: managedPlugins,
+ provisionedPlugins: provisionedPlugins,
}
}
@@ -54,6 +59,7 @@ func (s *Service) Checks() []checks.Check {
s.pluginRepo,
s.pluginPreinstall,
s.managedPlugins,
+ s.provisionedPlugins,
),
}
}
diff --git a/apps/advisor/pkg/app/checks/plugincheck/check.go b/apps/advisor/pkg/app/checks/plugincheck/check.go
index 45c54d4fdc0..3b08e0c5f6f 100644
--- a/apps/advisor/pkg/app/checks/plugincheck/check.go
+++ b/apps/advisor/pkg/app/checks/plugincheck/check.go
@@ -4,15 +4,18 @@ import (
"context"
"fmt"
sysruntime "runtime"
+ "slices"
"github.com/Masterminds/semver/v3"
advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
"github.com/grafana/grafana/pkg/cmd/grafana-cli/services"
+ "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins/repo"
"github.com/grafana/grafana/pkg/services/pluginsintegration/managedplugins"
"github.com/grafana/grafana/pkg/services/pluginsintegration/plugininstaller"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
+ "github.com/grafana/grafana/pkg/services/pluginsintegration/provisionedplugins"
)
func New(
@@ -20,20 +23,23 @@ func New(
pluginRepo repo.Service,
pluginPreinstall plugininstaller.Preinstall,
managedPlugins managedplugins.Manager,
+ provisionedPlugins provisionedplugins.Manager,
) checks.Check {
return &check{
- PluginStore: pluginStore,
- PluginRepo: pluginRepo,
- PluginPreinstall: pluginPreinstall,
- ManagedPlugins: managedPlugins,
+ PluginStore: pluginStore,
+ PluginRepo: pluginRepo,
+ PluginPreinstall: pluginPreinstall,
+ ManagedPlugins: managedPlugins,
+ ProvisionedPlugins: provisionedPlugins,
}
}
type check struct {
- PluginStore pluginstore.Store
- PluginRepo repo.Service
- PluginPreinstall plugininstaller.Preinstall
- ManagedPlugins managedplugins.Manager
+ PluginStore pluginstore.Store
+ PluginRepo repo.Service
+ PluginPreinstall plugininstaller.Preinstall
+ ManagedPlugins managedplugins.Manager
+ ProvisionedPlugins provisionedplugins.Manager
}
func (c *check) ID() string {
@@ -55,9 +61,11 @@ func (c *check) Steps() []checks.Step {
PluginRepo: c.PluginRepo,
},
&updateStep{
- PluginRepo: c.PluginRepo,
- PluginPreinstall: c.PluginPreinstall,
- ManagedPlugins: c.ManagedPlugins,
+ PluginRepo: c.PluginRepo,
+ PluginPreinstall: c.PluginPreinstall,
+ ManagedPlugins: c.ManagedPlugins,
+ ProvisionedPlugins: c.ProvisionedPlugins,
+ log: log.New("advisor.check.plugin.update"),
},
}
}
@@ -117,9 +125,12 @@ func (s *deprecationStep) Run(ctx context.Context, _ *advisor.CheckSpec, it any)
}
type updateStep struct {
- PluginRepo repo.Service
- PluginPreinstall plugininstaller.Preinstall
- ManagedPlugins managedplugins.Manager
+ PluginRepo repo.Service
+ PluginPreinstall plugininstaller.Preinstall
+ ManagedPlugins managedplugins.Manager
+ ProvisionedPlugins provisionedplugins.Manager
+ provisionedPlugins []string
+ log log.Logger
}
func (s *updateStep) Title() string {
@@ -146,11 +157,19 @@ func (s *updateStep) Run(ctx context.Context, _ *advisor.CheckSpec, i any) (*adv
// Skip if it's a core plugin
if p.IsCorePlugin() {
+ s.log.Debug("Skipping core plugin", "plugin", p.ID)
return nil, nil
}
// Skip if it's managed or pinned
if s.isManaged(ctx, p.ID) || s.PluginPreinstall.IsPinned(p.ID) {
+ s.log.Debug("Skipping managed or pinned plugin", "plugin", p.ID)
+ return nil, nil
+ }
+
+ // Skip if it's provisioned
+ if s.isProvisioned(ctx, p.ID) {
+ s.log.Debug("Skipping provisioned plugin", "plugin", p.ID)
return nil, nil
}
@@ -197,3 +216,14 @@ func (s *updateStep) isManaged(ctx context.Context, pluginID string) bool {
}
return false
}
+
+func (s *updateStep) isProvisioned(ctx context.Context, pluginID string) bool {
+ if s.provisionedPlugins == nil {
+ var err error
+ s.provisionedPlugins, err = s.ProvisionedPlugins.ProvisionedPlugins(ctx)
+ if err != nil {
+ return false
+ }
+ }
+ return slices.Contains(s.provisionedPlugins, pluginID)
+}
diff --git a/apps/advisor/pkg/app/checks/plugincheck/check_test.go b/apps/advisor/pkg/app/checks/plugincheck/check_test.go
index 13b2a17ea1b..c8cdc965a32 100644
--- a/apps/advisor/pkg/app/checks/plugincheck/check_test.go
+++ b/apps/advisor/pkg/app/checks/plugincheck/check_test.go
@@ -10,6 +10,7 @@ import (
"github.com/grafana/grafana/pkg/services/pluginsintegration/managedplugins"
"github.com/grafana/grafana/pkg/services/pluginsintegration/plugininstaller"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
+ "github.com/grafana/grafana/pkg/services/pluginsintegration/provisionedplugins"
"github.com/stretchr/testify/assert"
)
@@ -21,6 +22,7 @@ func TestRun(t *testing.T) {
pluginArchives map[string]*repo.PluginArchiveInfo
pluginPreinstalled []string
pluginManaged []string
+ pluginProvisioned []string
expectedFailures []advisor.CheckReportFailure
}{
{
@@ -131,6 +133,20 @@ func TestRun(t *testing.T) {
pluginManaged: []string{"plugin4"},
expectedFailures: []advisor.CheckReportFailure{},
},
+ {
+ name: "Provisioned plugin",
+ plugins: []pluginstore.Plugin{
+ {JSONData: plugins.JSONData{ID: "plugin5", Info: plugins.Info{Version: "1.0.0"}}},
+ },
+ pluginInfo: map[string]*repo.PluginInfo{
+ "plugin5": {Status: "active"},
+ },
+ pluginArchives: map[string]*repo.PluginArchiveInfo{
+ "plugin5": {Version: "1.1.0"},
+ },
+ pluginProvisioned: []string{"plugin5"},
+ expectedFailures: []advisor.CheckReportFailure{},
+ },
}
for _, tt := range tests {
@@ -142,7 +158,8 @@ func TestRun(t *testing.T) {
}
pluginPreinstall := &mockPluginPreinstall{pinned: tt.pluginPreinstalled}
managedPlugins := &mockManagedPlugins{managed: tt.pluginManaged}
- check := New(pluginStore, pluginRepo, pluginPreinstall, managedPlugins)
+ provisionedPlugins := &mockProvisionedPlugins{provisioned: tt.pluginProvisioned}
+ check := New(pluginStore, pluginRepo, pluginPreinstall, managedPlugins, provisionedPlugins)
items, err := check.Items(context.Background())
assert.NoError(t, err)
@@ -208,3 +225,12 @@ type mockManagedPlugins struct {
func (m *mockManagedPlugins) ManagedPlugins(ctx context.Context) []string {
return m.managed
}
+
+type mockProvisionedPlugins struct {
+ provisionedplugins.Manager
+ provisioned []string
+}
+
+func (m *mockProvisionedPlugins) ProvisionedPlugins(ctx context.Context) ([]string, error) {
+ return m.provisioned, nil
+}
diff --git a/apps/advisor/pkg/app/utils.go b/apps/advisor/pkg/app/utils.go
index 8c1b6c00eb8..86ad12a714b 100644
--- a/apps/advisor/pkg/app/utils.go
+++ b/apps/advisor/pkg/app/utils.go
@@ -6,13 +6,9 @@ import (
"fmt"
"sync"
- claims "github.com/grafana/authlib/types"
"github.com/grafana/grafana-app-sdk/resource"
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
- "github.com/grafana/grafana/pkg/apimachinery/identity"
- "github.com/grafana/grafana/pkg/apimachinery/utils"
- "github.com/grafana/grafana/pkg/services/user"
)
func getCheck(obj resource.Object, checkMap map[string]checks.Check) (checks.Check, error) {
@@ -39,6 +35,9 @@ func getStatusAnnotation(obj resource.Object) string {
func setStatusAnnotation(ctx context.Context, client resource.Client, obj resource.Object, status string) error {
annotations := obj.GetAnnotations()
+ if annotations == nil {
+ annotations = map[string]string{}
+ }
annotations[checks.StatusAnnotation] = status
return client.PatchInto(ctx, obj.GetStaticMetadata().Identifier(), resource.PatchRequest{
Operations: []resource.PatchOperation{{
@@ -59,20 +58,6 @@ func processCheck(ctx context.Context, client resource.Client, obj resource.Obje
if !ok {
return fmt.Errorf("invalid object type")
}
- // Populate ctx with the user that created the check
- meta, err := utils.MetaAccessor(obj)
- if err != nil {
- return err
- }
- createdBy := meta.GetCreatedBy()
- typ, uid, err := claims.ParseTypeID(createdBy)
- if err != nil {
- return err
- }
- ctx = identity.WithRequester(ctx, &user.SignedInUser{
- UserUID: uid,
- FallbackType: typ,
- })
// Get the items to check
items, err := check.Items(ctx)
if err != nil {
diff --git a/apps/alerting/notifications/go.mod b/apps/alerting/notifications/go.mod
index dfcdc5a722a..aac1a5b28fb 100644
--- a/apps/alerting/notifications/go.mod
+++ b/apps/alerting/notifications/go.mod
@@ -1,6 +1,6 @@
module github.com/grafana/grafana/apps/alerting/notifications
-go 1.23.5
+go 1.23.7
replace github.com/grafana/grafana => ../../..
@@ -38,7 +38,7 @@ require (
github.com/google/uuid v1.6.0 // indirect
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250220154326-6e5de80ef295 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jmespath-community/go-jmespath v1.1.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
@@ -50,37 +50,37 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pkg/errors v0.9.1 // indirect
- github.com/prometheus/client_golang v1.20.5 // indirect
+ github.com/prometheus/client_golang v1.21.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
- github.com/spf13/cobra v1.8.1 // indirect
- github.com/spf13/pflag v1.0.5 // indirect
+ github.com/spf13/cobra v1.9.1 // indirect
+ github.com/spf13/pflag v1.0.6 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.etcd.io/etcd/api/v3 v3.5.16 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect
go.etcd.io/etcd/client/v3 v3.5.16 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
- go.opentelemetry.io/otel v1.34.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
+ go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
- go.opentelemetry.io/otel/metric v1.34.0 // indirect
- go.opentelemetry.io/otel/sdk v1.34.0 // indirect
- go.opentelemetry.io/otel/trace v1.34.0 // indirect
+ go.opentelemetry.io/otel/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.35.0 // indirect
+ go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/crypto v0.35.0 // indirect
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
- golang.org/x/net v0.35.0 // indirect
+ golang.org/x/net v0.36.0 // indirect
golang.org/x/oauth2 v0.27.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.29.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/time v0.9.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect
google.golang.org/grpc v1.70.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
diff --git a/apps/alerting/notifications/go.sum b/apps/alerting/notifications/go.sum
index d871841faf1..c2e7b8b7d13 100644
--- a/apps/alerting/notifications/go.sum
+++ b/apps/alerting/notifications/go.sum
@@ -19,7 +19,7 @@ github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr
github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -81,8 +81,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a534
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc=
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jmespath-community/go-jmespath v1.1.1 h1:bFikPhsi/FdmlZhVgSCd2jj1e7G/rw+zyQfyg5UF+L4=
@@ -113,18 +113,18 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
-github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
-github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
-github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
+github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
+github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
+github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw=
+github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
-github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
-github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA=
+github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
@@ -142,10 +142,10 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=
github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
-github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
-github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
+github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
@@ -180,22 +180,22 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
-go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
-go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
-go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
-go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
-go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
-go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
-go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
-go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
-go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
-go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
+go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
+go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
+go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -214,8 +214,8 @@ golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
-golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
+golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -223,8 +223,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
-golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
+golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
@@ -252,8 +252,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
-golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
+golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
+golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -262,8 +262,8 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s=
google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE=
-google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47 h1:5iw9XJTD4thFidQmFVvx0wi4g5yOHk76rNRUxz1ZG5g=
-google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47/go.mod h1:AfA77qWLcidQWywD0YgqfpJzf50w2VjzBml3TybHeJU=
+google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 h1:fCuMM4fowGzigT89NCIsW57Pk9k2D12MMi2ODn+Nk+o=
+google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
diff --git a/apps/dashboard/Makefile b/apps/dashboard/Makefile
new file mode 100644
index 00000000000..d9d8b7de608
--- /dev/null
+++ b/apps/dashboard/Makefile
@@ -0,0 +1,18 @@
+.PHONY: generate
+generate:
+ @grafana-app-sdk generate \
+ --source=./kinds/ \
+ --gogenpath=./pkg/apis \
+ --tsgenpath=../../packages/grafana-schema/src/schema \
+ --grouping=group \
+ --defencoding=none \
+ --genoperatorstate=false \
+ --noschemasinmanifest
+
+ # This is a workaround for SDK codegen not producing correct output for v0alpha1
+ @rm ../../packages/grafana-schema/src/schema/dashboard/v0alpha1/types.spec.gen.ts
+ @cp ./tshack/v0alpha1_spec_gen.ts ../../packages/grafana-schema/src/schema/dashboard/v0alpha1/types.spec.gen.ts
+
+ # Same for v1alpha1
+ @rm ../../packages/grafana-schema/src/schema/dashboard/v1alpha1/types.spec.gen.ts
+ @cp ./tshack/v1alpha1_spec_gen.ts ../../packages/grafana-schema/src/schema/dashboard/v1alpha1/types.spec.gen.ts
diff --git a/apps/dashboard/go.mod b/apps/dashboard/go.mod
new file mode 100644
index 00000000000..8c2285debc3
--- /dev/null
+++ b/apps/dashboard/go.mod
@@ -0,0 +1,125 @@
+module github.com/grafana/grafana/apps/dashboard
+
+go 1.23.7
+
+require (
+ github.com/grafana/grafana-app-sdk v0.31.0
+ github.com/grafana/grafana-plugin-sdk-go v0.272.0
+ github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432
+ github.com/stretchr/testify v1.10.0
+ k8s.io/apimachinery v0.32.1
+ k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f
+)
+
+require (
+ github.com/BurntSushi/toml v1.4.0 // indirect
+ github.com/apache/arrow-go/v18 v18.0.1-0.20241212180703-82be143d7c30 // indirect
+ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
+ github.com/beorn7/perks v1.0.1 // indirect
+ github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+ github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/cheekybits/genny v1.0.0 // indirect
+ github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
+ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+ github.com/elazarl/goproxy v1.7.2 // indirect
+ github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/fatih/color v1.17.0 // indirect
+ github.com/fsnotify/fsnotify v1.8.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.7.0 // indirect
+ github.com/getkin/kin-openapi v0.129.0 // indirect
+ github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/stdr v1.2.2 // indirect
+ github.com/go-openapi/jsonpointer v0.21.0 // indirect
+ github.com/go-openapi/jsonreference v0.21.0 // indirect
+ github.com/go-openapi/swag v0.23.0 // indirect
+ github.com/goccy/go-json v0.10.4 // indirect
+ github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang/protobuf v1.5.4 // indirect
+ github.com/google/flatbuffers v24.3.25+incompatible // indirect
+ github.com/google/gnostic-models v0.6.8 // indirect
+ github.com/google/go-cmp v0.7.0 // indirect
+ github.com/google/gofuzz v1.2.0 // indirect
+ github.com/google/uuid v1.6.0 // indirect
+ github.com/gorilla/mux v1.8.1 // indirect
+ github.com/grafana/grafana-app-sdk/logging v0.30.0 // indirect
+ github.com/grafana/otel-profiling-go v0.5.1 // indirect
+ github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect
+ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect
+ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect
+ github.com/hashicorp/go-hclog v1.6.3 // indirect
+ github.com/hashicorp/go-plugin v1.6.3 // indirect
+ github.com/hashicorp/yamux v0.1.1 // indirect
+ github.com/josharian/intern v1.0.0 // indirect
+ github.com/json-iterator/go v1.1.12 // indirect
+ github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect
+ github.com/klauspost/compress v1.17.11 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.9 // indirect
+ github.com/magefile/mage v1.15.0 // indirect
+ github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mattetti/filebuffer v1.0.1 // indirect
+ github.com/mattn/go-colorable v0.1.13 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
+ github.com/mattn/go-runewidth v0.0.16 // indirect
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+ github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
+ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+ github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 // indirect
+ github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 // indirect
+ github.com/oklog/run v1.1.0 // indirect
+ github.com/olekukonko/tablewriter v0.0.5 // indirect
+ github.com/perimeterx/marshmallow v1.1.5 // indirect
+ github.com/pierrec/lz4/v4 v4.1.21 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+ github.com/prometheus/client_golang v1.21.0 // indirect
+ github.com/prometheus/client_model v0.6.1 // indirect
+ github.com/prometheus/common v0.62.0 // indirect
+ github.com/prometheus/procfs v0.15.1 // indirect
+ github.com/rivo/uniseg v0.4.7 // indirect
+ github.com/russross/blackfriday/v2 v2.1.0 // indirect
+ github.com/smartystreets/goconvey v1.6.4 // indirect
+ github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect
+ github.com/unknwon/com v1.0.1 // indirect
+ github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a // indirect
+ github.com/urfave/cli v1.22.16 // indirect
+ github.com/x448/float16 v0.8.4 // indirect
+ github.com/zeebo/xxh3 v1.0.2 // indirect
+ go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 // indirect
+ go.opentelemetry.io/contrib/propagators/jaeger v1.34.0 // indirect
+ go.opentelemetry.io/contrib/samplers/jaegerremote v0.28.0 // indirect
+ go.opentelemetry.io/otel v1.35.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
+ go.opentelemetry.io/otel/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.35.0 // indirect
+ go.opentelemetry.io/otel/trace v1.35.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.5.0 // indirect
+ golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
+ golang.org/x/mod v0.23.0 // indirect
+ golang.org/x/net v0.36.0 // indirect
+ golang.org/x/oauth2 v0.27.0 // indirect
+ golang.org/x/sync v0.11.0 // indirect
+ golang.org/x/sys v0.30.0 // indirect
+ golang.org/x/term v0.29.0 // indirect
+ golang.org/x/text v0.22.0 // indirect
+ golang.org/x/time v0.9.0 // indirect
+ golang.org/x/tools v0.30.0 // indirect
+ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect
+ google.golang.org/grpc v1.70.0 // indirect
+ google.golang.org/protobuf v1.36.5 // indirect
+ gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
+ gopkg.in/inf.v0 v0.9.1 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+ k8s.io/client-go v0.32.1 // indirect
+ k8s.io/klog/v2 v2.130.1 // indirect
+ k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
+ sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
+ sigs.k8s.io/yaml v1.4.0 // indirect
+)
diff --git a/apps/dashboard/go.sum b/apps/dashboard/go.sum
new file mode 100644
index 00000000000..33cfb1d9e90
--- /dev/null
+++ b/apps/dashboard/go.sum
@@ -0,0 +1,377 @@
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
+github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
+github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
+github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
+github.com/apache/arrow-go/v18 v18.0.1-0.20241212180703-82be143d7c30 h1:hXVi7QKuCQ0E8Yujfu9b0f0RnzZ72efpWvPnZgnJPrE=
+github.com/apache/arrow-go/v18 v18.0.1-0.20241212180703-82be143d7c30/go.mod h1:RNuWDIiGjq5nndL2PyQrndUy9nMLwheA3uWaAV7fe4U=
+github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE=
+github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
+github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
+github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
+github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476 h1:VnjHsRXCRti7Av7E+j4DCha3kf68echfDzQ+wD11SBU=
+github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
+github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
+github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
+github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
+github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
+github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
+github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
+github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
+github.com/getkin/kin-openapi v0.129.0 h1:QGYTNcmyP5X0AtFQ2Dkou9DGBJsUETeLH9rFrJXZh30=
+github.com/getkin/kin-openapi v0.129.0/go.mod h1:gmWI+b/J45xqpyK5wJmRRZse5wefA5H0RDMK46kLUtI=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
+github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
+github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM=
+github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI=
+github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
+github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
+github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
+github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/grafana/grafana-app-sdk v0.31.0 h1:/mFCcx+YqG8cWAi9hePDJQxIdtXDClDIDRgZwHkksFk=
+github.com/grafana/grafana-app-sdk v0.31.0/go.mod h1:Xw00NL7qpRLo5r3Gn48Bl1Xn2n4eUDI5pYf/wMufKWs=
+github.com/grafana/grafana-app-sdk/logging v0.30.0 h1:K/P/bm7Cp7Di4tqIJ3EQz2+842JozQGRaz62r95ApME=
+github.com/grafana/grafana-app-sdk/logging v0.30.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM=
+github.com/grafana/grafana-plugin-sdk-go v0.272.0 h1:TmPIG+6e3lYGzkyfUfCHuaMaaiwDbkCacTZ7V/JaSeg=
+github.com/grafana/grafana-plugin-sdk-go v0.272.0/go.mod h1:i/9KH9y/6m5hkRnG3H6aR2nOMPbJUmvo4XNrHjI15cU=
+github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432 h1:/0MLOGx9Ow7ihR4smlUYHFvomXBpdpf/jLWHKNfEUiI=
+github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250312121619-f64be062c432/go.mod h1:A/SJ9CiAWNOdeD/IezNwRaDZusLKq0z6dTfhKDgZw5Y=
+github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8=
+github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls=
+github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg=
+github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU=
+github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA=
+github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU=
+github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 h1:KcFzXwzM/kGhIRHvc8jdixfIJjVzuUJdnv+5xsPutog=
+github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
+github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
+github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
+github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg=
+github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0=
+github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
+github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
+github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c=
+github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ=
+github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6/go.mod h1:WrYiIuiXUMIvTDAQw97C+9l0CnBmCcvosPjN3XDqS/o=
+github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4=
+github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
+github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
+github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
+github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
+github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg=
+github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM=
+github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs=
+github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 h1:nZspmSkneBbtxU9TopEAE0CY+SBJLxO8LPUlw2vG4pU=
+github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80/go.mod h1:7tFDb+Y51LcDpn26GccuUgQXUk6t0CXZsivKjyimYX8=
+github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 h1:t05Ww3DxZutOqbMN+7OIuqDwXbhl32HiZGpLy26BAPc=
+github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o=
+github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
+github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
+github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
+github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
+github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA=
+github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
+github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
+github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
+github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY=
+github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 h1:aVGB3YnaS/JNfOW3tiHIlmNmTDg618va+eT0mVomgyI=
+github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8/go.mod h1:fVle4kNr08ydeohzYafr20oZzbAkhQT39gKK/pFQ5M4=
+github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
+github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
+github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU=
+github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a h1:vcrhXnj9g9PIE+cmZgaPSwOyJ8MAQTRmsgGrB0x5rF4=
+github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ=
+github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po=
+github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
+github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
+github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
+go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
+go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 h1:0tY123n7CdWMem7MOVdKOt0YfshufLCwfE5Bob+hQuM=
+go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
+go.opentelemetry.io/contrib/propagators/jaeger v1.34.0 h1:D3htJISCUU/wOVlKwisVKancWm+2U4h9xDEaiMkiyRE=
+go.opentelemetry.io/contrib/propagators/jaeger v1.34.0/go.mod h1:DAX1bsj+uDm2ZuOQH/RgZRx7RQZWyzV5W2WR/0UX8JA=
+go.opentelemetry.io/contrib/samplers/jaegerremote v0.28.0 h1:Xx1N6cDr8iWy1Cz6OcY7oS0ACdt/6HDYTdu4KskuC7s=
+go.opentelemetry.io/contrib/samplers/jaegerremote v0.28.0/go.mod h1:iWS+NvC948FyfnJbVfPN9h/8+vr8CR2FPn6XsLRkvH8=
+go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
+go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
+go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
+go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
+go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
+go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
+go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
+go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
+go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
+golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
+golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
+golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
+golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
+golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
+golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
+golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
+golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
+golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
+golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
+golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
+golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
+gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0=
+gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o=
+google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 h1:fCuMM4fowGzigT89NCIsW57Pk9k2D12MMi2ODn+Nk+o=
+google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
+google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
+google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
+google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
+google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
+gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
+gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo=
+gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc=
+k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k=
+k8s.io/apimachinery v0.32.1 h1:683ENpaCBjma4CYqsmZyhEzrGz6cjn1MY/X2jB2hkZs=
+k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/client-go v0.32.1 h1:otM0AxdhdBIaQh7l1Q0jQpmo7WOFIk5FFa4bg6YMdUU=
+k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg=
+k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
+k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
+k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
+k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
+k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
+k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
+sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk=
+sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
+sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
+sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
diff --git a/apps/dashboard/kinds/cue.mod/module.cue b/apps/dashboard/kinds/cue.mod/module.cue
new file mode 100644
index 00000000000..a3b88f8aa81
--- /dev/null
+++ b/apps/dashboard/kinds/cue.mod/module.cue
@@ -0,0 +1,4 @@
+module: "github.com/grafana/grafana/sdkkinds/dashboard"
+language: {
+ version: "v0.9.0"
+}
diff --git a/apps/dashboard/kinds/dashboard.cue b/apps/dashboard/kinds/dashboard.cue
new file mode 100644
index 00000000000..da09322e0e8
--- /dev/null
+++ b/apps/dashboard/kinds/dashboard.cue
@@ -0,0 +1,68 @@
+package kinds
+
+import (
+ "github.com/grafana/grafana/sdkkinds/dashboard/v0alpha1"
+ "github.com/grafana/grafana/sdkkinds/dashboard/v1alpha1"
+ "github.com/grafana/grafana/sdkkinds/dashboard/v2alpha1"
+)
+
+// Status is the shared status of all dashboard versions.
+DashboardStatus: {
+ // Optional conversion status.
+ conversion?: ConversionStatus
+}
+
+// ConversionStatus is the status of the conversion of the dashboard.
+ConversionStatus: {
+ // Whether from another version has failed.
+ // If true, means that the dashboard is not valid,
+ // and the caller should instead fetch the stored version.
+ failed: bool
+
+ // The version which was stored when the dashboard was created / updated.
+ // Fetching this version should always succeed.
+ storedVersion: string
+
+ // The error message from the conversion.
+ // Empty if the conversion has not failed.
+ error: string
+}
+
+dashboard: {
+ kind: "Dashboard"
+ pluralName: "Dashboards"
+ current: "v0alpha1"
+
+ codegen: {
+ ts: {
+ enabled: true
+ config: {
+ enumsAsUnionTypes: true
+ }
+ }
+ go: {
+ enabled: true
+ }
+ }
+
+ versions: {
+ "v0alpha1": {
+ schema: {
+ spec: v0alpha1.DashboardSpec
+ status: DashboardStatus
+ }
+ }
+ "v1alpha1": {
+ schema: {
+ spec: v1alpha1.DashboardSpec
+ status: DashboardStatus
+ }
+ }
+ "v2alpha1": {
+ schema: {
+ spec: v2alpha1.DashboardSpec
+ status: DashboardStatus
+ }
+ }
+ }
+}
diff --git a/apps/dashboard/kinds/manifest.cue b/apps/dashboard/kinds/manifest.cue
new file mode 100644
index 00000000000..1ec0fb4f21c
--- /dev/null
+++ b/apps/dashboard/kinds/manifest.cue
@@ -0,0 +1,9 @@
+package kinds
+
+manifest: {
+ appName: "dashboard"
+ groupOverride: "dashboard.grafana.app"
+ kinds: [
+ dashboard,
+ ]
+}
diff --git a/apps/dashboard/kinds/v0alpha1/dashboard_spec.cue b/apps/dashboard/kinds/v0alpha1/dashboard_spec.cue
new file mode 100644
index 00000000000..a59f79e97e9
--- /dev/null
+++ b/apps/dashboard/kinds/v0alpha1/dashboard_spec.cue
@@ -0,0 +1,6 @@
+package v0alpha1
+
+// TODO: this outputs nothing.
+// For now, we use unstructured for the spec,
+// but it cannot be produced by the SDK codegen.
+DashboardSpec: [string]: _
diff --git a/apps/dashboard/kinds/v1alpha1/dashboard_spec.cue b/apps/dashboard/kinds/v1alpha1/dashboard_spec.cue
new file mode 100644
index 00000000000..709fb40fd02
--- /dev/null
+++ b/apps/dashboard/kinds/v1alpha1/dashboard_spec.cue
@@ -0,0 +1,6 @@
+package v1alpha1
+
+// TODO: this outputs nothing.
+// For now, we use unstructured for the spec,
+// but it cannot be produced by the SDK codegen.
+DashboardSpec: [string]: _
diff --git a/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue b/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue
new file mode 100644
index 00000000000..b3324616401
--- /dev/null
+++ b/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue
@@ -0,0 +1,964 @@
+package v2alpha1
+
+DashboardSpec: {
+ // Title of dashboard.
+ annotations: [...AnnotationQueryKind]
+
+ // Configuration of dashboard cursor sync behavior.
+ // "Off" for no shared crosshair or tooltip (default).
+ // "Crosshair" for shared crosshair.
+ // "Tooltip" for shared crosshair AND shared tooltip.
+ cursorSync: DashboardCursorSync
+
+ // Description of dashboard.
+ description?: string
+
+ // Whether a dashboard is editable or not.
+ editable?: bool | *true
+
+ elements: [ElementReference.name]: Element
+
+ layout: GridLayoutKind | RowsLayoutKind | ResponsiveGridLayoutKind | TabsLayoutKind
+
+ // Links with references to other dashboards or external websites.
+ links: [...DashboardLink]
+
+ // When set to true, the dashboard will redraw panels at an interval matching the pixel width.
+ // This will keep data "moving left" regardless of the query refresh rate. This setting helps
+ // avoid dashboards presenting stale live data.
+ liveNow?: bool
+
+ // When set to true, the dashboard will load all panels in the dashboard when it's loaded.
+ preload: bool
+
+ // Plugins only. The version of the dashboard installed together with the plugin.
+ // This is used to determine if the dashboard should be updated when the plugin is updated.
+ revision?: uint16
+
+ // Tags associated with dashboard.
+ tags: [...string]
+
+ timeSettings: TimeSettingsSpec
+
+ // Title of dashboard.
+ title: string
+
+ // Configured template variables.
+ variables: [...VariableKind]
+}
+
+// Supported dashboard elements
+Element: PanelKind | LibraryPanelKind // |* more element types in the future
+
+LibraryPanelKind: {
+ kind: "LibraryPanel"
+ spec: LibraryPanelKindSpec
+}
+
+LibraryPanelKindSpec: {
+ // Panel ID for the library panel in the dashboard
+ id: number
+ // Title for the library panel in the dashboard
+ title: string
+
+ libraryPanel: LibraryPanelRef
+}
+
+// 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
+ name: string
+ // Library panel uid
+ uid: string
+}
+
+AnnotationPanelFilter: {
+ // Should the specified panels be included or excluded
+ exclude?: bool | *false
+
+ // Panel IDs that should be included or excluded
+ ids: [...uint8]
+}
+
+// "Off" for no shared crosshair or tooltip (default).
+// "Crosshair" for shared crosshair.
+// "Tooltip" for shared crosshair AND shared tooltip.
+DashboardCursorSync: "Off" | "Crosshair" | "Tooltip"
+
+// Links with references to other dashboards or external resources
+DashboardLink: {
+ // Title to display with the link
+ title: string
+ // Link type. Accepted values are dashboards (to refer to another dashboard) and link (to refer to an external resource)
+ // FIXME: The type is generated as `type: DashboardLinkType | dashboardLinkType.Link;` but it should be `type: DashboardLinkType`
+ type: DashboardLinkType
+ // Icon name to be displayed with the link
+ icon: string
+ // Tooltip to display when the user hovers their mouse over it
+ tooltip: string
+ // Link URL. Only required/valid if the type is link
+ url?: string
+ // List of tags to limit the linked dashboards. If empty, all dashboards will be displayed. Only valid if the type is dashboards
+ tags: [...string]
+ // If true, all dashboards links will be displayed in a dropdown. If false, all dashboards links will be displayed side by side. Only valid if the type is dashboards
+ asDropdown: bool | *false
+ // If true, the link will be opened in a new tab
+ targetBlank: bool | *false
+ // If true, includes current template variables values in the link as query params
+ includeVars: bool | *false
+ // If true, includes current time range in the link as query params
+ keepTime: bool | *false
+}
+
+DataSourceRef: {
+ // The plugin type-id
+ type?: string
+
+ // Specific datasource instance
+ uid?: string
+}
+
+// A topic is attached to DataFrame metadata in query results.
+// This specifies where the data should be used.
+DataTopic: "series" | "annotations" | "alertStates" @cog(kind="enum",memberNames="Series|Annotations|AlertStates")
+
+// 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
+ id: string
+ // Disabled transformations are skipped
+ disabled?: bool
+ // Optional frame matcher. When missing it will be applied to all results
+ filter?: MatcherConfig
+ // Where to pull DataFrames from as input to transformation
+ topic?: DataTopic
+ // Options to be passed to the transformer
+ // Valid options depend on the transformer id
+ options: _
+}
+
+DataLink: {
+ title: string
+ url: string
+ targetBlank?: bool
+}
+
+// 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: {
+ // Defaults are the options applied to all fields.
+ defaults: FieldConfig
+ // Overrides are the options applied to specific fields overriding the defaults.
+ overrides: [...{
+ matcher: MatcherConfig
+ properties: [...DynamicConfigValue]
+ }]
+}
+
+// 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: {
+ // The display value for this field. This supports template variables blank is auto
+ displayName?: string
+
+ // 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
+
+ // Human readable field metadata
+ description?: string
+
+ // An explicit 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
+
+ // True if data source can write a value to the path. Auth/authz are supported separately
+ writeable?: bool
+
+ // True if data source field supports ad-hoc filters
+ filterable?: bool
+
+ // Unit a field should use. The unit you select is applied to all fields except time.
+ // You can use the units ID availables in Grafana or a custom unit.
+ // Available units in Grafana: https://github.com/grafana/grafana/blob/main/packages/grafana-data/src/valueFormats/categories.ts
+ // As custom unit, you can use the following formats:
+ // `suffix:` for custom unit that should go after value.
+ // `prefix:` for custom unit that should go before value.
+ // `time:` For custom date time formats type for example `time:YYYY-MM-DD`.
+ // `si:` for custom SI units. For example: `si: mF`. This one is a bit more advanced as you can specify both a unit and the source data scale. So if your source data is represented as milli (thousands of) something prefix the unit with that SI scale character.
+ // `count:` for a custom count unit.
+ // `currency:` for custom a currency unit.
+ unit?: string
+
+ // 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
+
+ // The minimum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields.
+ min?: number
+ // The maximum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields.
+ max?: number
+
+ // Convert input values into a display string
+ mappings?: [...ValueMapping]
+
+ // Map numeric values to states
+ thresholds?: ThresholdsConfig
+
+ // Panel color configuration
+ color?: FieldColor
+
+ // The behavior when clicking on a result
+ links?: [...]
+
+ // Alternative to empty string
+ noValue?: string
+
+ // custom is specified by the FieldConfig field
+ // in panel plugin schemas.
+ custom?: {...}
+}
+
+DynamicConfigValue: {
+ id: string | *""
+ value?: _
+}
+
+// Matcher is a predicate configuration. Based on the config a set of field(s) or values is filtered in order to apply override / transformation.
+// It comes with in id ( to resolve implementation from registry) and a configuration that’s specific to a particular matcher type.
+MatcherConfig: {
+ // The matcher id. This is used to find the matcher implementation from registry.
+ id: string | *""
+ // The matcher options. This is specific to the matcher implementation.
+ options?: _
+}
+
+Threshold: {
+ value: number
+ color: string
+}
+
+ThresholdsMode: "absolute" | "percentage"
+
+ThresholdsConfig: {
+ mode: ThresholdsMode
+ steps: [...Threshold]
+}
+
+ValueMapping: ValueMap | RangeMap | RegexMap | SpecialValueMap
+
+// 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.
+// `range`: 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.
+// `regex`: 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.
+// `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" @cog(kind="enum",memberNames="ValueToText|RangeToText|RegexToText|SpecialValue")
+
+// 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: {
+ // TODO (@radiohead): Something broke in cog / app SDK codegen
+ // And this is no longer producing valid TS / Go output
+ // type: MappingType & "value"
+ type: "value"
+ // Map with : ValueMappingResult. For example: { "10": { text: "Perfection!", color: "green" } }
+ options: [string]: ValueMappingResult
+}
+
+// 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: {
+ // TODO (@radiohead): Something broke in cog / app SDK codegen
+ // And this is no longer producing valid TS / Go output
+ // type: MappingType & "range"
+ type: "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 | null
+ // Max value of the range. It can be null which means +Infinity
+ to: float64 | null
+ // Config to apply when the value is within the range
+ result: ValueMappingResult
+ }
+}
+
+// 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: {
+ // TODO (@radiohead): Something broke in cog / app SDK codegen
+ // And this is no longer producing valid TS / Go output
+ // type: MappingType & "regex"
+ type: "regex"
+ // Regular expression to match against and the result to apply when the value matches the regex
+ options: {
+ // Regular expression to match against
+ pattern: string
+ // Config to apply when the value matches the regex
+ result: ValueMappingResult
+ }
+}
+
+// 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: {
+ // TODO (@radiohead): Something broke in cog / app SDK codegen
+ // And this is no longer producing valid TS / Go output
+ // type: MappingType & "special"
+ type: "special"
+ options: {
+ // Special value to match against
+ match: SpecialValueMatch
+ // Config to apply when the value matches the special value
+ result: ValueMappingResult
+ }
+}
+
+// Special value types supported by the `SpecialValueMap`
+SpecialValueMatch: "true" | "false" | "null" | "nan" | "null+nan" | "empty" @cog(kind="enum",memberNames="True|False|Null|NaN|NullAndNaN|Empty")
+
+// Result used as replacement with text and color when the value matches
+ValueMappingResult: {
+ // Text to display when the value matches
+ text?: string
+ // Text to use when the value matches
+ color?: string
+ // Icon to display when the value matches. Only specific visualizations.
+ icon?: string
+ // Position in the mapping array. Only used internally.
+ index?: int32
+}
+
+// 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
+// `palette-classic`: Classic palette. Grafana will assign color by looking up a color in a palette by series index. Useful for Graphs and pie charts and other categorical data visualizations
+// `palette-classic-by-name`: Classic palette (by name). Grafana will assign color by looking up a color in a palette by series name. Useful for Graphs and pie charts and other categorical data visualizations
+// `continuous-GrYlRd`: ontinuous Green-Yellow-Red palette mode
+// `continuous-RdYlGr`: Continuous Red-Yellow-Green palette mode
+// `continuous-BlYlRd`: Continuous Blue-Yellow-Red palette mode
+// `continuous-YlRd`: Continuous Yellow-Red palette mode
+// `continuous-BlPu`: Continuous Blue-Purple palette mode
+// `continuous-YlBl`: Continuous Yellow-Blue palette mode
+// `continuous-blues`: Continuous Blue palette mode
+// `continuous-reds`: Continuous Red palette mode
+// `continuous-greens`: Continuous Green palette mode
+// `continuous-purples`: Continuous Purple palette mode
+// `shades`: Shades of a single color. Specify a single color, useful in an override rule.
+// `fixed`: Fixed color mode. Specify a single color, useful in an override rule.
+FieldColorModeId: "thresholds" | "palette-classic" | "palette-classic-by-name" | "continuous-GrYlRd" | "continuous-RdYlGr" | "continuous-BlYlRd" | "continuous-YlRd" | "continuous-BlPu" | "continuous-YlBl" | "continuous-blues" | "continuous-reds" | "continuous-greens" | "continuous-purples" | "fixed" | "shades"
+
+// Defines how to assign a series color from "by value" color schemes. For example for an aggregated data points like a timeseries, the color can be assigned by the min, max or last value.
+FieldColorSeriesByMode: "min" | "max" | "last"
+
+// Map a field to a color.
+FieldColor: {
+ // The main color scheme mode.
+ mode: FieldColorModeId
+ // The fixed color value for fixed or shades color modes.
+ fixedColor?: string
+ // Some visualizations need to know how to assign a series color from by value color schemes.
+ seriesBy?: FieldColorSeriesByMode
+}
+
+// Dashboard Link type. Accepted values are dashboards (to refer to another dashboard) and link (to refer to an external resource)
+DashboardLinkType: "link" | "dashboards"
+
+// --- Common types ---
+Kind: {
+ kind: string
+ spec: _
+ metadata?: _
+}
+
+// --- Kinds ---
+VizConfigSpec: {
+ pluginVersion: string
+ options: [string]: _
+ fieldConfig: FieldConfigSource
+}
+
+VizConfigKind: {
+ // The kind of a VizConfigKind is the plugin ID
+ kind: string
+ spec: VizConfigSpec
+}
+
+AnnotationQuerySpec: {
+ datasource?: DataSourceRef
+ query?: DataQueryKind
+ enable: bool
+ hide: bool
+ iconColor: string
+ name: string
+ builtIn?: bool | *false
+ filter?: AnnotationPanelFilter
+}
+
+AnnotationQueryKind: {
+ kind: "AnnotationQuery"
+ spec: AnnotationQuerySpec
+}
+
+QueryOptionsSpec: {
+ timeFrom?: string
+ maxDataPoints?: int
+ timeShift?: string
+ queryCachingTTL?: int
+ interval?: string
+ cacheTimeout?: string
+ hideTimeOverride?: bool
+}
+
+DataQueryKind: {
+ // The kind of a DataQueryKind is the datasource type
+ kind: string
+ spec: [string]: _
+}
+
+PanelQuerySpec: {
+ query: DataQueryKind
+ datasource?: DataSourceRef
+
+ refId: string
+ hidden: bool
+}
+
+PanelQueryKind: {
+ kind: "PanelQuery"
+ spec: PanelQuerySpec
+}
+
+TransformationKind: {
+ // The kind of a TransformationKind is the transformation ID
+ kind: string
+ spec: DataTransformerConfig
+}
+
+QueryGroupSpec: {
+ queries: [...PanelQueryKind]
+ transformations: [...TransformationKind]
+ queryOptions: QueryOptionsSpec
+}
+
+QueryGroupKind: {
+ kind: "QueryGroup"
+ spec: QueryGroupSpec
+}
+
+TimeRangeOption: {
+ display: string | *"Last 6 hours"
+ from: string | *"now-6h"
+ to: string | *"now"
+}
+
+// Time configuration
+// It defines the default time config for the time picker, the refresh picker for the specific dashboard.
+TimeSettingsSpec: {
+ // Timezone of dashboard. Accepted values are IANA TZDB zone ID or "browser" or "utc".
+ timezone?: string | *"browser"
+ // Start time range for dashboard.
+ // Accepted values are relative time strings like "now-6h" or absolute time strings like "2020-07-10T08:00:00.000Z".
+ from: string | *"now-6h"
+ // End time range for dashboard.
+ // Accepted values are relative time strings like "now-6h" or absolute time strings like "2020-07-10T08:00:00.000Z".
+ to: string | *"now"
+ // Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d".
+ autoRefresh: string // v1: refresh
+ // Interval options available in the refresh picker dropdown.
+ autoRefreshIntervals: [...string] | *["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"] // v1: timepicker.refresh_intervals
+ // Selectable options available in the time picker dropdown. Has no effect on provisioned dashboard.
+ quickRanges?: [...TimeRangeOption] // v1: timepicker.quick_ranges , not exposed in the UI
+ // Whether timepicker is visible or not.
+ hideTimepicker: bool // v1: timepicker.hidden
+ // Day when the week starts. Expressed by the name of the day in lowercase, e.g. "monday".
+ weekStart?: "saturday" | "monday" | "sunday"
+ // The month that the fiscal year starts on. 0 = January, 11 = December
+ fiscalYearStartMonth: int
+ // Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.
+ nowDelay?: string // v1: timepicker.nowDelay
+}
+
+RepeatMode: "variable" // other repeat modes will be added in the future: label, frame
+
+RepeatOptions: {
+ mode: RepeatMode
+ value: string
+ direction?: "h" | "v"
+ maxPerRow?: int
+}
+
+RowRepeatOptions: {
+ mode: RepeatMode
+ value: string
+}
+
+ResponsiveGridRepeatOptions: {
+ mode: RepeatMode
+ value: string
+}
+
+GridLayoutItemSpec: {
+ x: int
+ y: int
+ width: int
+ height: int
+ element: ElementReference // reference to a PanelKind from dashboard.spec.elements Expressed as JSON Schema reference
+ repeat?: RepeatOptions
+}
+
+GridLayoutItemKind: {
+ kind: "GridLayoutItem"
+ spec: GridLayoutItemSpec
+}
+
+GridLayoutRowKind: {
+ kind: "GridLayoutRow"
+ spec: GridLayoutRowSpec
+}
+
+GridLayoutRowSpec: {
+ y: int
+ collapsed: bool
+ title: string
+ elements: [...GridLayoutItemKind] // Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard.
+ repeat?: RowRepeatOptions
+}
+
+GridLayoutSpec: {
+ items: [...GridLayoutItemKind | GridLayoutRowKind]
+}
+
+GridLayoutKind: {
+ kind: "GridLayout"
+ spec: GridLayoutSpec
+}
+
+RowsLayoutKind: {
+ kind: "RowsLayout"
+ spec: RowsLayoutSpec
+}
+
+RowsLayoutSpec: {
+ rows: [...RowsLayoutRowKind]
+}
+
+RowsLayoutRowKind: {
+ kind: "RowsLayoutRow"
+ spec: RowsLayoutRowSpec
+}
+
+RowsLayoutRowSpec: {
+ title?: string
+ collapsed: bool
+ conditionalRendering?: ConditionalRenderingGroupKind
+ repeat?: RowRepeatOptions
+ layout: GridLayoutKind | ResponsiveGridLayoutKind | TabsLayoutKind
+}
+
+ResponsiveGridLayoutKind: {
+ kind: "ResponsiveGridLayout"
+ spec: ResponsiveGridLayoutSpec
+}
+
+ResponsiveGridLayoutSpec: {
+ row: string
+ col: string
+ items: [...ResponsiveGridLayoutItemKind]
+}
+
+ResponsiveGridLayoutItemKind: {
+ kind: "ResponsiveGridLayoutItem"
+ spec: ResponsiveGridLayoutItemSpec
+}
+
+ResponsiveGridLayoutItemSpec: {
+ element: ElementReference
+ repeat?: ResponsiveGridRepeatOptions
+ conditionalRendering?: ConditionalRenderingGroupKind
+}
+
+TabsLayoutKind: {
+ kind: "TabsLayout"
+ spec: TabsLayoutSpec
+}
+
+TabsLayoutSpec: {
+ tabs: [...TabsLayoutTabKind]
+}
+
+TabsLayoutTabKind: {
+ kind: "TabsLayoutTab"
+ spec: TabsLayoutTabSpec
+}
+
+TabsLayoutTabSpec: {
+ title?: string
+ layout: GridLayoutKind | RowsLayoutKind | ResponsiveGridLayoutKind
+}
+
+PanelSpec: {
+ id: number
+ title: string
+ description: string
+ links: [...DataLink]
+ data: QueryGroupKind
+ vizConfig: VizConfigKind
+ transparent?: bool
+}
+
+PanelKind: {
+ kind: "Panel"
+ spec: PanelSpec
+}
+
+ElementReference: {
+ kind: "ElementReference"
+ name: string
+}
+
+// Start FIXME: variables - in CUE PR - this are things that should be added into the cue schema
+// TODO: properties such as `hide`, `skipUrlSync`, `multi` are type boolean, and in the old schema they are conditional,
+// should we make them conditional in the new schema as well? or should we make them required but default to false?
+
+// Variable types
+VariableValue: VariableValueSingle | [...VariableValueSingle]
+
+VariableValueSingle: string | bool | number | CustomVariableValue
+
+// Custom formatter variable
+CustomFormatterVariable: {
+ name: string
+ type: VariableType
+ multi: bool
+ includeAll: bool
+}
+
+// Custom variable value
+CustomVariableValue: {
+ // The format name or function used in the expression
+ formatter: *null | string | VariableCustomFormatterFn
+}
+
+// Custom formatter function
+VariableCustomFormatterFn: {
+ value: _
+ legacyVariableModel: {
+ name: string
+ type: VariableType
+ multi: bool
+ includeAll: bool
+ }
+ legacyDefaultFormatter?: VariableCustomFormatterFn
+}
+
+// Dashboard variable type
+// `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.
+// `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" | "groupby" | "constant" | "datasource" | "interval" | "textbox" | "custom" |
+ "system" | "snapshot"
+
+VariableKind: QueryVariableKind | TextVariableKind | ConstantVariableKind | DatasourceVariableKind | IntervalVariableKind | CustomVariableKind | GroupByVariableKind | AdhocVariableKind
+
+// Sort variable options
+// Accepted values are:
+// `disabled`: No sorting
+// `alphabeticalAsc`: Alphabetical ASC
+// `alphabeticalDesc`: Alphabetical DESC
+// `numericalAsc`: Numerical ASC
+// `numericalDesc`: Numerical DESC
+// `alphabeticalCaseInsensitiveAsc`: Alphabetical Case Insensitive ASC
+// `alphabeticalCaseInsensitiveDesc`: Alphabetical Case Insensitive DESC
+// `naturalAsc`: Natural ASC
+// `naturalDesc`: Natural DESC
+// VariableSort enum with default value
+VariableSort: "disabled" | "alphabeticalAsc" | "alphabeticalDesc" | "numericalAsc" | "numericalDesc" | "alphabeticalCaseInsensitiveAsc" | "alphabeticalCaseInsensitiveDesc" | "naturalAsc" | "naturalDesc"
+
+// Options to config when to refresh a variable
+// `never`: Never refresh the variable
+// `onDashboardLoad`: Queries the data source every time the dashboard loads.
+// `onTimeRangeChanged`: Queries the data source when the dashboard time range changes.
+VariableRefresh: *"never" | "onDashboardLoad" | "onTimeRangeChanged"
+
+// Determine if the variable shows on dashboard
+// Accepted values are `dontHide` (show label and value), `hideLabel` (show value only), `hideVariable` (show nothing).
+VariableHide: *"dontHide" | "hideLabel" | "hideVariable"
+
+// FIXME: should we introduce this? --- Variable value option
+VariableValueOption: {
+ label: string
+ value: VariableValueSingle
+ group?: string
+}
+
+// Variable option specification
+VariableOption: {
+ // Whether the option is selected or not
+ selected?: bool
+ // Text to be displayed for the option
+ text: string | [...string]
+ // Value of the option
+ value: string | [...string]
+}
+
+// Query variable specification
+QueryVariableSpec: {
+ name: string | *""
+ current: VariableOption | *{
+ text: ""
+ value: ""
+ }
+ label?: string
+ hide: VariableHide
+ refresh: VariableRefresh
+ skipUrlSync: bool | *false
+ description?: string
+ datasource?: DataSourceRef
+ query: DataQueryKind
+ regex: string | *""
+ sort: VariableSort
+ definition?: string
+ options: [...VariableOption] | *[]
+ multi: bool | *false
+ includeAll: bool | *false
+ allValue?: string
+ placeholder?: string
+}
+
+// Query variable kind
+QueryVariableKind: {
+ kind: "QueryVariable"
+ spec: QueryVariableSpec
+}
+
+// Text variable specification
+TextVariableSpec: {
+ name: string | *""
+ current: VariableOption | *{
+ text: ""
+ value: ""
+ }
+ query: string | *""
+ label?: string
+ hide: VariableHide
+ skipUrlSync: bool | *false
+ description?: string
+}
+
+// Text variable kind
+TextVariableKind: {
+ kind: "TextVariable"
+ spec: TextVariableSpec
+}
+
+// Constant variable specification
+ConstantVariableSpec: {
+ name: string | *""
+ query: string | *""
+ current: VariableOption | *{
+ text: ""
+ value: ""
+ }
+ label?: string
+ hide: VariableHide
+ skipUrlSync: bool | *false
+ description?: string
+}
+
+// Constant variable kind
+ConstantVariableKind: {
+ kind: "ConstantVariable"
+ spec: ConstantVariableSpec
+}
+
+// Datasource variable specification
+DatasourceVariableSpec: {
+ name: string | *""
+ pluginId: string | *""
+ refresh: VariableRefresh
+ regex: string | *""
+ current: VariableOption | *{
+ text: ""
+ value: ""
+ }
+ options: [...VariableOption] | *[]
+ multi: bool | *false
+ includeAll: bool | *false
+ allValue?: string
+ label?: string
+ hide: VariableHide
+ skipUrlSync: bool | *false
+ description?: string
+}
+
+// Datasource variable kind
+DatasourceVariableKind: {
+ kind: "DatasourceVariable"
+ spec: DatasourceVariableSpec
+}
+
+// Interval variable specification
+IntervalVariableSpec: {
+ name: string | *""
+ query: string | *""
+ current: VariableOption | *{
+ text: ""
+ value: ""
+ }
+ options: [...VariableOption] | *[]
+ auto: bool | *false
+ auto_min: string | *""
+ auto_count: int | *0
+ refresh: VariableRefresh
+ label?: string
+ hide: VariableHide
+ skipUrlSync: bool | *false
+ description?: string
+}
+
+// Interval variable kind
+IntervalVariableKind: {
+ kind: "IntervalVariable"
+ spec: IntervalVariableSpec
+}
+
+// Custom variable specification
+CustomVariableSpec: {
+ name: string | *""
+ query: string | *""
+ current: VariableOption
+ options: [...VariableOption] | *[]
+ multi: bool | *false
+ includeAll: bool | *false
+ allValue?: string
+ label?: string
+ hide: VariableHide
+ skipUrlSync: bool | *false
+ description?: string
+}
+
+// Custom variable kind
+CustomVariableKind: {
+ kind: "CustomVariable"
+ spec: CustomVariableSpec
+}
+
+// GroupBy variable specification
+GroupByVariableSpec: {
+ name: string | *""
+ datasource?: DataSourceRef
+ current: VariableOption | *{
+ text: ""
+ value: ""
+ }
+ options: [...VariableOption] | *[]
+ multi: bool | *false
+ label?: string
+ hide: VariableHide
+ skipUrlSync: bool | *false
+ description?: string
+}
+
+// Group variable kind
+GroupByVariableKind: {
+ kind: "GroupByVariable"
+ spec: GroupByVariableSpec
+}
+
+// Adhoc variable specification
+AdhocVariableSpec: {
+ name: string | *""
+ datasource?: DataSourceRef
+ baseFilters: [...AdHocFilterWithLabels] | *[]
+ filters: [...AdHocFilterWithLabels] | *[]
+ defaultKeys: [...MetricFindValue] | *[]
+ label?: string
+ hide: VariableHide
+ skipUrlSync: bool | *false
+ description?: string
+}
+
+// Define the MetricFindValue type
+MetricFindValue: {
+ text: string
+ value?: string | number
+ group?: string
+ expandable?: bool
+}
+
+// Define the AdHocFilterWithLabels type
+AdHocFilterWithLabels: {
+ key: string
+ operator: string
+ value: string
+ values?: [...string]
+ keyLabel?: string
+ valueLabels?: [...string]
+ forceEdit?: bool
+ // @deprecated
+ condition?: string
+}
+
+// Adhoc variable kind
+AdhocVariableKind: {
+ kind: "AdhocVariable"
+ spec: AdhocVariableSpec
+}
+
+ConditionalRenderingGroupKind: {
+ kind: "ConditionalRenderingGroup"
+ spec: ConditionalRenderingGroupSpec
+}
+
+ConditionalRenderingGroupSpec: {
+ condition: "and" | "or"
+ items: [...ConditionalRenderingVariableKind | ConditionalRenderingDataKind | ConditionalRenderingTimeIntervalKind]
+}
+
+ConditionalRenderingVariableKind: {
+ kind: "ConditionalRenderingVariable"
+ spec: ConditionalRenderingVariableSpec
+}
+
+ConditionalRenderingVariableSpec: {
+ variable: string
+ operator: "equals" | "notEquals"
+ value: string
+}
+
+ConditionalRenderingDataKind: {
+ kind: "ConditionalRenderingData"
+ spec: ConditionalRenderingDataSpec
+}
+
+ConditionalRenderingDataSpec: {
+ value: bool
+}
+
+ConditionalRenderingTimeIntervalKind: {
+ kind: "ConditionalRenderingTimeInterval"
+ spec: ConditionalRenderingTimeIntervalSpec
+}
+
+ConditionalRenderingTimeIntervalSpec: {
+ value: string
+}
\ No newline at end of file
diff --git a/pkg/apis/dashboard/types.go b/apps/dashboard/pkg/apis/dashboard/types.go
similarity index 100%
rename from pkg/apis/dashboard/types.go
rename to apps/dashboard/pkg/apis/dashboard/types.go
diff --git a/apps/dashboard/pkg/apis/dashboard/utils.go b/apps/dashboard/pkg/apis/dashboard/utils.go
new file mode 100644
index 00000000000..a5979151a90
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/utils.go
@@ -0,0 +1,31 @@
+package dashboard
+
+import (
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+
+ "github.com/grafana/grafana/pkg/apimachinery/utils"
+)
+
+// SetPluginIDMeta sets the repo name to "plugin" and the path to the plugin ID
+func SetPluginIDMeta(obj *unstructured.Unstructured, pluginID string) {
+ if pluginID == "" {
+ return
+ }
+
+ meta, err := utils.MetaAccessor(obj)
+ if err == nil {
+ meta.SetManagerProperties(utils.ManagerProperties{
+ Kind: utils.ManagerKindPlugin,
+ Identity: pluginID,
+ })
+ }
+}
+
+// GetPluginIDFromMeta returns the plugin ID from the meta if the repo name is "plugin"
+func GetPluginIDFromMeta(obj utils.GrafanaMetaAccessor) string {
+ p, ok := obj.GetManagerProperties()
+ if ok && p.Kind == utils.ManagerKindPlugin {
+ return p.Identity
+ }
+ return ""
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go
new file mode 100644
index 00000000000..90cb8b29db7
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go
@@ -0,0 +1,18 @@
+package v0alpha1
+
+import "k8s.io/apimachinery/pkg/runtime/schema"
+
+const (
+ // Group is the API group used by all kinds in this package
+ Group = "dashboard.grafana.app"
+ // Version is the API version used by all kinds in this package
+ Version = "v0alpha1"
+)
+
+var (
+ // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package
+ GroupVersion = schema.GroupVersion{
+ Group: Group,
+ Version: Version,
+ }
+)
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_codec_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_codec_gen.go
new file mode 100644
index 00000000000..6186cb824b5
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_codec_gen.go
@@ -0,0 +1,28 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v0alpha1
+
+import (
+ "encoding/json"
+ "io"
+
+ "github.com/grafana/grafana-app-sdk/resource"
+)
+
+// DashboardJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding
+type DashboardJSONCodec struct{}
+
+// Read reads JSON-encoded bytes from `reader` and unmarshals them into `into`
+func (*DashboardJSONCodec) Read(reader io.Reader, into resource.Object) error {
+ return json.NewDecoder(reader).Decode(into)
+}
+
+// Write writes JSON-encoded bytes into `writer` marshaled from `from`
+func (*DashboardJSONCodec) Write(writer io.Writer, from resource.Object) error {
+ return json.NewEncoder(writer).Encode(from)
+}
+
+// Interface compliance checks
+var _ resource.Codec = &DashboardJSONCodec{}
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go
new file mode 100644
index 00000000000..6e22219dbf4
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go
@@ -0,0 +1,28 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v0alpha1
+
+import (
+ time "time"
+)
+
+// metadata contains embedded CommonMetadata and can be extended with custom string fields
+// TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
+// without external reference as using the CommonMetadata reference breaks thema codegen.
+type DashboardMetadata struct {
+ UpdateTimestamp time.Time `json:"updateTimestamp"`
+ CreatedBy string `json:"createdBy"`
+ Uid string `json:"uid"`
+ CreationTimestamp time.Time `json:"creationTimestamp"`
+ DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
+ Finalizers []string `json:"finalizers"`
+ ResourceVersion string `json:"resourceVersion"`
+ Generation int64 `json:"generation"`
+ UpdatedBy string `json:"updatedBy"`
+ Labels map[string]string `json:"labels"`
+}
+
+// NewDashboardMetadata creates a new DashboardMetadata object.
+func NewDashboardMetadata() *DashboardMetadata {
+ return &DashboardMetadata{}
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go
new file mode 100644
index 00000000000..ab406988c90
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_object_gen.go
@@ -0,0 +1,269 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v0alpha1
+
+import (
+ "fmt"
+ "github.com/grafana/grafana-app-sdk/resource"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/apimachinery/pkg/types"
+ "time"
+)
+
+// +k8s:openapi-gen=true
+type Dashboard struct {
+ metav1.TypeMeta `json:",inline" yaml:",inline"`
+ metav1.ObjectMeta `json:"metadata" yaml:"metadata"`
+
+ // Spec is the spec of the Dashboard
+ Spec DashboardSpec `json:"spec" yaml:"spec"`
+
+ Status DashboardStatus `json:"status" yaml:"status"`
+}
+
+func (o *Dashboard) GetSpec() any {
+ return o.Spec
+}
+
+func (o *Dashboard) SetSpec(spec any) error {
+ cast, ok := spec.(DashboardSpec)
+ if !ok {
+ return fmt.Errorf("cannot set spec type %#v, not of type Spec", spec)
+ }
+ o.Spec = cast
+ return nil
+}
+
+func (o *Dashboard) GetSubresources() map[string]any {
+ return map[string]any{
+ "status": o.Status,
+ }
+}
+
+func (o *Dashboard) GetSubresource(name string) (any, bool) {
+ switch name {
+ case "status":
+ return o.Status, true
+ default:
+ return nil, false
+ }
+}
+
+func (o *Dashboard) SetSubresource(name string, value any) error {
+ switch name {
+ case "status":
+ cast, ok := value.(DashboardStatus)
+ if !ok {
+ return fmt.Errorf("cannot set status type %#v, not of type DashboardStatus", value)
+ }
+ o.Status = cast
+ return nil
+ default:
+ return fmt.Errorf("subresource '%s' does not exist", name)
+ }
+}
+
+func (o *Dashboard) GetStaticMetadata() resource.StaticMetadata {
+ gvk := o.GroupVersionKind()
+ return resource.StaticMetadata{
+ Name: o.ObjectMeta.Name,
+ Namespace: o.ObjectMeta.Namespace,
+ Group: gvk.Group,
+ Version: gvk.Version,
+ Kind: gvk.Kind,
+ }
+}
+
+func (o *Dashboard) SetStaticMetadata(metadata resource.StaticMetadata) {
+ o.Name = metadata.Name
+ o.Namespace = metadata.Namespace
+ o.SetGroupVersionKind(schema.GroupVersionKind{
+ Group: metadata.Group,
+ Version: metadata.Version,
+ Kind: metadata.Kind,
+ })
+}
+
+func (o *Dashboard) GetCommonMetadata() resource.CommonMetadata {
+ dt := o.DeletionTimestamp
+ var deletionTimestamp *time.Time
+ if dt != nil {
+ deletionTimestamp = &dt.Time
+ }
+ // Legacy ExtraFields support
+ extraFields := make(map[string]any)
+ if o.Annotations != nil {
+ extraFields["annotations"] = o.Annotations
+ }
+ if o.ManagedFields != nil {
+ extraFields["managedFields"] = o.ManagedFields
+ }
+ if o.OwnerReferences != nil {
+ extraFields["ownerReferences"] = o.OwnerReferences
+ }
+ return resource.CommonMetadata{
+ UID: string(o.UID),
+ ResourceVersion: o.ResourceVersion,
+ Generation: o.Generation,
+ Labels: o.Labels,
+ CreationTimestamp: o.CreationTimestamp.Time,
+ DeletionTimestamp: deletionTimestamp,
+ Finalizers: o.Finalizers,
+ UpdateTimestamp: o.GetUpdateTimestamp(),
+ CreatedBy: o.GetCreatedBy(),
+ UpdatedBy: o.GetUpdatedBy(),
+ ExtraFields: extraFields,
+ }
+}
+
+func (o *Dashboard) SetCommonMetadata(metadata resource.CommonMetadata) {
+ o.UID = types.UID(metadata.UID)
+ o.ResourceVersion = metadata.ResourceVersion
+ o.Generation = metadata.Generation
+ o.Labels = metadata.Labels
+ o.CreationTimestamp = metav1.NewTime(metadata.CreationTimestamp)
+ if metadata.DeletionTimestamp != nil {
+ dt := metav1.NewTime(*metadata.DeletionTimestamp)
+ o.DeletionTimestamp = &dt
+ } else {
+ o.DeletionTimestamp = nil
+ }
+ o.Finalizers = metadata.Finalizers
+ if o.Annotations == nil {
+ o.Annotations = make(map[string]string)
+ }
+ if !metadata.UpdateTimestamp.IsZero() {
+ o.SetUpdateTimestamp(metadata.UpdateTimestamp)
+ }
+ if metadata.CreatedBy != "" {
+ o.SetCreatedBy(metadata.CreatedBy)
+ }
+ if metadata.UpdatedBy != "" {
+ o.SetUpdatedBy(metadata.UpdatedBy)
+ }
+ // Legacy support for setting Annotations, ManagedFields, and OwnerReferences via ExtraFields
+ if metadata.ExtraFields != nil {
+ if annotations, ok := metadata.ExtraFields["annotations"]; ok {
+ if cast, ok := annotations.(map[string]string); ok {
+ o.Annotations = cast
+ }
+ }
+ if managedFields, ok := metadata.ExtraFields["managedFields"]; ok {
+ if cast, ok := managedFields.([]metav1.ManagedFieldsEntry); ok {
+ o.ManagedFields = cast
+ }
+ }
+ if ownerReferences, ok := metadata.ExtraFields["ownerReferences"]; ok {
+ if cast, ok := ownerReferences.([]metav1.OwnerReference); ok {
+ o.OwnerReferences = cast
+ }
+ }
+ }
+}
+
+func (o *Dashboard) GetCreatedBy() string {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ return o.ObjectMeta.Annotations["grafana.com/createdBy"]
+}
+
+func (o *Dashboard) SetCreatedBy(createdBy string) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/createdBy"] = createdBy
+}
+
+func (o *Dashboard) GetUpdateTimestamp() time.Time {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ parsed, _ := time.Parse(time.RFC3339, o.ObjectMeta.Annotations["grafana.com/updateTimestamp"])
+ return parsed
+}
+
+func (o *Dashboard) SetUpdateTimestamp(updateTimestamp time.Time) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/updateTimestamp"] = updateTimestamp.Format(time.RFC3339)
+}
+
+func (o *Dashboard) GetUpdatedBy() string {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ return o.ObjectMeta.Annotations["grafana.com/updatedBy"]
+}
+
+func (o *Dashboard) SetUpdatedBy(updatedBy string) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/updatedBy"] = updatedBy
+}
+
+func (o *Dashboard) Copy() resource.Object {
+ return resource.CopyObject(o)
+}
+
+func (o *Dashboard) DeepCopyObject() runtime.Object {
+ return o.Copy()
+}
+
+// Interface compliance compile-time check
+var _ resource.Object = &Dashboard{}
+
+// +k8s:openapi-gen=true
+type DashboardList struct {
+ metav1.TypeMeta `json:",inline" yaml:",inline"`
+ metav1.ListMeta `json:"metadata" yaml:"metadata"`
+ Items []Dashboard `json:"items" yaml:"items"`
+}
+
+func (o *DashboardList) DeepCopyObject() runtime.Object {
+ return o.Copy()
+}
+
+func (o *DashboardList) Copy() resource.ListObject {
+ cpy := &DashboardList{
+ TypeMeta: o.TypeMeta,
+ Items: make([]Dashboard, len(o.Items)),
+ }
+ o.ListMeta.DeepCopyInto(&cpy.ListMeta)
+ for i := 0; i < len(o.Items); i++ {
+ if item, ok := o.Items[i].Copy().(*Dashboard); ok {
+ cpy.Items[i] = *item
+ }
+ }
+ return cpy
+}
+
+func (o *DashboardList) GetItems() []resource.Object {
+ items := make([]resource.Object, len(o.Items))
+ for i := 0; i < len(o.Items); i++ {
+ items[i] = &o.Items[i]
+ }
+ return items
+}
+
+func (o *DashboardList) SetItems(items []resource.Object) {
+ o.Items = make([]Dashboard, len(items))
+ for i := 0; i < len(items); i++ {
+ o.Items[i] = *items[i].(*Dashboard)
+ }
+}
+
+// Interface compliance compile-time check
+var _ resource.ListObject = &DashboardList{}
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_schema_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_schema_gen.go
new file mode 100644
index 00000000000..5b2da44ec05
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_schema_gen.go
@@ -0,0 +1,34 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v0alpha1
+
+import (
+ "github.com/grafana/grafana-app-sdk/resource"
+)
+
+// schema is unexported to prevent accidental overwrites
+var (
+ schemaDashboard = resource.NewSimpleSchema("dashboard.grafana.app", "v0alpha1", &Dashboard{}, &DashboardList{}, resource.WithKind("Dashboard"),
+ resource.WithPlural("dashboards"), resource.WithScope(resource.NamespacedScope))
+ kindDashboard = resource.Kind{
+ Schema: schemaDashboard,
+ Codecs: map[resource.KindEncoding]resource.Codec{
+ resource.KindEncodingJSON: &DashboardJSONCodec{},
+ },
+ }
+)
+
+// Kind returns a resource.Kind for this Schema with a JSON codec
+func DashboardKind() resource.Kind {
+ return kindDashboard
+}
+
+// Schema returns a resource.SimpleSchema representation of Dashboard
+func DashboardSchema() *resource.SimpleSchema {
+ return schemaDashboard
+}
+
+// Interface compliance checks
+var _ resource.Schema = kindDashboard
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec.go
new file mode 100644
index 00000000000..ec3bf1aeb1f
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec.go
@@ -0,0 +1,13 @@
+package v0alpha1
+
+import (
+ common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
+)
+
+// +k8s:openapi-gen=true
+type DashboardSpec = common.Unstructured
+
+// NewDashboardSpec creates a new Spec object.
+func NewDashboardSpec() *DashboardSpec {
+ return &DashboardSpec{}
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec_gen.go
new file mode 100644
index 00000000000..90130b85cf3
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_spec_gen.go
@@ -0,0 +1,3 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v0alpha1
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_status_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_status_gen.go
new file mode 100644
index 00000000000..70fbb4e9263
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_status_gen.go
@@ -0,0 +1,34 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v0alpha1
+
+// ConversionStatus is the status of the conversion of the dashboard.
+// +k8s:openapi-gen=true
+type DashboardConversionStatus struct {
+ // Whether from another version has failed.
+ // If true, means that the dashboard is not valid,
+ // and the caller should instead fetch the stored version.
+ Failed bool `json:"failed"`
+ // The version which was stored when the dashboard was created / updated.
+ // Fetching this version should always succeed.
+ StoredVersion string `json:"storedVersion"`
+ // The error message from the conversion.
+ // Empty if the conversion has not failed.
+ Error string `json:"error"`
+}
+
+// NewDashboardConversionStatus creates a new DashboardConversionStatus object.
+func NewDashboardConversionStatus() *DashboardConversionStatus {
+ return &DashboardConversionStatus{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardStatus struct {
+ // Optional conversion status.
+ Conversion *DashboardConversionStatus `json:"conversion,omitempty"`
+}
+
+// NewDashboardStatus creates a new DashboardStatus object.
+func NewDashboardStatus() *DashboardStatus {
+ return &DashboardStatus{}
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/deepcopy.go
new file mode 100644
index 00000000000..ffdea428a67
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/deepcopy.go
@@ -0,0 +1,41 @@
+package v0alpha1
+
+// TODO: these should be automatically generated by the SDK.
+
+func (in *Dashboard) DeepCopyInto(out *Dashboard) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+}
+
+func (in *Dashboard) DeepCopy() *Dashboard {
+ if in == nil {
+ return nil
+ }
+ out := new(Dashboard)
+ in.DeepCopyInto(out)
+ return out
+}
+
+func (in *DashboardList) DeepCopyInto(out *DashboardList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ListMeta.DeepCopyInto(&out.ListMeta)
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Dashboard, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+}
+
+func (in *DashboardList) DeepCopy() *DashboardList {
+ if in == nil {
+ return nil
+ }
+ out := new(DashboardList)
+ in.DeepCopyInto(out)
+ return out
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/doc.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/doc.go
new file mode 100644
index 00000000000..a71646dde24
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/doc.go
@@ -0,0 +1,10 @@
+// +k8s:openapi-gen=true
+// +k8s:defaulter-gen=TypeMeta
+// +k8s:conversion-gen=github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard
+// +groupName=dashboard.grafana.app
+
+// NOTE (@radiohead): we do not use package-wide deepcopy generation
+// because grafana-app-sdk already provides deepcopy functions.
+// Kinds which are not generated by the SDK are explicitly opted in to deepcopy generation.
+
+package v0alpha1 // import "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1"
diff --git a/pkg/apis/dashboard/v0alpha1/register.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/register.go
similarity index 100%
rename from pkg/apis/dashboard/v0alpha1/register.go
rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/register.go
diff --git a/pkg/apis/dashboard/v0alpha1/search.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/search.go
similarity index 92%
rename from pkg/apis/dashboard/v0alpha1/search.go
rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/search.go
index 96afdc447ff..5d768dbfc11 100644
--- a/pkg/apis/dashboard/v0alpha1/search.go
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/search.go
@@ -6,6 +6,7 @@ import (
common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
)
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type SearchResults struct {
metav1.TypeMeta `json:",inline"`
@@ -32,11 +33,13 @@ type SearchResults struct {
Facets map[string]FacetResult `json:"facets,omitempty"`
}
+// +k8s:deepcopy-gen=true
type SortBy struct {
Field string `json:"field"`
Descending bool `json:"desc,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type SortableFields struct {
metav1.TypeMeta `json:",inline"`
@@ -45,12 +48,14 @@ type SortableFields struct {
Fields []SortableField `json:"fields"`
}
+// +k8s:deepcopy-gen=true
type SortableField struct {
Field string `json:"string,omitempty"`
Display string `json:"display,omitempty"`
Type string `json:"type,omitempty"` // string or number
}
+// +k8s:deepcopy-gen=true
type DashboardHit struct {
// Dashboard or folder
Resource string `json:"resource"` // dashboards | folders
@@ -70,6 +75,7 @@ type DashboardHit struct {
Explain *common.Unstructured `json:"explain,omitempty"`
}
+// +k8s:deepcopy-gen=true
type FacetResult struct {
Field string `json:"field,omitempty"`
// The distinct terms
@@ -80,6 +86,7 @@ type FacetResult struct {
Terms []TermFacet `json:"terms,omitempty"`
}
+// +k8s:deepcopy-gen=true
type TermFacet struct {
Term string `json:"term,omitempty"`
Count int64 `json:"count,omitempty"`
diff --git a/pkg/apis/dashboard/v0alpha1/types.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go
similarity index 79%
rename from pkg/apis/dashboard/v0alpha1/types.go
rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go
index af6f62f2e95..ff4e38841d3 100644
--- a/pkg/apis/dashboard/v0alpha1/types.go
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/types.go
@@ -7,40 +7,7 @@ import (
common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
)
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-type Dashboard struct {
- metav1.TypeMeta `json:",inline"`
- // Standard object's metadata
- // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
- // +optional
- metav1.ObjectMeta `json:"metadata,omitempty"`
-
- // The dashboard body (unstructured for now)
- Spec common.Unstructured `json:"spec"`
-
- // Optional dashboard status
- Status *DashboardStatus `json:"status,omitempty"`
-}
-
-type DashboardStatus struct {
- ConversionStatus *ConversionStatus `json:"conversion,omitempty"`
-}
-
-type ConversionStatus struct {
- Failed bool `json:"failed,omitempty"`
- StoredVersion string `json:"storedVersion,omitempty"`
- Error string `json:"error,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-type DashboardList struct {
- metav1.TypeMeta `json:",inline"`
- // +optional
- metav1.ListMeta `json:"metadata,omitempty"`
-
- Items []Dashboard `json:"items,omitempty"`
-}
-
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type DashboardVersionList struct {
metav1.TypeMeta `json:",inline"`
@@ -50,6 +17,7 @@ type DashboardVersionList struct {
Items []DashboardVersionInfo `json:"items,omitempty"`
}
+// +k8s:deepcopy-gen=true
type DashboardVersionInfo struct {
// The internal ID for this version (will be replaced with resourceVersion)
Version int `json:"version"`
@@ -67,6 +35,7 @@ type DashboardVersionInfo struct {
Message string `json:"message,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:conversion-gen:explicit-from=net/url.Values
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type VersionsQueryOptions struct {
@@ -80,6 +49,7 @@ type VersionsQueryOptions struct {
Version int64 `json:"version,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type LibraryPanel struct {
metav1.TypeMeta `json:",inline"`
@@ -95,6 +65,7 @@ type LibraryPanel struct {
Status *LibraryPanelStatus `json:"status,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type LibraryPanelList struct {
metav1.TypeMeta `json:",inline"`
@@ -104,6 +75,7 @@ type LibraryPanelList struct {
Items []LibraryPanel `json:"items,omitempty"`
}
+// +k8s:deepcopy-gen=true
type LibraryPanelSpec struct {
// The panel type
Type string `json:"type"`
@@ -131,6 +103,7 @@ type LibraryPanelSpec struct {
Targets []data.DataQuery `json:"targets,omitempty"`
}
+// +k8s:deepcopy-gen=true
type LibraryPanelStatus struct {
// Translation warnings (mostly things that were in SQL columns but not found in the saved body)
Warnings []string `json:"warnings,omitempty"`
@@ -140,6 +113,7 @@ type LibraryPanelStatus struct {
}
// This is like the legacy DTO where access and metadata are all returned in a single call
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type DashboardWithAccessInfo struct {
Dashboard `json:",inline"`
@@ -147,7 +121,7 @@ type DashboardWithAccessInfo struct {
Access DashboardAccess `json:"access"`
}
-// Information about how the requesting user can use a given dashboard
+// +k8s:deepcopy-gen=true
type DashboardAccess struct {
// Metadata fields
Slug string `json:"slug,omitempty"`
@@ -162,11 +136,13 @@ type DashboardAccess struct {
AnnotationsPermissions *AnnotationPermission `json:"annotationsPermissions"`
}
+// +k8s:deepcopy-gen=true
type AnnotationPermission struct {
Dashboard AnnotationActions `json:"dashboard"`
Organization AnnotationActions `json:"organization"`
}
+// +k8s:deepcopy-gen=true
type AnnotationActions struct {
CanAdd bool `json:"canAdd"`
CanEdit bool `json:"canEdit"`
diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go
similarity index 99%
rename from pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go
rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go
index ade3e08a22a..b76e6b614ab 100644
--- a/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.conversion.go
@@ -11,7 +11,7 @@ import (
url "net/url"
unsafe "unsafe"
- dashboard "github.com/grafana/grafana/pkg/apis/dashboard"
+ dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard"
conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime"
)
diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go
similarity index 81%
rename from pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go
rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go
index 82e62ccdae6..8d851c4f6c2 100644
--- a/pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.deepcopy.go
@@ -46,54 +46,6 @@ func (in *AnnotationPermission) DeepCopy() *AnnotationPermission {
return out
}
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ConversionStatus) DeepCopyInto(out *ConversionStatus) {
- *out = *in
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConversionStatus.
-func (in *ConversionStatus) DeepCopy() *ConversionStatus {
- if in == nil {
- return nil
- }
- out := new(ConversionStatus)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Dashboard) DeepCopyInto(out *Dashboard) {
- *out = *in
- out.TypeMeta = in.TypeMeta
- in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
- in.Spec.DeepCopyInto(&out.Spec)
- if in.Status != nil {
- in, out := &in.Status, &out.Status
- *out = new(DashboardStatus)
- (*in).DeepCopyInto(*out)
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Dashboard.
-func (in *Dashboard) DeepCopy() *Dashboard {
- if in == nil {
- return nil
- }
- out := new(Dashboard)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Dashboard) DeepCopyObject() runtime.Object {
- if c := in.DeepCopy(); c != nil {
- return c
- }
- return nil
-}
-
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DashboardAccess) DeepCopyInto(out *DashboardAccess) {
*out = *in
@@ -144,60 +96,6 @@ func (in *DashboardHit) DeepCopy() *DashboardHit {
return out
}
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DashboardList) DeepCopyInto(out *DashboardList) {
- *out = *in
- out.TypeMeta = in.TypeMeta
- in.ListMeta.DeepCopyInto(&out.ListMeta)
- if in.Items != nil {
- in, out := &in.Items, &out.Items
- *out = make([]Dashboard, len(*in))
- for i := range *in {
- (*in)[i].DeepCopyInto(&(*out)[i])
- }
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardList.
-func (in *DashboardList) DeepCopy() *DashboardList {
- if in == nil {
- return nil
- }
- out := new(DashboardList)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *DashboardList) DeepCopyObject() runtime.Object {
- if c := in.DeepCopy(); c != nil {
- return c
- }
- return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DashboardStatus) DeepCopyInto(out *DashboardStatus) {
- *out = *in
- if in.ConversionStatus != nil {
- in, out := &in.ConversionStatus, &out.ConversionStatus
- *out = new(ConversionStatus)
- **out = **in
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardStatus.
-func (in *DashboardStatus) DeepCopy() *DashboardStatus {
- if in == nil {
- return nil
- }
- out := new(DashboardStatus)
- in.DeepCopyInto(out)
- return out
-}
-
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DashboardVersionInfo) DeepCopyInto(out *DashboardVersionInfo) {
*out = *in
diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.defaults.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.defaults.go
similarity index 100%
rename from pkg/apis/dashboard/v0alpha1/zz_generated.defaults.go
rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.defaults.go
diff --git a/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go
similarity index 71%
rename from pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go
rename to apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go
index 23197ec669b..a9d0f5b73c7 100644
--- a/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi.go
@@ -8,34 +8,38 @@
package v0alpha1
import (
+ commonv0alpha1 "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
common "k8s.io/kube-openapi/pkg/common"
spec "k8s.io/kube-openapi/pkg/validation/spec"
)
func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition {
return map[string]common.OpenAPIDefinition{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationActions": schema_pkg_apis_dashboard_v0alpha1_AnnotationActions(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v0alpha1_AnnotationPermission(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.ConversionStatus": schema_pkg_apis_dashboard_v0alpha1_ConversionStatus(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.Dashboard": schema_pkg_apis_dashboard_v0alpha1_Dashboard(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardAccess": schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardHit": schema_pkg_apis_dashboard_v0alpha1_DashboardHit(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardList": schema_pkg_apis_dashboard_v0alpha1_DashboardList(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus": schema_pkg_apis_dashboard_v0alpha1_DashboardStatus(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v0alpha1_DashboardVersionInfo(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v0alpha1_DashboardVersionList(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v0alpha1_DashboardWithAccessInfo(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.FacetResult": schema_pkg_apis_dashboard_v0alpha1_FacetResult(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanel": schema_pkg_apis_dashboard_v0alpha1_LibraryPanel(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelList(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelSpec(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelStatus(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SearchResults": schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortBy": schema_pkg_apis_dashboard_v0alpha1_SortBy(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableField": schema_pkg_apis_dashboard_v0alpha1_SortableField(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableFields": schema_pkg_apis_dashboard_v0alpha1_SortableFields(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.TermFacet": schema_pkg_apis_dashboard_v0alpha1_TermFacet(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v0alpha1_VersionsQueryOptions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationActions": schema_pkg_apis_dashboard_v0alpha1_AnnotationActions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v0alpha1_AnnotationPermission(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.Dashboard": schema_pkg_apis_dashboard_v0alpha1_Dashboard(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardAccess": schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v0alpha1_DashboardConversionStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardHit": schema_pkg_apis_dashboard_v0alpha1_DashboardHit(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v0alpha1_DashboardJSONCodec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardList": schema_pkg_apis_dashboard_v0alpha1_DashboardList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v0alpha1_DashboardMetadata(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus": schema_pkg_apis_dashboard_v0alpha1_DashboardStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v0alpha1_DashboardVersionInfo(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v0alpha1_DashboardVersionList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v0alpha1_DashboardWithAccessInfo(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.FacetResult": schema_pkg_apis_dashboard_v0alpha1_FacetResult(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanel": schema_pkg_apis_dashboard_v0alpha1_LibraryPanel(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v0alpha1_LibraryPanelStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SearchResults": schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortBy": schema_pkg_apis_dashboard_v0alpha1_SortBy(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableField": schema_pkg_apis_dashboard_v0alpha1_SortableField(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableFields": schema_pkg_apis_dashboard_v0alpha1_SortableFields(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.TermFacet": schema_pkg_apis_dashboard_v0alpha1_TermFacet(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v0alpha1_VersionsQueryOptions(ref),
+ "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured": commonv0alpha1.Unstructured{}.OpenAPIDefinition(),
}
}
@@ -82,13 +86,13 @@ func schema_pkg_apis_dashboard_v0alpha1_AnnotationPermission(ref common.Referenc
"dashboard": {
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationActions"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationActions"),
},
},
"organization": {
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationActions"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationActions"),
},
},
},
@@ -96,37 +100,7 @@ func schema_pkg_apis_dashboard_v0alpha1_AnnotationPermission(ref common.Referenc
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationActions"},
- }
-}
-
-func schema_pkg_apis_dashboard_v0alpha1_ConversionStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
- return common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Properties: map[string]spec.Schema{
- "failed": {
- SchemaProps: spec.SchemaProps{
- Type: []string{"boolean"},
- Format: "",
- },
- },
- "storedVersion": {
- SchemaProps: spec.SchemaProps{
- Type: []string{"string"},
- Format: "",
- },
- },
- "error": {
- SchemaProps: spec.SchemaProps{
- Type: []string{"string"},
- Format: "",
- },
- },
- },
- },
- },
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationActions"},
}
}
@@ -152,29 +126,28 @@ func schema_pkg_apis_dashboard_v0alpha1_Dashboard(ref common.ReferenceCallback)
},
"metadata": {
SchemaProps: spec.SchemaProps{
- Description: "Standard object's metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
- Default: map[string]interface{}{},
- Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
},
},
"spec": {
SchemaProps: spec.SchemaProps{
- Description: "The dashboard body (unstructured for now)",
+ Description: "Spec is the spec of the Dashboard",
Ref: ref("github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"),
},
},
"status": {
SchemaProps: spec.SchemaProps{
- Description: "Optional dashboard status",
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus"),
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus"),
},
},
},
- Required: []string{"spec"},
+ Required: []string{"metadata", "spec", "status"},
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
}
}
@@ -182,8 +155,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref common.ReferenceCall
return common.OpenAPIDefinition{
Schema: spec.Schema{
SchemaProps: spec.SchemaProps{
- Description: "Information about how the requesting user can use a given dashboard",
- Type: []string{"object"},
+ Type: []string{"object"},
Properties: map[string]spec.Schema{
"slug": {
SchemaProps: spec.SchemaProps{
@@ -236,7 +208,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref common.ReferenceCall
},
"annotationsPermissions": {
SchemaProps: spec.SchemaProps{
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationPermission"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationPermission"),
},
},
},
@@ -244,7 +216,45 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardAccess(ref common.ReferenceCall
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.AnnotationPermission"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.AnnotationPermission"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v0alpha1_DashboardConversionStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "ConversionStatus is the status of the conversion of the dashboard.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "failed": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Whether from another version has failed. If true, means that the dashboard is not valid, and the caller should instead fetch the stored version.",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "storedVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The version which was stored when the dashboard was created / updated. Fetching this version should always succeed.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "error": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The error message from the conversion. Empty if the conversion has not failed.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"failed", "storedVersion", "error"},
+ },
+ },
}
}
@@ -328,6 +338,17 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardHit(ref common.ReferenceCallbac
}
}
+func schema_pkg_apis_dashboard_v0alpha1_DashboardJSONCodec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "DashboardJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding",
+ Type: []string{"object"},
+ },
+ },
+ }
+}
+
func schema_pkg_apis_dashboard_v0alpha1_DashboardList(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -361,17 +382,114 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardList(ref common.ReferenceCallba
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.Dashboard"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.Dashboard"),
},
},
},
},
},
},
+ Required: []string{"metadata", "items"},
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v0alpha1_DashboardMetadata(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "metadata contains embedded CommonMetadata and can be extended with custom string fields without external reference as using the CommonMetadata reference breaks thema codegen.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "updateTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "createdBy": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "uid": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "creationTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "deletionTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "finalizers": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "resourceVersion": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "generation": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "updatedBy": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "labels": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"updateTimestamp", "createdBy", "uid", "creationTimestamp", "finalizers", "resourceVersion", "generation", "updatedBy", "labels"},
+ },
+ },
}
}
@@ -383,14 +501,15 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardStatus(ref common.ReferenceCall
Properties: map[string]spec.Schema{
"conversion": {
SchemaProps: spec.SchemaProps{
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.ConversionStatus"),
+ Description: "Optional conversion status.",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus"),
},
},
},
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.ConversionStatus"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardConversionStatus"},
}
}
@@ -477,7 +596,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardVersionList(ref common.Referenc
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo"),
},
},
},
@@ -487,7 +606,7 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardVersionList(ref common.Referenc
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
}
}
@@ -514,35 +633,34 @@ func schema_pkg_apis_dashboard_v0alpha1_DashboardWithAccessInfo(ref common.Refer
},
"metadata": {
SchemaProps: spec.SchemaProps{
- Description: "Standard object's metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
- Default: map[string]interface{}{},
- Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
},
},
"spec": {
SchemaProps: spec.SchemaProps{
- Description: "The dashboard body (unstructured for now)",
+ Description: "Spec is the spec of the Dashboard",
Ref: ref("github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"),
},
},
"status": {
SchemaProps: spec.SchemaProps{
- Description: "Optional dashboard status",
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus"),
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus"),
},
},
"access": {
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardAccess"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardAccess"),
},
},
},
- Required: []string{"spec", "access"},
+ Required: []string{"metadata", "spec", "status", "access"},
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardAccess", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardAccess", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardStatus", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
}
}
@@ -580,7 +698,7 @@ func schema_pkg_apis_dashboard_v0alpha1_FacetResult(ref common.ReferenceCallback
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.TermFacet"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.TermFacet"),
},
},
},
@@ -590,7 +708,7 @@ func schema_pkg_apis_dashboard_v0alpha1_FacetResult(ref common.ReferenceCallback
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.TermFacet"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.TermFacet"},
}
}
@@ -625,13 +743,13 @@ func schema_pkg_apis_dashboard_v0alpha1_LibraryPanel(ref common.ReferenceCallbac
SchemaProps: spec.SchemaProps{
Description: "Panel properties",
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec"),
},
},
"status": {
SchemaProps: spec.SchemaProps{
Description: "Status will show errors",
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus"),
},
},
},
@@ -639,7 +757,7 @@ func schema_pkg_apis_dashboard_v0alpha1_LibraryPanel(ref common.ReferenceCallbac
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
}
}
@@ -676,7 +794,7 @@ func schema_pkg_apis_dashboard_v0alpha1_LibraryPanelList(ref common.ReferenceCal
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanel"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanel"),
},
},
},
@@ -686,7 +804,7 @@ func schema_pkg_apis_dashboard_v0alpha1_LibraryPanelList(ref common.ReferenceCal
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
}
}
@@ -848,7 +966,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref common.ReferenceCallba
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardHit"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardHit"),
},
},
},
@@ -871,7 +989,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref common.ReferenceCallba
"sortBy": {
SchemaProps: spec.SchemaProps{
Description: "How are the results sorted",
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortBy"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortBy"),
},
},
"facets": {
@@ -883,7 +1001,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref common.ReferenceCallba
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.FacetResult"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.FacetResult"),
},
},
},
@@ -894,7 +1012,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SearchResults(ref common.ReferenceCallba
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.DashboardHit", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.FacetResult", "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortBy"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.DashboardHit", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.FacetResult", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortBy"},
}
}
@@ -982,7 +1100,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SortableFields(ref common.ReferenceCallb
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableField"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableField"),
},
},
},
@@ -993,7 +1111,7 @@ func schema_pkg_apis_dashboard_v0alpha1_SortableFields(ref common.ReferenceCallb
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v0alpha1.SortableField"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1.SortableField"},
}
}
diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list
new file mode 100644
index 00000000000..68505c7d05d
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list
@@ -0,0 +1,9 @@
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,DashboardHit,Tags
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,DashboardMetadata,Finalizers
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,FacetResult,Terms
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,LibraryPanelStatus,Warnings
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SearchResults,Hits
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SortableFields,Fields
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SortBy,Descending
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SortableField,Field
+API rule violation: names_match,github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1,Unstructured,Object
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/constants.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/constants.go
new file mode 100644
index 00000000000..b3732986f0b
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/constants.go
@@ -0,0 +1,18 @@
+package v1alpha1
+
+import "k8s.io/apimachinery/pkg/runtime/schema"
+
+const (
+ // Group is the API group used by all kinds in this package
+ Group = "dashboard.grafana.app"
+ // Version is the API version used by all kinds in this package
+ Version = "v1alpha1"
+)
+
+var (
+ // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package
+ GroupVersion = schema.GroupVersion{
+ Group: Group,
+ Version: Version,
+ }
+)
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_codec_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_codec_gen.go
new file mode 100644
index 00000000000..24ee7ecd7bd
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_codec_gen.go
@@ -0,0 +1,28 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v1alpha1
+
+import (
+ "encoding/json"
+ "io"
+
+ "github.com/grafana/grafana-app-sdk/resource"
+)
+
+// DashboardJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding
+type DashboardJSONCodec struct{}
+
+// Read reads JSON-encoded bytes from `reader` and unmarshals them into `into`
+func (*DashboardJSONCodec) Read(reader io.Reader, into resource.Object) error {
+ return json.NewDecoder(reader).Decode(into)
+}
+
+// Write writes JSON-encoded bytes into `writer` marshaled from `from`
+func (*DashboardJSONCodec) Write(writer io.Writer, from resource.Object) error {
+ return json.NewEncoder(writer).Encode(from)
+}
+
+// Interface compliance checks
+var _ resource.Codec = &DashboardJSONCodec{}
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_metadata_gen.go
new file mode 100644
index 00000000000..16ead71d265
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_metadata_gen.go
@@ -0,0 +1,28 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+ time "time"
+)
+
+// metadata contains embedded CommonMetadata and can be extended with custom string fields
+// TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
+// without external reference as using the CommonMetadata reference breaks thema codegen.
+type DashboardMetadata struct {
+ UpdateTimestamp time.Time `json:"updateTimestamp"`
+ CreatedBy string `json:"createdBy"`
+ Uid string `json:"uid"`
+ CreationTimestamp time.Time `json:"creationTimestamp"`
+ DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
+ Finalizers []string `json:"finalizers"`
+ ResourceVersion string `json:"resourceVersion"`
+ Generation int64 `json:"generation"`
+ UpdatedBy string `json:"updatedBy"`
+ Labels map[string]string `json:"labels"`
+}
+
+// NewDashboardMetadata creates a new DashboardMetadata object.
+func NewDashboardMetadata() *DashboardMetadata {
+ return &DashboardMetadata{}
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go
new file mode 100644
index 00000000000..cdf11cabbd0
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_object_gen.go
@@ -0,0 +1,269 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v1alpha1
+
+import (
+ "fmt"
+ "github.com/grafana/grafana-app-sdk/resource"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/apimachinery/pkg/types"
+ "time"
+)
+
+// +k8s:openapi-gen=true
+type Dashboard struct {
+ metav1.TypeMeta `json:",inline" yaml:",inline"`
+ metav1.ObjectMeta `json:"metadata" yaml:"metadata"`
+
+ // Spec is the spec of the Dashboard
+ Spec DashboardSpec `json:"spec" yaml:"spec"`
+
+ Status DashboardStatus `json:"status" yaml:"status"`
+}
+
+func (o *Dashboard) GetSpec() any {
+ return o.Spec
+}
+
+func (o *Dashboard) SetSpec(spec any) error {
+ cast, ok := spec.(DashboardSpec)
+ if !ok {
+ return fmt.Errorf("cannot set spec type %#v, not of type Spec", spec)
+ }
+ o.Spec = cast
+ return nil
+}
+
+func (o *Dashboard) GetSubresources() map[string]any {
+ return map[string]any{
+ "status": o.Status,
+ }
+}
+
+func (o *Dashboard) GetSubresource(name string) (any, bool) {
+ switch name {
+ case "status":
+ return o.Status, true
+ default:
+ return nil, false
+ }
+}
+
+func (o *Dashboard) SetSubresource(name string, value any) error {
+ switch name {
+ case "status":
+ cast, ok := value.(DashboardStatus)
+ if !ok {
+ return fmt.Errorf("cannot set status type %#v, not of type DashboardStatus", value)
+ }
+ o.Status = cast
+ return nil
+ default:
+ return fmt.Errorf("subresource '%s' does not exist", name)
+ }
+}
+
+func (o *Dashboard) GetStaticMetadata() resource.StaticMetadata {
+ gvk := o.GroupVersionKind()
+ return resource.StaticMetadata{
+ Name: o.ObjectMeta.Name,
+ Namespace: o.ObjectMeta.Namespace,
+ Group: gvk.Group,
+ Version: gvk.Version,
+ Kind: gvk.Kind,
+ }
+}
+
+func (o *Dashboard) SetStaticMetadata(metadata resource.StaticMetadata) {
+ o.Name = metadata.Name
+ o.Namespace = metadata.Namespace
+ o.SetGroupVersionKind(schema.GroupVersionKind{
+ Group: metadata.Group,
+ Version: metadata.Version,
+ Kind: metadata.Kind,
+ })
+}
+
+func (o *Dashboard) GetCommonMetadata() resource.CommonMetadata {
+ dt := o.DeletionTimestamp
+ var deletionTimestamp *time.Time
+ if dt != nil {
+ deletionTimestamp = &dt.Time
+ }
+ // Legacy ExtraFields support
+ extraFields := make(map[string]any)
+ if o.Annotations != nil {
+ extraFields["annotations"] = o.Annotations
+ }
+ if o.ManagedFields != nil {
+ extraFields["managedFields"] = o.ManagedFields
+ }
+ if o.OwnerReferences != nil {
+ extraFields["ownerReferences"] = o.OwnerReferences
+ }
+ return resource.CommonMetadata{
+ UID: string(o.UID),
+ ResourceVersion: o.ResourceVersion,
+ Generation: o.Generation,
+ Labels: o.Labels,
+ CreationTimestamp: o.CreationTimestamp.Time,
+ DeletionTimestamp: deletionTimestamp,
+ Finalizers: o.Finalizers,
+ UpdateTimestamp: o.GetUpdateTimestamp(),
+ CreatedBy: o.GetCreatedBy(),
+ UpdatedBy: o.GetUpdatedBy(),
+ ExtraFields: extraFields,
+ }
+}
+
+func (o *Dashboard) SetCommonMetadata(metadata resource.CommonMetadata) {
+ o.UID = types.UID(metadata.UID)
+ o.ResourceVersion = metadata.ResourceVersion
+ o.Generation = metadata.Generation
+ o.Labels = metadata.Labels
+ o.CreationTimestamp = metav1.NewTime(metadata.CreationTimestamp)
+ if metadata.DeletionTimestamp != nil {
+ dt := metav1.NewTime(*metadata.DeletionTimestamp)
+ o.DeletionTimestamp = &dt
+ } else {
+ o.DeletionTimestamp = nil
+ }
+ o.Finalizers = metadata.Finalizers
+ if o.Annotations == nil {
+ o.Annotations = make(map[string]string)
+ }
+ if !metadata.UpdateTimestamp.IsZero() {
+ o.SetUpdateTimestamp(metadata.UpdateTimestamp)
+ }
+ if metadata.CreatedBy != "" {
+ o.SetCreatedBy(metadata.CreatedBy)
+ }
+ if metadata.UpdatedBy != "" {
+ o.SetUpdatedBy(metadata.UpdatedBy)
+ }
+ // Legacy support for setting Annotations, ManagedFields, and OwnerReferences via ExtraFields
+ if metadata.ExtraFields != nil {
+ if annotations, ok := metadata.ExtraFields["annotations"]; ok {
+ if cast, ok := annotations.(map[string]string); ok {
+ o.Annotations = cast
+ }
+ }
+ if managedFields, ok := metadata.ExtraFields["managedFields"]; ok {
+ if cast, ok := managedFields.([]metav1.ManagedFieldsEntry); ok {
+ o.ManagedFields = cast
+ }
+ }
+ if ownerReferences, ok := metadata.ExtraFields["ownerReferences"]; ok {
+ if cast, ok := ownerReferences.([]metav1.OwnerReference); ok {
+ o.OwnerReferences = cast
+ }
+ }
+ }
+}
+
+func (o *Dashboard) GetCreatedBy() string {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ return o.ObjectMeta.Annotations["grafana.com/createdBy"]
+}
+
+func (o *Dashboard) SetCreatedBy(createdBy string) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/createdBy"] = createdBy
+}
+
+func (o *Dashboard) GetUpdateTimestamp() time.Time {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ parsed, _ := time.Parse(time.RFC3339, o.ObjectMeta.Annotations["grafana.com/updateTimestamp"])
+ return parsed
+}
+
+func (o *Dashboard) SetUpdateTimestamp(updateTimestamp time.Time) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/updateTimestamp"] = updateTimestamp.Format(time.RFC3339)
+}
+
+func (o *Dashboard) GetUpdatedBy() string {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ return o.ObjectMeta.Annotations["grafana.com/updatedBy"]
+}
+
+func (o *Dashboard) SetUpdatedBy(updatedBy string) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/updatedBy"] = updatedBy
+}
+
+func (o *Dashboard) Copy() resource.Object {
+ return resource.CopyObject(o)
+}
+
+func (o *Dashboard) DeepCopyObject() runtime.Object {
+ return o.Copy()
+}
+
+// Interface compliance compile-time check
+var _ resource.Object = &Dashboard{}
+
+// +k8s:openapi-gen=true
+type DashboardList struct {
+ metav1.TypeMeta `json:",inline" yaml:",inline"`
+ metav1.ListMeta `json:"metadata" yaml:"metadata"`
+ Items []Dashboard `json:"items" yaml:"items"`
+}
+
+func (o *DashboardList) DeepCopyObject() runtime.Object {
+ return o.Copy()
+}
+
+func (o *DashboardList) Copy() resource.ListObject {
+ cpy := &DashboardList{
+ TypeMeta: o.TypeMeta,
+ Items: make([]Dashboard, len(o.Items)),
+ }
+ o.ListMeta.DeepCopyInto(&cpy.ListMeta)
+ for i := 0; i < len(o.Items); i++ {
+ if item, ok := o.Items[i].Copy().(*Dashboard); ok {
+ cpy.Items[i] = *item
+ }
+ }
+ return cpy
+}
+
+func (o *DashboardList) GetItems() []resource.Object {
+ items := make([]resource.Object, len(o.Items))
+ for i := 0; i < len(o.Items); i++ {
+ items[i] = &o.Items[i]
+ }
+ return items
+}
+
+func (o *DashboardList) SetItems(items []resource.Object) {
+ o.Items = make([]Dashboard, len(items))
+ for i := 0; i < len(items); i++ {
+ o.Items[i] = *items[i].(*Dashboard)
+ }
+}
+
+// Interface compliance compile-time check
+var _ resource.ListObject = &DashboardList{}
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_schema_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_schema_gen.go
new file mode 100644
index 00000000000..1c09a83e2bd
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_schema_gen.go
@@ -0,0 +1,34 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v1alpha1
+
+import (
+ "github.com/grafana/grafana-app-sdk/resource"
+)
+
+// schema is unexported to prevent accidental overwrites
+var (
+ schemaDashboard = resource.NewSimpleSchema("dashboard.grafana.app", "v1alpha1", &Dashboard{}, &DashboardList{}, resource.WithKind("Dashboard"),
+ resource.WithPlural("dashboards"), resource.WithScope(resource.NamespacedScope))
+ kindDashboard = resource.Kind{
+ Schema: schemaDashboard,
+ Codecs: map[resource.KindEncoding]resource.Codec{
+ resource.KindEncodingJSON: &DashboardJSONCodec{},
+ },
+ }
+)
+
+// Kind returns a resource.Kind for this Schema with a JSON codec
+func DashboardKind() resource.Kind {
+ return kindDashboard
+}
+
+// Schema returns a resource.SimpleSchema representation of Dashboard
+func DashboardSchema() *resource.SimpleSchema {
+ return schemaDashboard
+}
+
+// Interface compliance checks
+var _ resource.Schema = kindDashboard
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec.go
new file mode 100644
index 00000000000..0b341e6e55e
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec.go
@@ -0,0 +1,11 @@
+package v1alpha1
+
+import common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
+
+// +k8s:openapi-gen=true
+type DashboardSpec = common.Unstructured
+
+// NewDashboardSpec creates a new Spec object.
+func NewDashboardSpec() *DashboardSpec {
+ return &DashboardSpec{}
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec_gen.go
new file mode 100644
index 00000000000..4f48fee9aae
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_spec_gen.go
@@ -0,0 +1,3 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v1alpha1
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_status_gen.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_status_gen.go
new file mode 100644
index 00000000000..556d5ddba53
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/dashboard_status_gen.go
@@ -0,0 +1,34 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v1alpha1
+
+// ConversionStatus is the status of the conversion of the dashboard.
+// +k8s:openapi-gen=true
+type DashboardConversionStatus struct {
+ // Whether from another version has failed.
+ // If true, means that the dashboard is not valid,
+ // and the caller should instead fetch the stored version.
+ Failed bool `json:"failed"`
+ // The version which was stored when the dashboard was created / updated.
+ // Fetching this version should always succeed.
+ StoredVersion string `json:"storedVersion"`
+ // The error message from the conversion.
+ // Empty if the conversion has not failed.
+ Error string `json:"error"`
+}
+
+// NewDashboardConversionStatus creates a new DashboardConversionStatus object.
+func NewDashboardConversionStatus() *DashboardConversionStatus {
+ return &DashboardConversionStatus{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardStatus struct {
+ // Optional conversion status.
+ Conversion *DashboardConversionStatus `json:"conversion,omitempty"`
+}
+
+// NewDashboardStatus creates a new DashboardStatus object.
+func NewDashboardStatus() *DashboardStatus {
+ return &DashboardStatus{}
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/deepcopy.go
new file mode 100644
index 00000000000..1e05aa647f2
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/deepcopy.go
@@ -0,0 +1,41 @@
+package v1alpha1
+
+// TODO: these should be automatically generated by the SDK.
+
+func (in *Dashboard) DeepCopyInto(out *Dashboard) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+}
+
+func (in *Dashboard) DeepCopy() *Dashboard {
+ if in == nil {
+ return nil
+ }
+ out := new(Dashboard)
+ in.DeepCopyInto(out)
+ return out
+}
+
+func (in *DashboardList) DeepCopyInto(out *DashboardList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ListMeta.DeepCopyInto(&out.ListMeta)
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Dashboard, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+}
+
+func (in *DashboardList) DeepCopy() *DashboardList {
+ if in == nil {
+ return nil
+ }
+ out := new(DashboardList)
+ in.DeepCopyInto(out)
+ return out
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/doc.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/doc.go
new file mode 100644
index 00000000000..66bf673964c
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/doc.go
@@ -0,0 +1,10 @@
+// +k8s:openapi-gen=true
+// +k8s:defaulter-gen=TypeMeta
+// +k8s:conversion-gen=github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard
+// +groupName=dashboard.grafana.app
+
+// NOTE (@radiohead): we do not use package-wide deepcopy generation
+// because grafana-app-sdk already provides deepcopy functions.
+// Kinds which are not generated by the SDK are explicitly opted in to deepcopy generation.
+
+package v1alpha1 // import "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1"
diff --git a/pkg/apis/dashboard/v1alpha1/register.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/register.go
similarity index 100%
rename from pkg/apis/dashboard/v1alpha1/register.go
rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/register.go
diff --git a/pkg/apis/dashboard/v1alpha1/types.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/types.go
similarity index 80%
rename from pkg/apis/dashboard/v1alpha1/types.go
rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/types.go
index 0a5144508a1..43844655505 100644
--- a/pkg/apis/dashboard/v1alpha1/types.go
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/types.go
@@ -7,40 +7,7 @@ import (
common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
)
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-type Dashboard struct {
- metav1.TypeMeta `json:",inline"`
- // Standard object's metadata
- // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
- // +optional
- metav1.ObjectMeta `json:"metadata,omitempty"`
-
- // The dashboard body (unstructured for now)
- Spec common.Unstructured `json:"spec"`
-
- // Optional dashboard status
- Status *DashboardStatus `json:"status,omitempty"`
-}
-
-type DashboardStatus struct {
- ConversionStatus *ConversionStatus `json:"conversion,omitempty"`
-}
-
-type ConversionStatus struct {
- Failed bool `json:"failed,omitempty"`
- StoredVersion string `json:"storedVersion,omitempty"`
- Error string `json:"error,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-type DashboardList struct {
- metav1.TypeMeta `json:",inline"`
- // +optional
- metav1.ListMeta `json:"metadata,omitempty"`
-
- Items []Dashboard `json:"items,omitempty"`
-}
-
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type DashboardVersionList struct {
metav1.TypeMeta `json:",inline"`
@@ -50,6 +17,7 @@ type DashboardVersionList struct {
Items []DashboardVersionInfo `json:"items,omitempty"`
}
+// +k8s:deepcopy-gen=true
type DashboardVersionInfo struct {
// The internal ID for this version (will be replaced with resourceVersion)
Version int `json:"version"`
@@ -67,6 +35,7 @@ type DashboardVersionInfo struct {
Message string `json:"message,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:conversion-gen:explicit-from=net/url.Values
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type VersionsQueryOptions struct {
@@ -80,6 +49,7 @@ type VersionsQueryOptions struct {
Version int64 `json:"version,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type LibraryPanel struct {
metav1.TypeMeta `json:",inline"`
@@ -95,6 +65,7 @@ type LibraryPanel struct {
Status *LibraryPanelStatus `json:"status,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type LibraryPanelList struct {
metav1.TypeMeta `json:",inline"`
@@ -104,6 +75,7 @@ type LibraryPanelList struct {
Items []LibraryPanel `json:"items,omitempty"`
}
+// +k8s:deepcopy-gen=true
type LibraryPanelSpec struct {
// The panel type
Type string `json:"type"`
@@ -131,6 +103,7 @@ type LibraryPanelSpec struct {
Targets []data.DataQuery `json:"targets,omitempty"`
}
+// +k8s:deepcopy-gen=true
type LibraryPanelStatus struct {
// Translation warnings (mostly things that were in SQL columns but not found in the saved body)
Warnings []string `json:"warnings,omitempty"`
@@ -140,6 +113,7 @@ type LibraryPanelStatus struct {
}
// This is like the legacy DTO where access and metadata are all returned in a single call
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type DashboardWithAccessInfo struct {
Dashboard `json:",inline"`
@@ -148,6 +122,7 @@ type DashboardWithAccessInfo struct {
}
// Information about how the requesting user can use a given dashboard
+// +k8s:deepcopy-gen=true
type DashboardAccess struct {
// Metadata fields
Slug string `json:"slug,omitempty"`
@@ -162,11 +137,13 @@ type DashboardAccess struct {
AnnotationsPermissions *AnnotationPermission `json:"annotationsPermissions"`
}
+// +k8s:deepcopy-gen=true
type AnnotationPermission struct {
Dashboard AnnotationActions `json:"dashboard"`
Organization AnnotationActions `json:"organization"`
}
+// +k8s:deepcopy-gen=true
type AnnotationActions struct {
CanAdd bool `json:"canAdd"`
CanEdit bool `json:"canEdit"`
diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go
similarity index 99%
rename from pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go
rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go
index d5a3f99ce07..85780124520 100644
--- a/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.conversion.go
@@ -11,7 +11,7 @@ import (
url "net/url"
unsafe "unsafe"
- dashboard "github.com/grafana/grafana/pkg/apis/dashboard"
+ dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard"
conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime"
)
diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go
similarity index 74%
rename from pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go
rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go
index c94be011e07..8e38161cc58 100644
--- a/pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.deepcopy.go
@@ -46,54 +46,6 @@ func (in *AnnotationPermission) DeepCopy() *AnnotationPermission {
return out
}
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ConversionStatus) DeepCopyInto(out *ConversionStatus) {
- *out = *in
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConversionStatus.
-func (in *ConversionStatus) DeepCopy() *ConversionStatus {
- if in == nil {
- return nil
- }
- out := new(ConversionStatus)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Dashboard) DeepCopyInto(out *Dashboard) {
- *out = *in
- out.TypeMeta = in.TypeMeta
- in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
- in.Spec.DeepCopyInto(&out.Spec)
- if in.Status != nil {
- in, out := &in.Status, &out.Status
- *out = new(DashboardStatus)
- (*in).DeepCopyInto(*out)
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Dashboard.
-func (in *Dashboard) DeepCopy() *Dashboard {
- if in == nil {
- return nil
- }
- out := new(Dashboard)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Dashboard) DeepCopyObject() runtime.Object {
- if c := in.DeepCopy(); c != nil {
- return c
- }
- return nil
-}
-
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DashboardAccess) DeepCopyInto(out *DashboardAccess) {
*out = *in
@@ -115,60 +67,6 @@ func (in *DashboardAccess) DeepCopy() *DashboardAccess {
return out
}
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DashboardList) DeepCopyInto(out *DashboardList) {
- *out = *in
- out.TypeMeta = in.TypeMeta
- in.ListMeta.DeepCopyInto(&out.ListMeta)
- if in.Items != nil {
- in, out := &in.Items, &out.Items
- *out = make([]Dashboard, len(*in))
- for i := range *in {
- (*in)[i].DeepCopyInto(&(*out)[i])
- }
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardList.
-func (in *DashboardList) DeepCopy() *DashboardList {
- if in == nil {
- return nil
- }
- out := new(DashboardList)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *DashboardList) DeepCopyObject() runtime.Object {
- if c := in.DeepCopy(); c != nil {
- return c
- }
- return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DashboardStatus) DeepCopyInto(out *DashboardStatus) {
- *out = *in
- if in.ConversionStatus != nil {
- in, out := &in.ConversionStatus, &out.ConversionStatus
- *out = new(ConversionStatus)
- **out = **in
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardStatus.
-func (in *DashboardStatus) DeepCopy() *DashboardStatus {
- if in == nil {
- return nil
- }
- out := new(DashboardStatus)
- in.DeepCopyInto(out)
- return out
-}
-
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DashboardVersionInfo) DeepCopyInto(out *DashboardVersionInfo) {
*out = *in
diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.defaults.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.defaults.go
similarity index 100%
rename from pkg/apis/dashboard/v1alpha1/zz_generated.defaults.go
rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.defaults.go
diff --git a/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go
similarity index 67%
rename from pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go
rename to apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go
index e6f99cd895c..9e3bb475d68 100644
--- a/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi.go
@@ -8,27 +8,31 @@
package v1alpha1
import (
+ v0alpha1 "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
common "k8s.io/kube-openapi/pkg/common"
spec "k8s.io/kube-openapi/pkg/validation/spec"
)
func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition {
return map[string]common.OpenAPIDefinition{
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationActions": schema_pkg_apis_dashboard_v1alpha1_AnnotationActions(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v1alpha1_AnnotationPermission(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.ConversionStatus": schema_pkg_apis_dashboard_v1alpha1_ConversionStatus(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.Dashboard": schema_pkg_apis_dashboard_v1alpha1_Dashboard(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardAccess": schema_pkg_apis_dashboard_v1alpha1_DashboardAccess(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardList": schema_pkg_apis_dashboard_v1alpha1_DashboardList(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus": schema_pkg_apis_dashboard_v1alpha1_DashboardStatus(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v1alpha1_DashboardVersionInfo(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v1alpha1_DashboardVersionList(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v1alpha1_DashboardWithAccessInfo(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanel": schema_pkg_apis_dashboard_v1alpha1_LibraryPanel(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelList(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelSpec(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelStatus(ref),
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v1alpha1_VersionsQueryOptions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationActions": schema_pkg_apis_dashboard_v1alpha1_AnnotationActions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v1alpha1_AnnotationPermission(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.Dashboard": schema_pkg_apis_dashboard_v1alpha1_Dashboard(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardAccess": schema_pkg_apis_dashboard_v1alpha1_DashboardAccess(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v1alpha1_DashboardConversionStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v1alpha1_DashboardJSONCodec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardList": schema_pkg_apis_dashboard_v1alpha1_DashboardList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v1alpha1_DashboardMetadata(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus": schema_pkg_apis_dashboard_v1alpha1_DashboardStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v1alpha1_DashboardVersionInfo(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v1alpha1_DashboardVersionList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v1alpha1_DashboardWithAccessInfo(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanel": schema_pkg_apis_dashboard_v1alpha1_LibraryPanel(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v1alpha1_LibraryPanelStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v1alpha1_VersionsQueryOptions(ref),
+ "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured": v0alpha1.Unstructured{}.OpenAPIDefinition(),
}
}
@@ -75,13 +79,13 @@ func schema_pkg_apis_dashboard_v1alpha1_AnnotationPermission(ref common.Referenc
"dashboard": {
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationActions"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationActions"),
},
},
"organization": {
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationActions"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationActions"),
},
},
},
@@ -89,37 +93,7 @@ func schema_pkg_apis_dashboard_v1alpha1_AnnotationPermission(ref common.Referenc
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationActions"},
- }
-}
-
-func schema_pkg_apis_dashboard_v1alpha1_ConversionStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
- return common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Properties: map[string]spec.Schema{
- "failed": {
- SchemaProps: spec.SchemaProps{
- Type: []string{"boolean"},
- Format: "",
- },
- },
- "storedVersion": {
- SchemaProps: spec.SchemaProps{
- Type: []string{"string"},
- Format: "",
- },
- },
- "error": {
- SchemaProps: spec.SchemaProps{
- Type: []string{"string"},
- Format: "",
- },
- },
- },
- },
- },
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationActions"},
}
}
@@ -145,29 +119,28 @@ func schema_pkg_apis_dashboard_v1alpha1_Dashboard(ref common.ReferenceCallback)
},
"metadata": {
SchemaProps: spec.SchemaProps{
- Description: "Standard object's metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
- Default: map[string]interface{}{},
- Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
},
},
"spec": {
SchemaProps: spec.SchemaProps{
- Description: "The dashboard body (unstructured for now)",
+ Description: "Spec is the spec of the Dashboard",
Ref: ref("github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"),
},
},
"status": {
SchemaProps: spec.SchemaProps{
- Description: "Optional dashboard status",
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus"),
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus"),
},
},
},
- Required: []string{"spec"},
+ Required: []string{"metadata", "spec", "status"},
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
}
}
@@ -229,7 +202,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardAccess(ref common.ReferenceCall
},
"annotationsPermissions": {
SchemaProps: spec.SchemaProps{
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationPermission"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationPermission"),
},
},
},
@@ -237,7 +210,56 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardAccess(ref common.ReferenceCall
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.AnnotationPermission"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.AnnotationPermission"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v1alpha1_DashboardConversionStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "ConversionStatus is the status of the conversion of the dashboard.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "failed": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Whether from another version has failed. If true, means that the dashboard is not valid, and the caller should instead fetch the stored version.",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "storedVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The version which was stored when the dashboard was created / updated. Fetching this version should always succeed.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "error": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The error message from the conversion. Empty if the conversion has not failed.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"failed", "storedVersion", "error"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v1alpha1_DashboardJSONCodec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "DashboardJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding",
+ Type: []string{"object"},
+ },
+ },
}
}
@@ -274,17 +296,114 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardList(ref common.ReferenceCallba
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.Dashboard"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.Dashboard"),
},
},
},
},
},
},
+ Required: []string{"metadata", "items"},
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v1alpha1_DashboardMetadata(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "metadata contains embedded CommonMetadata and can be extended with custom string fields without external reference as using the CommonMetadata reference breaks thema codegen.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "updateTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "createdBy": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "uid": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "creationTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "deletionTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "finalizers": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "resourceVersion": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "generation": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "updatedBy": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "labels": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"updateTimestamp", "createdBy", "uid", "creationTimestamp", "finalizers", "resourceVersion", "generation", "updatedBy", "labels"},
+ },
+ },
}
}
@@ -296,14 +415,15 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardStatus(ref common.ReferenceCall
Properties: map[string]spec.Schema{
"conversion": {
SchemaProps: spec.SchemaProps{
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.ConversionStatus"),
+ Description: "Optional conversion status.",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus"),
},
},
},
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.ConversionStatus"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardConversionStatus"},
}
}
@@ -390,7 +510,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardVersionList(ref common.Referenc
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo"),
},
},
},
@@ -400,7 +520,7 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardVersionList(ref common.Referenc
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
}
}
@@ -427,35 +547,34 @@ func schema_pkg_apis_dashboard_v1alpha1_DashboardWithAccessInfo(ref common.Refer
},
"metadata": {
SchemaProps: spec.SchemaProps{
- Description: "Standard object's metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
- Default: map[string]interface{}{},
- Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
},
},
"spec": {
SchemaProps: spec.SchemaProps{
- Description: "The dashboard body (unstructured for now)",
+ Description: "Spec is the spec of the Dashboard",
Ref: ref("github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"),
},
},
"status": {
SchemaProps: spec.SchemaProps{
- Description: "Optional dashboard status",
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus"),
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus"),
},
},
"access": {
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardAccess"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardAccess"),
},
},
},
- Required: []string{"spec", "access"},
+ Required: []string{"metadata", "spec", "status", "access"},
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardAccess", "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardAccess", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.DashboardStatus", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
}
}
@@ -490,13 +609,13 @@ func schema_pkg_apis_dashboard_v1alpha1_LibraryPanel(ref common.ReferenceCallbac
SchemaProps: spec.SchemaProps{
Description: "Panel properties",
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec"),
},
},
"status": {
SchemaProps: spec.SchemaProps{
Description: "Status will show errors",
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus"),
},
},
},
@@ -504,7 +623,7 @@ func schema_pkg_apis_dashboard_v1alpha1_LibraryPanel(ref common.ReferenceCallbac
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec", "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
}
}
@@ -541,7 +660,7 @@ func schema_pkg_apis_dashboard_v1alpha1_LibraryPanelList(ref common.ReferenceCal
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanel"),
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanel"),
},
},
},
@@ -551,7 +670,7 @@ func schema_pkg_apis_dashboard_v1alpha1_LibraryPanelList(ref common.ReferenceCal
},
},
Dependencies: []string{
- "github.com/grafana/grafana/pkg/apis/dashboard/v1alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
}
}
diff --git a/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list
new file mode 100644
index 00000000000..9a9b51f93c7
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v1alpha1/zz_generated.openapi_violation_exceptions.list
@@ -0,0 +1,3 @@
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1,DashboardMetadata,Finalizers
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1,LibraryPanelStatus,Warnings
+API rule violation: names_match,github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1,Unstructured,Object
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go
new file mode 100644
index 00000000000..84b030c8994
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go
@@ -0,0 +1,18 @@
+package v2alpha1
+
+import "k8s.io/apimachinery/pkg/runtime/schema"
+
+const (
+ // Group is the API group used by all kinds in this package
+ Group = "dashboard.grafana.app"
+ // Version is the API version used by all kinds in this package
+ Version = "v2alpha1"
+)
+
+var (
+ // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package
+ GroupVersion = schema.GroupVersion{
+ Group: Group,
+ Version: Version,
+ }
+)
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_codec_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_codec_gen.go
new file mode 100644
index 00000000000..a1892865692
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_codec_gen.go
@@ -0,0 +1,28 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v2alpha1
+
+import (
+ "encoding/json"
+ "io"
+
+ "github.com/grafana/grafana-app-sdk/resource"
+)
+
+// DashboardJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding
+type DashboardJSONCodec struct{}
+
+// Read reads JSON-encoded bytes from `reader` and unmarshals them into `into`
+func (*DashboardJSONCodec) Read(reader io.Reader, into resource.Object) error {
+ return json.NewDecoder(reader).Decode(into)
+}
+
+// Write writes JSON-encoded bytes into `writer` marshaled from `from`
+func (*DashboardJSONCodec) Write(writer io.Writer, from resource.Object) error {
+ return json.NewEncoder(writer).Encode(from)
+}
+
+// Interface compliance checks
+var _ resource.Codec = &DashboardJSONCodec{}
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go
new file mode 100644
index 00000000000..f4e92178780
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go
@@ -0,0 +1,28 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v2alpha1
+
+import (
+ time "time"
+)
+
+// metadata contains embedded CommonMetadata and can be extended with custom string fields
+// TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
+// without external reference as using the CommonMetadata reference breaks thema codegen.
+type DashboardMetadata struct {
+ UpdateTimestamp time.Time `json:"updateTimestamp"`
+ CreatedBy string `json:"createdBy"`
+ Uid string `json:"uid"`
+ CreationTimestamp time.Time `json:"creationTimestamp"`
+ DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"`
+ Finalizers []string `json:"finalizers"`
+ ResourceVersion string `json:"resourceVersion"`
+ Generation int64 `json:"generation"`
+ UpdatedBy string `json:"updatedBy"`
+ Labels map[string]string `json:"labels"`
+}
+
+// NewDashboardMetadata creates a new DashboardMetadata object.
+func NewDashboardMetadata() *DashboardMetadata {
+ return &DashboardMetadata{}
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go
new file mode 100644
index 00000000000..504dc5a25f1
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_object_gen.go
@@ -0,0 +1,269 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v2alpha1
+
+import (
+ "fmt"
+ "github.com/grafana/grafana-app-sdk/resource"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/apimachinery/pkg/types"
+ "time"
+)
+
+// +k8s:openapi-gen=true
+type Dashboard struct {
+ metav1.TypeMeta `json:",inline" yaml:",inline"`
+ metav1.ObjectMeta `json:"metadata" yaml:"metadata"`
+
+ // Spec is the spec of the Dashboard
+ Spec DashboardSpec `json:"spec" yaml:"spec"`
+
+ Status DashboardStatus `json:"status" yaml:"status"`
+}
+
+func (o *Dashboard) GetSpec() any {
+ return o.Spec
+}
+
+func (o *Dashboard) SetSpec(spec any) error {
+ cast, ok := spec.(DashboardSpec)
+ if !ok {
+ return fmt.Errorf("cannot set spec type %#v, not of type Spec", spec)
+ }
+ o.Spec = cast
+ return nil
+}
+
+func (o *Dashboard) GetSubresources() map[string]any {
+ return map[string]any{
+ "status": o.Status,
+ }
+}
+
+func (o *Dashboard) GetSubresource(name string) (any, bool) {
+ switch name {
+ case "status":
+ return o.Status, true
+ default:
+ return nil, false
+ }
+}
+
+func (o *Dashboard) SetSubresource(name string, value any) error {
+ switch name {
+ case "status":
+ cast, ok := value.(DashboardStatus)
+ if !ok {
+ return fmt.Errorf("cannot set status type %#v, not of type DashboardStatus", value)
+ }
+ o.Status = cast
+ return nil
+ default:
+ return fmt.Errorf("subresource '%s' does not exist", name)
+ }
+}
+
+func (o *Dashboard) GetStaticMetadata() resource.StaticMetadata {
+ gvk := o.GroupVersionKind()
+ return resource.StaticMetadata{
+ Name: o.ObjectMeta.Name,
+ Namespace: o.ObjectMeta.Namespace,
+ Group: gvk.Group,
+ Version: gvk.Version,
+ Kind: gvk.Kind,
+ }
+}
+
+func (o *Dashboard) SetStaticMetadata(metadata resource.StaticMetadata) {
+ o.Name = metadata.Name
+ o.Namespace = metadata.Namespace
+ o.SetGroupVersionKind(schema.GroupVersionKind{
+ Group: metadata.Group,
+ Version: metadata.Version,
+ Kind: metadata.Kind,
+ })
+}
+
+func (o *Dashboard) GetCommonMetadata() resource.CommonMetadata {
+ dt := o.DeletionTimestamp
+ var deletionTimestamp *time.Time
+ if dt != nil {
+ deletionTimestamp = &dt.Time
+ }
+ // Legacy ExtraFields support
+ extraFields := make(map[string]any)
+ if o.Annotations != nil {
+ extraFields["annotations"] = o.Annotations
+ }
+ if o.ManagedFields != nil {
+ extraFields["managedFields"] = o.ManagedFields
+ }
+ if o.OwnerReferences != nil {
+ extraFields["ownerReferences"] = o.OwnerReferences
+ }
+ return resource.CommonMetadata{
+ UID: string(o.UID),
+ ResourceVersion: o.ResourceVersion,
+ Generation: o.Generation,
+ Labels: o.Labels,
+ CreationTimestamp: o.CreationTimestamp.Time,
+ DeletionTimestamp: deletionTimestamp,
+ Finalizers: o.Finalizers,
+ UpdateTimestamp: o.GetUpdateTimestamp(),
+ CreatedBy: o.GetCreatedBy(),
+ UpdatedBy: o.GetUpdatedBy(),
+ ExtraFields: extraFields,
+ }
+}
+
+func (o *Dashboard) SetCommonMetadata(metadata resource.CommonMetadata) {
+ o.UID = types.UID(metadata.UID)
+ o.ResourceVersion = metadata.ResourceVersion
+ o.Generation = metadata.Generation
+ o.Labels = metadata.Labels
+ o.CreationTimestamp = metav1.NewTime(metadata.CreationTimestamp)
+ if metadata.DeletionTimestamp != nil {
+ dt := metav1.NewTime(*metadata.DeletionTimestamp)
+ o.DeletionTimestamp = &dt
+ } else {
+ o.DeletionTimestamp = nil
+ }
+ o.Finalizers = metadata.Finalizers
+ if o.Annotations == nil {
+ o.Annotations = make(map[string]string)
+ }
+ if !metadata.UpdateTimestamp.IsZero() {
+ o.SetUpdateTimestamp(metadata.UpdateTimestamp)
+ }
+ if metadata.CreatedBy != "" {
+ o.SetCreatedBy(metadata.CreatedBy)
+ }
+ if metadata.UpdatedBy != "" {
+ o.SetUpdatedBy(metadata.UpdatedBy)
+ }
+ // Legacy support for setting Annotations, ManagedFields, and OwnerReferences via ExtraFields
+ if metadata.ExtraFields != nil {
+ if annotations, ok := metadata.ExtraFields["annotations"]; ok {
+ if cast, ok := annotations.(map[string]string); ok {
+ o.Annotations = cast
+ }
+ }
+ if managedFields, ok := metadata.ExtraFields["managedFields"]; ok {
+ if cast, ok := managedFields.([]metav1.ManagedFieldsEntry); ok {
+ o.ManagedFields = cast
+ }
+ }
+ if ownerReferences, ok := metadata.ExtraFields["ownerReferences"]; ok {
+ if cast, ok := ownerReferences.([]metav1.OwnerReference); ok {
+ o.OwnerReferences = cast
+ }
+ }
+ }
+}
+
+func (o *Dashboard) GetCreatedBy() string {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ return o.ObjectMeta.Annotations["grafana.com/createdBy"]
+}
+
+func (o *Dashboard) SetCreatedBy(createdBy string) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/createdBy"] = createdBy
+}
+
+func (o *Dashboard) GetUpdateTimestamp() time.Time {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ parsed, _ := time.Parse(time.RFC3339, o.ObjectMeta.Annotations["grafana.com/updateTimestamp"])
+ return parsed
+}
+
+func (o *Dashboard) SetUpdateTimestamp(updateTimestamp time.Time) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/updateTimestamp"] = updateTimestamp.Format(time.RFC3339)
+}
+
+func (o *Dashboard) GetUpdatedBy() string {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ return o.ObjectMeta.Annotations["grafana.com/updatedBy"]
+}
+
+func (o *Dashboard) SetUpdatedBy(updatedBy string) {
+ if o.ObjectMeta.Annotations == nil {
+ o.ObjectMeta.Annotations = make(map[string]string)
+ }
+
+ o.ObjectMeta.Annotations["grafana.com/updatedBy"] = updatedBy
+}
+
+func (o *Dashboard) Copy() resource.Object {
+ return resource.CopyObject(o)
+}
+
+func (o *Dashboard) DeepCopyObject() runtime.Object {
+ return o.Copy()
+}
+
+// Interface compliance compile-time check
+var _ resource.Object = &Dashboard{}
+
+// +k8s:openapi-gen=true
+type DashboardList struct {
+ metav1.TypeMeta `json:",inline" yaml:",inline"`
+ metav1.ListMeta `json:"metadata" yaml:"metadata"`
+ Items []Dashboard `json:"items" yaml:"items"`
+}
+
+func (o *DashboardList) DeepCopyObject() runtime.Object {
+ return o.Copy()
+}
+
+func (o *DashboardList) Copy() resource.ListObject {
+ cpy := &DashboardList{
+ TypeMeta: o.TypeMeta,
+ Items: make([]Dashboard, len(o.Items)),
+ }
+ o.ListMeta.DeepCopyInto(&cpy.ListMeta)
+ for i := 0; i < len(o.Items); i++ {
+ if item, ok := o.Items[i].Copy().(*Dashboard); ok {
+ cpy.Items[i] = *item
+ }
+ }
+ return cpy
+}
+
+func (o *DashboardList) GetItems() []resource.Object {
+ items := make([]resource.Object, len(o.Items))
+ for i := 0; i < len(o.Items); i++ {
+ items[i] = &o.Items[i]
+ }
+ return items
+}
+
+func (o *DashboardList) SetItems(items []resource.Object) {
+ o.Items = make([]Dashboard, len(items))
+ for i := 0; i < len(items); i++ {
+ o.Items[i] = *items[i].(*Dashboard)
+ }
+}
+
+// Interface compliance compile-time check
+var _ resource.ListObject = &DashboardList{}
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_schema_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_schema_gen.go
new file mode 100644
index 00000000000..136698cf70f
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_schema_gen.go
@@ -0,0 +1,34 @@
+//
+// Code generated by grafana-app-sdk. DO NOT EDIT.
+//
+
+package v2alpha1
+
+import (
+ "github.com/grafana/grafana-app-sdk/resource"
+)
+
+// schema is unexported to prevent accidental overwrites
+var (
+ schemaDashboard = resource.NewSimpleSchema("dashboard.grafana.app", "v2alpha1", &Dashboard{}, &DashboardList{}, resource.WithKind("Dashboard"),
+ resource.WithPlural("dashboards"), resource.WithScope(resource.NamespacedScope))
+ kindDashboard = resource.Kind{
+ Schema: schemaDashboard,
+ Codecs: map[resource.KindEncoding]resource.Codec{
+ resource.KindEncodingJSON: &DashboardJSONCodec{},
+ },
+ }
+)
+
+// Kind returns a resource.Kind for this Schema with a JSON codec
+func DashboardKind() resource.Kind {
+ return kindDashboard
+}
+
+// Schema returns a resource.SimpleSchema representation of Dashboard
+func DashboardSchema() *resource.SimpleSchema {
+ return schemaDashboard
+}
+
+// Interface compliance checks
+var _ resource.Schema = kindDashboard
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go
new file mode 100644
index 00000000000..9f13ee1f69b
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go
@@ -0,0 +1,2564 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v2alpha1
+
+import (
+ json "encoding/json"
+ errors "errors"
+ fmt "fmt"
+)
+
+// +k8s:openapi-gen=true
+type DashboardAnnotationQueryKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardAnnotationQuerySpec `json:"spec"`
+}
+
+// NewDashboardAnnotationQueryKind creates a new DashboardAnnotationQueryKind object.
+func NewDashboardAnnotationQueryKind() *DashboardAnnotationQueryKind {
+ return &DashboardAnnotationQueryKind{
+ Kind: "AnnotationQuery",
+ Spec: *NewDashboardAnnotationQuerySpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardAnnotationQuerySpec struct {
+ Datasource *DashboardDataSourceRef `json:"datasource,omitempty"`
+ Query *DashboardDataQueryKind `json:"query,omitempty"`
+ Enable bool `json:"enable"`
+ Hide bool `json:"hide"`
+ IconColor string `json:"iconColor"`
+ Name string `json:"name"`
+ BuiltIn *bool `json:"builtIn,omitempty"`
+ Filter *DashboardAnnotationPanelFilter `json:"filter,omitempty"`
+}
+
+// NewDashboardAnnotationQuerySpec creates a new DashboardAnnotationQuerySpec object.
+func NewDashboardAnnotationQuerySpec() *DashboardAnnotationQuerySpec {
+ return &DashboardAnnotationQuerySpec{
+ BuiltIn: (func(input bool) *bool { return &input })(false),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardDataSourceRef struct {
+ // The plugin type-id
+ Type *string `json:"type,omitempty"`
+ // Specific datasource instance
+ Uid *string `json:"uid,omitempty"`
+}
+
+// NewDashboardDataSourceRef creates a new DashboardDataSourceRef object.
+func NewDashboardDataSourceRef() *DashboardDataSourceRef {
+ return &DashboardDataSourceRef{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardDataQueryKind struct {
+ // The kind of a DataQueryKind is the datasource type
+ Kind string `json:"kind"`
+ Spec map[string]interface{} `json:"spec"`
+}
+
+// NewDashboardDataQueryKind creates a new DashboardDataQueryKind object.
+func NewDashboardDataQueryKind() *DashboardDataQueryKind {
+ return &DashboardDataQueryKind{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardAnnotationPanelFilter struct {
+ // Should the specified panels be included or excluded
+ Exclude *bool `json:"exclude,omitempty"`
+ // Panel IDs that should be included or excluded
+ Ids []uint8 `json:"ids"`
+}
+
+// NewDashboardAnnotationPanelFilter creates a new DashboardAnnotationPanelFilter object.
+func NewDashboardAnnotationPanelFilter() *DashboardAnnotationPanelFilter {
+ return &DashboardAnnotationPanelFilter{
+ Exclude: (func(input bool) *bool { return &input })(false),
+ }
+}
+
+// "Off" for no shared crosshair or tooltip (default).
+// "Crosshair" for shared crosshair.
+// "Tooltip" for shared crosshair AND shared tooltip.
+// +k8s:openapi-gen=true
+type DashboardDashboardCursorSync string
+
+const (
+ DashboardDashboardCursorSyncOff DashboardDashboardCursorSync = "Off"
+ DashboardDashboardCursorSyncCrosshair DashboardDashboardCursorSync = "Crosshair"
+ DashboardDashboardCursorSyncTooltip DashboardDashboardCursorSync = "Tooltip"
+)
+
+// Supported dashboard elements
+// |* more element types in the future
+// +k8s:openapi-gen=true
+type DashboardElement = DashboardPanelKindOrLibraryPanelKind
+
+// NewDashboardElement creates a new DashboardElement object.
+func NewDashboardElement() *DashboardElement {
+ return NewDashboardPanelKindOrLibraryPanelKind()
+}
+
+// +k8s:openapi-gen=true
+type DashboardPanelKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardPanelSpec `json:"spec"`
+}
+
+// NewDashboardPanelKind creates a new DashboardPanelKind object.
+func NewDashboardPanelKind() *DashboardPanelKind {
+ return &DashboardPanelKind{
+ Kind: "Panel",
+ Spec: *NewDashboardPanelSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardPanelSpec struct {
+ Id float64 `json:"id"`
+ Title string `json:"title"`
+ Description string `json:"description"`
+ Links []DashboardDataLink `json:"links"`
+ Data DashboardQueryGroupKind `json:"data"`
+ VizConfig DashboardVizConfigKind `json:"vizConfig"`
+ Transparent *bool `json:"transparent,omitempty"`
+}
+
+// NewDashboardPanelSpec creates a new DashboardPanelSpec object.
+func NewDashboardPanelSpec() *DashboardPanelSpec {
+ return &DashboardPanelSpec{
+ Data: *NewDashboardQueryGroupKind(),
+ VizConfig: *NewDashboardVizConfigKind(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardDataLink struct {
+ Title string `json:"title"`
+ Url string `json:"url"`
+ TargetBlank *bool `json:"targetBlank,omitempty"`
+}
+
+// NewDashboardDataLink creates a new DashboardDataLink object.
+func NewDashboardDataLink() *DashboardDataLink {
+ return &DashboardDataLink{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardQueryGroupKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardQueryGroupSpec `json:"spec"`
+}
+
+// NewDashboardQueryGroupKind creates a new DashboardQueryGroupKind object.
+func NewDashboardQueryGroupKind() *DashboardQueryGroupKind {
+ return &DashboardQueryGroupKind{
+ Kind: "QueryGroup",
+ Spec: *NewDashboardQueryGroupSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardQueryGroupSpec struct {
+ Queries []DashboardPanelQueryKind `json:"queries"`
+ Transformations []DashboardTransformationKind `json:"transformations"`
+ QueryOptions DashboardQueryOptionsSpec `json:"queryOptions"`
+}
+
+// NewDashboardQueryGroupSpec creates a new DashboardQueryGroupSpec object.
+func NewDashboardQueryGroupSpec() *DashboardQueryGroupSpec {
+ return &DashboardQueryGroupSpec{
+ QueryOptions: *NewDashboardQueryOptionsSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardPanelQueryKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardPanelQuerySpec `json:"spec"`
+}
+
+// NewDashboardPanelQueryKind creates a new DashboardPanelQueryKind object.
+func NewDashboardPanelQueryKind() *DashboardPanelQueryKind {
+ return &DashboardPanelQueryKind{
+ Kind: "PanelQuery",
+ Spec: *NewDashboardPanelQuerySpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardPanelQuerySpec struct {
+ Query DashboardDataQueryKind `json:"query"`
+ Datasource *DashboardDataSourceRef `json:"datasource,omitempty"`
+ RefId string `json:"refId"`
+ Hidden bool `json:"hidden"`
+}
+
+// NewDashboardPanelQuerySpec creates a new DashboardPanelQuerySpec object.
+func NewDashboardPanelQuerySpec() *DashboardPanelQuerySpec {
+ return &DashboardPanelQuerySpec{
+ Query: *NewDashboardDataQueryKind(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardTransformationKind struct {
+ // The kind of a TransformationKind is the transformation ID
+ Kind string `json:"kind"`
+ Spec DashboardDataTransformerConfig `json:"spec"`
+}
+
+// NewDashboardTransformationKind creates a new DashboardTransformationKind object.
+func NewDashboardTransformationKind() *DashboardTransformationKind {
+ return &DashboardTransformationKind{
+ Spec: *NewDashboardDataTransformerConfig(),
+ }
+}
+
+// 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.
+// +k8s:openapi-gen=true
+type DashboardDataTransformerConfig struct {
+ // Unique identifier of transformer
+ Id string `json:"id"`
+ // Disabled transformations are skipped
+ Disabled *bool `json:"disabled,omitempty"`
+ // Optional frame matcher. When missing it will be applied to all results
+ Filter *DashboardMatcherConfig `json:"filter,omitempty"`
+ // Where to pull DataFrames from as input to transformation
+ Topic *DashboardDataTopic `json:"topic,omitempty"`
+ // Options to be passed to the transformer
+ // Valid options depend on the transformer id
+ Options interface{} `json:"options"`
+}
+
+// NewDashboardDataTransformerConfig creates a new DashboardDataTransformerConfig object.
+func NewDashboardDataTransformerConfig() *DashboardDataTransformerConfig {
+ return &DashboardDataTransformerConfig{}
+}
+
+// Matcher is a predicate configuration. Based on the config a set of field(s) or values is filtered in order to apply override / transformation.
+// It comes with in id ( to resolve implementation from registry) and a configuration that’s specific to a particular matcher type.
+// +k8s:openapi-gen=true
+type DashboardMatcherConfig struct {
+ // The matcher id. This is used to find the matcher implementation from registry.
+ Id string `json:"id"`
+ // The matcher options. This is specific to the matcher implementation.
+ Options interface{} `json:"options,omitempty"`
+}
+
+// NewDashboardMatcherConfig creates a new DashboardMatcherConfig object.
+func NewDashboardMatcherConfig() *DashboardMatcherConfig {
+ return &DashboardMatcherConfig{
+ Id: "",
+ }
+}
+
+// A topic is attached to DataFrame metadata in query results.
+// This specifies where the data should be used.
+// +k8s:openapi-gen=true
+type DashboardDataTopic string
+
+const (
+ DashboardDataTopicSeries DashboardDataTopic = "series"
+ DashboardDataTopicAnnotations DashboardDataTopic = "annotations"
+ DashboardDataTopicAlertStates DashboardDataTopic = "alertStates"
+)
+
+// +k8s:openapi-gen=true
+type DashboardQueryOptionsSpec struct {
+ TimeFrom *string `json:"timeFrom,omitempty"`
+ MaxDataPoints *int64 `json:"maxDataPoints,omitempty"`
+ TimeShift *string `json:"timeShift,omitempty"`
+ QueryCachingTTL *int64 `json:"queryCachingTTL,omitempty"`
+ Interval *string `json:"interval,omitempty"`
+ CacheTimeout *string `json:"cacheTimeout,omitempty"`
+ HideTimeOverride *bool `json:"hideTimeOverride,omitempty"`
+}
+
+// NewDashboardQueryOptionsSpec creates a new DashboardQueryOptionsSpec object.
+func NewDashboardQueryOptionsSpec() *DashboardQueryOptionsSpec {
+ return &DashboardQueryOptionsSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardVizConfigKind struct {
+ // The kind of a VizConfigKind is the plugin ID
+ Kind string `json:"kind"`
+ Spec DashboardVizConfigSpec `json:"spec"`
+}
+
+// NewDashboardVizConfigKind creates a new DashboardVizConfigKind object.
+func NewDashboardVizConfigKind() *DashboardVizConfigKind {
+ return &DashboardVizConfigKind{
+ Spec: *NewDashboardVizConfigSpec(),
+ }
+}
+
+// --- Kinds ---
+// +k8s:openapi-gen=true
+type DashboardVizConfigSpec struct {
+ PluginVersion string `json:"pluginVersion"`
+ Options map[string]interface{} `json:"options"`
+ FieldConfig DashboardFieldConfigSource `json:"fieldConfig"`
+}
+
+// NewDashboardVizConfigSpec creates a new DashboardVizConfigSpec object.
+func NewDashboardVizConfigSpec() *DashboardVizConfigSpec {
+ return &DashboardVizConfigSpec{
+ FieldConfig: *NewDashboardFieldConfigSource(),
+ }
+}
+
+// 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.
+// +k8s:openapi-gen=true
+type DashboardFieldConfigSource struct {
+ // Defaults are the options applied to all fields.
+ Defaults DashboardFieldConfig `json:"defaults"`
+ // Overrides are the options applied to specific fields overriding the defaults.
+ Overrides []DashboardV2alpha1FieldConfigSourceOverrides `json:"overrides"`
+}
+
+// NewDashboardFieldConfigSource creates a new DashboardFieldConfigSource object.
+func NewDashboardFieldConfigSource() *DashboardFieldConfigSource {
+ return &DashboardFieldConfigSource{
+ Defaults: *NewDashboardFieldConfig(),
+ }
+}
+
+// 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.
+// +k8s:openapi-gen=true
+type DashboardFieldConfig struct {
+ // The display value for this field. This supports template variables blank is auto
+ DisplayName *string `json:"displayName,omitempty"`
+ // 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 `json:"displayNameFromDS,omitempty"`
+ // Human readable field metadata
+ Description *string `json:"description,omitempty"`
+ // An explicit 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 `json:"path,omitempty"`
+ // True if data source can write a value to the path. Auth/authz are supported separately
+ Writeable *bool `json:"writeable,omitempty"`
+ // True if data source field supports ad-hoc filters
+ Filterable *bool `json:"filterable,omitempty"`
+ // Unit a field should use. The unit you select is applied to all fields except time.
+ // You can use the units ID availables in Grafana or a custom unit.
+ // Available units in Grafana: https://github.com/grafana/grafana/blob/main/packages/grafana-data/src/valueFormats/categories.ts
+ // As custom unit, you can use the following formats:
+ // `suffix:` for custom unit that should go after value.
+ // `prefix:` for custom unit that should go before value.
+ // `time:` For custom date time formats type for example `time:YYYY-MM-DD`.
+ // `si:` for custom SI units. For example: `si: mF`. This one is a bit more advanced as you can specify both a unit and the source data scale. So if your source data is represented as milli (thousands of) something prefix the unit with that SI scale character.
+ // `count:` for a custom count unit.
+ // `currency:` for custom a currency unit.
+ Unit *string `json:"unit,omitempty"`
+ // 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 *float64 `json:"decimals,omitempty"`
+ // The minimum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields.
+ Min *float64 `json:"min,omitempty"`
+ // The maximum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields.
+ Max *float64 `json:"max,omitempty"`
+ // Convert input values into a display string
+ Mappings []DashboardValueMapping `json:"mappings,omitempty"`
+ // Map numeric values to states
+ Thresholds *DashboardThresholdsConfig `json:"thresholds,omitempty"`
+ // Panel color configuration
+ Color *DashboardFieldColor `json:"color,omitempty"`
+ // The behavior when clicking on a result
+ Links []interface{} `json:"links,omitempty"`
+ // Alternative to empty string
+ NoValue *string `json:"noValue,omitempty"`
+ // custom is specified by the FieldConfig field
+ // in panel plugin schemas.
+ Custom map[string]interface{} `json:"custom,omitempty"`
+}
+
+// NewDashboardFieldConfig creates a new DashboardFieldConfig object.
+func NewDashboardFieldConfig() *DashboardFieldConfig {
+ return &DashboardFieldConfig{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardValueMapping = DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap
+
+// NewDashboardValueMapping creates a new DashboardValueMapping object.
+func NewDashboardValueMapping() *DashboardValueMapping {
+ return NewDashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap()
+}
+
+// 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.
+// +k8s:openapi-gen=true
+type DashboardValueMap struct {
+ // TODO (@radiohead): Something broke in cog / app SDK codegen
+ // And this is no longer producing valid TS / Go output
+ // type: MappingType & "value"
+ Type string `json:"type"`
+ // Map with : ValueMappingResult. For example: { "10": { text: "Perfection!", color: "green" } }
+ Options map[string]DashboardValueMappingResult `json:"options"`
+}
+
+// NewDashboardValueMap creates a new DashboardValueMap object.
+func NewDashboardValueMap() *DashboardValueMap {
+ return &DashboardValueMap{
+ Type: "value",
+ }
+}
+
+// Result used as replacement with text and color when the value matches
+// +k8s:openapi-gen=true
+type DashboardValueMappingResult struct {
+ // Text to display when the value matches
+ Text *string `json:"text,omitempty"`
+ // Text to use when the value matches
+ Color *string `json:"color,omitempty"`
+ // Icon to display when the value matches. Only specific visualizations.
+ Icon *string `json:"icon,omitempty"`
+ // Position in the mapping array. Only used internally.
+ Index *int32 `json:"index,omitempty"`
+}
+
+// NewDashboardValueMappingResult creates a new DashboardValueMappingResult object.
+func NewDashboardValueMappingResult() *DashboardValueMappingResult {
+ return &DashboardValueMappingResult{}
+}
+
+// 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.
+// +k8s:openapi-gen=true
+type DashboardRangeMap struct {
+ // TODO (@radiohead): Something broke in cog / app SDK codegen
+ // And this is no longer producing valid TS / Go output
+ // type: MappingType & "range"
+ Type string `json:"type"`
+ // Range to match against and the result to apply when the value is within the range
+ Options DashboardV2alpha1RangeMapOptions `json:"options"`
+}
+
+// NewDashboardRangeMap creates a new DashboardRangeMap object.
+func NewDashboardRangeMap() *DashboardRangeMap {
+ return &DashboardRangeMap{
+ Type: "range",
+ Options: *NewDashboardV2alpha1RangeMapOptions(),
+ }
+}
+
+// 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.
+// +k8s:openapi-gen=true
+type DashboardRegexMap struct {
+ // TODO (@radiohead): Something broke in cog / app SDK codegen
+ // And this is no longer producing valid TS / Go output
+ // type: MappingType & "regex"
+ Type string `json:"type"`
+ // Regular expression to match against and the result to apply when the value matches the regex
+ Options DashboardV2alpha1RegexMapOptions `json:"options"`
+}
+
+// NewDashboardRegexMap creates a new DashboardRegexMap object.
+func NewDashboardRegexMap() *DashboardRegexMap {
+ return &DashboardRegexMap{
+ Type: "regex",
+ Options: *NewDashboardV2alpha1RegexMapOptions(),
+ }
+}
+
+// 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.
+// +k8s:openapi-gen=true
+type DashboardSpecialValueMap struct {
+ // TODO (@radiohead): Something broke in cog / app SDK codegen
+ // And this is no longer producing valid TS / Go output
+ // type: MappingType & "special"
+ Type string `json:"type"`
+ Options DashboardV2alpha1SpecialValueMapOptions `json:"options"`
+}
+
+// NewDashboardSpecialValueMap creates a new DashboardSpecialValueMap object.
+func NewDashboardSpecialValueMap() *DashboardSpecialValueMap {
+ return &DashboardSpecialValueMap{
+ Type: "special",
+ Options: *NewDashboardV2alpha1SpecialValueMapOptions(),
+ }
+}
+
+// Special value types supported by the `SpecialValueMap`
+// +k8s:openapi-gen=true
+type DashboardSpecialValueMatch string
+
+const (
+ DashboardSpecialValueMatchTrue DashboardSpecialValueMatch = "true"
+ DashboardSpecialValueMatchFalse DashboardSpecialValueMatch = "false"
+ DashboardSpecialValueMatchNull DashboardSpecialValueMatch = "null"
+ DashboardSpecialValueMatchNaN DashboardSpecialValueMatch = "nan"
+ DashboardSpecialValueMatchNullAndNaN DashboardSpecialValueMatch = "null+nan"
+ DashboardSpecialValueMatchEmpty DashboardSpecialValueMatch = "empty"
+)
+
+// +k8s:openapi-gen=true
+type DashboardThresholdsConfig struct {
+ Mode DashboardThresholdsMode `json:"mode"`
+ Steps []DashboardThreshold `json:"steps"`
+}
+
+// NewDashboardThresholdsConfig creates a new DashboardThresholdsConfig object.
+func NewDashboardThresholdsConfig() *DashboardThresholdsConfig {
+ return &DashboardThresholdsConfig{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardThresholdsMode string
+
+const (
+ DashboardThresholdsModeAbsolute DashboardThresholdsMode = "absolute"
+ DashboardThresholdsModePercentage DashboardThresholdsMode = "percentage"
+)
+
+// +k8s:openapi-gen=true
+type DashboardThreshold struct {
+ Value float64 `json:"value"`
+ Color string `json:"color"`
+}
+
+// NewDashboardThreshold creates a new DashboardThreshold object.
+func NewDashboardThreshold() *DashboardThreshold {
+ return &DashboardThreshold{}
+}
+
+// Map a field to a color.
+// +k8s:openapi-gen=true
+type DashboardFieldColor struct {
+ // The main color scheme mode.
+ Mode DashboardFieldColorModeId `json:"mode"`
+ // The fixed color value for fixed or shades color modes.
+ FixedColor *string `json:"fixedColor,omitempty"`
+ // Some visualizations need to know how to assign a series color from by value color schemes.
+ SeriesBy *DashboardFieldColorSeriesByMode `json:"seriesBy,omitempty"`
+}
+
+// NewDashboardFieldColor creates a new DashboardFieldColor object.
+func NewDashboardFieldColor() *DashboardFieldColor {
+ return &DashboardFieldColor{}
+}
+
+// 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
+// `palette-classic`: Classic palette. Grafana will assign color by looking up a color in a palette by series index. Useful for Graphs and pie charts and other categorical data visualizations
+// `palette-classic-by-name`: Classic palette (by name). Grafana will assign color by looking up a color in a palette by series name. Useful for Graphs and pie charts and other categorical data visualizations
+// `continuous-GrYlRd`: ontinuous Green-Yellow-Red palette mode
+// `continuous-RdYlGr`: Continuous Red-Yellow-Green palette mode
+// `continuous-BlYlRd`: Continuous Blue-Yellow-Red palette mode
+// `continuous-YlRd`: Continuous Yellow-Red palette mode
+// `continuous-BlPu`: Continuous Blue-Purple palette mode
+// `continuous-YlBl`: Continuous Yellow-Blue palette mode
+// `continuous-blues`: Continuous Blue palette mode
+// `continuous-reds`: Continuous Red palette mode
+// `continuous-greens`: Continuous Green palette mode
+// `continuous-purples`: Continuous Purple palette mode
+// `shades`: Shades of a single color. Specify a single color, useful in an override rule.
+// `fixed`: Fixed color mode. Specify a single color, useful in an override rule.
+// +k8s:openapi-gen=true
+type DashboardFieldColorModeId string
+
+const (
+ DashboardFieldColorModeIdThresholds DashboardFieldColorModeId = "thresholds"
+ DashboardFieldColorModeIdPaletteClassic DashboardFieldColorModeId = "palette-classic"
+ DashboardFieldColorModeIdPaletteClassicByName DashboardFieldColorModeId = "palette-classic-by-name"
+ DashboardFieldColorModeIdContinuousGrYlRd DashboardFieldColorModeId = "continuous-GrYlRd"
+ DashboardFieldColorModeIdContinuousRdYlGr DashboardFieldColorModeId = "continuous-RdYlGr"
+ DashboardFieldColorModeIdContinuousBlYlRd DashboardFieldColorModeId = "continuous-BlYlRd"
+ DashboardFieldColorModeIdContinuousYlRd DashboardFieldColorModeId = "continuous-YlRd"
+ DashboardFieldColorModeIdContinuousBlPu DashboardFieldColorModeId = "continuous-BlPu"
+ DashboardFieldColorModeIdContinuousYlBl DashboardFieldColorModeId = "continuous-YlBl"
+ DashboardFieldColorModeIdContinuousBlues DashboardFieldColorModeId = "continuous-blues"
+ DashboardFieldColorModeIdContinuousReds DashboardFieldColorModeId = "continuous-reds"
+ DashboardFieldColorModeIdContinuousGreens DashboardFieldColorModeId = "continuous-greens"
+ DashboardFieldColorModeIdContinuousPurples DashboardFieldColorModeId = "continuous-purples"
+ DashboardFieldColorModeIdFixed DashboardFieldColorModeId = "fixed"
+ DashboardFieldColorModeIdShades DashboardFieldColorModeId = "shades"
+)
+
+// Defines how to assign a series color from "by value" color schemes. For example for an aggregated data points like a timeseries, the color can be assigned by the min, max or last value.
+// +k8s:openapi-gen=true
+type DashboardFieldColorSeriesByMode string
+
+const (
+ DashboardFieldColorSeriesByModeMin DashboardFieldColorSeriesByMode = "min"
+ DashboardFieldColorSeriesByModeMax DashboardFieldColorSeriesByMode = "max"
+ DashboardFieldColorSeriesByModeLast DashboardFieldColorSeriesByMode = "last"
+)
+
+// +k8s:openapi-gen=true
+type DashboardDynamicConfigValue struct {
+ Id string `json:"id"`
+ Value interface{} `json:"value,omitempty"`
+}
+
+// NewDashboardDynamicConfigValue creates a new DashboardDynamicConfigValue object.
+func NewDashboardDynamicConfigValue() *DashboardDynamicConfigValue {
+ return &DashboardDynamicConfigValue{
+ Id: "",
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardLibraryPanelKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardLibraryPanelKindSpec `json:"spec"`
+}
+
+// NewDashboardLibraryPanelKind creates a new DashboardLibraryPanelKind object.
+func NewDashboardLibraryPanelKind() *DashboardLibraryPanelKind {
+ return &DashboardLibraryPanelKind{
+ Kind: "LibraryPanel",
+ Spec: *NewDashboardLibraryPanelKindSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardLibraryPanelKindSpec struct {
+ // Panel ID for the library panel in the dashboard
+ Id float64 `json:"id"`
+ // Title for the library panel in the dashboard
+ Title string `json:"title"`
+ LibraryPanel DashboardLibraryPanelRef `json:"libraryPanel"`
+}
+
+// NewDashboardLibraryPanelKindSpec creates a new DashboardLibraryPanelKindSpec object.
+func NewDashboardLibraryPanelKindSpec() *DashboardLibraryPanelKindSpec {
+ return &DashboardLibraryPanelKindSpec{
+ LibraryPanel: *NewDashboardLibraryPanelRef(),
+ }
+}
+
+// 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.
+// +k8s:openapi-gen=true
+type DashboardLibraryPanelRef struct {
+ // Library panel name
+ Name string `json:"name"`
+ // Library panel uid
+ Uid string `json:"uid"`
+}
+
+// NewDashboardLibraryPanelRef creates a new DashboardLibraryPanelRef object.
+func NewDashboardLibraryPanelRef() *DashboardLibraryPanelRef {
+ return &DashboardLibraryPanelRef{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardGridLayoutSpec `json:"spec"`
+}
+
+// NewDashboardGridLayoutKind creates a new DashboardGridLayoutKind object.
+func NewDashboardGridLayoutKind() *DashboardGridLayoutKind {
+ return &DashboardGridLayoutKind{
+ Kind: "GridLayout",
+ Spec: *NewDashboardGridLayoutSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutSpec struct {
+ Items []DashboardGridLayoutItemKindOrGridLayoutRowKind `json:"items"`
+}
+
+// NewDashboardGridLayoutSpec creates a new DashboardGridLayoutSpec object.
+func NewDashboardGridLayoutSpec() *DashboardGridLayoutSpec {
+ return &DashboardGridLayoutSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutItemKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardGridLayoutItemSpec `json:"spec"`
+}
+
+// NewDashboardGridLayoutItemKind creates a new DashboardGridLayoutItemKind object.
+func NewDashboardGridLayoutItemKind() *DashboardGridLayoutItemKind {
+ return &DashboardGridLayoutItemKind{
+ Kind: "GridLayoutItem",
+ Spec: *NewDashboardGridLayoutItemSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutItemSpec struct {
+ X int64 `json:"x"`
+ Y int64 `json:"y"`
+ Width int64 `json:"width"`
+ Height int64 `json:"height"`
+ // reference to a PanelKind from dashboard.spec.elements Expressed as JSON Schema reference
+ Element DashboardElementReference `json:"element"`
+ Repeat *DashboardRepeatOptions `json:"repeat,omitempty"`
+}
+
+// NewDashboardGridLayoutItemSpec creates a new DashboardGridLayoutItemSpec object.
+func NewDashboardGridLayoutItemSpec() *DashboardGridLayoutItemSpec {
+ return &DashboardGridLayoutItemSpec{
+ Element: *NewDashboardElementReference(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardElementReference struct {
+ Kind string `json:"kind"`
+ Name string `json:"name"`
+}
+
+// NewDashboardElementReference creates a new DashboardElementReference object.
+func NewDashboardElementReference() *DashboardElementReference {
+ return &DashboardElementReference{
+ Kind: "ElementReference",
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardRepeatOptions struct {
+ Mode string `json:"mode"`
+ Value string `json:"value"`
+ Direction *DashboardRepeatOptionsDirection `json:"direction,omitempty"`
+ MaxPerRow *int64 `json:"maxPerRow,omitempty"`
+}
+
+// NewDashboardRepeatOptions creates a new DashboardRepeatOptions object.
+func NewDashboardRepeatOptions() *DashboardRepeatOptions {
+ return &DashboardRepeatOptions{}
+}
+
+// other repeat modes will be added in the future: label, frame
+// +k8s:openapi-gen=true
+const DashboardRepeatMode = "variable"
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutRowKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardGridLayoutRowSpec `json:"spec"`
+}
+
+// NewDashboardGridLayoutRowKind creates a new DashboardGridLayoutRowKind object.
+func NewDashboardGridLayoutRowKind() *DashboardGridLayoutRowKind {
+ return &DashboardGridLayoutRowKind{
+ Kind: "GridLayoutRow",
+ Spec: *NewDashboardGridLayoutRowSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutRowSpec struct {
+ Y int64 `json:"y"`
+ Collapsed bool `json:"collapsed"`
+ Title string `json:"title"`
+ // Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard.
+ Elements []DashboardGridLayoutItemKind `json:"elements"`
+ Repeat *DashboardRowRepeatOptions `json:"repeat,omitempty"`
+}
+
+// NewDashboardGridLayoutRowSpec creates a new DashboardGridLayoutRowSpec object.
+func NewDashboardGridLayoutRowSpec() *DashboardGridLayoutRowSpec {
+ return &DashboardGridLayoutRowSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardRowRepeatOptions struct {
+ Mode string `json:"mode"`
+ Value string `json:"value"`
+}
+
+// NewDashboardRowRepeatOptions creates a new DashboardRowRepeatOptions object.
+func NewDashboardRowRepeatOptions() *DashboardRowRepeatOptions {
+ return &DashboardRowRepeatOptions{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardRowsLayoutKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardRowsLayoutSpec `json:"spec"`
+}
+
+// NewDashboardRowsLayoutKind creates a new DashboardRowsLayoutKind object.
+func NewDashboardRowsLayoutKind() *DashboardRowsLayoutKind {
+ return &DashboardRowsLayoutKind{
+ Kind: "RowsLayout",
+ Spec: *NewDashboardRowsLayoutSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardRowsLayoutSpec struct {
+ Rows []DashboardRowsLayoutRowKind `json:"rows"`
+}
+
+// NewDashboardRowsLayoutSpec creates a new DashboardRowsLayoutSpec object.
+func NewDashboardRowsLayoutSpec() *DashboardRowsLayoutSpec {
+ return &DashboardRowsLayoutSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardRowsLayoutRowKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardRowsLayoutRowSpec `json:"spec"`
+}
+
+// NewDashboardRowsLayoutRowKind creates a new DashboardRowsLayoutRowKind object.
+func NewDashboardRowsLayoutRowKind() *DashboardRowsLayoutRowKind {
+ return &DashboardRowsLayoutRowKind{
+ Kind: "RowsLayoutRow",
+ Spec: *NewDashboardRowsLayoutRowSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardRowsLayoutRowSpec struct {
+ Title *string `json:"title,omitempty"`
+ Collapsed bool `json:"collapsed"`
+ ConditionalRendering *DashboardConditionalRenderingGroupKind `json:"conditionalRendering,omitempty"`
+ Repeat *DashboardRowRepeatOptions `json:"repeat,omitempty"`
+ Layout DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind `json:"layout"`
+}
+
+// NewDashboardRowsLayoutRowSpec creates a new DashboardRowsLayoutRowSpec object.
+func NewDashboardRowsLayoutRowSpec() *DashboardRowsLayoutRowSpec {
+ return &DashboardRowsLayoutRowSpec{
+ Layout: *NewDashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingGroupKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardConditionalRenderingGroupSpec `json:"spec"`
+}
+
+// NewDashboardConditionalRenderingGroupKind creates a new DashboardConditionalRenderingGroupKind object.
+func NewDashboardConditionalRenderingGroupKind() *DashboardConditionalRenderingGroupKind {
+ return &DashboardConditionalRenderingGroupKind{
+ Kind: "ConditionalRenderingGroup",
+ Spec: *NewDashboardConditionalRenderingGroupSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingGroupSpec struct {
+ Condition DashboardConditionalRenderingGroupSpecCondition `json:"condition"`
+ Items []DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind `json:"items"`
+}
+
+// NewDashboardConditionalRenderingGroupSpec creates a new DashboardConditionalRenderingGroupSpec object.
+func NewDashboardConditionalRenderingGroupSpec() *DashboardConditionalRenderingGroupSpec {
+ return &DashboardConditionalRenderingGroupSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardConditionalRenderingVariableSpec `json:"spec"`
+}
+
+// NewDashboardConditionalRenderingVariableKind creates a new DashboardConditionalRenderingVariableKind object.
+func NewDashboardConditionalRenderingVariableKind() *DashboardConditionalRenderingVariableKind {
+ return &DashboardConditionalRenderingVariableKind{
+ Kind: "ConditionalRenderingVariable",
+ Spec: *NewDashboardConditionalRenderingVariableSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingVariableSpec struct {
+ Variable string `json:"variable"`
+ Operator DashboardConditionalRenderingVariableSpecOperator `json:"operator"`
+ Value string `json:"value"`
+}
+
+// NewDashboardConditionalRenderingVariableSpec creates a new DashboardConditionalRenderingVariableSpec object.
+func NewDashboardConditionalRenderingVariableSpec() *DashboardConditionalRenderingVariableSpec {
+ return &DashboardConditionalRenderingVariableSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingDataKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardConditionalRenderingDataSpec `json:"spec"`
+}
+
+// NewDashboardConditionalRenderingDataKind creates a new DashboardConditionalRenderingDataKind object.
+func NewDashboardConditionalRenderingDataKind() *DashboardConditionalRenderingDataKind {
+ return &DashboardConditionalRenderingDataKind{
+ Kind: "ConditionalRenderingData",
+ Spec: *NewDashboardConditionalRenderingDataSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingDataSpec struct {
+ Value bool `json:"value"`
+}
+
+// NewDashboardConditionalRenderingDataSpec creates a new DashboardConditionalRenderingDataSpec object.
+func NewDashboardConditionalRenderingDataSpec() *DashboardConditionalRenderingDataSpec {
+ return &DashboardConditionalRenderingDataSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingTimeIntervalKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardConditionalRenderingTimeIntervalSpec `json:"spec"`
+}
+
+// NewDashboardConditionalRenderingTimeIntervalKind creates a new DashboardConditionalRenderingTimeIntervalKind object.
+func NewDashboardConditionalRenderingTimeIntervalKind() *DashboardConditionalRenderingTimeIntervalKind {
+ return &DashboardConditionalRenderingTimeIntervalKind{
+ Kind: "ConditionalRenderingTimeInterval",
+ Spec: *NewDashboardConditionalRenderingTimeIntervalSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingTimeIntervalSpec struct {
+ Value string `json:"value"`
+}
+
+// NewDashboardConditionalRenderingTimeIntervalSpec creates a new DashboardConditionalRenderingTimeIntervalSpec object.
+func NewDashboardConditionalRenderingTimeIntervalSpec() *DashboardConditionalRenderingTimeIntervalSpec {
+ return &DashboardConditionalRenderingTimeIntervalSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardResponsiveGridLayoutKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardResponsiveGridLayoutSpec `json:"spec"`
+}
+
+// NewDashboardResponsiveGridLayoutKind creates a new DashboardResponsiveGridLayoutKind object.
+func NewDashboardResponsiveGridLayoutKind() *DashboardResponsiveGridLayoutKind {
+ return &DashboardResponsiveGridLayoutKind{
+ Kind: "ResponsiveGridLayout",
+ Spec: *NewDashboardResponsiveGridLayoutSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardResponsiveGridLayoutSpec struct {
+ Row string `json:"row"`
+ Col string `json:"col"`
+ Items []DashboardResponsiveGridLayoutItemKind `json:"items"`
+}
+
+// NewDashboardResponsiveGridLayoutSpec creates a new DashboardResponsiveGridLayoutSpec object.
+func NewDashboardResponsiveGridLayoutSpec() *DashboardResponsiveGridLayoutSpec {
+ return &DashboardResponsiveGridLayoutSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardResponsiveGridLayoutItemKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardResponsiveGridLayoutItemSpec `json:"spec"`
+}
+
+// NewDashboardResponsiveGridLayoutItemKind creates a new DashboardResponsiveGridLayoutItemKind object.
+func NewDashboardResponsiveGridLayoutItemKind() *DashboardResponsiveGridLayoutItemKind {
+ return &DashboardResponsiveGridLayoutItemKind{
+ Kind: "ResponsiveGridLayoutItem",
+ Spec: *NewDashboardResponsiveGridLayoutItemSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardResponsiveGridLayoutItemSpec struct {
+ Element DashboardElementReference `json:"element"`
+ Repeat *DashboardResponsiveGridRepeatOptions `json:"repeat,omitempty"`
+ ConditionalRendering *DashboardConditionalRenderingGroupKind `json:"conditionalRendering,omitempty"`
+}
+
+// NewDashboardResponsiveGridLayoutItemSpec creates a new DashboardResponsiveGridLayoutItemSpec object.
+func NewDashboardResponsiveGridLayoutItemSpec() *DashboardResponsiveGridLayoutItemSpec {
+ return &DashboardResponsiveGridLayoutItemSpec{
+ Element: *NewDashboardElementReference(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardResponsiveGridRepeatOptions struct {
+ Mode string `json:"mode"`
+ Value string `json:"value"`
+}
+
+// NewDashboardResponsiveGridRepeatOptions creates a new DashboardResponsiveGridRepeatOptions object.
+func NewDashboardResponsiveGridRepeatOptions() *DashboardResponsiveGridRepeatOptions {
+ return &DashboardResponsiveGridRepeatOptions{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardTabsLayoutKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardTabsLayoutSpec `json:"spec"`
+}
+
+// NewDashboardTabsLayoutKind creates a new DashboardTabsLayoutKind object.
+func NewDashboardTabsLayoutKind() *DashboardTabsLayoutKind {
+ return &DashboardTabsLayoutKind{
+ Kind: "TabsLayout",
+ Spec: *NewDashboardTabsLayoutSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardTabsLayoutSpec struct {
+ Tabs []DashboardTabsLayoutTabKind `json:"tabs"`
+}
+
+// NewDashboardTabsLayoutSpec creates a new DashboardTabsLayoutSpec object.
+func NewDashboardTabsLayoutSpec() *DashboardTabsLayoutSpec {
+ return &DashboardTabsLayoutSpec{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardTabsLayoutTabKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardTabsLayoutTabSpec `json:"spec"`
+}
+
+// NewDashboardTabsLayoutTabKind creates a new DashboardTabsLayoutTabKind object.
+func NewDashboardTabsLayoutTabKind() *DashboardTabsLayoutTabKind {
+ return &DashboardTabsLayoutTabKind{
+ Kind: "TabsLayoutTab",
+ Spec: *NewDashboardTabsLayoutTabSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardTabsLayoutTabSpec struct {
+ Title *string `json:"title,omitempty"`
+ Layout DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind `json:"layout"`
+}
+
+// NewDashboardTabsLayoutTabSpec creates a new DashboardTabsLayoutTabSpec object.
+func NewDashboardTabsLayoutTabSpec() *DashboardTabsLayoutTabSpec {
+ return &DashboardTabsLayoutTabSpec{
+ Layout: *NewDashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind(),
+ }
+}
+
+// Links with references to other dashboards or external resources
+// +k8s:openapi-gen=true
+type DashboardDashboardLink struct {
+ // Title to display with the link
+ Title string `json:"title"`
+ // Link type. Accepted values are dashboards (to refer to another dashboard) and link (to refer to an external resource)
+ // FIXME: The type is generated as `type: DashboardLinkType | dashboardLinkType.Link;` but it should be `type: DashboardLinkType`
+ Type DashboardDashboardLinkType `json:"type"`
+ // Icon name to be displayed with the link
+ Icon string `json:"icon"`
+ // Tooltip to display when the user hovers their mouse over it
+ Tooltip string `json:"tooltip"`
+ // Link URL. Only required/valid if the type is link
+ Url *string `json:"url,omitempty"`
+ // List of tags to limit the linked dashboards. If empty, all dashboards will be displayed. Only valid if the type is dashboards
+ Tags []string `json:"tags"`
+ // If true, all dashboards links will be displayed in a dropdown. If false, all dashboards links will be displayed side by side. Only valid if the type is dashboards
+ AsDropdown bool `json:"asDropdown"`
+ // If true, the link will be opened in a new tab
+ TargetBlank bool `json:"targetBlank"`
+ // If true, includes current template variables values in the link as query params
+ IncludeVars bool `json:"includeVars"`
+ // If true, includes current time range in the link as query params
+ KeepTime bool `json:"keepTime"`
+}
+
+// NewDashboardDashboardLink creates a new DashboardDashboardLink object.
+func NewDashboardDashboardLink() *DashboardDashboardLink {
+ return &DashboardDashboardLink{
+ AsDropdown: false,
+ TargetBlank: false,
+ IncludeVars: false,
+ KeepTime: false,
+ }
+}
+
+// Dashboard Link type. Accepted values are dashboards (to refer to another dashboard) and link (to refer to an external resource)
+// +k8s:openapi-gen=true
+type DashboardDashboardLinkType string
+
+const (
+ DashboardDashboardLinkTypeLink DashboardDashboardLinkType = "link"
+ DashboardDashboardLinkTypeDashboards DashboardDashboardLinkType = "dashboards"
+)
+
+// Time configuration
+// It defines the default time config for the time picker, the refresh picker for the specific dashboard.
+// +k8s:openapi-gen=true
+type DashboardTimeSettingsSpec struct {
+ // Timezone of dashboard. Accepted values are IANA TZDB zone ID or "browser" or "utc".
+ Timezone *string `json:"timezone,omitempty"`
+ // Start time range for dashboard.
+ // Accepted values are relative time strings like "now-6h" or absolute time strings like "2020-07-10T08:00:00.000Z".
+ From string `json:"from"`
+ // End time range for dashboard.
+ // Accepted values are relative time strings like "now-6h" or absolute time strings like "2020-07-10T08:00:00.000Z".
+ To string `json:"to"`
+ // Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d".
+ // v1: refresh
+ AutoRefresh string `json:"autoRefresh"`
+ // Interval options available in the refresh picker dropdown.
+ // v1: timepicker.refresh_intervals
+ AutoRefreshIntervals []string `json:"autoRefreshIntervals"`
+ // Selectable options available in the time picker dropdown. Has no effect on provisioned dashboard.
+ // v1: timepicker.quick_ranges , not exposed in the UI
+ QuickRanges []DashboardTimeRangeOption `json:"quickRanges,omitempty"`
+ // Whether timepicker is visible or not.
+ // v1: timepicker.hidden
+ HideTimepicker bool `json:"hideTimepicker"`
+ // Day when the week starts. Expressed by the name of the day in lowercase, e.g. "monday".
+ WeekStart *DashboardTimeSettingsSpecWeekStart `json:"weekStart,omitempty"`
+ // The month that the fiscal year starts on. 0 = January, 11 = December
+ FiscalYearStartMonth int64 `json:"fiscalYearStartMonth"`
+ // Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.
+ // v1: timepicker.nowDelay
+ NowDelay *string `json:"nowDelay,omitempty"`
+}
+
+// NewDashboardTimeSettingsSpec creates a new DashboardTimeSettingsSpec object.
+func NewDashboardTimeSettingsSpec() *DashboardTimeSettingsSpec {
+ return &DashboardTimeSettingsSpec{
+ Timezone: (func(input string) *string { return &input })("browser"),
+ From: "now-6h",
+ To: "now",
+ AutoRefreshIntervals: []string{"5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"},
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardTimeRangeOption struct {
+ Display string `json:"display"`
+ From string `json:"from"`
+ To string `json:"to"`
+}
+
+// NewDashboardTimeRangeOption creates a new DashboardTimeRangeOption object.
+func NewDashboardTimeRangeOption() *DashboardTimeRangeOption {
+ return &DashboardTimeRangeOption{
+ Display: "Last 6 hours",
+ From: "now-6h",
+ To: "now",
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardVariableKind = DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind
+
+// NewDashboardVariableKind creates a new DashboardVariableKind object.
+func NewDashboardVariableKind() *DashboardVariableKind {
+ return NewDashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind()
+}
+
+// Query variable kind
+// +k8s:openapi-gen=true
+type DashboardQueryVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardQueryVariableSpec `json:"spec"`
+}
+
+// NewDashboardQueryVariableKind creates a new DashboardQueryVariableKind object.
+func NewDashboardQueryVariableKind() *DashboardQueryVariableKind {
+ return &DashboardQueryVariableKind{
+ Kind: "QueryVariable",
+ Spec: *NewDashboardQueryVariableSpec(),
+ }
+}
+
+// Query variable specification
+// +k8s:openapi-gen=true
+type DashboardQueryVariableSpec struct {
+ Name string `json:"name"`
+ Current DashboardVariableOption `json:"current"`
+ Label *string `json:"label,omitempty"`
+ Hide DashboardVariableHide `json:"hide"`
+ Refresh DashboardVariableRefresh `json:"refresh"`
+ SkipUrlSync bool `json:"skipUrlSync"`
+ Description *string `json:"description,omitempty"`
+ Datasource *DashboardDataSourceRef `json:"datasource,omitempty"`
+ Query DashboardDataQueryKind `json:"query"`
+ Regex string `json:"regex"`
+ Sort DashboardVariableSort `json:"sort"`
+ Definition *string `json:"definition,omitempty"`
+ Options []DashboardVariableOption `json:"options"`
+ Multi bool `json:"multi"`
+ IncludeAll bool `json:"includeAll"`
+ AllValue *string `json:"allValue,omitempty"`
+ Placeholder *string `json:"placeholder,omitempty"`
+}
+
+// NewDashboardQueryVariableSpec creates a new DashboardQueryVariableSpec object.
+func NewDashboardQueryVariableSpec() *DashboardQueryVariableSpec {
+ return &DashboardQueryVariableSpec{
+ Name: "",
+ Current: DashboardVariableOption{
+ Text: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ Value: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ },
+ Hide: DashboardVariableHideDontHide,
+ Refresh: DashboardVariableRefreshNever,
+ SkipUrlSync: false,
+ Query: *NewDashboardDataQueryKind(),
+ Regex: "",
+ Multi: false,
+ IncludeAll: false,
+ }
+}
+
+// Variable option specification
+// +k8s:openapi-gen=true
+type DashboardVariableOption struct {
+ // Whether the option is selected or not
+ Selected *bool `json:"selected,omitempty"`
+ // Text to be displayed for the option
+ Text DashboardStringOrArrayOfString `json:"text"`
+ // Value of the option
+ Value DashboardStringOrArrayOfString `json:"value"`
+}
+
+// NewDashboardVariableOption creates a new DashboardVariableOption object.
+func NewDashboardVariableOption() *DashboardVariableOption {
+ return &DashboardVariableOption{
+ Text: *NewDashboardStringOrArrayOfString(),
+ Value: *NewDashboardStringOrArrayOfString(),
+ }
+}
+
+// Determine if the variable shows on dashboard
+// Accepted values are `dontHide` (show label and value), `hideLabel` (show value only), `hideVariable` (show nothing).
+// +k8s:openapi-gen=true
+type DashboardVariableHide string
+
+const (
+ DashboardVariableHideDontHide DashboardVariableHide = "dontHide"
+ DashboardVariableHideHideLabel DashboardVariableHide = "hideLabel"
+ DashboardVariableHideHideVariable DashboardVariableHide = "hideVariable"
+)
+
+// Options to config when to refresh a variable
+// `never`: Never refresh the variable
+// `onDashboardLoad`: Queries the data source every time the dashboard loads.
+// `onTimeRangeChanged`: Queries the data source when the dashboard time range changes.
+// +k8s:openapi-gen=true
+type DashboardVariableRefresh string
+
+const (
+ DashboardVariableRefreshNever DashboardVariableRefresh = "never"
+ DashboardVariableRefreshOnDashboardLoad DashboardVariableRefresh = "onDashboardLoad"
+ DashboardVariableRefreshOnTimeRangeChanged DashboardVariableRefresh = "onTimeRangeChanged"
+)
+
+// Sort variable options
+// Accepted values are:
+// `disabled`: No sorting
+// `alphabeticalAsc`: Alphabetical ASC
+// `alphabeticalDesc`: Alphabetical DESC
+// `numericalAsc`: Numerical ASC
+// `numericalDesc`: Numerical DESC
+// `alphabeticalCaseInsensitiveAsc`: Alphabetical Case Insensitive ASC
+// `alphabeticalCaseInsensitiveDesc`: Alphabetical Case Insensitive DESC
+// `naturalAsc`: Natural ASC
+// `naturalDesc`: Natural DESC
+// VariableSort enum with default value
+// +k8s:openapi-gen=true
+type DashboardVariableSort string
+
+const (
+ DashboardVariableSortDisabled DashboardVariableSort = "disabled"
+ DashboardVariableSortAlphabeticalAsc DashboardVariableSort = "alphabeticalAsc"
+ DashboardVariableSortAlphabeticalDesc DashboardVariableSort = "alphabeticalDesc"
+ DashboardVariableSortNumericalAsc DashboardVariableSort = "numericalAsc"
+ DashboardVariableSortNumericalDesc DashboardVariableSort = "numericalDesc"
+ DashboardVariableSortAlphabeticalCaseInsensitiveAsc DashboardVariableSort = "alphabeticalCaseInsensitiveAsc"
+ DashboardVariableSortAlphabeticalCaseInsensitiveDesc DashboardVariableSort = "alphabeticalCaseInsensitiveDesc"
+ DashboardVariableSortNaturalAsc DashboardVariableSort = "naturalAsc"
+ DashboardVariableSortNaturalDesc DashboardVariableSort = "naturalDesc"
+)
+
+// Text variable kind
+// +k8s:openapi-gen=true
+type DashboardTextVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardTextVariableSpec `json:"spec"`
+}
+
+// NewDashboardTextVariableKind creates a new DashboardTextVariableKind object.
+func NewDashboardTextVariableKind() *DashboardTextVariableKind {
+ return &DashboardTextVariableKind{
+ Kind: "TextVariable",
+ Spec: *NewDashboardTextVariableSpec(),
+ }
+}
+
+// Text variable specification
+// +k8s:openapi-gen=true
+type DashboardTextVariableSpec struct {
+ Name string `json:"name"`
+ Current DashboardVariableOption `json:"current"`
+ Query string `json:"query"`
+ Label *string `json:"label,omitempty"`
+ Hide DashboardVariableHide `json:"hide"`
+ SkipUrlSync bool `json:"skipUrlSync"`
+ Description *string `json:"description,omitempty"`
+}
+
+// NewDashboardTextVariableSpec creates a new DashboardTextVariableSpec object.
+func NewDashboardTextVariableSpec() *DashboardTextVariableSpec {
+ return &DashboardTextVariableSpec{
+ Name: "",
+ Current: DashboardVariableOption{
+ Text: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ Value: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ },
+ Query: "",
+ Hide: DashboardVariableHideDontHide,
+ SkipUrlSync: false,
+ }
+}
+
+// Constant variable kind
+// +k8s:openapi-gen=true
+type DashboardConstantVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardConstantVariableSpec `json:"spec"`
+}
+
+// NewDashboardConstantVariableKind creates a new DashboardConstantVariableKind object.
+func NewDashboardConstantVariableKind() *DashboardConstantVariableKind {
+ return &DashboardConstantVariableKind{
+ Kind: "ConstantVariable",
+ Spec: *NewDashboardConstantVariableSpec(),
+ }
+}
+
+// Constant variable specification
+// +k8s:openapi-gen=true
+type DashboardConstantVariableSpec struct {
+ Name string `json:"name"`
+ Query string `json:"query"`
+ Current DashboardVariableOption `json:"current"`
+ Label *string `json:"label,omitempty"`
+ Hide DashboardVariableHide `json:"hide"`
+ SkipUrlSync bool `json:"skipUrlSync"`
+ Description *string `json:"description,omitempty"`
+}
+
+// NewDashboardConstantVariableSpec creates a new DashboardConstantVariableSpec object.
+func NewDashboardConstantVariableSpec() *DashboardConstantVariableSpec {
+ return &DashboardConstantVariableSpec{
+ Name: "",
+ Query: "",
+ Current: DashboardVariableOption{
+ Text: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ Value: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ },
+ Hide: DashboardVariableHideDontHide,
+ SkipUrlSync: false,
+ }
+}
+
+// Datasource variable kind
+// +k8s:openapi-gen=true
+type DashboardDatasourceVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardDatasourceVariableSpec `json:"spec"`
+}
+
+// NewDashboardDatasourceVariableKind creates a new DashboardDatasourceVariableKind object.
+func NewDashboardDatasourceVariableKind() *DashboardDatasourceVariableKind {
+ return &DashboardDatasourceVariableKind{
+ Kind: "DatasourceVariable",
+ Spec: *NewDashboardDatasourceVariableSpec(),
+ }
+}
+
+// Datasource variable specification
+// +k8s:openapi-gen=true
+type DashboardDatasourceVariableSpec struct {
+ Name string `json:"name"`
+ PluginId string `json:"pluginId"`
+ Refresh DashboardVariableRefresh `json:"refresh"`
+ Regex string `json:"regex"`
+ Current DashboardVariableOption `json:"current"`
+ Options []DashboardVariableOption `json:"options"`
+ Multi bool `json:"multi"`
+ IncludeAll bool `json:"includeAll"`
+ AllValue *string `json:"allValue,omitempty"`
+ Label *string `json:"label,omitempty"`
+ Hide DashboardVariableHide `json:"hide"`
+ SkipUrlSync bool `json:"skipUrlSync"`
+ Description *string `json:"description,omitempty"`
+}
+
+// NewDashboardDatasourceVariableSpec creates a new DashboardDatasourceVariableSpec object.
+func NewDashboardDatasourceVariableSpec() *DashboardDatasourceVariableSpec {
+ return &DashboardDatasourceVariableSpec{
+ Name: "",
+ PluginId: "",
+ Refresh: DashboardVariableRefreshNever,
+ Regex: "",
+ Current: DashboardVariableOption{
+ Text: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ Value: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ },
+ Multi: false,
+ IncludeAll: false,
+ Hide: DashboardVariableHideDontHide,
+ SkipUrlSync: false,
+ }
+}
+
+// Interval variable kind
+// +k8s:openapi-gen=true
+type DashboardIntervalVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardIntervalVariableSpec `json:"spec"`
+}
+
+// NewDashboardIntervalVariableKind creates a new DashboardIntervalVariableKind object.
+func NewDashboardIntervalVariableKind() *DashboardIntervalVariableKind {
+ return &DashboardIntervalVariableKind{
+ Kind: "IntervalVariable",
+ Spec: *NewDashboardIntervalVariableSpec(),
+ }
+}
+
+// Interval variable specification
+// +k8s:openapi-gen=true
+type DashboardIntervalVariableSpec struct {
+ Name string `json:"name"`
+ Query string `json:"query"`
+ Current DashboardVariableOption `json:"current"`
+ Options []DashboardVariableOption `json:"options"`
+ Auto bool `json:"auto"`
+ AutoMin string `json:"auto_min"`
+ AutoCount int64 `json:"auto_count"`
+ Refresh DashboardVariableRefresh `json:"refresh"`
+ Label *string `json:"label,omitempty"`
+ Hide DashboardVariableHide `json:"hide"`
+ SkipUrlSync bool `json:"skipUrlSync"`
+ Description *string `json:"description,omitempty"`
+}
+
+// NewDashboardIntervalVariableSpec creates a new DashboardIntervalVariableSpec object.
+func NewDashboardIntervalVariableSpec() *DashboardIntervalVariableSpec {
+ return &DashboardIntervalVariableSpec{
+ Name: "",
+ Query: "",
+ Current: DashboardVariableOption{
+ Text: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ Value: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ },
+ Auto: false,
+ AutoMin: "",
+ AutoCount: 0,
+ Refresh: DashboardVariableRefreshNever,
+ Hide: DashboardVariableHideDontHide,
+ SkipUrlSync: false,
+ }
+}
+
+// Custom variable kind
+// +k8s:openapi-gen=true
+type DashboardCustomVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardCustomVariableSpec `json:"spec"`
+}
+
+// NewDashboardCustomVariableKind creates a new DashboardCustomVariableKind object.
+func NewDashboardCustomVariableKind() *DashboardCustomVariableKind {
+ return &DashboardCustomVariableKind{
+ Kind: "CustomVariable",
+ Spec: *NewDashboardCustomVariableSpec(),
+ }
+}
+
+// Custom variable specification
+// +k8s:openapi-gen=true
+type DashboardCustomVariableSpec struct {
+ Name string `json:"name"`
+ Query string `json:"query"`
+ Current DashboardVariableOption `json:"current"`
+ Options []DashboardVariableOption `json:"options"`
+ Multi bool `json:"multi"`
+ IncludeAll bool `json:"includeAll"`
+ AllValue *string `json:"allValue,omitempty"`
+ Label *string `json:"label,omitempty"`
+ Hide DashboardVariableHide `json:"hide"`
+ SkipUrlSync bool `json:"skipUrlSync"`
+ Description *string `json:"description,omitempty"`
+}
+
+// NewDashboardCustomVariableSpec creates a new DashboardCustomVariableSpec object.
+func NewDashboardCustomVariableSpec() *DashboardCustomVariableSpec {
+ return &DashboardCustomVariableSpec{
+ Name: "",
+ Query: "",
+ Current: *NewDashboardVariableOption(),
+ Multi: false,
+ IncludeAll: false,
+ Hide: DashboardVariableHideDontHide,
+ SkipUrlSync: false,
+ }
+}
+
+// Group variable kind
+// +k8s:openapi-gen=true
+type DashboardGroupByVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardGroupByVariableSpec `json:"spec"`
+}
+
+// NewDashboardGroupByVariableKind creates a new DashboardGroupByVariableKind object.
+func NewDashboardGroupByVariableKind() *DashboardGroupByVariableKind {
+ return &DashboardGroupByVariableKind{
+ Kind: "GroupByVariable",
+ Spec: *NewDashboardGroupByVariableSpec(),
+ }
+}
+
+// GroupBy variable specification
+// +k8s:openapi-gen=true
+type DashboardGroupByVariableSpec struct {
+ Name string `json:"name"`
+ Datasource *DashboardDataSourceRef `json:"datasource,omitempty"`
+ Current DashboardVariableOption `json:"current"`
+ Options []DashboardVariableOption `json:"options"`
+ Multi bool `json:"multi"`
+ Label *string `json:"label,omitempty"`
+ Hide DashboardVariableHide `json:"hide"`
+ SkipUrlSync bool `json:"skipUrlSync"`
+ Description *string `json:"description,omitempty"`
+}
+
+// NewDashboardGroupByVariableSpec creates a new DashboardGroupByVariableSpec object.
+func NewDashboardGroupByVariableSpec() *DashboardGroupByVariableSpec {
+ return &DashboardGroupByVariableSpec{
+ Name: "",
+ Current: DashboardVariableOption{
+ Text: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ Value: DashboardStringOrArrayOfString{
+ String: (func(input string) *string { return &input })(""),
+ },
+ },
+ Multi: false,
+ Hide: DashboardVariableHideDontHide,
+ SkipUrlSync: false,
+ }
+}
+
+// Adhoc variable kind
+// +k8s:openapi-gen=true
+type DashboardAdhocVariableKind struct {
+ Kind string `json:"kind"`
+ Spec DashboardAdhocVariableSpec `json:"spec"`
+}
+
+// NewDashboardAdhocVariableKind creates a new DashboardAdhocVariableKind object.
+func NewDashboardAdhocVariableKind() *DashboardAdhocVariableKind {
+ return &DashboardAdhocVariableKind{
+ Kind: "AdhocVariable",
+ Spec: *NewDashboardAdhocVariableSpec(),
+ }
+}
+
+// Adhoc variable specification
+// +k8s:openapi-gen=true
+type DashboardAdhocVariableSpec struct {
+ Name string `json:"name"`
+ Datasource *DashboardDataSourceRef `json:"datasource,omitempty"`
+ BaseFilters []DashboardAdHocFilterWithLabels `json:"baseFilters"`
+ Filters []DashboardAdHocFilterWithLabels `json:"filters"`
+ DefaultKeys []DashboardMetricFindValue `json:"defaultKeys"`
+ Label *string `json:"label,omitempty"`
+ Hide DashboardVariableHide `json:"hide"`
+ SkipUrlSync bool `json:"skipUrlSync"`
+ Description *string `json:"description,omitempty"`
+}
+
+// NewDashboardAdhocVariableSpec creates a new DashboardAdhocVariableSpec object.
+func NewDashboardAdhocVariableSpec() *DashboardAdhocVariableSpec {
+ return &DashboardAdhocVariableSpec{
+ Name: "",
+ Hide: DashboardVariableHideDontHide,
+ SkipUrlSync: false,
+ }
+}
+
+// Define the AdHocFilterWithLabels type
+// +k8s:openapi-gen=true
+type DashboardAdHocFilterWithLabels struct {
+ Key string `json:"key"`
+ Operator string `json:"operator"`
+ Value string `json:"value"`
+ Values []string `json:"values,omitempty"`
+ KeyLabel *string `json:"keyLabel,omitempty"`
+ ValueLabels []string `json:"valueLabels,omitempty"`
+ ForceEdit *bool `json:"forceEdit,omitempty"`
+ // @deprecated
+ Condition *string `json:"condition,omitempty"`
+}
+
+// NewDashboardAdHocFilterWithLabels creates a new DashboardAdHocFilterWithLabels object.
+func NewDashboardAdHocFilterWithLabels() *DashboardAdHocFilterWithLabels {
+ return &DashboardAdHocFilterWithLabels{}
+}
+
+// Define the MetricFindValue type
+// +k8s:openapi-gen=true
+type DashboardMetricFindValue struct {
+ Text string `json:"text"`
+ Value *DashboardStringOrFloat64 `json:"value,omitempty"`
+ Group *string `json:"group,omitempty"`
+ Expandable *bool `json:"expandable,omitempty"`
+}
+
+// NewDashboardMetricFindValue creates a new DashboardMetricFindValue object.
+func NewDashboardMetricFindValue() *DashboardMetricFindValue {
+ return &DashboardMetricFindValue{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardSpec struct {
+ // Title of dashboard.
+ Annotations []DashboardAnnotationQueryKind `json:"annotations"`
+ // Configuration of dashboard cursor sync behavior.
+ // "Off" for no shared crosshair or tooltip (default).
+ // "Crosshair" for shared crosshair.
+ // "Tooltip" for shared crosshair AND shared tooltip.
+ CursorSync DashboardDashboardCursorSync `json:"cursorSync"`
+ // Description of dashboard.
+ Description *string `json:"description,omitempty"`
+ // Whether a dashboard is editable or not.
+ Editable *bool `json:"editable,omitempty"`
+ Elements map[string]DashboardElement `json:"elements"`
+ Layout DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind `json:"layout"`
+ // Links with references to other dashboards or external websites.
+ Links []DashboardDashboardLink `json:"links"`
+ // When set to true, the dashboard will redraw panels at an interval matching the pixel width.
+ // This will keep data "moving left" regardless of the query refresh rate. This setting helps
+ // avoid dashboards presenting stale live data.
+ LiveNow *bool `json:"liveNow,omitempty"`
+ // When set to true, the dashboard will load all panels in the dashboard when it's loaded.
+ Preload bool `json:"preload"`
+ // Plugins only. The version of the dashboard installed together with the plugin.
+ // This is used to determine if the dashboard should be updated when the plugin is updated.
+ Revision *uint16 `json:"revision,omitempty"`
+ // Tags associated with dashboard.
+ Tags []string `json:"tags"`
+ TimeSettings DashboardTimeSettingsSpec `json:"timeSettings"`
+ // Title of dashboard.
+ Title string `json:"title"`
+ // Configured template variables.
+ Variables []DashboardVariableKind `json:"variables"`
+}
+
+// NewDashboardSpec creates a new DashboardSpec object.
+func NewDashboardSpec() *DashboardSpec {
+ return &DashboardSpec{
+ Editable: (func(input bool) *bool { return &input })(true),
+ Layout: *NewDashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(),
+ TimeSettings: *NewDashboardTimeSettingsSpec(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardV2alpha1FieldConfigSourceOverrides struct {
+ Matcher DashboardMatcherConfig `json:"matcher"`
+ Properties []DashboardDynamicConfigValue `json:"properties"`
+}
+
+// NewDashboardV2alpha1FieldConfigSourceOverrides creates a new DashboardV2alpha1FieldConfigSourceOverrides object.
+func NewDashboardV2alpha1FieldConfigSourceOverrides() *DashboardV2alpha1FieldConfigSourceOverrides {
+ return &DashboardV2alpha1FieldConfigSourceOverrides{
+ Matcher: *NewDashboardMatcherConfig(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardV2alpha1RangeMapOptions struct {
+ // Min value of the range. It can be null which means -Infinity
+ From *float64 `json:"from"`
+ // Max value of the range. It can be null which means +Infinity
+ To *float64 `json:"to"`
+ // Config to apply when the value is within the range
+ Result DashboardValueMappingResult `json:"result"`
+}
+
+// NewDashboardV2alpha1RangeMapOptions creates a new DashboardV2alpha1RangeMapOptions object.
+func NewDashboardV2alpha1RangeMapOptions() *DashboardV2alpha1RangeMapOptions {
+ return &DashboardV2alpha1RangeMapOptions{
+ Result: *NewDashboardValueMappingResult(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardV2alpha1RegexMapOptions struct {
+ // Regular expression to match against
+ Pattern string `json:"pattern"`
+ // Config to apply when the value matches the regex
+ Result DashboardValueMappingResult `json:"result"`
+}
+
+// NewDashboardV2alpha1RegexMapOptions creates a new DashboardV2alpha1RegexMapOptions object.
+func NewDashboardV2alpha1RegexMapOptions() *DashboardV2alpha1RegexMapOptions {
+ return &DashboardV2alpha1RegexMapOptions{
+ Result: *NewDashboardValueMappingResult(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardV2alpha1SpecialValueMapOptions struct {
+ // Special value to match against
+ Match DashboardSpecialValueMatch `json:"match"`
+ // Config to apply when the value matches the special value
+ Result DashboardValueMappingResult `json:"result"`
+}
+
+// NewDashboardV2alpha1SpecialValueMapOptions creates a new DashboardV2alpha1SpecialValueMapOptions object.
+func NewDashboardV2alpha1SpecialValueMapOptions() *DashboardV2alpha1SpecialValueMapOptions {
+ return &DashboardV2alpha1SpecialValueMapOptions{
+ Result: *NewDashboardValueMappingResult(),
+ }
+}
+
+// +k8s:openapi-gen=true
+type DashboardRepeatOptionsDirection string
+
+const (
+ DashboardRepeatOptionsDirectionH DashboardRepeatOptionsDirection = "h"
+ DashboardRepeatOptionsDirectionV DashboardRepeatOptionsDirection = "v"
+)
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingGroupSpecCondition string
+
+const (
+ DashboardConditionalRenderingGroupSpecConditionAnd DashboardConditionalRenderingGroupSpecCondition = "and"
+ DashboardConditionalRenderingGroupSpecConditionOr DashboardConditionalRenderingGroupSpecCondition = "or"
+)
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingVariableSpecOperator string
+
+const (
+ DashboardConditionalRenderingVariableSpecOperatorEquals DashboardConditionalRenderingVariableSpecOperator = "equals"
+ DashboardConditionalRenderingVariableSpecOperatorNotEquals DashboardConditionalRenderingVariableSpecOperator = "notEquals"
+)
+
+// +k8s:openapi-gen=true
+type DashboardTimeSettingsSpecWeekStart string
+
+const (
+ DashboardTimeSettingsSpecWeekStartSaturday DashboardTimeSettingsSpecWeekStart = "saturday"
+ DashboardTimeSettingsSpecWeekStartMonday DashboardTimeSettingsSpecWeekStart = "monday"
+ DashboardTimeSettingsSpecWeekStartSunday DashboardTimeSettingsSpecWeekStart = "sunday"
+)
+
+// +k8s:openapi-gen=true
+type DashboardPanelKindOrLibraryPanelKind struct {
+ PanelKind *DashboardPanelKind `json:"PanelKind,omitempty"`
+ LibraryPanelKind *DashboardLibraryPanelKind `json:"LibraryPanelKind,omitempty"`
+}
+
+// NewDashboardPanelKindOrLibraryPanelKind creates a new DashboardPanelKindOrLibraryPanelKind object.
+func NewDashboardPanelKindOrLibraryPanelKind() *DashboardPanelKindOrLibraryPanelKind {
+ return &DashboardPanelKindOrLibraryPanelKind{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardPanelKindOrLibraryPanelKind` as JSON.
+func (resource DashboardPanelKindOrLibraryPanelKind) MarshalJSON() ([]byte, error) {
+ if resource.PanelKind != nil {
+ return json.Marshal(resource.PanelKind)
+ }
+ if resource.LibraryPanelKind != nil {
+ return json.Marshal(resource.LibraryPanelKind)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of refs")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardPanelKindOrLibraryPanelKind` from JSON.
+func (resource *DashboardPanelKindOrLibraryPanelKind) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this.
+ parsedAsMap := make(map[string]interface{})
+ if err := json.Unmarshal(raw, &parsedAsMap); err != nil {
+ return err
+ }
+
+ discriminator, found := parsedAsMap["kind"]
+ if !found {
+ return errors.New("discriminator field 'kind' not found in payload")
+ }
+
+ switch discriminator {
+ case "LibraryPanel":
+ var dashboardLibraryPanelKind DashboardLibraryPanelKind
+ if err := json.Unmarshal(raw, &dashboardLibraryPanelKind); err != nil {
+ return err
+ }
+
+ resource.LibraryPanelKind = &dashboardLibraryPanelKind
+ return nil
+ case "Panel":
+ var dashboardPanelKind DashboardPanelKind
+ if err := json.Unmarshal(raw, &dashboardPanelKind); err != nil {
+ return err
+ }
+
+ resource.PanelKind = &dashboardPanelKind
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator)
+}
+
+// +k8s:openapi-gen=true
+type DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap struct {
+ ValueMap *DashboardValueMap `json:"ValueMap,omitempty"`
+ RangeMap *DashboardRangeMap `json:"RangeMap,omitempty"`
+ RegexMap *DashboardRegexMap `json:"RegexMap,omitempty"`
+ SpecialValueMap *DashboardSpecialValueMap `json:"SpecialValueMap,omitempty"`
+}
+
+// NewDashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap creates a new DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap object.
+func NewDashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap() *DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap {
+ return &DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap` as JSON.
+func (resource DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap) MarshalJSON() ([]byte, error) {
+ if resource.ValueMap != nil {
+ return json.Marshal(resource.ValueMap)
+ }
+ if resource.RangeMap != nil {
+ return json.Marshal(resource.RangeMap)
+ }
+ if resource.RegexMap != nil {
+ return json.Marshal(resource.RegexMap)
+ }
+ if resource.SpecialValueMap != nil {
+ return json.Marshal(resource.SpecialValueMap)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of refs")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap` from JSON.
+func (resource *DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this.
+ parsedAsMap := make(map[string]interface{})
+ if err := json.Unmarshal(raw, &parsedAsMap); err != nil {
+ return err
+ }
+
+ discriminator, found := parsedAsMap["type"]
+ if !found {
+ return errors.New("discriminator field 'type' not found in payload")
+ }
+
+ switch discriminator {
+ case "range":
+ var dashboardRangeMap DashboardRangeMap
+ if err := json.Unmarshal(raw, &dashboardRangeMap); err != nil {
+ return err
+ }
+
+ resource.RangeMap = &dashboardRangeMap
+ return nil
+ case "regex":
+ var dashboardRegexMap DashboardRegexMap
+ if err := json.Unmarshal(raw, &dashboardRegexMap); err != nil {
+ return err
+ }
+
+ resource.RegexMap = &dashboardRegexMap
+ return nil
+ case "special":
+ var dashboardSpecialValueMap DashboardSpecialValueMap
+ if err := json.Unmarshal(raw, &dashboardSpecialValueMap); err != nil {
+ return err
+ }
+
+ resource.SpecialValueMap = &dashboardSpecialValueMap
+ return nil
+ case "value":
+ var dashboardValueMap DashboardValueMap
+ if err := json.Unmarshal(raw, &dashboardValueMap); err != nil {
+ return err
+ }
+
+ resource.ValueMap = &dashboardValueMap
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal resource with `type = %v`", discriminator)
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutItemKindOrGridLayoutRowKind struct {
+ GridLayoutItemKind *DashboardGridLayoutItemKind `json:"GridLayoutItemKind,omitempty"`
+ GridLayoutRowKind *DashboardGridLayoutRowKind `json:"GridLayoutRowKind,omitempty"`
+}
+
+// NewDashboardGridLayoutItemKindOrGridLayoutRowKind creates a new DashboardGridLayoutItemKindOrGridLayoutRowKind object.
+func NewDashboardGridLayoutItemKindOrGridLayoutRowKind() *DashboardGridLayoutItemKindOrGridLayoutRowKind {
+ return &DashboardGridLayoutItemKindOrGridLayoutRowKind{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardGridLayoutItemKindOrGridLayoutRowKind` as JSON.
+func (resource DashboardGridLayoutItemKindOrGridLayoutRowKind) MarshalJSON() ([]byte, error) {
+ if resource.GridLayoutItemKind != nil {
+ return json.Marshal(resource.GridLayoutItemKind)
+ }
+ if resource.GridLayoutRowKind != nil {
+ return json.Marshal(resource.GridLayoutRowKind)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of refs")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardGridLayoutItemKindOrGridLayoutRowKind` from JSON.
+func (resource *DashboardGridLayoutItemKindOrGridLayoutRowKind) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this.
+ parsedAsMap := make(map[string]interface{})
+ if err := json.Unmarshal(raw, &parsedAsMap); err != nil {
+ return err
+ }
+
+ discriminator, found := parsedAsMap["kind"]
+ if !found {
+ return errors.New("discriminator field 'kind' not found in payload")
+ }
+
+ switch discriminator {
+ case "GridLayoutItem":
+ var dashboardGridLayoutItemKind DashboardGridLayoutItemKind
+ if err := json.Unmarshal(raw, &dashboardGridLayoutItemKind); err != nil {
+ return err
+ }
+
+ resource.GridLayoutItemKind = &dashboardGridLayoutItemKind
+ return nil
+ case "GridLayoutRow":
+ var dashboardGridLayoutRowKind DashboardGridLayoutRowKind
+ if err := json.Unmarshal(raw, &dashboardGridLayoutRowKind); err != nil {
+ return err
+ }
+
+ resource.GridLayoutRowKind = &dashboardGridLayoutRowKind
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator)
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind struct {
+ GridLayoutKind *DashboardGridLayoutKind `json:"GridLayoutKind,omitempty"`
+ ResponsiveGridLayoutKind *DashboardResponsiveGridLayoutKind `json:"ResponsiveGridLayoutKind,omitempty"`
+ TabsLayoutKind *DashboardTabsLayoutKind `json:"TabsLayoutKind,omitempty"`
+}
+
+// NewDashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind creates a new DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind object.
+func NewDashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind() *DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind {
+ return &DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind` as JSON.
+func (resource DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind) MarshalJSON() ([]byte, error) {
+ if resource.GridLayoutKind != nil {
+ return json.Marshal(resource.GridLayoutKind)
+ }
+ if resource.ResponsiveGridLayoutKind != nil {
+ return json.Marshal(resource.ResponsiveGridLayoutKind)
+ }
+ if resource.TabsLayoutKind != nil {
+ return json.Marshal(resource.TabsLayoutKind)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of refs")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind` from JSON.
+func (resource *DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this.
+ parsedAsMap := make(map[string]interface{})
+ if err := json.Unmarshal(raw, &parsedAsMap); err != nil {
+ return err
+ }
+
+ discriminator, found := parsedAsMap["kind"]
+ if !found {
+ return errors.New("discriminator field 'kind' not found in payload")
+ }
+
+ switch discriminator {
+ case "GridLayout":
+ var dashboardGridLayoutKind DashboardGridLayoutKind
+ if err := json.Unmarshal(raw, &dashboardGridLayoutKind); err != nil {
+ return err
+ }
+
+ resource.GridLayoutKind = &dashboardGridLayoutKind
+ return nil
+ case "ResponsiveGridLayout":
+ var dashboardResponsiveGridLayoutKind DashboardResponsiveGridLayoutKind
+ if err := json.Unmarshal(raw, &dashboardResponsiveGridLayoutKind); err != nil {
+ return err
+ }
+
+ resource.ResponsiveGridLayoutKind = &dashboardResponsiveGridLayoutKind
+ return nil
+ case "TabsLayout":
+ var dashboardTabsLayoutKind DashboardTabsLayoutKind
+ if err := json.Unmarshal(raw, &dashboardTabsLayoutKind); err != nil {
+ return err
+ }
+
+ resource.TabsLayoutKind = &dashboardTabsLayoutKind
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator)
+}
+
+// +k8s:openapi-gen=true
+type DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind struct {
+ ConditionalRenderingVariableKind *DashboardConditionalRenderingVariableKind `json:"ConditionalRenderingVariableKind,omitempty"`
+ ConditionalRenderingDataKind *DashboardConditionalRenderingDataKind `json:"ConditionalRenderingDataKind,omitempty"`
+ ConditionalRenderingTimeIntervalKind *DashboardConditionalRenderingTimeIntervalKind `json:"ConditionalRenderingTimeIntervalKind,omitempty"`
+}
+
+// NewDashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind creates a new DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind object.
+func NewDashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind() *DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind {
+ return &DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind` as JSON.
+func (resource DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind) MarshalJSON() ([]byte, error) {
+ if resource.ConditionalRenderingVariableKind != nil {
+ return json.Marshal(resource.ConditionalRenderingVariableKind)
+ }
+ if resource.ConditionalRenderingDataKind != nil {
+ return json.Marshal(resource.ConditionalRenderingDataKind)
+ }
+ if resource.ConditionalRenderingTimeIntervalKind != nil {
+ return json.Marshal(resource.ConditionalRenderingTimeIntervalKind)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of refs")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind` from JSON.
+func (resource *DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this.
+ parsedAsMap := make(map[string]interface{})
+ if err := json.Unmarshal(raw, &parsedAsMap); err != nil {
+ return err
+ }
+
+ discriminator, found := parsedAsMap["kind"]
+ if !found {
+ return errors.New("discriminator field 'kind' not found in payload")
+ }
+
+ switch discriminator {
+ case "ConditionalRenderingData":
+ var dashboardConditionalRenderingDataKind DashboardConditionalRenderingDataKind
+ if err := json.Unmarshal(raw, &dashboardConditionalRenderingDataKind); err != nil {
+ return err
+ }
+
+ resource.ConditionalRenderingDataKind = &dashboardConditionalRenderingDataKind
+ return nil
+ case "ConditionalRenderingTimeInterval":
+ var dashboardConditionalRenderingTimeIntervalKind DashboardConditionalRenderingTimeIntervalKind
+ if err := json.Unmarshal(raw, &dashboardConditionalRenderingTimeIntervalKind); err != nil {
+ return err
+ }
+
+ resource.ConditionalRenderingTimeIntervalKind = &dashboardConditionalRenderingTimeIntervalKind
+ return nil
+ case "ConditionalRenderingVariable":
+ var dashboardConditionalRenderingVariableKind DashboardConditionalRenderingVariableKind
+ if err := json.Unmarshal(raw, &dashboardConditionalRenderingVariableKind); err != nil {
+ return err
+ }
+
+ resource.ConditionalRenderingVariableKind = &dashboardConditionalRenderingVariableKind
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator)
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind struct {
+ GridLayoutKind *DashboardGridLayoutKind `json:"GridLayoutKind,omitempty"`
+ RowsLayoutKind *DashboardRowsLayoutKind `json:"RowsLayoutKind,omitempty"`
+ ResponsiveGridLayoutKind *DashboardResponsiveGridLayoutKind `json:"ResponsiveGridLayoutKind,omitempty"`
+}
+
+// NewDashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind creates a new DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind object.
+func NewDashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind() *DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind {
+ return &DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind` as JSON.
+func (resource DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind) MarshalJSON() ([]byte, error) {
+ if resource.GridLayoutKind != nil {
+ return json.Marshal(resource.GridLayoutKind)
+ }
+ if resource.RowsLayoutKind != nil {
+ return json.Marshal(resource.RowsLayoutKind)
+ }
+ if resource.ResponsiveGridLayoutKind != nil {
+ return json.Marshal(resource.ResponsiveGridLayoutKind)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of refs")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind` from JSON.
+func (resource *DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this.
+ parsedAsMap := make(map[string]interface{})
+ if err := json.Unmarshal(raw, &parsedAsMap); err != nil {
+ return err
+ }
+
+ discriminator, found := parsedAsMap["kind"]
+ if !found {
+ return errors.New("discriminator field 'kind' not found in payload")
+ }
+
+ switch discriminator {
+ case "GridLayout":
+ var dashboardGridLayoutKind DashboardGridLayoutKind
+ if err := json.Unmarshal(raw, &dashboardGridLayoutKind); err != nil {
+ return err
+ }
+
+ resource.GridLayoutKind = &dashboardGridLayoutKind
+ return nil
+ case "ResponsiveGridLayout":
+ var dashboardResponsiveGridLayoutKind DashboardResponsiveGridLayoutKind
+ if err := json.Unmarshal(raw, &dashboardResponsiveGridLayoutKind); err != nil {
+ return err
+ }
+
+ resource.ResponsiveGridLayoutKind = &dashboardResponsiveGridLayoutKind
+ return nil
+ case "RowsLayout":
+ var dashboardRowsLayoutKind DashboardRowsLayoutKind
+ if err := json.Unmarshal(raw, &dashboardRowsLayoutKind); err != nil {
+ return err
+ }
+
+ resource.RowsLayoutKind = &dashboardRowsLayoutKind
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator)
+}
+
+// +k8s:openapi-gen=true
+type DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind struct {
+ QueryVariableKind *DashboardQueryVariableKind `json:"QueryVariableKind,omitempty"`
+ TextVariableKind *DashboardTextVariableKind `json:"TextVariableKind,omitempty"`
+ ConstantVariableKind *DashboardConstantVariableKind `json:"ConstantVariableKind,omitempty"`
+ DatasourceVariableKind *DashboardDatasourceVariableKind `json:"DatasourceVariableKind,omitempty"`
+ IntervalVariableKind *DashboardIntervalVariableKind `json:"IntervalVariableKind,omitempty"`
+ CustomVariableKind *DashboardCustomVariableKind `json:"CustomVariableKind,omitempty"`
+ GroupByVariableKind *DashboardGroupByVariableKind `json:"GroupByVariableKind,omitempty"`
+ AdhocVariableKind *DashboardAdhocVariableKind `json:"AdhocVariableKind,omitempty"`
+}
+
+// NewDashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind creates a new DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind object.
+func NewDashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind() *DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind {
+ return &DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind` as JSON.
+func (resource DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind) MarshalJSON() ([]byte, error) {
+ if resource.QueryVariableKind != nil {
+ return json.Marshal(resource.QueryVariableKind)
+ }
+ if resource.TextVariableKind != nil {
+ return json.Marshal(resource.TextVariableKind)
+ }
+ if resource.ConstantVariableKind != nil {
+ return json.Marshal(resource.ConstantVariableKind)
+ }
+ if resource.DatasourceVariableKind != nil {
+ return json.Marshal(resource.DatasourceVariableKind)
+ }
+ if resource.IntervalVariableKind != nil {
+ return json.Marshal(resource.IntervalVariableKind)
+ }
+ if resource.CustomVariableKind != nil {
+ return json.Marshal(resource.CustomVariableKind)
+ }
+ if resource.GroupByVariableKind != nil {
+ return json.Marshal(resource.GroupByVariableKind)
+ }
+ if resource.AdhocVariableKind != nil {
+ return json.Marshal(resource.AdhocVariableKind)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of refs")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind` from JSON.
+func (resource *DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this.
+ parsedAsMap := make(map[string]interface{})
+ if err := json.Unmarshal(raw, &parsedAsMap); err != nil {
+ return err
+ }
+
+ discriminator, found := parsedAsMap["kind"]
+ if !found {
+ return errors.New("discriminator field 'kind' not found in payload")
+ }
+
+ switch discriminator {
+ case "AdhocVariable":
+ var dashboardAdhocVariableKind DashboardAdhocVariableKind
+ if err := json.Unmarshal(raw, &dashboardAdhocVariableKind); err != nil {
+ return err
+ }
+
+ resource.AdhocVariableKind = &dashboardAdhocVariableKind
+ return nil
+ case "ConstantVariable":
+ var dashboardConstantVariableKind DashboardConstantVariableKind
+ if err := json.Unmarshal(raw, &dashboardConstantVariableKind); err != nil {
+ return err
+ }
+
+ resource.ConstantVariableKind = &dashboardConstantVariableKind
+ return nil
+ case "CustomVariable":
+ var dashboardCustomVariableKind DashboardCustomVariableKind
+ if err := json.Unmarshal(raw, &dashboardCustomVariableKind); err != nil {
+ return err
+ }
+
+ resource.CustomVariableKind = &dashboardCustomVariableKind
+ return nil
+ case "DatasourceVariable":
+ var dashboardDatasourceVariableKind DashboardDatasourceVariableKind
+ if err := json.Unmarshal(raw, &dashboardDatasourceVariableKind); err != nil {
+ return err
+ }
+
+ resource.DatasourceVariableKind = &dashboardDatasourceVariableKind
+ return nil
+ case "GroupByVariable":
+ var dashboardGroupByVariableKind DashboardGroupByVariableKind
+ if err := json.Unmarshal(raw, &dashboardGroupByVariableKind); err != nil {
+ return err
+ }
+
+ resource.GroupByVariableKind = &dashboardGroupByVariableKind
+ return nil
+ case "IntervalVariable":
+ var dashboardIntervalVariableKind DashboardIntervalVariableKind
+ if err := json.Unmarshal(raw, &dashboardIntervalVariableKind); err != nil {
+ return err
+ }
+
+ resource.IntervalVariableKind = &dashboardIntervalVariableKind
+ return nil
+ case "QueryVariable":
+ var dashboardQueryVariableKind DashboardQueryVariableKind
+ if err := json.Unmarshal(raw, &dashboardQueryVariableKind); err != nil {
+ return err
+ }
+
+ resource.QueryVariableKind = &dashboardQueryVariableKind
+ return nil
+ case "TextVariable":
+ var dashboardTextVariableKind DashboardTextVariableKind
+ if err := json.Unmarshal(raw, &dashboardTextVariableKind); err != nil {
+ return err
+ }
+
+ resource.TextVariableKind = &dashboardTextVariableKind
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator)
+}
+
+// +k8s:openapi-gen=true
+type DashboardStringOrArrayOfString struct {
+ String *string `json:"String,omitempty"`
+ ArrayOfString []string `json:"ArrayOfString,omitempty"`
+}
+
+// NewDashboardStringOrArrayOfString creates a new DashboardStringOrArrayOfString object.
+func NewDashboardStringOrArrayOfString() *DashboardStringOrArrayOfString {
+ return &DashboardStringOrArrayOfString{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardStringOrArrayOfString` as JSON.
+func (resource DashboardStringOrArrayOfString) MarshalJSON() ([]byte, error) {
+ if resource.String != nil {
+ return json.Marshal(resource.String)
+ }
+
+ if resource.ArrayOfString != nil {
+ return json.Marshal(resource.ArrayOfString)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of scalars")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardStringOrArrayOfString` from JSON.
+func (resource *DashboardStringOrArrayOfString) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ var errList []error
+
+ // String
+ var String string
+ if err := json.Unmarshal(raw, &String); err != nil {
+ errList = append(errList, err)
+ resource.String = nil
+ } else {
+ resource.String = &String
+ return nil
+ }
+
+ // ArrayOfString
+ var ArrayOfString []string
+ if err := json.Unmarshal(raw, &ArrayOfString); err != nil {
+ errList = append(errList, err)
+ resource.ArrayOfString = nil
+ } else {
+ resource.ArrayOfString = ArrayOfString
+ return nil
+ }
+
+ return errors.Join(errList...)
+}
+
+// +k8s:openapi-gen=true
+type DashboardStringOrFloat64 struct {
+ String *string `json:"String,omitempty"`
+ Float64 *float64 `json:"Float64,omitempty"`
+}
+
+// NewDashboardStringOrFloat64 creates a new DashboardStringOrFloat64 object.
+func NewDashboardStringOrFloat64() *DashboardStringOrFloat64 {
+ return &DashboardStringOrFloat64{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardStringOrFloat64` as JSON.
+func (resource DashboardStringOrFloat64) MarshalJSON() ([]byte, error) {
+ if resource.String != nil {
+ return json.Marshal(resource.String)
+ }
+
+ if resource.Float64 != nil {
+ return json.Marshal(resource.Float64)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of scalars")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardStringOrFloat64` from JSON.
+func (resource *DashboardStringOrFloat64) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ var errList []error
+
+ // String
+ var String string
+ if err := json.Unmarshal(raw, &String); err != nil {
+ errList = append(errList, err)
+ resource.String = nil
+ } else {
+ resource.String = &String
+ return nil
+ }
+
+ // Float64
+ var Float64 float64
+ if err := json.Unmarshal(raw, &Float64); err != nil {
+ errList = append(errList, err)
+ resource.Float64 = nil
+ } else {
+ resource.Float64 = &Float64
+ return nil
+ }
+
+ return errors.Join(errList...)
+}
+
+// +k8s:openapi-gen=true
+type DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind struct {
+ GridLayoutKind *DashboardGridLayoutKind `json:"GridLayoutKind,omitempty"`
+ RowsLayoutKind *DashboardRowsLayoutKind `json:"RowsLayoutKind,omitempty"`
+ ResponsiveGridLayoutKind *DashboardResponsiveGridLayoutKind `json:"ResponsiveGridLayoutKind,omitempty"`
+ TabsLayoutKind *DashboardTabsLayoutKind `json:"TabsLayoutKind,omitempty"`
+}
+
+// NewDashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind creates a new DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind object.
+func NewDashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind() *DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind {
+ return &DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind{}
+}
+
+// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind` as JSON.
+func (resource DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind) MarshalJSON() ([]byte, error) {
+ if resource.GridLayoutKind != nil {
+ return json.Marshal(resource.GridLayoutKind)
+ }
+ if resource.RowsLayoutKind != nil {
+ return json.Marshal(resource.RowsLayoutKind)
+ }
+ if resource.ResponsiveGridLayoutKind != nil {
+ return json.Marshal(resource.ResponsiveGridLayoutKind)
+ }
+ if resource.TabsLayoutKind != nil {
+ return json.Marshal(resource.TabsLayoutKind)
+ }
+
+ return nil, fmt.Errorf("no value for disjunction of refs")
+}
+
+// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind` from JSON.
+func (resource *DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind) UnmarshalJSON(raw []byte) error {
+ if raw == nil {
+ return nil
+ }
+
+ // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this.
+ parsedAsMap := make(map[string]interface{})
+ if err := json.Unmarshal(raw, &parsedAsMap); err != nil {
+ return err
+ }
+
+ discriminator, found := parsedAsMap["kind"]
+ if !found {
+ return errors.New("discriminator field 'kind' not found in payload")
+ }
+
+ switch discriminator {
+ case "GridLayout":
+ var dashboardGridLayoutKind DashboardGridLayoutKind
+ if err := json.Unmarshal(raw, &dashboardGridLayoutKind); err != nil {
+ return err
+ }
+
+ resource.GridLayoutKind = &dashboardGridLayoutKind
+ return nil
+ case "ResponsiveGridLayout":
+ var dashboardResponsiveGridLayoutKind DashboardResponsiveGridLayoutKind
+ if err := json.Unmarshal(raw, &dashboardResponsiveGridLayoutKind); err != nil {
+ return err
+ }
+
+ resource.ResponsiveGridLayoutKind = &dashboardResponsiveGridLayoutKind
+ return nil
+ case "RowsLayout":
+ var dashboardRowsLayoutKind DashboardRowsLayoutKind
+ if err := json.Unmarshal(raw, &dashboardRowsLayoutKind); err != nil {
+ return err
+ }
+
+ resource.RowsLayoutKind = &dashboardRowsLayoutKind
+ return nil
+ case "TabsLayout":
+ var dashboardTabsLayoutKind DashboardTabsLayoutKind
+ if err := json.Unmarshal(raw, &dashboardTabsLayoutKind); err != nil {
+ return err
+ }
+
+ resource.TabsLayoutKind = &dashboardTabsLayoutKind
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator)
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_status_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_status_gen.go
new file mode 100644
index 00000000000..5bd84ac30cc
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_status_gen.go
@@ -0,0 +1,34 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+package v2alpha1
+
+// ConversionStatus is the status of the conversion of the dashboard.
+// +k8s:openapi-gen=true
+type DashboardConversionStatus struct {
+ // Whether from another version has failed.
+ // If true, means that the dashboard is not valid,
+ // and the caller should instead fetch the stored version.
+ Failed bool `json:"failed"`
+ // The version which was stored when the dashboard was created / updated.
+ // Fetching this version should always succeed.
+ StoredVersion string `json:"storedVersion"`
+ // The error message from the conversion.
+ // Empty if the conversion has not failed.
+ Error string `json:"error"`
+}
+
+// NewDashboardConversionStatus creates a new DashboardConversionStatus object.
+func NewDashboardConversionStatus() *DashboardConversionStatus {
+ return &DashboardConversionStatus{}
+}
+
+// +k8s:openapi-gen=true
+type DashboardStatus struct {
+ // Optional conversion status.
+ Conversion *DashboardConversionStatus `json:"conversion,omitempty"`
+}
+
+// NewDashboardStatus creates a new DashboardStatus object.
+func NewDashboardStatus() *DashboardStatus {
+ return &DashboardStatus{}
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/deepcopy.go
new file mode 100644
index 00000000000..621d7232a8e
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/deepcopy.go
@@ -0,0 +1,63 @@
+package v2alpha1
+
+import "reflect"
+
+// TODO: these should be automatically generated by the SDK.
+
+func (in *Dashboard) DeepCopyInto(out *Dashboard) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+}
+
+func (in *Dashboard) DeepCopy() *Dashboard {
+ if in == nil {
+ return nil
+ }
+ out := new(Dashboard)
+ in.DeepCopyInto(out)
+ return out
+}
+
+func (in *DashboardList) DeepCopyInto(out *DashboardList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ListMeta.DeepCopyInto(&out.ListMeta)
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]Dashboard, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+}
+
+func (in *DashboardList) DeepCopy() *DashboardList {
+ if in == nil {
+ return nil
+ }
+ out := new(DashboardList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// TODO: we currently don't generate these methods for spec / status types.
+// We probably should do that in the SDK.
+
+func (in *DashboardSpec) DeepCopyInto(out *DashboardSpec) {
+ // TODO (@radiohead): since we don't generate this,
+ // I've added a manual reflection-based implementation for now.
+ val := reflect.ValueOf(in).Elem()
+ cpy := reflect.New(val.Type())
+ cpy.Elem().Set(val)
+}
+
+func (in *DashboardSpec) DeepCopy() *DashboardSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(DashboardSpec)
+ in.DeepCopyInto(out)
+ return out
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/doc.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/doc.go
new file mode 100644
index 00000000000..c4f1d65781e
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/doc.go
@@ -0,0 +1,10 @@
+// +k8s:openapi-gen=true
+// +k8s:defaulter-gen=TypeMeta
+// +k8s:conversion-gen=github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard
+// +groupName=dashboard.grafana.app
+
+// NOTE (@radiohead): we do not use package-wide deepcopy generation
+// because grafana-app-sdk already provides deepcopy functions.
+// Kinds which are not generated by the SDK are explicitly opted in to deepcopy generation.
+
+package v2alpha1 // import "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1"
diff --git a/pkg/apis/dashboard/v2alpha1/register.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/register.go
similarity index 93%
rename from pkg/apis/dashboard/v2alpha1/register.go
rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/register.go
index 8ee9e149d7a..31aa15a72dd 100644
--- a/pkg/apis/dashboard/v2alpha1/register.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/register.go
@@ -32,7 +32,7 @@ var DashboardResourceInfo = utils.NewResourceInfo(GROUP, VERSION,
if dash != nil {
return []interface{}{
dash.Name,
- dash.Spec.GetNestedString("title"),
+ dash.Spec.Title,
dash.CreationTimestamp.UTC().Format(time.RFC3339),
}, nil
}
@@ -54,14 +54,14 @@ var LibraryPanelResourceInfo = utils.NewResourceInfo(GROUP, VERSION,
{Name: "Created At", Type: "date"},
},
Reader: func(obj any) ([]interface{}, error) {
- dash, ok := obj.(*LibraryPanel)
+ panel, ok := obj.(*LibraryPanel)
if ok {
- if dash != nil {
+ if panel != nil {
return []interface{}{
- dash.Name,
- dash.Spec.Title,
- dash.Spec.Type,
- dash.CreationTimestamp.UTC().Format(time.RFC3339),
+ panel.Name,
+ panel.Spec.Title,
+ panel.Spec.Type,
+ panel.CreationTimestamp.UTC().Format(time.RFC3339),
}, nil
}
}
diff --git a/pkg/apis/dashboard/v2alpha1/types.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go
similarity index 80%
rename from pkg/apis/dashboard/v2alpha1/types.go
rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go
index dd25b2e683b..7cc9d29d149 100644
--- a/pkg/apis/dashboard/v2alpha1/types.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/types.go
@@ -7,40 +7,7 @@ import (
common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
)
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-type Dashboard struct {
- metav1.TypeMeta `json:",inline"`
- // Standard object's metadata
- // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
- // +optional
- metav1.ObjectMeta `json:"metadata,omitempty"`
-
- // The dashboard body (unstructured for now)
- Spec common.Unstructured `json:"spec"`
-
- // Optional dashboard status
- Status *DashboardStatus `json:"status,omitempty"`
-}
-
-type DashboardStatus struct {
- ConversionStatus *ConversionStatus `json:"conversion,omitempty"`
-}
-
-type ConversionStatus struct {
- Failed bool `json:"failed,omitempty"`
- StoredVersion string `json:"storedVersion,omitempty"`
- Error string `json:"error,omitempty"`
-}
-
-// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
-type DashboardList struct {
- metav1.TypeMeta `json:",inline"`
- // +optional
- metav1.ListMeta `json:"metadata,omitempty"`
-
- Items []Dashboard `json:"items,omitempty"`
-}
-
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type DashboardVersionList struct {
metav1.TypeMeta `json:",inline"`
@@ -50,6 +17,7 @@ type DashboardVersionList struct {
Items []DashboardVersionInfo `json:"items,omitempty"`
}
+// +k8s:deepcopy-gen=true
type DashboardVersionInfo struct {
// The internal ID for this version (will be replaced with resourceVersion)
Version int `json:"version"`
@@ -67,6 +35,7 @@ type DashboardVersionInfo struct {
Message string `json:"message,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:conversion-gen:explicit-from=net/url.Values
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type VersionsQueryOptions struct {
@@ -80,6 +49,7 @@ type VersionsQueryOptions struct {
Version int64 `json:"version,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type LibraryPanel struct {
metav1.TypeMeta `json:",inline"`
@@ -95,6 +65,7 @@ type LibraryPanel struct {
Status *LibraryPanelStatus `json:"status,omitempty"`
}
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type LibraryPanelList struct {
metav1.TypeMeta `json:",inline"`
@@ -104,6 +75,7 @@ type LibraryPanelList struct {
Items []LibraryPanel `json:"items,omitempty"`
}
+// +k8s:deepcopy-gen=true
type LibraryPanelSpec struct {
// The panel type
Type string `json:"type"`
@@ -131,6 +103,7 @@ type LibraryPanelSpec struct {
Targets []data.DataQuery `json:"targets,omitempty"`
}
+// +k8s:deepcopy-gen=true
type LibraryPanelStatus struct {
// Translation warnings (mostly things that were in SQL columns but not found in the saved body)
Warnings []string `json:"warnings,omitempty"`
@@ -140,6 +113,7 @@ type LibraryPanelStatus struct {
}
// This is like the legacy DTO where access and metadata are all returned in a single call
+// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type DashboardWithAccessInfo struct {
Dashboard `json:",inline"`
@@ -148,6 +122,7 @@ type DashboardWithAccessInfo struct {
}
// Information about how the requesting user can use a given dashboard
+// +k8s:deepcopy-gen=true
type DashboardAccess struct {
// Metadata fields
Slug string `json:"slug,omitempty"`
@@ -162,11 +137,13 @@ type DashboardAccess struct {
AnnotationsPermissions *AnnotationPermission `json:"annotationsPermissions"`
}
+// +k8s:deepcopy-gen=true
type AnnotationPermission struct {
Dashboard AnnotationActions `json:"dashboard"`
Organization AnnotationActions `json:"organization"`
}
+// +k8s:deepcopy-gen=true
type AnnotationActions struct {
CanAdd bool `json:"canAdd"`
CanEdit bool `json:"canEdit"`
diff --git a/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go
similarity index 99%
rename from pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go
rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go
index 10204d0a3b3..fe4c7479194 100644
--- a/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.conversion.go
@@ -11,7 +11,7 @@ import (
url "net/url"
unsafe "unsafe"
- dashboard "github.com/grafana/grafana/pkg/apis/dashboard"
+ dashboard "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard"
conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime"
)
diff --git a/pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go
similarity index 74%
rename from pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go
rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go
index 36e22f8aeda..6ce617a1d0b 100644
--- a/pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.deepcopy.go
@@ -46,54 +46,6 @@ func (in *AnnotationPermission) DeepCopy() *AnnotationPermission {
return out
}
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ConversionStatus) DeepCopyInto(out *ConversionStatus) {
- *out = *in
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConversionStatus.
-func (in *ConversionStatus) DeepCopy() *ConversionStatus {
- if in == nil {
- return nil
- }
- out := new(ConversionStatus)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Dashboard) DeepCopyInto(out *Dashboard) {
- *out = *in
- out.TypeMeta = in.TypeMeta
- in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
- in.Spec.DeepCopyInto(&out.Spec)
- if in.Status != nil {
- in, out := &in.Status, &out.Status
- *out = new(DashboardStatus)
- (*in).DeepCopyInto(*out)
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Dashboard.
-func (in *Dashboard) DeepCopy() *Dashboard {
- if in == nil {
- return nil
- }
- out := new(Dashboard)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Dashboard) DeepCopyObject() runtime.Object {
- if c := in.DeepCopy(); c != nil {
- return c
- }
- return nil
-}
-
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DashboardAccess) DeepCopyInto(out *DashboardAccess) {
*out = *in
@@ -115,60 +67,6 @@ func (in *DashboardAccess) DeepCopy() *DashboardAccess {
return out
}
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DashboardList) DeepCopyInto(out *DashboardList) {
- *out = *in
- out.TypeMeta = in.TypeMeta
- in.ListMeta.DeepCopyInto(&out.ListMeta)
- if in.Items != nil {
- in, out := &in.Items, &out.Items
- *out = make([]Dashboard, len(*in))
- for i := range *in {
- (*in)[i].DeepCopyInto(&(*out)[i])
- }
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardList.
-func (in *DashboardList) DeepCopy() *DashboardList {
- if in == nil {
- return nil
- }
- out := new(DashboardList)
- in.DeepCopyInto(out)
- return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *DashboardList) DeepCopyObject() runtime.Object {
- if c := in.DeepCopy(); c != nil {
- return c
- }
- return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *DashboardStatus) DeepCopyInto(out *DashboardStatus) {
- *out = *in
- if in.ConversionStatus != nil {
- in, out := &in.ConversionStatus, &out.ConversionStatus
- *out = new(ConversionStatus)
- **out = **in
- }
- return
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardStatus.
-func (in *DashboardStatus) DeepCopy() *DashboardStatus {
- if in == nil {
- return nil
- }
- out := new(DashboardStatus)
- in.DeepCopyInto(out)
- return out
-}
-
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DashboardVersionInfo) DeepCopyInto(out *DashboardVersionInfo) {
*out = *in
diff --git a/pkg/apis/dashboard/v2alpha1/zz_generated.defaults.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.defaults.go
similarity index 100%
rename from pkg/apis/dashboard/v2alpha1/zz_generated.defaults.go
rename to apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.defaults.go
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go
new file mode 100644
index 00000000000..ccb68473004
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go
@@ -0,0 +1,5078 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+// SPDX-License-Identifier: AGPL-3.0-only
+
+// Code generated by openapi-gen. DO NOT EDIT.
+
+package v2alpha1
+
+import (
+ common "k8s.io/kube-openapi/pkg/common"
+ spec "k8s.io/kube-openapi/pkg/validation/spec"
+)
+
+func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition {
+ return map[string]common.OpenAPIDefinition{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationActions": schema_pkg_apis_dashboard_v2alpha1_AnnotationActions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationPermission": schema_pkg_apis_dashboard_v2alpha1_AnnotationPermission(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.Dashboard": schema_pkg_apis_dashboard_v2alpha1_Dashboard(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAccess": schema_pkg_apis_dashboard_v2alpha1_DashboardAccess(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels": schema_pkg_apis_dashboard_v2alpha1_DashboardAdHocFilterWithLabels(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationPanelFilter(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQueryKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec": schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingDataKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingDataSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingGroupKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingGroupSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingTimeIntervalKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingTimeIntervalSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus": schema_pkg_apis_dashboard_v2alpha1_DashboardConversionStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink": schema_pkg_apis_dashboard_v2alpha1_DashboardDashboardLink(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataLink": schema_pkg_apis_dashboard_v2alpha1_DashboardDataLink(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardDataQueryKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef": schema_pkg_apis_dashboard_v2alpha1_DashboardDataSourceRef(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardDataTransformerConfig(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue": schema_pkg_apis_dashboard_v2alpha1_DashboardDynamicConfigValue(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference": schema_pkg_apis_dashboard_v2alpha1_DashboardElementReference(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldColor": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldColor(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfigSource(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKindOrGridLayoutRowKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardJSONCodec": schema_pkg_apis_dashboard_v2alpha1_DashboardJSONCodec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKindSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef": schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelRef(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardList": schema_pkg_apis_dashboard_v2alpha1_DashboardList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardMatcherConfig(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMetadata": schema_pkg_apis_dashboard_v2alpha1_DashboardMetadata(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue": schema_pkg_apis_dashboard_v2alpha1_DashboardMetricFindValue(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKindOrLibraryPanelKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQueryKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQuerySpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardPanelSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryOptionsSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRangeMap": schema_pkg_apis_dashboard_v2alpha1_DashboardRangeMap(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRegexMap": schema_pkg_apis_dashboard_v2alpha1_DashboardRegexMap(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardRepeatOptions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridRepeatOptions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardRowRepeatOptions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardSpecialValueMap(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus": schema_pkg_apis_dashboard_v2alpha1_DashboardStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString": schema_pkg_apis_dashboard_v2alpha1_DashboardStringOrArrayOfString(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64": schema_pkg_apis_dashboard_v2alpha1_DashboardStringOrFloat64(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThreshold": schema_pkg_apis_dashboard_v2alpha1_DashboardThreshold(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardThresholdsConfig(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption": schema_pkg_apis_dashboard_v2alpha1_DashboardTimeRangeOption(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardTimeSettingsSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind": schema_pkg_apis_dashboard_v2alpha1_DashboardTransformationKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1FieldConfigSourceOverrides(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RangeMapOptions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RegexMapOptions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions": schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1SpecialValueMapOptions(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMap(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult": schema_pkg_apis_dashboard_v2alpha1_DashboardValueMappingResult(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption": schema_pkg_apis_dashboard_v2alpha1_DashboardVariableOption(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo": schema_pkg_apis_dashboard_v2alpha1_DashboardVersionInfo(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVersionList": schema_pkg_apis_dashboard_v2alpha1_DashboardVersionList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind": schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigKind(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardWithAccessInfo": schema_pkg_apis_dashboard_v2alpha1_DashboardWithAccessInfo(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanel": schema_pkg_apis_dashboard_v2alpha1_LibraryPanel(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelList": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelList(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelSpec(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus": schema_pkg_apis_dashboard_v2alpha1_LibraryPanelStatus(ref),
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.VersionsQueryOptions": schema_pkg_apis_dashboard_v2alpha1_VersionsQueryOptions(ref),
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_AnnotationActions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "canAdd": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "canEdit": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "canDelete": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"canAdd", "canEdit", "canDelete"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_AnnotationPermission(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "dashboard": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationActions"),
+ },
+ },
+ "organization": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationActions"),
+ },
+ },
+ },
+ Required: []string{"dashboard", "organization"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationActions"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_Dashboard(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Spec is the spec of the Dashboard",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec"),
+ },
+ },
+ "status": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus"),
+ },
+ },
+ },
+ Required: []string{"metadata", "spec", "status"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardAccess(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Information about how the requesting user can use a given dashboard",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "slug": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Metadata fields",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "url": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "canSave": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The permissions part",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "canEdit": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "canAdmin": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "canStar": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "canDelete": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "annotationsPermissions": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationPermission"),
+ },
+ },
+ },
+ Required: []string{"canSave", "canEdit", "canAdmin", "canStar", "canDelete", "annotationsPermissions"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.AnnotationPermission"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardAdHocFilterWithLabels(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Define the AdHocFilterWithLabels type",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "key": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "operator": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "values": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "keyLabel": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "valueLabels": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "forceEdit": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "condition": {
+ SchemaProps: spec.SchemaProps{
+ Description: "@deprecated",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"key", "operator", "value"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Adhoc variable kind",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardAdhocVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Adhoc variable specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "datasource": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"),
+ },
+ },
+ "baseFilters": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels"),
+ },
+ },
+ },
+ },
+ },
+ "filters": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels"),
+ },
+ },
+ },
+ },
+ },
+ "defaultKeys": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue"),
+ },
+ },
+ },
+ },
+ },
+ "label": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "skipUrlSync": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "baseFilters", "filters", "defaultKeys", "hide", "skipUrlSync"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdHocFilterWithLabels", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMetricFindValue"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationPanelFilter(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "exclude": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Should the specified panels be included or excluded",
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "ids": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Panel IDs that should be included or excluded",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "byte",
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"ids"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQueryKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQuerySpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardAnnotationQuerySpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "datasource": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"),
+ },
+ },
+ "query": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"),
+ },
+ },
+ "enable": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "iconColor": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "builtIn": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "filter": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter"),
+ },
+ },
+ },
+ Required: []string{"enable", "hide", "iconColor", "name"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationPanelFilter", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingDataKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingDataSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"value"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingGroupKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingGroupSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "condition": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "items": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"condition", "items"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingTimeIntervalKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingTimeIntervalSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"value"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "ConditionalRenderingVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKind"),
+ },
+ },
+ "ConditionalRenderingDataKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataKind"),
+ },
+ },
+ "ConditionalRenderingTimeIntervalKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalKind"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingDataKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingTimeIntervalKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingVariableKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConditionalRenderingVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "variable": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "operator": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"variable", "operator", "value"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Constant variable kind",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConstantVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Constant variable specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "query": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "current": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ "label": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "skipUrlSync": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "query", "current", "hide", "skipUrlSync"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardConversionStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "ConversionStatus is the status of the conversion of the dashboard.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "failed": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Whether from another version has failed. If true, means that the dashboard is not valid, and the caller should instead fetch the stored version.",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "storedVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The version which was stored when the dashboard was created / updated. Fetching this version should always succeed.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "error": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The error message from the conversion. Empty if the conversion has not failed.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"failed", "storedVersion", "error"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Custom variable kind",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardCustomVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Custom variable specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "query": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "current": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ },
+ },
+ },
+ "multi": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "includeAll": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "allValue": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "label": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "skipUrlSync": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "query", "current", "options", "multi", "includeAll", "hide", "skipUrlSync"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardDashboardLink(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Links with references to other dashboards or external resources",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Title to display with the link",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "type": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Link type. Accepted values are dashboards (to refer to another dashboard) and link (to refer to an external resource) FIXME: The type is generated as `type: DashboardLinkType | dashboardLinkType.Link;` but it should be `type: DashboardLinkType`",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "icon": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Icon name to be displayed with the link",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "tooltip": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Tooltip to display when the user hovers their mouse over it",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "url": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Link URL. Only required/valid if the type is link",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "tags": {
+ SchemaProps: spec.SchemaProps{
+ Description: "List of tags to limit the linked dashboards. If empty, all dashboards will be displayed. Only valid if the type is dashboards",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "asDropdown": {
+ SchemaProps: spec.SchemaProps{
+ Description: "If true, all dashboards links will be displayed in a dropdown. If false, all dashboards links will be displayed side by side. Only valid if the type is dashboards",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "targetBlank": {
+ SchemaProps: spec.SchemaProps{
+ Description: "If true, the link will be opened in a new tab",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "includeVars": {
+ SchemaProps: spec.SchemaProps{
+ Description: "If true, includes current template variables values in the link as query params",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "keepTime": {
+ SchemaProps: spec.SchemaProps{
+ Description: "If true, includes current time range in the link as query params",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"title", "type", "icon", "tooltip", "tags", "asDropdown", "targetBlank", "includeVars", "keepTime"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardDataLink(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "url": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "targetBlank": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"title", "url"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardDataQueryKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The kind of a DataQueryKind is the datasource type",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardDataSourceRef(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "type": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The plugin type-id",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "uid": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Specific datasource instance",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardDataTransformerConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "id": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Unique identifier of transformer",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "disabled": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Disabled transformations are skipped",
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "filter": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Optional frame matcher. When missing it will be applied to all results",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"),
+ },
+ },
+ "topic": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Where to pull DataFrames from as input to transformation",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Options to be passed to the transformer Valid options depend on the transformer id",
+ Type: []string{"object"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"id", "options"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Datasource variable kind",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardDatasourceVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Datasource variable specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "pluginId": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "refresh": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "regex": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "current": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ },
+ },
+ },
+ "multi": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "includeAll": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "allValue": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "label": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "skipUrlSync": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "pluginId", "refresh", "regex", "current", "options", "multi", "includeAll", "hide", "skipUrlSync"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardDynamicConfigValue(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "id": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"id"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardElementReference(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"kind", "name"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldColor(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Map a field to a color.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "mode": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The main color scheme mode.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "fixedColor": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The fixed color value for fixed or shades color modes.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "seriesBy": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Some visualizations need to know how to assign a series color from by value color schemes.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"mode"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "displayName": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The display value for this field. This supports template variables blank is auto",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "displayNameFromDS": {
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Human readable field metadata",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "path": {
+ SchemaProps: spec.SchemaProps{
+ Description: "An explicit path to the field in the datasource. When the frame meta includes a path, This will default to `${frame.meta.path}/${field.name}\n\nWhen defined, this value can be used as an identifier within the datasource scope, and may be used to update the results",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "writeable": {
+ SchemaProps: spec.SchemaProps{
+ Description: "True if data source can write a value to the path. Auth/authz are supported separately",
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "filterable": {
+ SchemaProps: spec.SchemaProps{
+ Description: "True if data source field supports ad-hoc filters",
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "unit": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Unit a field should use. The unit you select is applied to all fields except time. You can use the units ID availables in Grafana or a custom unit. Available units in Grafana: https://github.com/grafana/grafana/blob/main/packages/grafana-data/src/valueFormats/categories.ts As custom unit, you can use the following formats: `suffix:` for custom unit that should go after value. `prefix:` for custom unit that should go before value. `time:` For custom date time formats type for example `time:YYYY-MM-DD`. `si:` for custom SI units. For example: `si: mF`. This one is a bit more advanced as you can specify both a unit and the source data scale. So if your source data is represented as milli (thousands of) something prefix the unit with that SI scale character. `count:` for a custom count unit. `currency:` for custom a currency unit.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "decimals": {
+ SchemaProps: spec.SchemaProps{
+ Description: "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`.",
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ "min": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The minimum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields.",
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ "max": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The maximum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields.",
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ "mappings": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Convert input values into a display string",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap"),
+ },
+ },
+ },
+ },
+ },
+ "thresholds": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Map numeric values to states",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig"),
+ },
+ },
+ "color": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Panel color configuration",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldColor"),
+ },
+ },
+ "links": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The behavior when clicking on a result",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "noValue": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Alternative to empty string",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "custom": {
+ SchemaProps: spec.SchemaProps{
+ Description: "custom is specified by the FieldConfig field in panel plugin schemas.",
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldColor", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThresholdsConfig", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfigSource(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "defaults": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Defaults are the options applied to all fields.",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig"),
+ },
+ },
+ "overrides": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Overrides are the options applied to specific fields overriding the defaults.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"defaults", "overrides"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1FieldConfigSourceOverrides"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKindOrGridLayoutRowKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "GridLayoutItemKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"),
+ },
+ },
+ "GridLayoutRowKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "x": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "y": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "width": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "height": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "element": {
+ SchemaProps: spec.SchemaProps{
+ Description: "reference to a PanelKind from dashboard.spec.elements Expressed as JSON Schema reference",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference"),
+ },
+ },
+ "repeat": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions"),
+ },
+ },
+ },
+ Required: []string{"x", "y", "width", "height", "element"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRepeatOptions"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "GridLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"),
+ },
+ },
+ "ResponsiveGridLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"),
+ },
+ },
+ "TabsLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "GridLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"),
+ },
+ },
+ "RowsLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"),
+ },
+ },
+ "ResponsiveGridLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "GridLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind"),
+ },
+ },
+ "RowsLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind"),
+ },
+ },
+ "ResponsiveGridLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind"),
+ },
+ },
+ "TabsLayoutKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "y": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "collapsed": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "elements": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"),
+ },
+ },
+ },
+ },
+ },
+ "repeat": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"),
+ },
+ },
+ },
+ Required: []string{"y", "collapsed", "title", "elements"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "items": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"items"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Group variable kind",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "GroupBy variable specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "datasource": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"),
+ },
+ },
+ "current": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ },
+ },
+ },
+ "multi": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "label": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "skipUrlSync": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "current", "options", "multi", "hide", "skipUrlSync"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Interval variable kind",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardIntervalVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Interval variable specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "query": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "current": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ },
+ },
+ },
+ "auto": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "auto_min": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "auto_count": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "refresh": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "label": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "skipUrlSync": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "query", "current", "options", "auto", "auto_min", "auto_count", "refresh", "hide", "skipUrlSync"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardJSONCodec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "DashboardJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding",
+ Type: []string{"object"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKindSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelKindSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "id": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Panel ID for the library panel in the dashboard",
+ Default: 0,
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Title for the library panel in the dashboard",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "libraryPanel": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef"),
+ },
+ },
+ },
+ Required: []string{"id", "title", "libraryPanel"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelRef"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardLibraryPanelRef(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Library panel name",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "uid": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Library panel uid",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "uid"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardList(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
+ },
+ },
+ "items": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.Dashboard"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"metadata", "items"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.Dashboard", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardMatcherConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Matcher is a predicate configuration. Based on the config a set of field(s) or values is filtered in order to apply override / transformation. It comes with in id ( to resolve implementation from registry) and a configuration that’s specific to a particular matcher type.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "id": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The matcher id. This is used to find the matcher implementation from registry.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The matcher options. This is specific to the matcher implementation.",
+ Type: []string{"object"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"id"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardMetadata(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "metadata contains embedded CommonMetadata and can be extended with custom string fields without external reference as using the CommonMetadata reference breaks thema codegen.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "updateTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "createdBy": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "uid": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "creationTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "deletionTimestamp": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "date-time",
+ },
+ },
+ "finalizers": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "resourceVersion": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "generation": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "updatedBy": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "labels": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"updateTimestamp", "createdBy", "uid", "creationTimestamp", "finalizers", "resourceVersion", "generation", "updatedBy", "labels"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardMetricFindValue(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Define the MetricFindValue type",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "text": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64"),
+ },
+ },
+ "group": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "expandable": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"text"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrFloat64"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelKindOrLibraryPanelKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "PanelKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKind"),
+ },
+ },
+ "LibraryPanelKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardLibraryPanelKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQueryKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQuerySpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelQuerySpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "query": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"),
+ },
+ },
+ "datasource": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"),
+ },
+ },
+ "refId": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hidden": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"query", "refId", "hidden"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardPanelSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "id": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "links": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataLink"),
+ },
+ },
+ },
+ },
+ },
+ "data": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind"),
+ },
+ },
+ "vizConfig": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind"),
+ },
+ },
+ "transparent": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"id", "title", "description", "links", "data", "vizConfig"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataLink", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryGroupSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryGroupSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "queries": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind"),
+ },
+ },
+ },
+ },
+ },
+ "transformations": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind"),
+ },
+ },
+ },
+ },
+ },
+ "queryOptions": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec"),
+ },
+ },
+ },
+ Required: []string{"queries", "transformations", "queryOptions"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryOptionsSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTransformationKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryOptionsSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "timeFrom": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "maxDataPoints": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "timeShift": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "queryCachingTTL": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "interval": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "cacheTimeout": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hideTimeOverride": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Query variable kind",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "QueryVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind"),
+ },
+ },
+ "TextVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind"),
+ },
+ },
+ "ConstantVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind"),
+ },
+ },
+ "DatasourceVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind"),
+ },
+ },
+ "IntervalVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind"),
+ },
+ },
+ "CustomVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind"),
+ },
+ },
+ "GroupByVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind"),
+ },
+ },
+ "AdhocVariableKind": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAdhocVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConstantVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardCustomVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDatasourceVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardIntervalVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardQueryVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Query variable specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "current": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ "label": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "refresh": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "skipUrlSync": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "datasource": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"),
+ },
+ },
+ "query": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind"),
+ },
+ },
+ "regex": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "sort": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "definition": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ },
+ },
+ },
+ "multi": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "includeAll": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "allValue": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "placeholder": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "current", "hide", "refresh", "skipUrlSync", "query", "regex", "sort", "options", "multi", "includeAll"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardRangeMap(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "type": {
+ SchemaProps: spec.SchemaProps{
+ Description: "And this is no longer producing valid TS / Go output type: MappingType & \"range\"",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Range to match against and the result to apply when the value is within the range",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions"),
+ },
+ },
+ },
+ Required: []string{"type", "options"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RangeMapOptions"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardRegexMap(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "type": {
+ SchemaProps: spec.SchemaProps{
+ Description: "And this is no longer producing valid TS / Go output type: MappingType & \"regex\"",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Regular expression to match against and the result to apply when the value matches the regex",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions"),
+ },
+ },
+ },
+ Required: []string{"type", "options"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1RegexMapOptions"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardRepeatOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "mode": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "direction": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "maxPerRow": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ },
+ Required: []string{"mode", "value"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutItemSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "element": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference"),
+ },
+ },
+ "repeat": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"),
+ },
+ },
+ "conditionalRendering": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind"),
+ },
+ },
+ },
+ Required: []string{"element"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardElementReference", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridRepeatOptions"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridLayoutSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "row": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "col": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "items": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"row", "col", "items"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardResponsiveGridLayoutItemKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardResponsiveGridRepeatOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "mode": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"mode", "value"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardRowRepeatOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "mode": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"mode", "value"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutRowSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "collapsed": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "conditionalRendering": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind"),
+ },
+ },
+ "repeat": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"),
+ },
+ },
+ "layout": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind"),
+ },
+ },
+ },
+ Required: []string{"collapsed", "layout"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConditionalRenderingGroupKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardRowsLayoutSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "rows": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"rows"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowsLayoutRowKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "annotations": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Title of dashboard.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind"),
+ },
+ },
+ },
+ },
+ },
+ "cursorSync": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Configuration of dashboard cursor sync behavior. \"Off\" for no shared crosshair or tooltip (default). \"Crosshair\" for shared crosshair. \"Tooltip\" for shared crosshair AND shared tooltip.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Description of dashboard.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "editable": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Whether a dashboard is editable or not.",
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "elements": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind"),
+ },
+ },
+ },
+ },
+ },
+ "layout": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind"),
+ },
+ },
+ "links": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Links with references to other dashboards or external websites.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink"),
+ },
+ },
+ },
+ },
+ },
+ "liveNow": {
+ SchemaProps: spec.SchemaProps{
+ Description: "When set to true, the dashboard will redraw panels at an interval matching the pixel width. This will keep data \"moving left\" regardless of the query refresh rate. This setting helps avoid dashboards presenting stale live data.",
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "preload": {
+ SchemaProps: spec.SchemaProps{
+ Description: "When set to true, the dashboard will load all panels in the dashboard when it's loaded.",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "revision": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Plugins only. The version of the dashboard installed together with the plugin. This is used to determine if the dashboard should be updated when the plugin is updated.",
+ Type: []string{"integer"},
+ Format: "int32",
+ },
+ },
+ "tags": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Tags associated with dashboard.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "timeSettings": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec"),
+ },
+ },
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Title of dashboard.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "variables": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Configured template variables.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"annotations", "cursorSync", "elements", "layout", "links", "preload", "tags", "timeSettings", "title", "variables"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAnnotationQueryKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDashboardLink", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardPanelKindOrLibraryPanelKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeSettingsSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardSpecialValueMap(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "type": {
+ SchemaProps: spec.SchemaProps{
+ Description: "And this is no longer producing valid TS / Go output type: MappingType & \"special\"",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions"),
+ },
+ },
+ },
+ Required: []string{"type", "options"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardV2alpha1SpecialValueMapOptions"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "conversion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Optional conversion status.",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardConversionStatus"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardStringOrArrayOfString(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "String": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "ArrayOfString": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardStringOrFloat64(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "String": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "Float64": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ },
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "tabs": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"tabs"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTabsLayoutTabSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTabsLayoutTabSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "layout": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind"),
+ },
+ },
+ },
+ Required: []string{"layout"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Text variable kind",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTextVariableSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTextVariableSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Text variable specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "name": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "current": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"),
+ },
+ },
+ "query": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "label": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "hide": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "skipUrlSync": {
+ SchemaProps: spec.SchemaProps{
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"name", "current", "query", "hide", "skipUrlSync"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardThreshold(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Default: 0,
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ "color": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"value", "color"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardThresholdsConfig(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "mode": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "steps": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThreshold"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"mode", "steps"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardThreshold"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTimeRangeOption(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "display": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "from": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "to": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"display", "from", "to"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTimeSettingsSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Time configuration It defines the default time config for the time picker, the refresh picker for the specific dashboard.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "timezone": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Timezone of dashboard. Accepted values are IANA TZDB zone ID or \"browser\" or \"utc\".",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "from": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Start time range for dashboard. Accepted values are relative time strings like \"now-6h\" or absolute time strings like \"2020-07-10T08:00:00.000Z\".",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "to": {
+ SchemaProps: spec.SchemaProps{
+ Description: "End time range for dashboard. Accepted values are relative time strings like \"now-6h\" or absolute time strings like \"2020-07-10T08:00:00.000Z\".",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "autoRefresh": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Refresh rate of dashboard. Represented via interval string, e.g. \"5s\", \"1m\", \"1h\", \"1d\". v1: refresh",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "autoRefreshIntervals": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Interval options available in the refresh picker dropdown. v1: timepicker.refresh_intervals",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "quickRanges": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Selectable options available in the time picker dropdown. Has no effect on provisioned dashboard. v1: timepicker.quick_ranges , not exposed in the UI",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption"),
+ },
+ },
+ },
+ },
+ },
+ "hideTimepicker": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Whether timepicker is visible or not. v1: timepicker.hidden",
+ Default: false,
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "weekStart": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Day when the week starts. Expressed by the name of the day in lowercase, e.g. \"monday\".",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "fiscalYearStartMonth": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The month that the fiscal year starts on. 0 = January, 11 = December",
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "nowDelay": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values. v1: timepicker.nowDelay",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"from", "to", "autoRefresh", "autoRefreshIntervals", "hideTimepicker", "fiscalYearStartMonth"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardTimeRangeOption"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardTransformationKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The kind of a TransformationKind is the transformation ID",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataTransformerConfig"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1FieldConfigSourceOverrides(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "matcher": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"),
+ },
+ },
+ "properties": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"matcher", "properties"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDynamicConfigValue", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardMatcherConfig"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RangeMapOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "from": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Min value of the range. It can be null which means -Infinity",
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ "to": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Max value of the range. It can be null which means +Infinity",
+ Type: []string{"number"},
+ Format: "double",
+ },
+ },
+ "result": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Config to apply when the value is within the range",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"),
+ },
+ },
+ },
+ Required: []string{"from", "to", "result"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1RegexMapOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "pattern": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Regular expression to match against",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "result": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Config to apply when the value matches the regex",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"),
+ },
+ },
+ },
+ Required: []string{"pattern", "result"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardV2alpha1SpecialValueMapOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "match": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Special value to match against",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "result": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Config to apply when the value matches the special value",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"),
+ },
+ },
+ },
+ Required: []string{"match", "result"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardValueMap(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "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.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "type": {
+ SchemaProps: spec.SchemaProps{
+ Description: "And this is no longer producing valid TS / Go output type: MappingType & \"value\"",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Map with : ValueMappingResult. For example: { \"10\": { text: \"Perfection!\", color: \"green\" } }",
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"type", "options"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMappingResult"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "ValueMap": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMap"),
+ },
+ },
+ "RangeMap": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRangeMap"),
+ },
+ },
+ "RegexMap": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRegexMap"),
+ },
+ },
+ "SpecialValueMap": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRangeMap", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRegexMap", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpecialValueMap", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardValueMap"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardValueMappingResult(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Result used as replacement with text and color when the value matches",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "text": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Text to display when the value matches",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "color": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Text to use when the value matches",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "icon": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Icon to display when the value matches. Only specific visualizations.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "index": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Position in the mapping array. Only used internally.",
+ Type: []string{"integer"},
+ Format: "int32",
+ },
+ },
+ },
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardVariableOption(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "Variable option specification",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "selected": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Whether the option is selected or not",
+ Type: []string{"boolean"},
+ Format: "",
+ },
+ },
+ "text": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Text to be displayed for the option",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"),
+ },
+ },
+ "value": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Value of the option",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"),
+ },
+ },
+ },
+ Required: []string{"text", "value"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStringOrArrayOfString"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardVersionInfo(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "version": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The internal ID for this version (will be replaced with resourceVersion)",
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int32",
+ },
+ },
+ "parentVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "If the dashboard came from a previous version, it is set here",
+ Type: []string{"integer"},
+ Format: "int32",
+ },
+ },
+ "created": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The creation timestamp for this version",
+ Default: 0,
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ "createdBy": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The user who created this version",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "message": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Message passed while saving the version",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ Required: []string{"version", "created"},
+ },
+ },
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardVersionList(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
+ },
+ },
+ "items": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo"),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVersionInfo", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigKind(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The kind of a VizConfigKind is the plugin ID",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec"),
+ },
+ },
+ },
+ Required: []string{"kind", "spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVizConfigSpec"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardVizConfigSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "--- Kinds ---",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "pluginVersion": {
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "fieldConfig": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource"),
+ },
+ },
+ },
+ Required: []string{"pluginVersion", "options", "fieldConfig"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_DashboardWithAccessInfo(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "This is like the legacy DTO where access and metadata are all returned in a single call",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Spec is the spec of the Dashboard",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec"),
+ },
+ },
+ "status": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus"),
+ },
+ },
+ "access": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAccess"),
+ },
+ },
+ },
+ Required: []string{"metadata", "spec", "status", "access"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardAccess", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_LibraryPanel(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Standard object's metadata More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata",
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+ },
+ },
+ "spec": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Panel properties",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec"),
+ },
+ },
+ "status": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Status will show errors",
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus"),
+ },
+ },
+ },
+ Required: []string{"spec"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelSpec", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanelStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_LibraryPanelList(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
+ },
+ },
+ "items": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanel"),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.LibraryPanel", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_LibraryPanelSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "type": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The panel type",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "pluginVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The panel type",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "title": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The panel title",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "description": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Library panel description",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "options": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The options schema depends on the panel type",
+ Ref: ref("github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"),
+ },
+ },
+ "fieldConfig": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The fieldConfig schema depends on the panel type",
+ Ref: ref("github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"),
+ },
+ },
+ "datasource": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The default datasource type",
+ Ref: ref("github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1.DataSourceRef"),
+ },
+ },
+ "targets": {
+ VendorExtensible: spec.VendorExtensible{
+ Extensions: spec.Extensions{
+ "x-kubernetes-list-type": "set",
+ },
+ },
+ SchemaProps: spec.SchemaProps{
+ Description: "The datasource queries",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1.DataQuery"),
+ },
+ },
+ },
+ },
+ },
+ },
+ Required: []string{"type", "options", "fieldConfig"},
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1.DataQuery", "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1.DataSourceRef", "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_LibraryPanelStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "warnings": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Translation warnings (mostly things that were in SQL columns but not found in the saved body)",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "missing": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The properties previously stored in SQL that are not included in this model",
+ Ref: ref("github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1.Unstructured"},
+ }
+}
+
+func schema_pkg_apis_dashboard_v2alpha1_VersionsQueryOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "kind": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "apiVersion": {
+ SchemaProps: spec.SchemaProps{
+ Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "path": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Path is the URL path",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "version": {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"integer"},
+ Format: "int64",
+ },
+ },
+ },
+ },
+ },
+ }
+}
diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list
new file mode 100644
index 00000000000..31084da6e9f
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list
@@ -0,0 +1,69 @@
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdHocFilterWithLabels,ValueLabels
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdHocFilterWithLabels,Values
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,BaseFilters
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,DefaultKeys
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardAdhocVariableSpec,Filters
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingGroupSpec,Items
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardCustomVariableSpec,Options
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardDashboardLink,Tags
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardDatasourceVariableSpec,Options
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfig,Links
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfig,Mappings
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfigSource,Overrides
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutRowSpec,Elements
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutSpec,Items
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGroupByVariableSpec,Options
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,Options
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardMetadata,Finalizers
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardPanelSpec,Links
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryGroupSpec,Queries
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryGroupSpec,Transformations
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableSpec,Options
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardResponsiveGridLayoutSpec,Items
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardRowsLayoutSpec,Rows
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardSpec,Annotations
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardSpec,Links
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardSpec,Tags
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardSpec,Variables
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,ArrayOfString
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardTabsLayoutSpec,Tabs
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardThresholdsConfig,Steps
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardTimeSettingsSpec,AutoRefreshIntervals
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardTimeSettingsSpec,QuickRanges
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardV2alpha1FieldConfigSourceOverrides,Properties
+API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,LibraryPanelStatus,Warnings
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind,ConditionalRenderingDataKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind,ConditionalRenderingTimeIntervalKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeIntervalKind,ConditionalRenderingVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutItemKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutRowKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,GridLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,ResponsiveGridLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,TabsLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,GridLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,ResponsiveGridLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKind,RowsLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,GridLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,ResponsiveGridLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,RowsLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind,TabsLayoutKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,AutoCount
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,AutoMin
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardPanelKindOrLibraryPanelKind,LibraryPanelKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardPanelKindOrLibraryPanelKind,PanelKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,AdhocVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,ConstantVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,CustomVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,DatasourceVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,GroupByVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,IntervalVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,QueryVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKindOrDatasourceVariableKindOrIntervalVariableKindOrCustomVariableKindOrGroupByVariableKindOrAdhocVariableKind,TextVariableKind
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,ArrayOfString
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrArrayOfString,String
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrFloat64,Float64
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardStringOrFloat64,String
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,RangeMap
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,RegexMap
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,SpecialValueMap
+API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,ValueMap
diff --git a/apps/dashboard/pkg/apis/dashboard_manifest.go b/apps/dashboard/pkg/apis/dashboard_manifest.go
new file mode 100644
index 00000000000..bc68fa86ca6
--- /dev/null
+++ b/apps/dashboard/pkg/apis/dashboard_manifest.go
@@ -0,0 +1,53 @@
+//
+// This file is generated by grafana-app-sdk
+// DO NOT EDIT
+//
+
+package apis
+
+import (
+ "encoding/json"
+
+ "github.com/grafana/grafana-app-sdk/app"
+)
+
+var ()
+
+var appManifestData = app.ManifestData{
+ AppName: "dashboard",
+ Group: "dashboard.grafana.app",
+ Kinds: []app.ManifestKind{
+ {
+ Kind: "Dashboard",
+ Scope: "Namespaced",
+ Conversion: false,
+ Versions: []app.ManifestKindVersion{
+ {
+ Name: "v0alpha1",
+ },
+
+ {
+ Name: "v1alpha1",
+ },
+
+ {
+ Name: "v2alpha1",
+ },
+ },
+ },
+ },
+}
+
+func jsonToMap(j string) map[string]any {
+ m := make(map[string]any)
+ json.Unmarshal([]byte(j), &j)
+ return m
+}
+
+func LocalManifest() app.Manifest {
+ return app.NewEmbeddedManifest(appManifestData)
+}
+
+func RemoteManifest() app.Manifest {
+ return app.NewAPIServerManifest("dashboard")
+}
diff --git a/apps/dashboard/pkg/migration/conversion/conversion.go b/apps/dashboard/pkg/migration/conversion/conversion.go
new file mode 100644
index 00000000000..7058230eba2
--- /dev/null
+++ b/apps/dashboard/pkg/migration/conversion/conversion.go
@@ -0,0 +1,173 @@
+package conversion
+
+import (
+ "k8s.io/apimachinery/pkg/conversion"
+ "k8s.io/apimachinery/pkg/runtime"
+
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1"
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1"
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
+)
+
+func RegisterConversions(s *runtime.Scheme) error {
+ if err := s.AddConversionFunc((*v0alpha1.Dashboard)(nil), (*v1alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_V0_to_V1(a.(*v0alpha1.Dashboard), b.(*v1alpha1.Dashboard), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddConversionFunc((*v0alpha1.Dashboard)(nil), (*v2alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_V0_to_V2(a.(*v0alpha1.Dashboard), b.(*v2alpha1.Dashboard), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddConversionFunc((*v1alpha1.Dashboard)(nil), (*v0alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_V1_to_V0(a.(*v1alpha1.Dashboard), b.(*v0alpha1.Dashboard), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddConversionFunc((*v1alpha1.Dashboard)(nil), (*v2alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_V1_to_V2(a.(*v1alpha1.Dashboard), b.(*v2alpha1.Dashboard), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddConversionFunc((*v2alpha1.Dashboard)(nil), (*v0alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_V2_to_V0(a.(*v2alpha1.Dashboard), b.(*v0alpha1.Dashboard), scope)
+ }); err != nil {
+ return err
+ }
+ if err := s.AddConversionFunc((*v2alpha1.Dashboard)(nil), (*v1alpha1.Dashboard)(nil), func(a, b interface{}, scope conversion.Scope) error {
+ return Convert_V2_to_V1(a.(*v2alpha1.Dashboard), b.(*v1alpha1.Dashboard), scope)
+ }); err != nil {
+ return err
+ }
+ return nil
+}
+
+func Convert_V0_to_V1(in *v0alpha1.Dashboard, out *v1alpha1.Dashboard, scope conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+
+ out.Spec.Object = in.Spec.Object
+
+ out.Status = v1alpha1.DashboardStatus{
+ Conversion: &v1alpha1.DashboardConversionStatus{
+ StoredVersion: v0alpha1.VERSION,
+ },
+ }
+
+ if err := migration.Migrate(out.Spec.Object, schemaversion.LATEST_VERSION); err != nil {
+ out.Status.Conversion.Failed = true
+ out.Status.Conversion.Error = err.Error()
+ }
+
+ return nil
+}
+
+func Convert_V0_to_V2(in *v0alpha1.Dashboard, out *v2alpha1.Dashboard, scope conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+
+ // TODO (@radiohead): implement V0 to V2 conversion
+ // This is the bare minimum conversion that is needed to make the dashboard servable.
+
+ if v, ok := in.Spec.Object["title"]; ok {
+ if title, ok := v.(string); ok {
+ out.Spec.Title = title
+ }
+ }
+
+ // We need to make sure the layout is set to some value, otherwise the JSON marshaling will fail.
+ out.Spec.Layout = v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind{
+ GridLayoutKind: &v2alpha1.DashboardGridLayoutKind{
+ Kind: "GridLayout",
+ Spec: v2alpha1.DashboardGridLayoutSpec{},
+ },
+ }
+
+ out.Status = v2alpha1.DashboardStatus{
+ Conversion: &v2alpha1.DashboardConversionStatus{
+ StoredVersion: v0alpha1.VERSION,
+ Failed: true,
+ Error: "backend conversion not yet implemented",
+ },
+ }
+
+ return nil
+}
+
+func Convert_V1_to_V0(in *v1alpha1.Dashboard, out *v0alpha1.Dashboard, scope conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+
+ out.Spec.Object = in.Spec.Object
+
+ out.Status = v0alpha1.DashboardStatus{
+ Conversion: &v0alpha1.DashboardConversionStatus{
+ StoredVersion: v1alpha1.VERSION,
+ },
+ }
+
+ return nil
+}
+
+func Convert_V1_to_V2(in *v1alpha1.Dashboard, out *v2alpha1.Dashboard, scope conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+
+ // TODO (@radiohead): implement V1 to V2 conversion
+ // This is the bare minimum conversion that is needed to make the dashboard servable.
+
+ if v, ok := in.Spec.Object["title"]; ok {
+ if title, ok := v.(string); ok {
+ out.Spec.Title = title
+ }
+ }
+
+ // We need to make sure the layout is set to some value, otherwise the JSON marshaling will fail.
+ out.Spec.Layout = v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrResponsiveGridLayoutKindOrTabsLayoutKind{
+ GridLayoutKind: &v2alpha1.DashboardGridLayoutKind{
+ Kind: "GridLayout",
+ Spec: v2alpha1.DashboardGridLayoutSpec{},
+ },
+ }
+
+ out.Status = v2alpha1.DashboardStatus{
+ Conversion: &v2alpha1.DashboardConversionStatus{
+ StoredVersion: v1alpha1.VERSION,
+ Failed: true,
+ Error: "backend conversion not yet implemented",
+ },
+ }
+
+ return nil
+}
+
+func Convert_V2_to_V0(in *v2alpha1.Dashboard, out *v0alpha1.Dashboard, scope conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+
+ // TODO: implement V2 to V0 conversion
+
+ out.Status = v0alpha1.DashboardStatus{
+ Conversion: &v0alpha1.DashboardConversionStatus{
+ StoredVersion: v2alpha1.VERSION,
+ Failed: true,
+ Error: "backend conversion not yet implemented",
+ },
+ }
+
+ return nil
+}
+
+func Convert_V2_to_V1(in *v2alpha1.Dashboard, out *v1alpha1.Dashboard, scope conversion.Scope) error {
+ out.ObjectMeta = in.ObjectMeta
+
+ // TODO: implement V2 to V1 conversion
+
+ out.Status = v1alpha1.DashboardStatus{
+ Conversion: &v1alpha1.DashboardConversionStatus{
+ StoredVersion: v2alpha1.VERSION,
+ Failed: true,
+ Error: "backend conversion not yet implemented",
+ },
+ }
+
+ return nil
+}
diff --git a/apps/dashboard/pkg/migration/conversion/conversion_test.go b/apps/dashboard/pkg/migration/conversion/conversion_test.go
new file mode 100644
index 00000000000..23cbd9fc2ba
--- /dev/null
+++ b/apps/dashboard/pkg/migration/conversion/conversion_test.go
@@ -0,0 +1,47 @@
+package conversion
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1"
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1alpha1"
+ "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1"
+ common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
+ "github.com/grafana/grafana/pkg/apimachinery/utils"
+)
+
+func TestConversionMatrixExist(t *testing.T) {
+ versions := []v1.Object{
+ &v0alpha1.Dashboard{Spec: common.Unstructured{Object: map[string]any{"title": "dashboardV0"}}},
+ &v1alpha1.Dashboard{Spec: common.Unstructured{Object: map[string]any{"title": "dashboardV1"}}},
+ &v2alpha1.Dashboard{Spec: v2alpha1.DashboardSpec{Title: "dashboardV2"}},
+ }
+
+ scheme := runtime.NewScheme()
+ err := RegisterConversions(scheme)
+ require.NoError(t, err)
+
+ for idx, in := range versions {
+ kind := fmt.Sprintf("%T", in)[1:]
+ t.Run(kind, func(t *testing.T) {
+ for i, out := range versions {
+ if i == idx {
+ continue // skip the same version
+ }
+ err = scheme.Convert(in, out, nil)
+ require.NoError(t, err)
+ }
+
+ // Make sure we get the right title for each value
+ meta, err := utils.MetaAccessor(in)
+ require.NoError(t, err)
+ require.True(t, strings.HasPrefix(meta.FindTitle(""), "dashboard"))
+ })
+ }
+}
diff --git a/pkg/apis/dashboard/migration/migrate.go b/apps/dashboard/pkg/migration/migrate.go
similarity index 69%
rename from pkg/apis/dashboard/migration/migrate.go
rename to apps/dashboard/pkg/migration/migrate.go
index 2a419596767..0f8992e6d2d 100644
--- a/pkg/apis/dashboard/migration/migrate.go
+++ b/apps/dashboard/pkg/migration/migrate.go
@@ -1,6 +1,6 @@
package migration
-import "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion"
+import "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
func Migrate(dash map[string]interface{}, targetVersion int) error {
if dash == nil {
@@ -9,6 +9,12 @@ func Migrate(dash map[string]interface{}, targetVersion int) error {
inputVersion := schemaversion.GetSchemaVersion(dash)
dash["schemaVersion"] = inputVersion
+ // If the schema version is older than the minimum version, with migration support,
+ // we don't migrate the dashboard.
+ if inputVersion < schemaversion.MIN_VERSION {
+ return schemaversion.NewMigrationError("schema version is too old", inputVersion, schemaversion.MIN_VERSION)
+ }
+
for nextVersion := inputVersion + 1; nextVersion <= targetVersion; nextVersion++ {
if migration, ok := schemaversion.Migrations[nextVersion]; ok {
if err := migration(dash); err != nil {
diff --git a/pkg/apis/dashboard/migration/migrate_test.go b/apps/dashboard/pkg/migration/migrate_test.go
similarity index 86%
rename from pkg/apis/dashboard/migration/migrate_test.go
rename to apps/dashboard/pkg/migration/migrate_test.go
index e037c37f00f..ef2a3468ce0 100644
--- a/pkg/apis/dashboard/migration/migrate_test.go
+++ b/apps/dashboard/pkg/migration/migrate_test.go
@@ -11,8 +11,8 @@ import (
"github.com/stretchr/testify/require"
- "github.com/grafana/grafana/pkg/apis/dashboard/migration"
- "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
)
const INPUT_DIR = "testdata/input"
@@ -22,6 +22,15 @@ func TestMigrate(t *testing.T) {
files, err := os.ReadDir(INPUT_DIR)
require.NoError(t, err)
+ t.Run("minimum version check", func(t *testing.T) {
+ err := migration.Migrate(map[string]interface{}{
+ "schemaVersion": schemaversion.MIN_VERSION - 1,
+ }, schemaversion.MIN_VERSION)
+
+ var minVersionErr = schemaversion.NewMigrationError("schema version is too old", schemaversion.MIN_VERSION-1, schemaversion.MIN_VERSION)
+ require.ErrorAs(t, err, &minVersionErr)
+ })
+
for _, f := range files {
if f.IsDir() {
continue
diff --git a/pkg/apis/dashboard/migration/schemaversion/errors.go b/apps/dashboard/pkg/migration/schemaversion/errors.go
similarity index 55%
rename from pkg/apis/dashboard/migration/schemaversion/errors.go
rename to apps/dashboard/pkg/migration/schemaversion/errors.go
index f5bbbe7d1fa..ee98593219d 100644
--- a/pkg/apis/dashboard/migration/schemaversion/errors.go
+++ b/apps/dashboard/pkg/migration/schemaversion/errors.go
@@ -23,3 +23,17 @@ type MigrationError struct {
func (e *MigrationError) Error() string {
return fmt.Errorf("schema migration from version %d to %d failed: %v", e.currentVersion, e.targetVersion, e.msg).Error()
}
+
+// MinimumVersionError is an error that is returned when the schema version is below the minimum version.
+func NewMinimumVersionError(inputVersion int) *MinimumVersionError {
+ return &MinimumVersionError{inputVersion: inputVersion}
+}
+
+// MinimumVersionError is an error type for minimum version errors.
+type MinimumVersionError struct {
+ inputVersion int
+}
+
+func (e *MinimumVersionError) Error() string {
+ return fmt.Errorf("input schema version is below minimum version. input: %d minimum: %d", e.inputVersion, MIN_VERSION).Error()
+}
diff --git a/pkg/apis/dashboard/migration/schemaversion/migrations.go b/apps/dashboard/pkg/migration/schemaversion/migrations.go
similarity index 90%
rename from pkg/apis/dashboard/migration/schemaversion/migrations.go
rename to apps/dashboard/pkg/migration/schemaversion/migrations.go
index 3d83da73a3f..81bdd545dc6 100644
--- a/pkg/apis/dashboard/migration/schemaversion/migrations.go
+++ b/apps/dashboard/pkg/migration/schemaversion/migrations.go
@@ -4,7 +4,10 @@ import "strconv"
type SchemaVersionMigrationFunc func(map[string]interface{}) error
-const LATEST_VERSION = 41
+const (
+ MIN_VERSION = 36
+ LATEST_VERSION = 41
+)
var Migrations = map[int]SchemaVersionMigrationFunc{
37: V37,
diff --git a/pkg/apis/dashboard/migration/schemaversion/migrations_test.go b/apps/dashboard/pkg/migration/schemaversion/migrations_test.go
similarity index 95%
rename from pkg/apis/dashboard/migration/schemaversion/migrations_test.go
rename to apps/dashboard/pkg/migration/schemaversion/migrations_test.go
index b20f7e4f561..02918b7b8fa 100644
--- a/pkg/apis/dashboard/migration/schemaversion/migrations_test.go
+++ b/apps/dashboard/pkg/migration/schemaversion/migrations_test.go
@@ -3,7 +3,7 @@ package schemaversion_test
import (
"testing"
- "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
"github.com/stretchr/testify/require"
)
diff --git a/pkg/apis/dashboard/migration/schemaversion/v37.go b/apps/dashboard/pkg/migration/schemaversion/v37.go
similarity index 100%
rename from pkg/apis/dashboard/migration/schemaversion/v37.go
rename to apps/dashboard/pkg/migration/schemaversion/v37.go
diff --git a/pkg/apis/dashboard/migration/schemaversion/v37_test.go b/apps/dashboard/pkg/migration/schemaversion/v37_test.go
similarity index 98%
rename from pkg/apis/dashboard/migration/schemaversion/v37_test.go
rename to apps/dashboard/pkg/migration/schemaversion/v37_test.go
index e0b2f4c27cb..71bafee584c 100644
--- a/pkg/apis/dashboard/migration/schemaversion/v37_test.go
+++ b/apps/dashboard/pkg/migration/schemaversion/v37_test.go
@@ -3,7 +3,7 @@ package schemaversion_test
import (
"testing"
- "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
)
func TestV37(t *testing.T) {
diff --git a/pkg/apis/dashboard/migration/schemaversion/v38.go b/apps/dashboard/pkg/migration/schemaversion/v38.go
similarity index 100%
rename from pkg/apis/dashboard/migration/schemaversion/v38.go
rename to apps/dashboard/pkg/migration/schemaversion/v38.go
diff --git a/pkg/apis/dashboard/migration/schemaversion/v38_test.go b/apps/dashboard/pkg/migration/schemaversion/v38_test.go
similarity index 98%
rename from pkg/apis/dashboard/migration/schemaversion/v38_test.go
rename to apps/dashboard/pkg/migration/schemaversion/v38_test.go
index f4bbb8c9cb6..9725fd3af66 100644
--- a/pkg/apis/dashboard/migration/schemaversion/v38_test.go
+++ b/apps/dashboard/pkg/migration/schemaversion/v38_test.go
@@ -3,7 +3,7 @@ package schemaversion_test
import (
"testing"
- "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
)
func TestV38(t *testing.T) {
diff --git a/pkg/apis/dashboard/migration/schemaversion/v39.go b/apps/dashboard/pkg/migration/schemaversion/v39.go
similarity index 100%
rename from pkg/apis/dashboard/migration/schemaversion/v39.go
rename to apps/dashboard/pkg/migration/schemaversion/v39.go
diff --git a/pkg/apis/dashboard/migration/schemaversion/v39_test.go b/apps/dashboard/pkg/migration/schemaversion/v39_test.go
similarity index 97%
rename from pkg/apis/dashboard/migration/schemaversion/v39_test.go
rename to apps/dashboard/pkg/migration/schemaversion/v39_test.go
index d204d31f0cf..2eab71718cc 100644
--- a/pkg/apis/dashboard/migration/schemaversion/v39_test.go
+++ b/apps/dashboard/pkg/migration/schemaversion/v39_test.go
@@ -3,7 +3,7 @@ package schemaversion_test
import (
"testing"
- "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
)
func TestV39(t *testing.T) {
diff --git a/pkg/apis/dashboard/migration/schemaversion/v40.go b/apps/dashboard/pkg/migration/schemaversion/v40.go
similarity index 100%
rename from pkg/apis/dashboard/migration/schemaversion/v40.go
rename to apps/dashboard/pkg/migration/schemaversion/v40.go
diff --git a/pkg/apis/dashboard/migration/schemaversion/v40_test.go b/apps/dashboard/pkg/migration/schemaversion/v40_test.go
similarity index 94%
rename from pkg/apis/dashboard/migration/schemaversion/v40_test.go
rename to apps/dashboard/pkg/migration/schemaversion/v40_test.go
index 179a2fbf655..041ac473f5d 100644
--- a/pkg/apis/dashboard/migration/schemaversion/v40_test.go
+++ b/apps/dashboard/pkg/migration/schemaversion/v40_test.go
@@ -3,7 +3,7 @@ package schemaversion_test
import (
"testing"
- "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
)
func TestV40(t *testing.T) {
diff --git a/pkg/apis/dashboard/migration/schemaversion/v41.go b/apps/dashboard/pkg/migration/schemaversion/v41.go
similarity index 100%
rename from pkg/apis/dashboard/migration/schemaversion/v41.go
rename to apps/dashboard/pkg/migration/schemaversion/v41.go
diff --git a/pkg/apis/dashboard/migration/schemaversion/v41_test.go b/apps/dashboard/pkg/migration/schemaversion/v41_test.go
similarity index 92%
rename from pkg/apis/dashboard/migration/schemaversion/v41_test.go
rename to apps/dashboard/pkg/migration/schemaversion/v41_test.go
index d0f11d227f3..642d6ed41a3 100644
--- a/pkg/apis/dashboard/migration/schemaversion/v41_test.go
+++ b/apps/dashboard/pkg/migration/schemaversion/v41_test.go
@@ -3,7 +3,7 @@ package schemaversion_test
import (
"testing"
- "github.com/grafana/grafana/pkg/apis/dashboard/migration/schemaversion"
+ "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
)
func TestV41(t *testing.T) {
diff --git a/pkg/apis/dashboard/migration/testdata/input/36.legend_normalization.json b/apps/dashboard/pkg/migration/testdata/input/36.legend_normalization.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/input/36.legend_normalization.json
rename to apps/dashboard/pkg/migration/testdata/input/36.legend_normalization.json
diff --git a/pkg/apis/dashboard/migration/testdata/input/37.timeseries_table_display_mode.json b/apps/dashboard/pkg/migration/testdata/input/37.timeseries_table_display_mode.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/input/37.timeseries_table_display_mode.json
rename to apps/dashboard/pkg/migration/testdata/input/37.timeseries_table_display_mode.json
diff --git a/pkg/apis/dashboard/migration/testdata/input/38.transform_timeseries_table.json b/apps/dashboard/pkg/migration/testdata/input/38.transform_timeseries_table.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/input/38.transform_timeseries_table.json
rename to apps/dashboard/pkg/migration/testdata/input/38.transform_timeseries_table.json
diff --git a/pkg/apis/dashboard/migration/testdata/input/39.refresh_true.json b/apps/dashboard/pkg/migration/testdata/input/39.refresh_true.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/input/39.refresh_true.json
rename to apps/dashboard/pkg/migration/testdata/input/39.refresh_true.json
diff --git a/pkg/apis/dashboard/migration/testdata/input/40.time_picker_time_options.json b/apps/dashboard/pkg/migration/testdata/input/40.time_picker_time_options.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/input/40.time_picker_time_options.json
rename to apps/dashboard/pkg/migration/testdata/input/40.time_picker_time_options.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.37.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.37.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.37.json
rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.37.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.38.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.38.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.38.json
rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.38.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.39.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.39.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.39.json
rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.39.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.40.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.40.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.40.json
rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.40.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.41.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.41.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/36.legend_normalization.41.json
rename to apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.41.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.38.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.38.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.38.json
rename to apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.38.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.39.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.39.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.39.json
rename to apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.39.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.40.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.40.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.40.json
rename to apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.40.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.41.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.41.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/37.timeseries_table_display_mode.41.json
rename to apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.41.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.39.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.39.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.39.json
rename to apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.39.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.40.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.40.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.40.json
rename to apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.40.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.41.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.41.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/38.transform_timeseries_table.41.json
rename to apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.41.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/39.refresh_true.40.json b/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.40.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/39.refresh_true.40.json
rename to apps/dashboard/pkg/migration/testdata/output/39.refresh_true.40.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/39.refresh_true.41.json b/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.41.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/39.refresh_true.41.json
rename to apps/dashboard/pkg/migration/testdata/output/39.refresh_true.41.json
diff --git a/pkg/apis/dashboard/migration/testdata/output/40.time_picker_time_options.41.json b/apps/dashboard/pkg/migration/testdata/output/40.time_picker_time_options.41.json
similarity index 100%
rename from pkg/apis/dashboard/migration/testdata/output/40.time_picker_time_options.41.json
rename to apps/dashboard/pkg/migration/testdata/output/40.time_picker_time_options.41.json
diff --git a/apps/dashboard/tshack/v0alpha1_spec_gen.ts b/apps/dashboard/tshack/v0alpha1_spec_gen.ts
new file mode 100644
index 00000000000..3de7e52c72e
--- /dev/null
+++ b/apps/dashboard/tshack/v0alpha1_spec_gen.ts
@@ -0,0 +1,7 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+export interface Spec {
+ [key: string]: any;
+}
+
+export const defaultSpec = (): Spec => ({});
diff --git a/apps/dashboard/tshack/v1alpha1_spec_gen.ts b/apps/dashboard/tshack/v1alpha1_spec_gen.ts
new file mode 100644
index 00000000000..3de7e52c72e
--- /dev/null
+++ b/apps/dashboard/tshack/v1alpha1_spec_gen.ts
@@ -0,0 +1,7 @@
+// Code generated - EDITING IS FUTILE. DO NOT EDIT.
+
+export interface Spec {
+ [key: string]: any;
+}
+
+export const defaultSpec = (): Spec => ({});
diff --git a/apps/investigations/go.mod b/apps/investigations/go.mod
index a57bc190e02..aada9c2c3b4 100644
--- a/apps/investigations/go.mod
+++ b/apps/investigations/go.mod
@@ -1,6 +1,6 @@
module github.com/grafana/grafana/apps/investigations
-go 1.23.4
+go 1.23.7
require (
github.com/grafana/grafana-app-sdk v0.31.0
@@ -32,7 +32,7 @@ require (
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/grafana/grafana-app-sdk/logging v0.30.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
@@ -45,32 +45,36 @@ require (
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 // indirect
github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 // indirect
+ github.com/onsi/ginkgo/v2 v2.22.0 // indirect
+ github.com/onsi/gomega v1.36.1 // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
- github.com/prometheus/client_golang v1.20.5 // indirect
+ github.com/prometheus/client_golang v1.21.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
- github.com/spf13/pflag v1.0.5 // indirect
+ github.com/spf13/pflag v1.0.6 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.34.0 // indirect
+ go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect
- go.opentelemetry.io/otel/metric v1.34.0 // indirect
- go.opentelemetry.io/otel/sdk v1.34.0 // indirect
- go.opentelemetry.io/otel/trace v1.34.0 // indirect
+ go.opentelemetry.io/otel/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.35.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
- golang.org/x/net v0.35.0 // indirect
+ golang.org/x/net v0.36.0 // indirect
golang.org/x/oauth2 v0.27.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.29.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/time v0.9.0 // indirect
+ golang.org/x/tools v0.30.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect
google.golang.org/grpc v1.70.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
diff --git a/apps/investigations/go.sum b/apps/investigations/go.sum
index f21718f2a17..129a8163693 100644
--- a/apps/investigations/go.sum
+++ b/apps/investigations/go.sum
@@ -53,8 +53,8 @@ github.com/grafana/grafana-app-sdk v0.31.0 h1:/mFCcx+YqG8cWAi9hePDJQxIdtXDClDIDR
github.com/grafana/grafana-app-sdk v0.31.0/go.mod h1:Xw00NL7qpRLo5r3Gn48Bl1Xn2n4eUDI5pYf/wMufKWs=
github.com/grafana/grafana-app-sdk/logging v0.30.0 h1:K/P/bm7Cp7Di4tqIJ3EQz2+842JozQGRaz62r95ApME=
github.com/grafana/grafana-app-sdk/logging v0.30.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -89,10 +89,10 @@ github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 h1:nZspmSkneBbtxU9Top
github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80/go.mod h1:7tFDb+Y51LcDpn26GccuUgQXUk6t0CXZsivKjyimYX8=
github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 h1:t05Ww3DxZutOqbMN+7OIuqDwXbhl32HiZGpLy26BAPc=
github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o=
-github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
-github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
-github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
-github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
+github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
+github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
+github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw=
+github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -100,8 +100,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
-github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA=
+github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
@@ -112,8 +112,8 @@ github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9p
github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
@@ -126,22 +126,22 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
-go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
-go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
-go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
-go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
-go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
-go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
-go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
-go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
-go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
+go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
+go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
+go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -155,8 +155,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
-golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
+golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -181,17 +181,16 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
-golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
+golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
+golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47 h1:5iw9XJTD4thFidQmFVvx0wi4g5yOHk76rNRUxz1ZG5g=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI=
-google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47/go.mod h1:AfA77qWLcidQWywD0YgqfpJzf50w2VjzBml3TybHeJU=
+google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 h1:fCuMM4fowGzigT89NCIsW57Pk9k2D12MMi2ODn+Nk+o=
+google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
diff --git a/apps/playlist/go.mod b/apps/playlist/go.mod
index 9b03e7fcc38..b8162370ed4 100644
--- a/apps/playlist/go.mod
+++ b/apps/playlist/go.mod
@@ -1,6 +1,6 @@
module github.com/grafana/grafana/apps/playlist
-go 1.23.4
+go 1.23.7
require (
github.com/grafana/grafana-app-sdk v0.31.0
@@ -33,7 +33,7 @@ require (
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/grafana/grafana-app-sdk/logging v0.30.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
@@ -46,32 +46,36 @@ require (
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 // indirect
github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 // indirect
+ github.com/onsi/ginkgo/v2 v2.22.0 // indirect
+ github.com/onsi/gomega v1.36.1 // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
- github.com/prometheus/client_golang v1.20.5 // indirect
+ github.com/prometheus/client_golang v1.21.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
- github.com/spf13/pflag v1.0.5 // indirect
+ github.com/spf13/pflag v1.0.6 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.34.0 // indirect
+ go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect
- go.opentelemetry.io/otel/metric v1.34.0 // indirect
- go.opentelemetry.io/otel/sdk v1.34.0 // indirect
- go.opentelemetry.io/otel/trace v1.34.0 // indirect
+ go.opentelemetry.io/otel/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.35.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
- golang.org/x/net v0.35.0 // indirect
+ golang.org/x/net v0.36.0 // indirect
golang.org/x/oauth2 v0.27.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.29.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/time v0.9.0 // indirect
+ golang.org/x/tools v0.30.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect
google.golang.org/grpc v1.70.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
diff --git a/apps/playlist/go.sum b/apps/playlist/go.sum
index f21718f2a17..129a8163693 100644
--- a/apps/playlist/go.sum
+++ b/apps/playlist/go.sum
@@ -53,8 +53,8 @@ github.com/grafana/grafana-app-sdk v0.31.0 h1:/mFCcx+YqG8cWAi9hePDJQxIdtXDClDIDR
github.com/grafana/grafana-app-sdk v0.31.0/go.mod h1:Xw00NL7qpRLo5r3Gn48Bl1Xn2n4eUDI5pYf/wMufKWs=
github.com/grafana/grafana-app-sdk/logging v0.30.0 h1:K/P/bm7Cp7Di4tqIJ3EQz2+842JozQGRaz62r95ApME=
github.com/grafana/grafana-app-sdk/logging v0.30.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -89,10 +89,10 @@ github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80 h1:nZspmSkneBbtxU9Top
github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80/go.mod h1:7tFDb+Y51LcDpn26GccuUgQXUk6t0CXZsivKjyimYX8=
github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349 h1:t05Ww3DxZutOqbMN+7OIuqDwXbhl32HiZGpLy26BAPc=
github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o=
-github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
-github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
-github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
-github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
+github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
+github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
+github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw=
+github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -100,8 +100,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
-github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA=
+github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
@@ -112,8 +112,8 @@ github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9p
github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
-github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
@@ -126,22 +126,22 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
-go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
-go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
-go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
-go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
-go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
-go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
-go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
-go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
-go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
+go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
+go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
+go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -155,8 +155,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
-golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
+golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -181,17 +181,16 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
-golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
+golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
+golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47 h1:5iw9XJTD4thFidQmFVvx0wi4g5yOHk76rNRUxz1ZG5g=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI=
-google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47/go.mod h1:AfA77qWLcidQWywD0YgqfpJzf50w2VjzBml3TybHeJU=
+google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 h1:fCuMM4fowGzigT89NCIsW57Pk9k2D12MMi2ODn+Nk+o=
+google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
diff --git a/conf/defaults.ini b/conf/defaults.ini
index 492151a87f2..ba04540e320 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -133,7 +133,7 @@ url =
# Set to true or false to enable or disable high availability mode.
# When it's set to false some functions will be simplified and only run in-process
# instead of relying on the database.
-#
+#
# Only set it to false if you run only a single instance of Grafana.
high_availability = true
@@ -198,7 +198,7 @@ type = database
# cache connectionstring options
# database: will use Grafana primary database.
-# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'.
+# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,username=grafana,password=grafanaRocks,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'.
# memcache: 127.0.0.1:11211
connstr =
@@ -1406,6 +1406,14 @@ resolved_alert_retention = 15m
# 0 value means no limit
rule_version_record_limit = 0
+# The retention period for deleted alerting rules.
+# Determines how long deleted rules are retained before being permanently removed.
+# The retention duration must be specified using a time format with unit suffixes
+# such as ms, s, m, h, d (e.g., 30d for 30 days).
+# Default: 30d
+# 0 value means that rules are deleted permanently immediately.
+deleted_rule_retention = 30d
+
[unified_alerting.screenshots]
# Enable screenshots in notifications. You must have either installed the Grafana image rendering
# plugin, or set up Grafana to use a remote rendering service.
@@ -1523,6 +1531,10 @@ basic_auth_password =
# Request timeout for recording rule writes.
timeout = 10s
+# Default data source UID to write to if not specified in the rule definition.
+# Only has effect if the grafanaManagedRecordRulesDatasources feature toggle is enabled.
+default_datasource_uid =
+
# Optional custom headers to include in recording rule write requests.
[recording_rules.custom_headers]
# exampleHeader = exampleValue
@@ -1875,6 +1887,9 @@ rendering_dumpio =
# This can be useful to enable (true) when optimizing the rendering mode settings to improve the plugin performance or when troubleshooting.
rendering_timing_metrics =
+# This is a configuration for OTLP exporter with HTTP protocol, set this URL to enable tracing (ex: http://localhost:4318/v1/traces). Default to empty (tracing disabled).
+rendering_tracing_url =
+
# Additional arguments to pass to the headless browser instance. Default is --no-sandbox. The list of Chromium flags can be found
# here (https://peter.sh/experiments/chromium-command-line-switches/). Multiple arguments is separated with comma-character.
rendering_args =
@@ -1928,6 +1943,15 @@ enable =
# feature1 = true
# feature2 = false
+[feature_toggles.openfeature]
+# This is EXPERIMENTAL. Please, do not use this section
+provider = static
+
+[feature_toggles.openfeature.context]
+# This is EXPERIMENTAL. Please, do not use this section
+# instance = "grafana"
+# version = 11.0.0
+
[date_formats]
# For information on what formatting patterns that are supported https://momentjs.com/docs/#/displaying/
diff --git a/conf/sample.ini b/conf/sample.ini
index f695824f04f..15f94510ba6 100644
--- a/conf/sample.ini
+++ b/conf/sample.ini
@@ -197,7 +197,7 @@
# cache connectionstring options
# database: will use Grafana primary database.
-# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'.
+# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,username=grafana,password=grafanaRocks,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'.
# memcache: 127.0.0.1:11211
;connstr =
@@ -1389,6 +1389,14 @@
# 0 value means no limit
;rule_version_record_limit= 0
+# The retention period for deleted alerting rules.
+# Determines how long deleted rules are retained before being permanently removed.
+# The retention duration must be specified using a time format with unit suffixes
+# such as ms, s, m, h, d (e.g., 30d for 30 days).
+# Default: 30d
+# 0 value means that rules are deleted permanently immediately.
+;deleted_rule_retention = 30d
+
[unified_alerting.screenshots]
# Enable screenshots in notifications. You must have either installed the Grafana image rendering
# plugin, or set up Grafana to use a remote rendering service.
@@ -1505,6 +1513,10 @@ basic_auth_password =
# Request timeout for recording rule writes.
timeout = 30s
+# Default data source UID to write to if not specified in the rule definition.
+# Only has effect if the grafanaManagedRecordRulesDatasources feature toggle is enabled.
+default_datasource_uid =
+
# Optional custom headers to include in recording rule write requests.
[recording_rules.custom_headers]
# exampleHeader = exampleValue
@@ -1809,6 +1821,9 @@ timeout = 30s
# This can be useful to enable (true) when optimizing the rendering mode settings to improve the plugin performance or when troubleshooting.
;rendering_timing_metrics =
+# This is a configuration for OTLP exporter with HTTP protocol, set this URL to enable tracing (ex: http://localhost:4318/v1/traces). Default to empty (tracing disabled).
+;rendering_tracing_url =
+
# Additional arguments to pass to the headless browser instance. Default is --no-sandbox. The list of Chromium flags can be found
# here (https://peter.sh/experiments/chromium-command-line-switches/). Multiple arguments is separated with comma-character.
;rendering_args =
diff --git a/devenv/docker/blocks/prometheus_high_card/go.mod b/devenv/docker/blocks/prometheus_high_card/go.mod
index be940ff6862..8dda4f5d7e2 100644
--- a/devenv/docker/blocks/prometheus_high_card/go.mod
+++ b/devenv/docker/blocks/prometheus_high_card/go.mod
@@ -1,6 +1,6 @@
module high-card
-go 1.22.4
+go 1.23.7
require (
github.com/prometheus/client_golang v1.20.2
@@ -15,6 +15,6 @@ require (
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
- golang.org/x/sys v0.22.0 // indirect
+ golang.org/x/sys v0.30.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
)
diff --git a/devenv/docker/blocks/prometheus_high_card/go.sum b/devenv/docker/blocks/prometheus_high_card/go.sum
index 742cb8092ff..93dcce3f212 100644
--- a/devenv/docker/blocks/prometheus_high_card/go.sum
+++ b/devenv/docker/blocks/prometheus_high_card/go.sum
@@ -20,7 +20,7 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA=
golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
-golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
-golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
+golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
diff --git a/devenv/docker/blocks/prometheus_utf8/go.mod b/devenv/docker/blocks/prometheus_utf8/go.mod
index 706d2d12e81..1202be94ed6 100644
--- a/devenv/docker/blocks/prometheus_utf8/go.mod
+++ b/devenv/docker/blocks/prometheus_utf8/go.mod
@@ -1,9 +1,10 @@
module utf8-support
-go 1.22.4
+go 1.23.7
require (
github.com/prometheus/client_golang v1.20.5
+ github.com/prometheus/common v0.60.1
golang.org/x/exp v0.0.0-20240823005443-9b4947da3948
)
@@ -13,8 +14,7 @@ require (
github.com/klauspost/compress v1.17.9 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.60.1 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
- golang.org/x/sys v0.25.0 // indirect
+ golang.org/x/sys v0.30.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
)
diff --git a/devenv/docker/blocks/prometheus_utf8/go.sum b/devenv/docker/blocks/prometheus_utf8/go.sum
index 5b2f91420df..be3770f9e3f 100644
--- a/devenv/docker/blocks/prometheus_utf8/go.sum
+++ b/devenv/docker/blocks/prometheus_utf8/go.sum
@@ -26,8 +26,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA=
golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
-golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
-golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
+golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
diff --git a/devenv/docker/blocks/stateful_webhook/Dockerfile b/devenv/docker/blocks/stateful_webhook/Dockerfile
index 03b50db2135..4b671c20410 100644
--- a/devenv/docker/blocks/stateful_webhook/Dockerfile
+++ b/devenv/docker/blocks/stateful_webhook/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.23.5
+FROM golang:1.23.7
ADD main.go /go/src/webhook/main.go
diff --git a/docs/Makefile b/docs/Makefile
index 36b7e4f41be..7bdbe026293 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -9,6 +9,6 @@ include docs.mk
.PHONY: sources/panels-visualizations/query-transform-data/transform-data/index.md
sources/panels-visualizations/query-transform-data/transform-data/index.md: ## Generate the Transform Data page source.
- cd $(CURDIR)/.. && npx tsc ./scripts/docs/generate-transformations.ts && \
- node -e "require('./scripts/docs/generate-transformations').buildMarkdownContent()" && \
+ cd $(CURDIR)/.. && \
+ npx tsx ./scripts/docs/generate-transformations.ts && \
npx prettier -w $(CURDIR)/$@
diff --git a/docs/README.md b/docs/README.md
index 4bea7d788e7..0bf4e8446b5 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -48,18 +48,6 @@ Only use [reference style links](https://grafana.com/docs/writers-toolkit/write/
### [Contributing](/contribute/documentation/README.md)
-### Using `relref` for internal links
-
-Use the Hugo shortcode [relref](https://gohugo.io/content-management/cross-references/#use-ref-and-relref) any time you are linking to other internal docs pages.
-
-Syntax is:
-
-```
-{{< relref "example.md" >}}
-```
-
-You might need to add more context for the link (containing folders and so on, `folder/example.md`) if Hugo says the relref is ambiguous.
-
### Managing redirects
When moving content around or removing pages it's important that users following old links are properly redirected to the new location. We do this using the [aliases](https://gohugo.io/content-management/urls/#aliases) feature in Hugo.
diff --git a/docs/docs.mk b/docs/docs.mk
index dfb6e9e501c..09308dc8604 100644
--- a/docs/docs.mk
+++ b/docs/docs.mk
@@ -125,7 +125,7 @@ update: ## Fetch the latest version of this Makefile and the `make-docs` script
TOPIC_TYPES := concept multiple-tasks reference section task tutorial visualization
.PHONY: $(patsubst %,topic/%,$(TOPIC_TYPES))
topic/%: ## Create a topic from the Writers' Toolkit template. Specify the topic type as the target, for example, `make topic/task TOPIC_PATH=sources/my-new-topic.md`.
-topic/%:
+$(patsubst %,topic/%,$(TOPIC_TYPES)):
$(if $(TOPIC_PATH),,$(error "You must set the TOPIC_PATH variable to the path where the $(@F) topic will be created. For example: make $(@) TOPIC_PATH=sources/my-new-topic.md"))
mkdir -p $(dir $(TOPIC_PATH))
curl -s -o $(TOPIC_PATH) https://raw.githubusercontent.com/grafana/writers-toolkit/refs/heads/main/docs/static/templates/$(@F)-template.md
diff --git a/docs/make-docs b/docs/make-docs
index 80c89aea7ce..f6d72f905dc 100755
--- a/docs/make-docs
+++ b/docs/make-docs
@@ -8,6 +8,12 @@
# [Semantic versioning](https://semver.org/) is used to help the reader identify the significance of changes.
# Changes are relevant to this script and the support docs.mk GNU Make interface.
#
+# ## 8.5.2 (2025-02-28)
+#
+# ### Fixed
+#
+# - topic/ targets are no longer no-ops as a result of 8.5.1.
+#
# ## 8.5.1 (2025-02-18)
#
# ### Fixed
diff --git a/docs/sources/_index.md b/docs/sources/_index.md
index 989ceddad50..c64772641e4 100644
--- a/docs/sources/_index.md
+++ b/docs/sources/_index.md
@@ -4,7 +4,9 @@ aliases:
- /docs/grafana/v3.1/
- guides/reference/admin/
cascade:
+ LOKI_VERSION: latest
TEMPO_VERSION: latest
+ ONCALL_VERSION: latest
PYROSCOPE_VERSION: latest
description: Find answers to your technical questions and learn how to use Grafana OSS and Enterprise products.
keywords:
diff --git a/docs/sources/administration/correlations/_index.md b/docs/sources/administration/correlations/_index.md
index 3a61b1800b5..36e0badf5f5 100644
--- a/docs/sources/administration/correlations/_index.md
+++ b/docs/sources/administration/correlations/_index.md
@@ -14,23 +14,23 @@ weight: 900
You can create interactive links for Explore visualizations by setting up Correlations. These links can either run queries or generate external URLs related to presented data.
-A correlation defines how data in one [data source]({{< relref "../../datasources" >}}) is used to query data in another data source or to generate an external URL.
+A correlation defines how data in one [data source](../../datasources/) is used to query data in another data source or to generate an external URL.
Some examples:
- an application name returned in a logs data source can be used to query metrics related to that application in a metrics data source, or
- a user name returned by an SQL data source can be used to query logs related to that particular user in a logs data source
- a customer ID in a logs data source can link to a different platform that has a profile on that customer.
-[Explore]({{< relref "../../explore" >}}) takes user-defined correlations to display links inside the visualizations.
-If a correlation links to a query, you can click on that link to run the related query and see results in [Explore Split View]({{< relref "../../explore#split-and-compare" >}}).
+[Explore](../../explore/) takes user-defined correlations to display links inside the visualizations.
+If a correlation links to a query, you can click on that link to run the related query and see results in [Explore Split View](../../explore/#split-and-compare).
If a correlation links to an external URL, you can click on the link to open the URL in a new tab in your browser.
Explore visualizations that currently support showing links based on correlations:
-- [Logs Panel]({{< relref "./use-correlations-in-visualizations#correlations-in-logs-panel">}})
-- [Table]({{< relref "./use-correlations-in-visualizations#correlations-in-table">}})
+- [Logs Panel](use-correlations-in-visualizations/#correlations-in-logs-panel)
+- [Table](use-correlations-in-visualizations/#correlations-in-table)
-You can configure correlations using [provisioning]({{< relref "../provisioning" >}}), the **Administration > Plugins and data > Correlations** page in Grafana or directly in [Explore]({{< relref "../../explore/correlations-editor-in-explore" >}}).
+You can configure correlations using [provisioning](../provisioning/), the **Administration > Plugins and data > Correlations** page in Grafana or directly in [Explore](../../explore/correlations-editor-in-explore/).
## Example of how links work in Explore once set up
diff --git a/docs/sources/administration/correlations/add-permissions-to-create-new-correlations/index.md b/docs/sources/administration/correlations/add-permissions-to-create-new-correlations/index.md
index 8dbca454cac..f232f26189c 100644
--- a/docs/sources/administration/correlations/add-permissions-to-create-new-correlations/index.md
+++ b/docs/sources/administration/correlations/add-permissions-to-create-new-correlations/index.md
@@ -12,7 +12,7 @@ weight: 30
## Before you begin
-Adding access to create correlations for [Viewers and Editors]({{< relref "../../../administration/roles-and-permissions" >}}) is available with [Role-based access control]({{< relref "../../../administration/roles-and-permissions/access-control" >}}).
+Adding access to create correlations for [Viewers and Editors](../../roles-and-permissions/) is available with [Role-based access control](../../roles-and-permissions/access-control/).
## Add permissions to create correlations
diff --git a/docs/sources/administration/correlations/correlation-configuration/index.md b/docs/sources/administration/correlations/correlation-configuration/index.md
index 56c21d89bc0..f01ef51d670 100644
--- a/docs/sources/administration/correlations/correlation-configuration/index.md
+++ b/docs/sources/administration/correlations/correlation-configuration/index.md
@@ -29,13 +29,13 @@ Each correlation is configured with the following options:
**Transformations**
: Optional manipulations to the source data included passed to the target query
-Learn how to create correlations using the [Administration page]({{< relref "./create-a-new-correlation#create-a-correlation-in-administration-page" >}}) or with [provisioning]({{< relref "./create-a-new-correlation#create-a-correlation-with-provisioning" >}}).
+Learn how to create correlations using the [Administration page](../create-a-new-correlation/#create-a-correlation-in-administration-page) or with [provisioning](../create-a-new-correlation/#create-a-correlation-with-provisioning).
## Source data source and result field
Links are shown in Explore visualizations for the results from the correlation’s source data source.
A link is assigned to one of the fields from the result provided in the correlation configuration (the results field).
-Each visualization displays fields with links in a different way ([Correlations in Logs Panel]({{< relref "./use-correlations-in-visualizations#correlations-in-logs-panel">}}) and see [Correlations in Table]({{< relref "./use-correlations-in-visualizations#correlations-in-table">}})).
+Each visualization displays fields with links in a different way ([Correlations in Logs Panel](../use-correlations-in-visualizations/#correlations-in-logs-panel) and see [Correlations in Table](../use-correlations-in-visualizations/#correlations-in-table)).
## Target query
@@ -44,10 +44,10 @@ The target query is run when a link is clicked in the visualization. You can use
### Correlation Variables
You can use variables inside the target query to access the source data related to the query.
-Correlations use [Grafana variable syntax]({{< relref "../../../dashboards/variables/variable-syntax" >}}).
+Correlations use [Grafana variable syntax](../../../dashboards/variables/variable-syntax/).
Variables are filled with values from the source results when the link is clicked. There are two types of variables you can use:
-- [field variables]({{< relref "../../../panels-visualizations/configure-data-links#field-variables" >}}) (allows to access field values and labels)
+- [field variables](../../../panels-visualizations/configure-data-links/#field-variables) (allows to access field values and labels)
- correlation variables (allows to access field values and transformations)
Example: If source results contain a field called “employee”, the value of the field can be accessed with:
@@ -57,9 +57,9 @@ Example: If source results contain a field called “employee”, the value of t
In addition to mapping field values to shorter variable names, more correlation variables can be created by applying transformations to existing fields
-For more details, please see the example in [Use variables and transformations in a correlation]({{< relref "./use-variables-and-transformations" >}}).
+For more details, please see the example in [Use variables and transformations in a correlation](../use-variables-and-transformations/).
-Correlation creates a data link only if all variables have values in the selected data row. [Global variables]({{< relref "/docs/grafana/latest/dashboards/variables/add-template-variables#global-variables" >}}) are exception to this rule and are not required to be filled in from the returned data. These variables are interpolated automatically by data sources.
+Correlation creates a data link only if all variables have values in the selected data row. [Global variables](/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables) are exception to this rule and are not required to be filled in from the returned data. These variables are interpolated automatically by data sources.
### Correlation Transformations
@@ -69,7 +69,7 @@ There are two types of transformations: logfmt and regular expression.
Each transformation uses a selected field value as the input. The output of a transformation is a set of new variables based on the type and options of the transformation.
-For more details, please see the example in [Use variables and transformations in a correlation]({{< relref "./use-variables-and-transformations" >}}) for more details.
+For more details, please see the example in [Use variables and transformations in a correlation](../use-variables-and-transformations/) for more details.
### Logfmt transformation
diff --git a/docs/sources/administration/correlations/correlation-permissions/index.md b/docs/sources/administration/correlations/correlation-permissions/index.md
index ee228d844fa..30984472c20 100644
--- a/docs/sources/administration/correlations/correlation-permissions/index.md
+++ b/docs/sources/administration/correlations/correlation-permissions/index.md
@@ -9,11 +9,11 @@ weight: 20
# Permissions
-Users with [Viewer base role]({{< relref "../../../administration/roles-and-permissions" >}}) or with [datasources:query RBAC role]({{< relref "../../../administration/roles-and-permissions/access-control" >}}) can:
+Users with [Viewer base role](../../roles-and-permissions/) or with [datasources:query RBAC role](../../roles-and-permissions/access-control/) can:
- Use correlations in Explore’s visualizations.
- List all available correlations in read-only mode.
-Users with [Admin base role]({{< relref "../../../administration/roles-and-permissions" >}}) or with [datasources:write RBAC role]({{< relref "../../../administration/roles-and-permissions/access-control" >}}) can:
+Users with [Admin base role](../../roles-and-permissions/) or with [datasources:write RBAC role](../../roles-and-permissions/access-control/) can:
- Add, edit and delete correlations.
diff --git a/docs/sources/administration/correlations/create-a-new-correlation/index.md b/docs/sources/administration/correlations/create-a-new-correlation/index.md
index 225d6ca8e1c..2ea3bb0b447 100644
--- a/docs/sources/administration/correlations/create-a-new-correlation/index.md
+++ b/docs/sources/administration/correlations/create-a-new-correlation/index.md
@@ -15,7 +15,7 @@ Make sure you have permission to add new correlations. Only users with write per
## Create a correlation in Explore's correlations editor
-To learn more, refer to Explore's [documentation]({{< relref "../../../explore/correlations-editor-in-explore" >}}) about building correlations in Explore.
+To learn more, refer to Explore's [documentation](../../../explore/correlations-editor-in-explore/) about building correlations in Explore.
## Create a correlation in Administration page
diff --git a/docs/sources/administration/correlations/use-correlations-in-visualizations/index.md b/docs/sources/administration/correlations/use-correlations-in-visualizations/index.md
index 4c98948ee3a..07070f27741 100644
--- a/docs/sources/administration/correlations/use-correlations-in-visualizations/index.md
+++ b/docs/sources/administration/correlations/use-correlations-in-visualizations/index.md
@@ -27,7 +27,7 @@ weight: 70
1. Open Explore.
1. Select a data source that you chose as the source data source of the correlation.
1. Run a query that results in data containing fields required to build variables in the target query.
-1. Links are added to cell rows in the column representing the field with the assigned link ([the results field]({{< relref "../correlation-configuration#source-data-source-and-result-field" >}}).
+1. Links are added to cell rows in the column representing the field with the assigned link ([the results field](../correlation-configuration/#source-data-source-and-result-field).
1. Cells containing multiple links accessible with a context menu.
{{< figure src="/static/img/docs/correlations/correlations-in-table-10-0.png" max-width="600px" caption="Correlations links in table" >}}
diff --git a/docs/sources/administration/correlations/use-variables-and-transformations/index.md b/docs/sources/administration/correlations/use-variables-and-transformations/index.md
index 6bc3668f9d8..6251d537352 100644
--- a/docs/sources/administration/correlations/use-variables-and-transformations/index.md
+++ b/docs/sources/administration/correlations/use-variables-and-transformations/index.md
@@ -73,7 +73,7 @@ Instructions below show how to set up a link that can run metrics query for the
- Required correlation type (query)
- Target query matching test data source model
- “App metrics” correlation contains the following configuration:
- - Alias is set to ${application} variable (note that in provisioning files $ is used to access environment variables so it has to be [escaped]({{< relref "../../../administration/provisioning#using-environment-variables" >}})).
+ - Alias is set to ${application} variable (note that in provisioning files $ is used to access environment variables so it has to be [escaped](../../provisioning/#using-environment-variables)).
- Regular expression transformation is created to extract values from “msg” field
- Regular expression transformation is used to capture the application name from the full name of the service stored in the log line.
- The output of the transformation is mapped to a variable called “application”.
diff --git a/docs/sources/administration/data-source-management/_index.md b/docs/sources/administration/data-source-management/_index.md
index ce91fc46eae..9eab6986e11 100644
--- a/docs/sources/administration/data-source-management/_index.md
+++ b/docs/sources/administration/data-source-management/_index.md
@@ -18,10 +18,10 @@ weight: 100
# Data source management
Grafana supports many different storage backends for your time series data (data source).
-Refer to [data sources]({{< relref "../../datasources" >}}) for more information about using data sources in Grafana.
+Refer to [data sources](../../datasources/) for more information about using data sources in Grafana.
Only users with the organization admin role can add data sources.
-For links to data source-specific documentation, see [Data sources]({{< relref "../../datasources" >}}).
+For links to data source-specific documentation, see [Data sources](../../datasources/).
## Data source permissions
@@ -32,7 +32,7 @@ You can configure data source permissions to allow or deny certain users the abi
- The `admin` permission allows users to query and edit the data source, change permissions on the data source and enable or disable query caching for the data source.
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) and [Grafana Cloud](/docs/grafana-cloud).
+Available in [Grafana Enterprise](../../introduction/grafana-enterprise/) and [Grafana Cloud](/docs/grafana-cloud).
{{% /admonition %}}
By default, data sources in an organization can be queried by any user in that organization. For example, a user with the `Viewer` role can issue any possible query to a data source, not just queries that exist on dashboards to which they have access. Additionally, by default, data sources can be edited by the user who created the data source, as well as users with the `Admin` role.
@@ -80,10 +80,10 @@ When you enable query and resource caching, Grafana temporarily stores the resul
When using Grafana, a query pertains to a request for data frames to be modified or displayed. A resource relates to any HTTP requests made by a plugin, such as the Amazon Timestream plugin requesting a list of available databases from AWS. For more information on data source queries and resources, please see the developers page on [backend plugins](https://grafana.com/developers/plugin-tools/key-concepts/backend-plugins/).
-The caching feature works for **all** backend data sources. You can enable the cache globally in Grafana's [configuration]({{< relref "../../setup-grafana/configure-grafana/enterprise-configuration/#caching" >}}), and configure a cache duration (also called Time to Live, or TTL) for each data source individually.
+The caching feature works for **all** backend data sources. You can enable the cache globally in Grafana's [configuration](../../setup-grafana/configure-grafana/enterprise-configuration/#caching), and configure a cache duration (also called Time to Live, or TTL) for each data source individually.
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise/" >}}) and [Grafana Cloud](/docs/grafana-cloud/).
+Available in [Grafana Enterprise](../../introduction/grafana-enterprise/) and [Grafana Cloud](/docs/grafana-cloud/).
{{% /admonition %}}
The following cache backend options are available: in-memory, Redis, and Memcached.
@@ -94,9 +94,9 @@ Storing cached queries in-memory can increase Grafana's memory footprint. In pro
When a panel queries a data source with cached data, it will either fetch fresh data or use cached data depending on the panel's **interval.** The interval is used to round the query time range to a nearby cached time range, increasing the likelihood of cache hits. Therefore, wider panels and dashboards with shorter time ranges fetch new data more often than narrower panels and dashboards with longer time ranges.
-A panel's interval is visible in the [query options]({{< relref "../../panels-visualizations/query-transform-data/" >}}). It is calculated as follows: `time range / max data points`. Max data points are calculated based on the width of the panel. For example, a wide panel with `1000 data points` on a dashboard with a time range of `last 7 days` will retrieve fresh data every 10 minutes: `7d / 1000 = 10m`. In this example, cached data for this panel will be served for up to 10 minutes before Grafana needs to query the data source again for new data.
+A panel's interval is visible in the [query options](../../panels-visualizations/query-transform-data/). It is calculated as follows: `time range / max data points`. Max data points are calculated based on the width of the panel. For example, a wide panel with `1000 data points` on a dashboard with a time range of `last 7 days` will retrieve fresh data every 10 minutes: `7d / 1000 = 10m`. In this example, cached data for this panel will be served for up to 10 minutes before Grafana needs to query the data source again for new data.
-You can configure a panel to retrieve data more often by increasing the **Max data points** setting in the panel's [query options]({{< relref "../../panels-visualizations/query-transform-data/" >}}).
+You can configure a panel to retrieve data more often by increasing the **Max data points** setting in the panel's [query options](../../panels-visualizations/query-transform-data/).
### Caching benefits
@@ -108,7 +108,7 @@ By reducing the number of queries and requests sent to data sources, caching can
### Data sources that work with query caching
-Query caching works for Grafana's [built-in data sources]({{< relref "../../datasources/#built-in-core-data-sources" >}}), and [backend data source plugins](https://grafana.com/grafana/plugins/?type=datasource) that extend the `DataSourceWithBackend` class in the plugins SDK.
+Query caching works for Grafana's [built-in data sources](../../datasources/#built-in-core-data-sources), and [backend data source plugins](https://grafana.com/grafana/plugins/?type=datasource) that extend the `DataSourceWithBackend` class in the plugins SDK.
{{% admonition type="note" %}}
Logs Insights for the CloudWatch data source does not support query caching due to the way logs are requested from AWS.
@@ -122,7 +122,7 @@ Some data sources, such as Elasticsearch, Prometheus, and Loki, cache queries th
### Enable and configure query caching
-You must be an Org admin or Grafana admin to enable query caching for a data source. For more information on Grafana roles and permissions, refer to [About users and permissions]({{< relref "../roles-and-permissions/" >}}).
+You must be an Org admin or Grafana admin to enable query caching for a data source. For more information on Grafana roles and permissions, refer to [About users and permissions](../roles-and-permissions/).
By default, data source queries are not cached. To enable query caching for a single data source:
@@ -141,7 +141,7 @@ You can optionally override a data source's configured TTL for individual dashbo
If query caching is enabled and the Cache tab is not visible in a data source's settings, then query caching is not available for that data source.
{{% /admonition %}}
-To configure global settings for query caching, refer to the `caching` section of [Configure Grafana Enterprise]({{< relref "../../setup-grafana/configure-grafana/enterprise-configuration/#caching" >}}).
+To configure global settings for query caching, refer to the `caching` section of [Configure Grafana Enterprise](../../setup-grafana/configure-grafana/enterprise-configuration/#caching).
### Disable query caching
@@ -152,7 +152,7 @@ To disable query caching for a single data source:
1. In the data source list, click the data source that you want to turn off caching for.
1. On the Cache tab, click **Disable**.
-To disable query caching for an entire Grafana instance, set the `enabled` flag to `false` in the `caching` section of [Configure Grafana Enterprise]({{< relref "../../setup-grafana/configure-grafana/enterprise-configuration/#caching" >}}). You will no longer see the Cache tab on any data sources, and no data source queries will be cached.
+To disable query caching for an entire Grafana instance, set the `enabled` flag to `false` in the `caching` section of [Configure Grafana Enterprise](../../setup-grafana/configure-grafana/enterprise-configuration/#caching). You will no longer see the Cache tab on any data sources, and no data source queries will be cached.
### Clear cache
diff --git a/docs/sources/administration/data-source-management/teamlbac/_index.md b/docs/sources/administration/data-source-management/teamlbac/_index.md
index 74470c792bf..4bf449af022 100644
--- a/docs/sources/administration/data-source-management/teamlbac/_index.md
+++ b/docs/sources/administration/data-source-management/teamlbac/_index.md
@@ -20,8 +20,19 @@ Label-Based Access Control (LBAC) allows fine-grained access control to data sou
## Supported Data Sources
+### Feature availability
+
LBAC for data sources is currently generally available for `Loki` and in **experimental** for `Prometheus`. Support for additional data sources may be added in future updates.
+| Data source | [Grafana Cloud](/docs/grafana-cloud) | [Grafana Enterprise](../../../introduction/grafana-enterprise/) |
+| ----------- | ------------------------------------ | --------------------------------------------------------------- |
+| Loki | GA | GA |
+| Prometheus | PrivatePreview | PrivatePreview |
+
+{{% admonition type="note" %}}
+For enterprise this feature requires Grafana Enterprise Metrics (GEM) or Grafana Enterprise Logs (GEL) to function.
+{{% /admonition %}}
+
**LBAC for data sources offers:**
- Team-based access control using `LogQL` rules.
diff --git a/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-prometheus/index.md b/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-prometheus/index.md
index 29f8467ad6d..fa08b2f47cc 100644
--- a/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-prometheus/index.md
+++ b/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-prometheus/index.md
@@ -31,7 +31,7 @@ To be able to use LBAC for Prometheus data sources, you need to enable the featu
LBAC for data sources is available in private preview on Grafana Cloud for Prometheus created with basic authentication. Prometheus data sources for LBAC for data sources can only be created, provisioning is currently not available.
-You cannot configure LBAC rules for Grafana-provisioned data sources from the UI. We recommend that you replicate the setting of the provisioned data source in a new data source as described in [LBAC Configuration for New Prometheus Data Source](https://grafana.com/docs/grafana/latest/administration/data-source-management/teamlbac/configure-teamlbac-for-Prometheus/#task-1-lbac-configuration-for-new-Prometheus-data-source) and then add the LBAC configuration to the new data source.
+You cannot configure LBAC rules for Grafana-provisioned data sources from the UI. We recommend that you replicate the setting of the provisioned data source in a new data source as described in [LBAC Configuration for New Prometheus Data Source](#task-1-lbac-configuration-for-new-prometheus-data-source) and then add the LBAC configuration to the new data source.
### Permissions
diff --git a/docs/sources/administration/enterprise-licensing/_index.md b/docs/sources/administration/enterprise-licensing/_index.md
index 16d7e9899f1..31fbf6027a3 100644
--- a/docs/sources/administration/enterprise-licensing/_index.md
+++ b/docs/sources/administration/enterprise-licensing/_index.md
@@ -23,11 +23,11 @@ weight: 500
# Grafana Enterprise license
-When you become a Grafana Enterprise customer, you gain access to Grafana's premium observability features, including enterprise data source plugins, reporting, and role-based access control. In order to use these [enhanced features of Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise" >}}), you must purchase and activate a Grafana Enterprise license.
+When you become a Grafana Enterprise customer, you gain access to Grafana's premium observability features, including enterprise data source plugins, reporting, and role-based access control. In order to use these [enhanced features of Grafana Enterprise](../../introduction/grafana-enterprise/), you must purchase and activate a Grafana Enterprise license.
-To purchase a license directly from Grafana Labs, [Contact a Grafana Labs representative](/contact?about=grafana-enterprise). To activate an Enterprise license purchased from Grafana Labs, refer to [Activate an Enterprise license]({{< relref "#activate-an-enterprise-license" >}}).
+To purchase a license directly from Grafana Labs, [Contact a Grafana Labs representative](/contact?about=grafana-enterprise). To activate an Enterprise license purchased from Grafana Labs, refer to [Activate an Enterprise license](#activate-an-enterprise-license).
-You can also purchase a Grafana Enterprise license through the AWS Marketplace. To learn more about activating a license purchased through AWS, refer to [Activate a Grafana Enterprise license purchased through AWS Marketplace]({{< relref "./activate-aws-marketplace-license/" >}}).
+You can also purchase a Grafana Enterprise license through the AWS Marketplace. To learn more about activating a license purchased through AWS, refer to [Activate a Grafana Enterprise license purchased through AWS Marketplace](activate-aws-marketplace-license/).
{{< section >}}
@@ -94,9 +94,9 @@ environment variable.
### Step 3. Ensure that the license file's root URL matches the root_url configuration option
-Update the [`root_url`]({{< relref "../../setup-grafana/configure-grafana/#root_url" >}}) in your configuration. It should be the URL that users type in their browsers to access the frontend, not the node hostname(s).
+Update the [`root_url`](../../setup-grafana/configure-grafana/#root_url) in your configuration. It should be the URL that users type in their browsers to access the frontend, not the node hostname(s).
-This is important, because as part of the validation checks at startup, Grafana compares the license URL to the [`root_url`]({{< relref "../../setup-grafana/configure-grafana/#root_url" >}}) in your configuration.
+This is important, because as part of the validation checks at startup, Grafana compares the license URL to the [`root_url`](../../setup-grafana/configure-grafana/#root_url) in your configuration.
In your configuration file:
@@ -113,7 +113,7 @@ GF_SERVER_ROOT_URL=https://grafana.example.com/
### Step 4. Restart Grafana
-To finalize the installation of Grafana Enterprise, restart Grafana to enable all Grafana Enterprise features. Refer to [restart Grafana]({{< relref "../../setup-grafana/start-restart-grafana/" >}}) for more information.
+To finalize the installation of Grafana Enterprise, restart Grafana to enable all Grafana Enterprise features. Refer to [restart Grafana](../../setup-grafana/start-restart-grafana/) for more information.
## License expiration
@@ -123,7 +123,7 @@ If your license has expired, most of Grafana keeps working as normal. Some enter
### Update your license
-1. Locate your current `license.jwt` file. In a standard installation it is stored inside the Grafana data directory, which on a typical Linux installation is in `/var/lib/grafana/data`. This location might be overridden in the ini file [Configuration]({{< relref "../../setup-grafana/configure-grafana/" >}}).
+1. Locate your current `license.jwt` file. In a standard installation it is stored inside the Grafana data directory, which on a typical Linux installation is in `/var/lib/grafana/data`. This location might be overridden in the ini file [Configuration](../../setup-grafana/configure-grafana/).
```ini
[enterprise]
@@ -135,7 +135,7 @@ If your license has expired, most of Grafana keeps working as normal. Some enter
2. Log in to your [Grafana Cloud Account](/login) and make sure you're in the correct organization in the dropdown at the top of the page.
3. Under the **Grafana Enterprise** section in the menu bar to the left, choose licenses and download the currently valid license with which you want to run Grafana. If you cannot see a valid license on Grafana.com, please contact your account manager at Grafana Labs to renew your subscription.
4. Replace the current `license.jwt`-file with the one you've just downloaded.
-5. [Restart Grafana]({{< relref "../../setup-grafana/start-restart-grafana/" >}}).
+5. [Restart Grafana](../../setup-grafana/start-restart-grafana/).
### If your license expires
@@ -244,7 +244,7 @@ Your license is controlled by the following rules:
**License expiration date:** The license includes an expiration date, which is the date when a license becomes inactive.
-As the license expiration date approaches, you will see a banner in Grafana that encourages you to renew. To learn about how to renew your license and what happens in Grafana when a license expires, refer to [License expiration]({{< relref "#license-expiration" >}}).
+As the license expiration date approaches, you will see a banner in Grafana that encourages you to renew. To learn about how to renew your license and what happens in Grafana when a license expires, refer to [License expiration](#license-expiration).
**License token expiration:** Grafana Enterprise requires a valid token, which is automatically renewed.
@@ -256,7 +256,7 @@ License token renewal requires internet access, and requires that the `auto_refr
**Grafana License URL:** Your license does not work with an instance of Grafana with a different root URL.
-The License URL is the complete URL of your Grafana instance, for example `https://grafana.your-company.com/`. It is defined in the [root_url]({{< relref "../../setup-grafana/configure-grafana/#root_url" >}}) configuration setting.
+The License URL is the complete URL of your Grafana instance, for example `https://grafana.your-company.com/`. It is defined in the [root_url](../../setup-grafana/configure-grafana/#root_url) configuration setting.
**Concurrent sessions limit**: As of Grafana Enterprise 7.5, users can initiate up to three concurrent sessions of Grafana.
@@ -268,7 +268,7 @@ When a user reaches the session limit, the fourth connection succeeds and the lo
To increase the number of licensed users within Grafana, extend a license, or change your licensed URL, contact [Grafana support](/profile/org#support) or your Grafana Labs account team. They will update your license, which you can activate from within Grafana.
-For instructions about how to activate your license after it is updated, refer to [Activate an Enterprise license]({{< relref "#activate-an-enterprise-license" >}}).
+For instructions about how to activate your license after it is updated, refer to [Activate an Enterprise license](#activate-an-enterprise-license).
## Usage billing
@@ -276,7 +276,7 @@ Standard Grafana Enterprise licenses include a certain number of seats that can
For those use-cases we support usage-based billing, where your license includes a certain number of included users and you are billed on a monthly basis for any excess active users during the month.
-Usage billing involves a contractual agreement between you and Grafana Labs and an update to your license, and it is only available if Grafana Enterprise version 10.0.0 or higher is configured to [automatically refresh its license token]({{< relref "../../setup-grafana/configure-grafana/enterprise-configuration/#auto_refresh_license" >}}).
+Usage billing involves a contractual agreement between you and Grafana Labs and an update to your license, and it is only available if Grafana Enterprise version 10.0.0 or higher is configured to [automatically refresh its license token](../../setup-grafana/configure-grafana/enterprise-configuration/#auto_refresh_license).
### User deduplication
diff --git a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/_index.md b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/_index.md
index 2ecc592a76d..4ac9e4814be 100644
--- a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/_index.md
+++ b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/_index.md
@@ -30,7 +30,7 @@ You can deploy Grafana Enterprise in the following ways:
- Using AWS services like ECS, EKS or EC2.
- In an instance outside AWS.
-In each case, you must activate the Grafana Enterprise license purchased in AWS Marketplace to take advantage of Grafana Enterprise observability features. Grafana Enterprise licenses purchased through AWS Marketplace are subject to the same [restrictions]({{< relref "../#license-restrictions" >}}) as Grafana Enterprise licensed purchased directly from Grafana Labs.
+In each case, you must activate the Grafana Enterprise license purchased in AWS Marketplace to take advantage of Grafana Enterprise observability features. Grafana Enterprise licenses purchased through AWS Marketplace are subject to the same [restrictions](../#license-restrictions) as Grafana Enterprise licensed purchased directly from Grafana Labs.
> To purchase a license directly from Grafana Labs or learn more about other Grafana offerings, [Contact a Grafana Labs representative](/contact?about=grafana-enterprise).
diff --git a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-ecs/index.md b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-ecs/index.md
index 5d3858c25cc..c9192e585e6 100644
--- a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-ecs/index.md
+++ b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-ecs/index.md
@@ -48,7 +48,7 @@ Grafana requires that you configure a database to hold dashboards, users, and ot
### Before you begin
- Ensure that you have a supported Grafana database available.
- - For a list of supported databases, refer to [Supported databases]({{< relref "../../../../setup-grafana/installation/#supported-databases" >}}).
+ - For a list of supported databases, refer to [Supported databases](../../../../setup-grafana/installation/#supported-databases).
- For information about creating a database, refer to [Creating an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html).
- Review the information required to connect to the RDS DB instance. For more information, refer to [Connecting to an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.Connect.html).
@@ -56,7 +56,7 @@ To configure Grafana for high availability:
1. In AWS ECS, use environment variables to update the `database` parameters.
- For a list of database parameters, refer to [Configuration]({{< relref "../../../../setup-grafana/configure-grafana/#database" >}}).
+ For a list of database parameters, refer to [Configuration](../../../../setup-grafana/configure-grafana/#database).
1. Create a revision of the task definition for the ECS Task that runs Grafana Enterprise.
@@ -114,4 +114,4 @@ In this task you configure Grafana Enterprise to validate the license with AWS i
1. To restart Grafana and activate your license, update the service running Grafana to use the latest revision of the task definition that you created.
1. After you update the service, navigate to your Grafana instance, sign in with Grafana Admin credentials, and navigate to **Administration > General > Stats and license** to validate that your license is active.
-For more information about validating that your license is active, refer to [Grafana Enterprise license restrictions]({{< relref "../../#grafana-enterprise-license-restrictions" >}}).
+For more information about validating that your license is active, refer to [Grafana Enterprise license restrictions](../../#grafana-enterprise-license-restrictions).
diff --git a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-eks/index.md b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-eks/index.md
index a5698448447..5199690faa3 100644
--- a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-eks/index.md
+++ b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-eks/index.md
@@ -50,7 +50,7 @@ Grafana requires that you configure a database to hold dashboards, users, and ot
### Before you begin
- Ensure that you have a supported Grafana database available.
- - For a list of supported databases, refer to [Supported databases]({{< relref "../../../../setup-grafana/installation/#supported-databases" >}}).
+ - For a list of supported databases, refer to [Supported databases](../../../../setup-grafana/installation/#supported-databases).
- For information about creating a database, refer to [Creating an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html).
- Review the information required to connect to the RDS DB instance. For more information, refer to [Connecting to an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.Connect.html).
@@ -82,7 +82,7 @@ To configure Grafana for high availability, choose **one** of the following opti
value: [database password]
```
-For more information on Grafana High Availability setup, refer to [Set up Grafana for high availability]({{< relref "../../../../setup-grafana/set-up-for-high-availability/" >}}).
+For more information on Grafana High Availability setup, refer to [Set up Grafana for high availability](../../../../setup-grafana/set-up-for-high-availability/).
## Task 3: Configure Grafana Enterprise to validate its license with AWS
@@ -99,7 +99,7 @@ In this task, you configure Grafana Enterprise to validate the license with AWS
For more information about AWS license permissions, refer to [Actions, resources, and condition keys for AWS License Manager](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslicensemanager.html).
-1. Choose **one** of the following options to update the [license_validation_type]({{< relref "../../../../setup-grafana/configure-grafana/enterprise-configuration/#license_validation_type" >}}) configuration to `aws`:
+1. Choose **one** of the following options to update the [license_validation_type](../../../../setup-grafana/configure-grafana/enterprise-configuration/#license_validation_type) configuration to `aws`:
- **Option 1:** Use `kubectl edit configmap grafana` to edit `grafana.ini` add the following section to the configuration:
@@ -125,6 +125,6 @@ To restart Grafana on a Kubernetes cluster,
1. After you update the service, navigate to your Grafana instance, sign in with Grafana Admin credentials, and navigate to **Administration > General > Stats and license** to validate that your license is active.
-For more information about restarting Grafana, refer to [Restart Grafana]({{< relref "../../../../setup-grafana/start-restart-grafana/" >}}).
+For more information about restarting Grafana, refer to [Restart Grafana](../../../../setup-grafana/start-restart-grafana/).
> If you experience issues when you update the EKS cluster, refer to [Amazon EKS troubleshooting](https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html).
diff --git a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-instance-outside-aws/index.md b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-instance-outside-aws/index.md
index a205673c676..9d1741d94a4 100644
--- a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-instance-outside-aws/index.md
+++ b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-instance-outside-aws/index.md
@@ -35,9 +35,9 @@ To activate a Grafana Enterprise license from AWS on a Grafana Enterprise instan
To install Grafana, refer to the documentation specific to your implementation.
-- [Install Grafana]({{< relref "../../../../setup-grafana/installation/" >}}).
-- [Run Grafana Docker image]({{< relref "../../../../setup-grafana/installation/docker/" >}}).
-- [Deploy Grafana on Kubernetes]({{< relref "../../../../setup-grafana/installation/kubernetes/#deploy-grafana-enterprise-on-kubernetes" >}}).
+- [Install Grafana](../../../../setup-grafana/installation/).
+- [Run Grafana Docker image](../../../../setup-grafana/installation/docker/).
+- [Deploy Grafana on Kubernetes](../../../../setup-grafana/installation/kubernetes/#deploy-grafana-enterprise-on-kubernetes).
## Task 2: Create an AWS IAM user with access to your Grafana Enterprise license
@@ -110,7 +110,7 @@ To retrieve your license, Grafana Enterprise requires access to your AWS account
In this task you configure Grafana Enterprise to validate the license with AWS instead of Grafana Labs.
-Choose one of the following options to update the [license_validation_type]({{< relref "../../../../setup-grafana/configure-grafana/enterprise-configuration/#license_validation_type" >}}) configuration to `aws`:
+Choose one of the following options to update the [license_validation_type](../../../../setup-grafana/configure-grafana/enterprise-configuration/#license_validation_type) configuration to `aws`:
- **Option 1:** In the `[enterprise]` section of the grafana.ini configuration file, add `license_validation_type=aws`.
@@ -131,4 +131,4 @@ Choose one of the following options to update the [license_validation_type]({{<
To activate Grafana Enterprise features, start (or restart) Grafana.
-For information about restarting Grafana, refer to [Restart Grafana]({{< relref "../../../../setup-grafana/start-restart-grafana/" >}}).
+For information about restarting Grafana, refer to [Restart Grafana](../../../../setup-grafana/start-restart-grafana/).
diff --git a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/manage-license-in-aws-marketplace/index.md b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/manage-license-in-aws-marketplace/index.md
index 56ba176742d..47988bf8a14 100644
--- a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/manage-license-in-aws-marketplace/index.md
+++ b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/manage-license-in-aws-marketplace/index.md
@@ -42,4 +42,4 @@ You can use AWS Marketplace to make the following modifications to your Grafana
This action retrieves updated license information from AWS.
-> To learn more about licensing and active users, refer to [Activate a Grafana Enterprise license purchased through AWS Marketplace]({{< relref "../" >}}).
+> To learn more about licensing and active users, refer to [Activate a Grafana Enterprise license purchased through AWS Marketplace](../).
diff --git a/docs/sources/administration/feature-toggles/index.md b/docs/sources/administration/feature-toggles/index.md
index 90d08353bec..b79d62fbede 100644
--- a/docs/sources/administration/feature-toggles/index.md
+++ b/docs/sources/administration/feature-toggles/index.md
@@ -19,7 +19,7 @@ For detailed information about particular features and how they operate, refer t
## Manage feature toggles
In the **Administration** page, the **Feature Management** section enables authorized users to view and edit the various features that are active in their Grafana environment.
-Authorized users include administrators, and users with the [fixed roles]({{< relref "../roles-and-permissions/access-control#fixed-roles" >}}) `featuremgmt.read` and `featuremgmt.write`.
+Authorized users include administrators, and users with the [fixed roles](../roles-and-permissions/access-control/#fixed-roles) `featuremgmt.read` and `featuremgmt.write`.
There are different options for visibility and customization depending on the development stage of the feature.
diff --git a/docs/sources/administration/migration-guide/cloud-migration-assistant.md b/docs/sources/administration/migration-guide/cloud-migration-assistant.md
index 87a5a47cb5a..5e1e1b0b423 100644
--- a/docs/sources/administration/migration-guide/cloud-migration-assistant.md
+++ b/docs/sources/administration/migration-guide/cloud-migration-assistant.md
@@ -147,6 +147,12 @@ Your data sources, including credentials, are migrated securely and seamlessly t
The migration assistant supports any plugins found in the plugins catalog. As long as the plugin is signed or is a core plugin built into Grafana, it is eligible for migration. Due to security reasons, unsigned plugins are not supported in Grafana Cloud. If you are using any unsigned private plugins, Grafana recommends you seek an alternative plugin for the catalog or work on a strategy to deprecate certain functionality from your self-managed instance.
+Upgrade any plugins you intend to migrate before using the migration assistant as any migrated plugins will be configured on the Grafana Cloud instance as the latest version of that plugin.
+
+{{< admonition type="caution">}}
+If you want to migrate Enterprise plugins, check what type of plan your Grafana Cloud instance is on and whether or not this plan requires an Enterprise plugin add-on.
+{{< /admonition >}}
+
### Grafana Alerting resources
The migration assistant can migrate the majority of Grafana Alerting resources to your Grafana Cloud instance. These include:
diff --git a/docs/sources/administration/migration-guide/manually-migrate-to-grafana-cloud.md b/docs/sources/administration/migration-guide/manually-migrate-to-grafana-cloud.md
index 6049846c108..d0bffd7b8f2 100644
--- a/docs/sources/administration/migration-guide/manually-migrate-to-grafana-cloud.md
+++ b/docs/sources/administration/migration-guide/manually-migrate-to-grafana-cloud.md
@@ -219,7 +219,7 @@ Some data sources, like Prometheus or SQL databases, live on private networks or
To access these data sources from Grafana Cloud, follow our guide to [configure PDC in your network](https://grafana.com/docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/configure-pdc/), and then configure the applicable Grafana data sources to [connect using PDC](https://grafana.com/docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/configure-pdc/#configure-a-data-source-to-use-private-data-source-connect-pdc). Note that PDC is only needed for your network-secured data sources, not for data sources like Splunk or CloudWatch that are accessible over the public internet.
-For more information on how PDC works, see our [overview document]({{< relref "../connect-externally-hosted/private-data-source-connect" >}}).
+For more information on how PDC works, see our [overview document](/docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/).
### Migrate reports and playlists using Grafana’s HTTP API
diff --git a/docs/sources/administration/organization-management/index.md b/docs/sources/administration/organization-management/index.md
index a332c8110db..6c4d52941f3 100644
--- a/docs/sources/administration/organization-management/index.md
+++ b/docs/sources/administration/organization-management/index.md
@@ -46,7 +46,7 @@ The following table summarizes the resources you can share and/or isolate using
The member of one organization cannot view dashboards assigned to another organization. However, a user can belong to multiple organizations.
-Grafana Server Administrators are responsible for creating organizations. For more information about the Grafana Server Administrator role, refer to [Grafana server administrators]({{< relref "../roles-and-permissions/#grafana-server-administrators" >}}).
+Grafana Server Administrators are responsible for creating organizations. For more information about the Grafana Server Administrator role, refer to [Grafana server administrators](../roles-and-permissions/#grafana-server-administrators).
## View a list of organizations
@@ -80,9 +80,9 @@ Create an organization when you want to isolate dashboards and other resources f
1. In the Preferences section, select a home dashboard, time zone, and week start.
- For more information about preferences, refer to [Preferences]({{< relref "../organization-preferences/" >}}).
+ For more information about preferences, refer to [Preferences](../organization-preferences/).
-For more information about adding users to an organization, refer to [Add a user to an organization]({{< relref "../user-management/server-user-management/add-remove-user-to-org/" >}}).
+For more information about adding users to an organization, refer to [Add a user to an organization](../user-management/server-user-management/add-remove-user-to-org/).
## Delete an organization
diff --git a/docs/sources/administration/organization-preferences/index.md b/docs/sources/administration/organization-preferences/index.md
index 590370bf27f..6ff4cf25dc0 100644
--- a/docs/sources/administration/organization-preferences/index.md
+++ b/docs/sources/administration/organization-preferences/index.md
@@ -20,9 +20,9 @@ Grafana preferences are basic settings. They control the Grafana UI theme, home
Preferences are sometimes confusing because they can be set at four different levels, listed from highest level to lowest:
-- **Server -** Affects all users on the Grafana server. Set by a [Grafana server admin]({{< relref "../roles-and-permissions/#grafana-server-administrators" >}}).
-- **Organization -** Affects all users in an organization. Set by an [Organization admin]({{< relref "../roles-and-permissions/#organization-roles" >}}).
-- **Team -** Affects all users assigned to a team. Set by an Organization Admin or Team Admin. To learn more about these roles, refer to [Teams and permissions]({{< relref "../roles-and-permissions/#teams-and-permissions" >}}).
+- **Server -** Affects all users on the Grafana server. Set by a [Grafana server admin](../roles-and-permissions/#grafana-server-administrators).
+- **Organization -** Affects all users in an organization. Set by an [Organization admin](../roles-and-permissions/#organization-roles).
+- **Team -** Affects all users assigned to a team. Set by an Organization Admin or Team Admin. To learn more about these roles, refer to [Teams and permissions](../roles-and-permissions/#teams-and-permissions).
- **User account -** Affects the individual user. Set by the user on their own account.
The lowest level always takes precedence. For example, if a user sets their theme to **Light**, then their visualization of Grafana displays the light theme. Nothing at any higher level can override that.
@@ -33,7 +33,7 @@ If the user is aware of the change and intended it, then that's great! But if th
In Grafana, you can change your names and emails associated with groups or accounts in the Settings or Preferences. This topic provides instructions for each task.
-Some tasks require certain permissions. For more information about roles, refer to [Roles and permissions]({{< relref "../roles-and-permissions/" >}}).
+Some tasks require certain permissions. For more information about roles, refer to [Roles and permissions](../roles-and-permissions/).
### Change organization name
@@ -75,13 +75,13 @@ To change the team name or email, follow these steps:
### Change user name or email
-To learn how to edit your user information, refer to [Edit your profile]({{< relref "../user-management/user-preferences/#edit-your-profile" >}}).
+To learn how to edit your user information, refer to [Edit your profile](../user-management/user-preferences/#edit-your-profile).
## Change Grafana UI theme
In Grafana, you can modify the UI theme configured in the Settings or Preferences. Set the UI theme for the server, an organization, a team, or your personal user account using the instructions in this topic.
-Some tasks require certain permissions. For more information about roles, refer to [Roles and permissions]({{< relref "../roles-and-permissions/" >}}).
+Some tasks require certain permissions. For more information about roles, refer to [Roles and permissions](../roles-and-permissions/).
### Theme options
@@ -105,9 +105,9 @@ Here is an example of the light theme.
### Change server UI theme
-As a Grafana server administrator, you can change the default Grafana UI theme for all users who are on the server by setting the [default_theme]({{< relref "../../setup-grafana/configure-grafana/#default_theme" >}}) option in the Grafana configuration file.
+As a Grafana server administrator, you can change the default Grafana UI theme for all users who are on the server by setting the [default_theme](../../setup-grafana/configure-grafana/#default_theme) option in the Grafana configuration file.
-To see what the current settings are, refer to [View server settings]({{< relref "../stats-and-license#view-server-settings" >}}).
+To see what the current settings are, refer to [View server settings](../stats-and-license/#view-server-settings).
### Change organization UI theme
@@ -141,11 +141,11 @@ You can change the UI theme for your user account. This setting overrides UI the
By default, Grafana uses the timezone in your web browser. However, you can override this setting at the server, organization, team, or individual user level. This topic provides instructions for each task.
-Some tasks require certain permissions. For more information about roles, refer to [Roles and permissions]({{< relref "../roles-and-permissions/" >}}).
+Some tasks require certain permissions. For more information about roles, refer to [Roles and permissions](../roles-and-permissions/).
### Set server timezone
-Grafana server administrators can choose a default timezone for all users on the server by setting the [default_timezone]({{< relref "../../setup-grafana/configure-grafana/#default_timezone" >}}) option in the Grafana configuration file.
+Grafana server administrators can choose a default timezone for all users on the server by setting the [default_timezone](../../setup-grafana/configure-grafana/#default_timezone) option in the Grafana configuration file.
### Set organization timezone
@@ -179,7 +179,7 @@ You can change the timezone for your user account. This setting overrides timezo
The home dashboard you set is the one all users will see by default when they log in. Click the Grafana icon or **Home** in the breadcrumb to return to it. You can set the home dashboard for the server, an organization, a team, or your personal user account. This topic provides instructions for each task.
-Some tasks require certain permissions. For more information about roles, refer to [Roles and permissions]({{< relref "../roles-and-permissions/" >}}).
+Some tasks require certain permissions. For more information about roles, refer to [Roles and permissions](../roles-and-permissions/).
### Set the home dashboard for the server
@@ -194,7 +194,7 @@ Users with the Grafana Server Admin flag on their account or access to the confi
#### Use a JSON file as the home dashboard
1. Save your JSON file somewhere that Grafana can access it. For example, in the Grafana `data` folder of Grafana.
-1. Update your configuration file to set the path to the JSON file. Refer to [default_home_dashboard_path]({{< relref "../../setup-grafana/configure-grafana/#default_home_dashboard_path" >}}) for more information about modifying the Grafana configuration files.
+1. Update your configuration file to set the path to the JSON file. Refer to [default_home_dashboard_path](../../setup-grafana/configure-grafana/#default_home_dashboard_path) for more information about modifying the Grafana configuration files.
```ini
[dashboards]
@@ -244,7 +244,7 @@ You can choose your own personal home dashboard. This setting overrides all home
### Change server language
-Grafana server administrators can change the default Grafana UI language for all users on the server by setting the [default_language]({{< relref "../../setup-grafana/configure-grafana/#default_language" >}}) option in the Grafana configuration file.
+Grafana server administrators can change the default Grafana UI language for all users on the server by setting the [default_language](../../setup-grafana/configure-grafana/#default_language) option in the Grafana configuration file.
### Change organization language
diff --git a/docs/sources/administration/plugin-management/index.md b/docs/sources/administration/plugin-management/index.md
index 21e048ed9ea..1f43832b69b 100644
--- a/docs/sources/administration/plugin-management/index.md
+++ b/docs/sources/administration/plugin-management/index.md
@@ -56,17 +56,17 @@ Use app plugins when you want an out-of-the-box monitoring experience.
### Managing access for app plugins
-Customize access to app plugins with [RBAC]({{< relref "../roles-and-permissions/access-control/rbac-for-app-plugins" >}}).
+Customize access to app plugins with [RBAC](../roles-and-permissions/access-control/rbac-for-app-plugins/).
By default, the Viewer, Editor and Admin roles have access to all app plugins that their Organization role allows them to access. Access is granted by the `fixed:plugins.app:reader` role.
{{% admonition type="note" %}}
-To prevent users from seeing an app plugin, refer to [these permissions scenarios]({{< relref "../roles-and-permissions/access-control/plan-rbac-rollout-strategy#prevent-viewers-from-accessing-an-app-plugin" >}}).
+To prevent users from seeing an app plugin, refer to [these permissions scenarios](../roles-and-permissions/access-control/plan-rbac-rollout-strategy/#prevent-viewers-from-accessing-an-app-plugin).
{{% /admonition %}}
## Plugin catalog
-The Grafana plugin catalog allows you to browse and manage plugins from within Grafana. Only Grafana server administrators and Organization administrators can access and use the plugin catalog. For more information about Grafana roles and permissions, refer to [Roles and permissions]({{< relref "../roles-and-permissions" >}}).
+The Grafana plugin catalog allows you to browse and manage plugins from within Grafana. Only Grafana server administrators and Organization administrators can access and use the plugin catalog. For more information about Grafana roles and permissions, refer to [Roles and permissions](../roles-and-permissions/).
The following access rules apply depending on the user role:
@@ -88,7 +88,7 @@ The Grafana plugin catalog is designed to work with a single Grafana server inst
_Video shows the Plugin catalog in a previous version of Grafana._
{{% admonition type="note" %}}
-If required, the Grafana plugin catalog can be disabled using the `plugin_admin_enabled` flag in the [configuration]({{< relref "../../setup-grafana/configure-grafana/#plugin_admin_enabled" >}}) file.
+If required, the Grafana plugin catalog can be disabled using the `plugin_admin_enabled` flag in the [configuration](../../setup-grafana/configure-grafana/#plugin_admin_enabled) file.
{{% /admonition %}}
@@ -114,7 +114,7 @@ There are also additional ways to install plugins depending on your setup.
#### Install a plugin using Grafana CLI
-Grafana CLI allows you to install, upgrade, and manage your Grafana plugins using a command line. For more information about Grafana CLI plugin commands, refer to [Plugin commands]({{< relref "../../cli/#plugins-commands" >}}).
+Grafana CLI allows you to install, upgrade, and manage your Grafana plugins using a command line. For more information about Grafana CLI plugin commands, refer to [Plugin commands](../../cli/#plugins-commands).
#### Install a plugin from a ZIP file
@@ -126,15 +126,15 @@ Download the archive containing the plugin assets, and install it by extracting
unzip my-plugin-0.2.0.zip -d YOUR_PLUGIN_DIR/my-plugin
```
-The path to the plugin directory is defined in the configuration file. For more information, refer to [Configuration]({{< relref "../../setup-grafana/configure-grafana/#plugins" >}}).
+The path to the plugin directory is defined in the configuration file. For more information, refer to [Configuration](../../setup-grafana/configure-grafana/#plugins).
-#### Install a plugin using Grafana configuration
+#### Install a plugin using Grafana configuration
{{% admonition type="note" %}}
This feature requires Grafana 11.5.0 or later.
{{% /admonition %}}
-You can install plugins by adding the plugin ID to the `plugins.preinstall` section in the Grafana configuration file. This prevents the plugin from being accidentally uninstalled and can be auto-updated. For more information, refer to [Configuration]({{< relref "../../setup-grafana/configure-grafana/#plugins" >}}).
+You can install plugins by adding the plugin ID to the `plugins.preinstall` section in the Grafana configuration file. This prevents the plugin from being accidentally uninstalled and can be auto-updated. For more information, refer to [Configuration](../../setup-grafana/configure-grafana/#plugins).
#### Install a plugin in air-gapped environment
@@ -224,7 +224,7 @@ All plugins are signed under a _signature level_. The signature level determines
Unsigned plugins are not supported in Grafana Cloud.
{{% /admonition %}}
-We strongly recommend that you don't run unsigned plugins in your Grafana instance. However, if you're aware of the risks and you still want to load an unsigned plugin, refer to [Configuration]({{< relref "../../setup-grafana/configure-grafana/#allow_loading_unsigned_plugins" >}}).
+We strongly recommend that you don't run unsigned plugins in your Grafana instance. However, if you're aware of the risks and you still want to load an unsigned plugin, refer to [Configuration](../../setup-grafana/configure-grafana/#allow_loading_unsigned_plugins).
If you've allowed loading of an unsigned plugin, then Grafana writes a warning message to the server log:
@@ -282,7 +282,7 @@ Plugins running inside the Frontend Sandbox should continue to work normally wit
The Frontend Sandbox feature is currently behind the `pluginsFrontendSandbox` feature flag. To enable it, you'll need to:
-1. Enable the feature flag in your Grafana configuration. For more information about enabling feature flags, refer to [Configure feature toggles](/setup-grafana/configure-grafana/feature-toggles/).
+1. Enable the feature flag in your Grafana configuration. For more information about enabling feature flags, refer to [Configure feature toggles](/docs/grafana//setup-grafana/configure-grafana/feature-toggles/).
2. For self-hosted Grafana installations, add the plugin IDs you want to sandbox in the `security` section using the `enable_frontend_sandbox_for_plugins` configuration option.
diff --git a/docs/sources/administration/provisioning/index.md b/docs/sources/administration/provisioning/index.md
index b06979b4880..6145d69a761 100644
--- a/docs/sources/administration/provisioning/index.md
+++ b/docs/sources/administration/provisioning/index.md
@@ -20,30 +20,29 @@ This makes GitOps more natural since data sources and dashboards can be defined
## Configuration file
-Refer to [Configuration]({{< relref "../../setup-grafana/configure-grafana/" >}}) for more information on what you can configure in `grafana.ini`.
+Refer to [Configuration](../../setup-grafana/configure-grafana/) for more information on what you can configure in `grafana.ini`.
### Configuration file locations
-- Default configuration from `$WORKING_DIR/conf/defaults.ini`
-- Custom configuration from `$WORKING_DIR/conf/custom.ini`
-- The custom configuration file path can be overridden using the `--config` parameter
+Grafana reads its default configuration from `/conf/defaults.ini`.
+By default, Grafana reads custom configuration from `/conf/custom.ini`.
+You can override the custom configuration path with the `--config` option.
{{< admonition type="note" >}}
-If you have installed Grafana using the `deb` or `rpm`
-packages, then your configuration file is located at
-`/etc/grafana/grafana.ini`. This path is specified in the Grafana
-`init.d` script using the `--config` file parameter.
+The Deb and RPM packages install the configuration file at `/etc/grafana/grafana.ini`.
+The Grafana init.d script sets the `--config` option to that path.
{{< /admonition >}}
-### Environment variables
+### Use environment variables
-You can use environment variable interpolation in all three provisioning configuration types.
-The allowed syntax is either `$ENV_VAR_NAME` or `${ENV_VAR_NAME}`, and it can be used only for values, not for keys or larger parts
-of the configurations. If the environment variable value has a `$` (e.g. `Pa$sw0rd`), use the `$ENV_VAR_NAME` syntax to avoid double expansion.
-It's not available in the dashboard's definition files, just the dashboard provisioning
-configuration.
+You can use environment variable lookups in all provisioning configuration.
+The syntax for an environment variable is `$ENV_VAR_NAME` or `${ENV_VAR_NAME}`.
+If the environment variable value has a `$` in it (for example, `Pa$sw0rd`), use the `$ENV_VAR_NAME` syntax to avoid double expansion.
+You can only use environment variables for configuration values and not for keys or bigger parts of the configuration file structure.
-Example:
+You can use environment variables in dashboard provisioning configuration but not the dashboard definition files themselves.
+
+The following example looks up the data source URL port, user, and password using environment variables:
```yaml
datasources:
@@ -54,45 +53,43 @@ datasources:
password: $PASSWORD
```
-You can use `$$` if you have a literal `$` in your value and want to avoid interpolation.
+To escape a literal `$` in your provisioning file values, use `$$`.
## Configuration management tools
-Currently, we don't provide any scripts or manifests for configuring Grafana.
-Rather than spending time learning and creating scripts or manifests for each tool, we think our time is better spent making Grafana easier to provision.
-Therefore, we heavily rely on the expertise of the community.
+The Grafana community maintains libraries for many popular configuration management tools.
-| Tool | Project |
-| --------- | ------------------------------------------------------------------------------------------------------------------------------- |
-| Puppet | [https://forge.puppet.com/puppet/grafana](https://forge.puppet.com/puppet/grafana) |
-| Ansible | [https://github.com/grafana/grafana-ansible-collection](https://github.com/grafana/grafana-ansible-collection) |
-| Chef | [https://github.com/sous-chefs/chef-grafana](https://github.com/sous-chefs/chef-grafana) |
-| Saltstack | [https://github.com/salt-formulas/salt-formula-grafana](https://github.com/salt-formulas/salt-formula-grafana) |
-| Jsonnet | [https://github.com/grafana/grafonnet-lib/](https://github.com/grafana/grafonnet-lib/) |
-| NixOS | [services.grafana.provision module](https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/monitoring/grafana.nix) |
+| Tool | Project |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| Puppet | |
+| Ansible | |
+| Chef | |
+| Saltstack | |
+| Jsonnet | ) |
+| NixOS | [`services.grafana.provision` module](https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/monitoring/grafana.nix) |
## Data sources
-You can manage data sources in Grafana by adding YAML configuration files in the [`provisioning/datasources`]({{< relref "../../setup-grafana/configure-grafana#provisioning" >}}) directory.
-Each configuration file can contain a list of `datasources` to add or update during startup.
+You can manage data sources in Grafana by adding YAML configuration files in the [`provisioning/datasources`](../../setup-grafana/configure-grafana/#provisioning) directory.
+Each configuration file contains a list of data sources, under the `datasources` key, to add or update during startup.
If the data source already exists, Grafana reconfigures it to match the provisioned configuration file.
-The configuration file can also list data sources to automatically delete, called `deleteDatasources`.
+You can also list data sources to automatically delete, using the key `deleteDatasources`.
Grafana deletes the data sources listed in `deleteDatasources` _before_ adding or updating those in the `datasources` list.
You can configure Grafana to automatically delete provisioned data sources when they're removed from the provisioning file.
To do so, add `prune: true` to the root of your data source provisioning file.
With this configuration, Grafana also removes the provisioned data sources if you remove the provisioning file entirely.
-### Running multiple Grafana instances
+### Run multiple Grafana instances
If you run multiple instances of Grafana, add a version number to each data source in the configuration and increase it when you update the configuration.
-Grafana updates only data sources with the same or lower version number than specified in the configuration.
+Grafana only updates data sources with the same or lower version number than the one set in the configuration file.
This prevents old configurations from overwriting newer ones if you have different versions of the `datasource.yaml` file that don't define version numbers, and then restart instances at the same time.
### Example data source configuration file
-This example provisions a [Graphite data source]({{< relref "../../datasources/graphite" >}}):
+This example provisions a [Graphite data source](../../datasources/graphite/):
```yaml
# Configuration file version
@@ -172,103 +169,104 @@ datasources:
editable: false
```
-For provisioning examples of specific data sources, refer to that [data source's documentation]({{< relref "../../datasources" >}}).
+For provisioning examples of specific data sources, refer to that [data source's documentation](../../datasources/).
#### JSON data
-Not all data sources have the same configuration settings. Only the most common fields are included in examples.
-To provision the rest of a data source's settings, include them as a JSON blob in the `jsonData` field.
+Not all data sources have the same configuration settings, only the most common ones are fields in the data source provisioning file.
+To provision the rest of a data source's settings, include them as JSON in the `jsonData` field.
-Common settings in the [built-in core data sources]({{< relref "../../datasources#built-in-core-data-sources" >}}) include:
+Common settings in the [built-in core data sources](../../datasources/#built-in-core-data-sources) include:
+
+| Name | Type | Data source | Description |
+| ------------------------------- | ------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `tlsAuth` | boolean | _HTTP\*_, MySQL | Enable TLS authentication using client cert configured in secure JSON data |
+| `tlsAuthWithCACert` | boolean | _HTTP\*_, MySQL, PostgreSQL | Enable TLS authentication using CA cert |
+| `tlsSkipVerify` | boolean | _HTTP\*_, MySQL, PostgreSQL, MSSQL | Controls whether a client verifies the server's certificate chain and host name. |
+| `serverName` | string | _HTTP\*_, MSSQL | Optional. Controls the server name used for certificate common name/subject alternative name verification. Defaults to using the data source URL. |
+| `timeout` | string | _HTTP\*_ | Request timeout in seconds. Overrides `dataproxy.timeout` option |
+| `graphiteVersion` | string | Graphite | Graphite version |
+| `timeInterval` | string | Prometheus, Elasticsearch, InfluxDB, MySQL, PostgreSQL and MSSQL | Lowest interval/step value that should be used for this data source. |
+| `httpMode` | string | InfluxDB | HTTP Method. 'GET', 'POST', defaults to GET |
+| `maxSeries` | number | InfluxDB | Max number of series/tables that Grafana processes |
+| `httpMethod` | string | Prometheus | HTTP Method. 'GET', 'POST', defaults to POST |
+| `customQueryParameters` | string | Prometheus | Query parameters to add, as a URL-encoded string. |
+| `manageAlerts` | boolean | Prometheus and Loki | Manage alerts via Alerting UI |
+| `alertmanagerUid` | string | Prometheus and Loki | UID of Alertmanager that manages Alert for this data source. |
+| `timeField` | string | Elasticsearch | Which field that should be used as timestamp |
+| `interval` | string | Elasticsearch | Index date time format. nil(No Pattern), 'Hourly', 'Daily', 'Weekly', 'Monthly' or 'Yearly' |
+| `logMessageField` | string | Elasticsearch | Which field should be used as the log message |
+| `logLevelField` | string | Elasticsearch | Which field should be used to indicate the priority of the log message |
+| `maxConcurrentShardRequests` | number | Elasticsearch | Maximum number of concurrent shard requests that each sub-search request executes per node |
+| `sigV4Auth` | boolean | Elasticsearch and Prometheus | Enable usage of SigV4 |
+| `sigV4AuthType` | string | Elasticsearch and Prometheus | SigV4 auth provider. default/credentials/keys |
+| `sigV4ExternalId` | string | Elasticsearch and Prometheus | Optional SigV4 External ID |
+| `sigV4AssumeRoleArn` | string | Elasticsearch and Prometheus | Optional SigV4 ARN role to assume |
+| `sigV4Region` | string | Elasticsearch and Prometheus | SigV4 AWS region |
+| `sigV4Profile` | string | Elasticsearch and Prometheus | Optional SigV4 credentials profile |
+| `authType` | string | Amazon CloudWatch | Auth provider. default/credentials/keys |
+| `externalId` | string | Amazon CloudWatch | Optional External ID |
+| `assumeRoleArn` | string | Amazon CloudWatch | Optional ARN role to assume |
+| `defaultRegion` | string | Amazon CloudWatch | Optional default AWS region |
+| `customMetricsNamespaces` | string | Amazon CloudWatch | Namespaces of Custom Metrics |
+| `profile` | string | Amazon CloudWatch | Optional credentials profile |
+| `tsdbVersion` | string | OpenTSDB | Version |
+| `tsdbResolution` | string | OpenTSDB | Resolution |
+| `sslmode` | string | PostgreSQL | SSL mode. 'disable', 'require', 'verify-ca' or 'verify-full' |
+| `tlsConfigurationMethod` | string | PostgreSQL | SSL certificate configuration, either by 'file-path' or 'file-content' |
+| `sslRootCertFile` | string | PostgreSQL, MSSQL | SSL server root certificate file, must be readable by the Grafana user |
+| `sslCertFile` | string | PostgreSQL | SSL client certificate file, must be readable by the Grafana user |
+| `sslKeyFile` | string | PostgreSQL | SSL client key file, must be readable by _only_ the Grafana user |
+| `encrypt` | string | MSSQL | Determines SSL encryption handling. Options include: `disable` - data sent between client and server is not encrypted; `false` - data sent between client and server is not encrypted beyond the login packet; `true` - data sent between client and server is encrypted. Default is `false`. |
+| `postgresVersion` | number | PostgreSQL | Postgres version as a number (903/904/905/906/1000) meaning v9.3, v9.4, ..., v10 |
+| `timescaledb` | boolean | PostgreSQL | Enable usage of TimescaleDB extension |
+| `maxOpenConns` | number | MySQL, PostgreSQL and MSSQL | Maximum number of open connections to the database (Grafana v5.4+) |
+| `maxIdleConns` | number | MySQL, PostgreSQL and MSSQL | Maximum number of connections in the idle connection pool (Grafana v5.4+) |
+| `connMaxLifetime` | number | MySQL, PostgreSQL and MSSQL | Maximum amount of time in seconds a connection may be reused (Grafana v5.4+) |
+| `keepCookies` | array | _HTTP\*_ | Cookies that needs to be passed along while communicating with data sources |
+| `prometheusVersion` | string | Prometheus | The version of the Prometheus data source, such as `2.37.0`, `2.24.0` |
+| `prometheusType` | string | Prometheus | Prometheus database type. Options are `Prometheus`, `Cortex`, `Mimir` or`Thanos`. |
+| `cacheLevel` | string | Prometheus | Determines the duration of the browser cache. Valid values include: `Low`, `Medium`, `High`, and `None`. |
+| `incrementalQuerying` | string | Prometheus | Experimental: Turn on incremental querying to enhance dashboard reload performance with slow data sources |
+| `incrementalQueryOverlapWindow` | string | Prometheus | Experimental: Configure incremental query overlap window. Requires a valid duration string, for example, `180s` or `15m` Default value is `10m` (10 minutes). |
+| `disableRecordingRules` | boolean | Prometheus | Experimental: Turn off Prometheus recording rules |
+| `implementation` | string | Alertmanager | The implementation of the Alertmanager data source, such as `prometheus`, `cortex` or `mimir` |
+| `handleGrafanaManagedAlerts` | boolean | Alertmanager | When enabled, Grafana-managed alerts are sent to this Alertmanager |
{{< admonition type="note" >}}
Data sources tagged with _HTTP\*_ communicate using the HTTP protocol, which includes all core data source plugins except MySQL, PostgreSQL, and MSSQL.
{{< /admonition >}}
-| Name | Type | Data source | Description |
-| ----------------------------- | ------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| tlsAuth | boolean | _HTTP\*_, MySQL | Enable TLS authentication using client cert configured in secure json data |
-| tlsAuthWithCACert | boolean | _HTTP\*_, MySQL, PostgreSQL | Enable TLS authentication using CA cert |
-| tlsSkipVerify | boolean | _HTTP\*_, MySQL, PostgreSQL, MSSQL | Controls whether a client verifies the server's certificate chain and host name. |
-| serverName | string | _HTTP\*_, MSSQL | Optional. Controls the server name used for certificate common name/subject alternative name verification. Defaults to using the data source URL. |
-| timeout | string | _HTTP\*_ | Request timeout in seconds. Overrides dataproxy.timeout option |
-| graphiteVersion | string | Graphite | Graphite version |
-| timeInterval | string | Prometheus, Elasticsearch, InfluxDB, MySQL, PostgreSQL and MSSQL | Lowest interval/step value that should be used for this data source. |
-| httpMode | string | Influxdb | HTTP Method. 'GET', 'POST', defaults to GET |
-| maxSeries | number | Influxdb | Max number of series/tables that Grafana processes |
-| httpMethod | string | Prometheus | HTTP Method. 'GET', 'POST', defaults to POST |
-| customQueryParameters | string | Prometheus | Query parameters to add, as a URL-encoded string. |
-| manageAlerts | boolean | Prometheus and Loki | Manage alerts via Alerting UI |
-| alertmanagerUid | string | Prometheus and Loki | UID of Alert Manager that manages Alert for this data source. |
-| timeField | string | Elasticsearch | Which field that should be used as timestamp |
-| interval | string | Elasticsearch | Index date time format. nil(No Pattern), 'Hourly', 'Daily', 'Weekly', 'Monthly' or 'Yearly' |
-| logMessageField | string | Elasticsearch | Which field should be used as the log message |
-| logLevelField | string | Elasticsearch | Which field should be used to indicate the priority of the log message |
-| maxConcurrentShardRequests | number | Elasticsearch | Maximum number of concurrent shard requests that each sub-search request executes per node |
-| sigV4Auth | boolean | Elasticsearch and Prometheus | Enable usage of SigV4 |
-| sigV4AuthType | string | Elasticsearch and Prometheus | SigV4 auth provider. default/credentials/keys |
-| sigV4ExternalId | string | Elasticsearch and Prometheus | Optional SigV4 External ID |
-| sigV4AssumeRoleArn | string | Elasticsearch and Prometheus | Optional SigV4 ARN role to assume |
-| sigV4Region | string | Elasticsearch and Prometheus | SigV4 AWS region |
-| sigV4Profile | string | Elasticsearch and Prometheus | Optional SigV4 credentials profile |
-| authType | string | Cloudwatch | Auth provider. default/credentials/keys |
-| externalId | string | Cloudwatch | Optional External ID |
-| assumeRoleArn | string | Cloudwatch | Optional ARN role to assume |
-| defaultRegion | string | Cloudwatch | Optional default AWS region |
-| customMetricsNamespaces | string | Cloudwatch | Namespaces of Custom Metrics |
-| profile | string | Cloudwatch | Optional credentials profile |
-| tsdbVersion | string | OpenTSDB | Version |
-| tsdbResolution | string | OpenTSDB | Resolution |
-| sslmode | string | PostgreSQL | SSLmode. 'disable', 'require', 'verify-ca' or 'verify-full' |
-| tlsConfigurationMethod | string | PostgreSQL | SSL Certificate configuration, either by 'file-path' or 'file-content' |
-| sslRootCertFile | string | PostgreSQL, MSSQL | SSL server root certificate file, must be readable by the Grafana user |
-| sslCertFile | string | PostgreSQL | SSL client certificate file, must be readable by the Grafana user |
-| sslKeyFile | string | PostgreSQL | SSL client key file, must be readable by _only_ the Grafana user |
-| encrypt | string | MSSQL | Determines SSL encryption handling. Options include: `disable` - data sent between client and server is not encrypted; `false` - data sent between client and server is not encrypted beyond the login packet; `true` - data sent between client and server is encrypted. Default is `false`. |
-| postgresVersion | number | PostgreSQL | Postgres version as a number (903/904/905/906/1000) meaning v9.3, v9.4, ..., v10 |
-| timescaledb | boolean | PostgreSQL | Enable usage of TimescaleDB extension |
-| maxOpenConns | number | MySQL, PostgreSQL and MSSQL | Maximum number of open connections to the database |
-| maxIdleConns | number | MySQL, PostgreSQL and MSSQL | Maximum number of connections in the idle connection pool |
-| connMaxLifetime | number | MySQL, PostgreSQL and MSSQL | Maximum amount of time in seconds a connection may be reused |
-| keepCookies | array | _HTTP\*_ | Cookies that needs to be passed along while communicating with data sources |
-| prometheusVersion | string | Prometheus | The version of the Prometheus data source, such as `2.37.0`, `2.24.0` |
-| prometheusType | string | Prometheus | Prometheus database type. Options are `Prometheus`, `Cortex`, `Mimir` or`Thanos`. |
-| cacheLevel | string | Prometheus | Determines the duration of the browser cache. Valid values include: `Low`, `Medium`, `High`, and `None`. This field is configurable when you enable the `prometheusResourceBrowserCache` feature flag. |
-| incrementalQuerying | string | Prometheus | Experimental: Turn on incremental querying to enhance dashboard reload performance with slow data sources |
-| incrementalQueryOverlapWindow | string | Prometheus | Experimental: Configure incremental query overlap window. Requires a valid duration string, i.e. `180s` or `15m` Default value is `10m` (10 minutes). |
-| disableRecordingRules | boolean | Prometheus | Experimental: Turn off Prometheus recording rules |
-| implementation | string | AlertManager | The implementation of the AlertManager data source, such as `prometheus`, `cortex` or `mimir` |
-| handleGrafanaManagedAlerts | boolean | AlertManager | When enabled, Grafana-managed alerts are sent to this Alertmanager |
+For examples of specific data sources' JSON data, refer to that [data source's documentation](../../datasources/).
-For examples of specific data sources' JSON data, refer to that [data source's documentation]({{< relref "../../datasources" >}}).
+#### Secure JSON data
-#### Secure JSON Data
-
-Secure JSON data is a map of settings that are encrypted with a [secret key]({{< relref "../../setup-grafana/configure-grafana#secret_key" >}}) from the Grafana configuration.
-The encryption hides content from the users of the application.
-This should be used for storing the TLS Cert and password that Grafana appends to the request on the server side.
+Secure JSON data is a map of settings encrypted with a [secret key](../../setup-grafana/configure-grafana/#secret_key).
+The encryption hides the JSON data from the users of Grafana.
+You should use secure JSON data to store TLS certificates and passwords for data source HTTP requests.
All of these settings are optional.
-{{< admonition type="note" >}}
-The _HTTP\*_ tag denotes data sources that communicate using the HTTP protocol, including all core data source plugins except MySQL, PostgreSQL, and MS SQL.
-{{< /admonition >}}
+| Name | Type | Data source | Description |
+| ------------------- | ------ | ---------------------------------- | -------------------------------------------------------- |
+| `tlsCACert` | string | _HTTP\*_, MySQL, PostgreSQL | CA cert for out going requests |
+| `tlsClientCert` | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client cert for outgoing requests |
+| `tlsClientKey` | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client key for outgoing requests |
+| `password` | string | _HTTP\*_, MySQL, PostgreSQL, MSSQL | password |
+| `basicAuthPassword` | string | _HTTP\*_ | password for basic authentication |
+| `accessKey` | string | Amazon CloudWatch | Access key for connecting to Amazon CloudWatch |
+| `secretKey` | string | Amazon CloudWatch | Secret key for connecting to Amazon CloudWatch |
+| `sigV4AccessKey` | string | Elasticsearch and Prometheus | SigV4 access key. Required when using keys auth provider |
+| `sigV4SecretKey` | string | Elasticsearch and Prometheus | SigV4 secret key. Required when using keys auth provider |
-| Name | Type | Data source | Description |
-| ----------------- | ------ | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| tlsCACert | string | _HTTP\*_, MySQL, PostgreSQL | CA cert for out going requests. You can point directly to your stored cert by using an environment variable following the `$__file{path/to/ca}` format. |
-| tlsClientCert | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client cert for outgoing requests. You can point directly to your stored cert by using an environment variable following the `$__file{path/to/cert}` format. |
-| tlsClientKey | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client key for outgoing requests. You can point directly to your stored key by using an environment variable following the `$__file{path/to/key}` format. |
-| password | string | _HTTP\*_, MySQL, PostgreSQL, MSSQL | password |
-| basicAuthPassword | string | _HTTP\*_ | password for basic authentication |
-| accessKey | string | Cloudwatch | Access key for connecting to Cloudwatch |
-| secretKey | string | Cloudwatch | Secret key for connecting to Cloudwatch |
-| sigV4AccessKey | string | Elasticsearch and Prometheus | SigV4 access key. Required when using keys auth provider |
-| sigV4SecretKey | string | Elasticsearch and Prometheus | SigV4 secret key. Required when using keys auth provider |
+{{< admonition type="note" >}}
+The _HTTP\*_ tag denotes data sources that communicate using the HTTP protocol, including all core data source plugins except MySQL, PostgreSQL, and MSSQL.
+{{< /admonition >}}
#### Custom HTTP headers for data sources
-Data sources managed with provisioning can be configured to add HTTP headers to all requests.
+You can add HTTP headers to all requests sent to data sources managed by Grafana provisioning
Configure the header name in the `jsonData` field and the header value in `secureJsonData`.
+The following example sets the `HeaderName` header to have the value `HeaderValue` and the `Authorization` header to have the value `Bearer XXXXXXXXX`:
```yaml
apiVersion: 1
@@ -285,13 +283,13 @@ datasources:
## Plugins
-You can manage plugin applications in Grafana by adding one or more YAML configuration files in the [`provisioning/plugins`]({{< relref "../../setup-grafana/configure-grafana#provisioning" >}}) directory.
-Each configuration file can contain a list of `apps` that update during start up.
-Grafana updates each app to match the configuration file.
+You can manage plugin applications in Grafana by adding one or more YAML configuration files in the [`provisioning/plugins`](../../setup-grafana/configure-grafana/#provisioning) directory.
+Each configuration file contains a list of `apps` that Grafana configures during start up.
+Grafana configures each app to use the configuration in the file.
{{< admonition type="note" >}}
This feature enables you to provision plugin configurations, not the plugins themselves.
-The plugins must already be installed on the Grafana instance.
+You must have already installed the plugin to use plugin configuration provisioning.
{{< /admonition >}}
### Example plugin configuration file
@@ -320,10 +318,10 @@ apps:
## Dashboards
-You can manage dashboards in Grafana by adding one or more YAML configuration files in the [`provisioning/dashboards`]({{< relref "../../setup-grafana/configure-grafana#dashboards" >}}) directory.
-Each configuration file can contain a list of `dashboards providers` that load dashboards into Grafana from the local filesystem.
+You can manage dashboards in Grafana by adding one or more YAML configuration files in the [`provisioning/dashboards`](../../setup-grafana/configure-grafana/#dashboards) directory.
+Each configuration file contains a list of `providers` that Grafana uses to load dashboards from the local filesystem.
-The dashboard provider configuration file looks somewhat like this:
+### Example dashboard configuration file
```yaml
apiVersion: 1
@@ -352,53 +350,55 @@ providers:
foldersFromFilesStructure: true
```
-When Grafana starts, it updates and inserts all dashboards available in the configured path.
-Then later on, Grafana polls that path every **updateIntervalSeconds**, looks for updated JSON files, and updates and inserts those into the database.
-
-> **Note:** Dashboards are provisioned to the root level if the `folder` option is missing or empty.
-
-#### Making changes to a provisioned dashboard
-
-While you can change a provisioned dashboard in the Grafana UI, those changes can't be saved back to the provisioning source.
-If `allowUiUpdates` is set to `true` and you make changes to a provisioned dashboard, you can `Save` the dashboard, then changes persist to the Grafana database.
+When Grafana starts, it updates or creates all dashboards found in the configured path.
+It later polls that path every `updateIntervalSeconds` for updates to the dashboard files and updates its database.
{{< admonition type="note" >}}
-If a provisioned dashboard is saved from the UI and then later updated from the source, the dashboard stored in the database will always be overwritten. The `version` property in the JSON file won't affect this, even if it's lower than the version of the existing dashboard.
-
-If a provisioned dashboard is saved from the UI and the source is removed, the dashboard stored in the database is deleted unless the configuration option `disableDeletion` is set to `true`.
+Grafana installs dashboards at the root level if you don't set the `folder` field.
{{< /admonition >}}
-If `allowUiUpdates` is configured to `false`, you are not able to make changes to a provisioned dashboard. When you click `Save`, Grafana brings up a _Cannot save provisioned dashboard_ dialog. The screenshot below illustrates this behavior.
+#### Make changes to a provisioned dashboard
-Grafana offers options to export the JSON definition of a dashboard. Either `Copy JSON to Clipboard` or `Save JSON to file` can help you synchronize your dashboard changes back to the provisioning source.
+You can make changes to a provisioned dashboard in the Grafana UI but its not possible to automatically save the changes back to the provisioning source.
+If `allowUiUpdates` is set to `true` and you make changes to a provisioned dashboard, when you save the dashboard, Grafana persists the changes to its database.
-{{< admonition type="note" >}}
-The JSON definition in the input field when using `Copy JSON to Clipboard` or `Save JSON to file` has the `id` field automatically removed to aid the provisioning workflow.
+{{< admonition type="caution" >}}
+If you save a provisioned dashboard in the UI and then later update the provisioning source, Grafana always overwrites the database dashboard with the one from the provisioning file.
+Grafana ignores the `version` property in the JSON file, even if it's lower than the dashboard in the database.
{{< /admonition >}}
+{{< admonition type="caution" >}}
+If you save a provisioned dashboard in the UI and remove the provisioning source, Grafana deletes the dashboard in the database unless you have set the option `disableDeletion` to `true`.
+{{< /admonition >}}
+
+If you set `allowUiUpdates` to `false`, you can't save changes to a provisioned dashboard.
+When you try to save changes to a provisioned dashboard, Grafana brings up a _Cannot save provisioned dashboard_ dialog box.
+
+Grafana offers options to export the JSON definition of a dashboard.
+Use either **Copy JSON to Clipboard** or **Save JSON to file** to sync your dashboard changes back to the provisioning source.
+Grafana removes the `id` field from the dashboard JSON to help the provisioning workflow.
+
+The following screenshot illustrates this behavior.
+
{{< figure src="/static/img/docs/v51/provisioning_cannot_save_dashboard.png" max-width="500px" class="docs-image--no-shadow" >}}
### Reusable dashboard URLs
-If the dashboard in the JSON file contains an [UID]({{< relref "../../dashboards/build-dashboards/view-dashboard-json-model" >}}), Grafana forces insert/update on that UID.
-This allows you to migrate dashboards between Grafana instances and provisioning Grafana from configuration without breaking the URLs given because the new dashboard URL uses the UID as identifier.
-When Grafana starts, it updates and inserts all dashboards available in the configured folders.
-If you modify the file, then the dashboard is also updated.
-By default, Grafana deletes dashboards in the database if the file is removed.
-You can disable this behavior using the `disableDeletion` setting.
+If the dashboard in the JSON file contains an [UID](../../dashboards/build-dashboards/view-dashboard-json-model/), Grafana updates that the dashboard with that UID in the database.
+This lets you migrate dashboards between Grafana instances and keep consistent dashboard URLs.
+When Grafana starts, it creates or updates all dashboards available in the configured folders.
-{{< admonition type="note" >}}
-Provisioning allows you to overwrite existing dashboards
-which leads to problems if you reuse settings that are supposed to be unique.
-Be careful not to reuse the same `title` multiple times within a folder
-or `uid` within the same installation as this causes weird behaviors.
+{{< admonition type="caution" >}}
+You can overwrite existing dashboards with provisioning.
+
+Be careful not to reuse the same `title` multiple times within a folder or `uid` within the same Grafana instance to avoid inconsistent behavior.
{{< /admonition >}}
### Provision folders structure from filesystem to Grafana
-If you already store your dashboards using folders in a git repo or on a filesystem, and also you want to have the same folder names in the Grafana menu, you can use `foldersFromFilesStructure` option.
+If you already store your dashboards using folders in a Git repository or on a filesystem, and want to have the same folder names in the Grafana menu, use `foldersFromFilesStructure` option.
-For example, to replicate these dashboards structure from the filesystem to Grafana,
+For example, to replicate the following dashboards structure from the filesystem to Grafana:
```
/etc/dashboards
@@ -410,7 +410,7 @@ For example, to replicate these dashboards structure from the filesystem to Graf
└── /resources_dashboard.json
```
-You need to specify just this short provision configuration file.
+use the following provisioning configuration file:
```yaml
apiVersion: 1
@@ -424,232 +424,243 @@ providers:
foldersFromFilesStructure: true
```
-In this example, `server` and `application` become new folders in the Grafana menu.
+Grafana creates the `server` and `application` folders in the UI.
-{{< admonition type="note" >}}
-The `folder` and `folderUid` options should be empty or missing to make `foldersFromFilesStructure` work.
+To use `foldersFromFilesStructure`, you must unset the `folder` and `folderUid` options.
To provision dashboards to the root level, store them in the root of your `path`.
-You can't create nested folders structures, where you have folders within folders.
+{{< admonition type="note" >}}
+This feature doesn't let you create nested folder structures, where you have folders within folders.
{{< /admonition >}}
## Alerting
-For information on provisioning Grafana Alerting, refer to [Provision Grafana Alerting resources]({{< relref "../../alerting/set-up/provision-alerting-resources/" >}}).
+For information on provisioning Grafana Alerting, refer to [Provision Grafana Alerting resources](../../alerting/set-up/provision-alerting-resources/).
### Supported settings
-The following sections detail the supported settings and secure settings for each alert notification type. Secure settings are stored encrypted in the database and you add them to `secure_settings` in the YAML file instead of `settings`.
+The following sections detail the supported settings and secure settings for each alert notification type.
+In the provisioning YAML use `settings` for settings and `secure_settings` for secure settings.
+Grafana encrypts secure settings in the database.
#### Alert notification `pushover`
-| Name | Secure setting |
-| ---------- | -------------- |
-| apiToken | yes |
-| userKey | yes |
-| device | |
-| priority | |
-| okPriority | |
-| retry | |
-| expire | |
-| sound | |
-| okSound | |
+| Name | Secure setting |
+| ------------ | -------------- |
+| `apiToken` | yes |
+| `userKey` | yes |
+| `device` | |
+| `priority` | |
+| `okPriority` | |
+| `retry` | |
+| `expire` | |
+| `sound` | |
+| `okSound` | |
#### Alert notification `discord`
-| Name | Secure setting |
-| -------------------- | -------------- |
-| url | yes |
-| avatar_url | |
-| content | |
-| use_discord_username | |
+| Name | Secure setting |
+| ---------------------- | -------------- |
+| `url` | yes |
+| `avatar_url` | |
+| `content` | |
+| `use_discord_username` | |
#### Alert notification `slack`
-| Name | Secure setting |
-| -------------- | -------------- |
-| url | yes |
-| recipient | |
-| username | |
-| icon_emoji | |
-| icon_url | |
-| uploadImage | |
-| mentionUsers | |
-| mentionGroups | |
-| mentionChannel | |
-| token | yes |
-| color | |
+| Name | Secure setting |
+| ---------------- | -------------- |
+| `url` | yes |
+| `recipient` | |
+| `username` | |
+| `icon_emoji` | |
+| `icon_url` | |
+| `uploadImage` | |
+| `mentionUsers` | |
+| `mentionGroups` | |
+| `mentionChannel` | |
+| `token` | yes |
+| `color` | |
#### Alert notification `victorops`
-| Name |
-| ----------- |
-| url |
-| autoResolve |
+| Name |
+| ------------- |
+| `url` |
+| `autoResolve` |
#### Alert notification `kafka`
-| Name |
-| -------------- |
-| kafkaRestProxy |
-| kafkaTopic |
+| Name |
+| ---------------- |
+| `kafkaRestProxy` |
+| `kafkaTopic` |
#### Alert notification `LINE`
-| Name | Secure setting |
-| ----- | -------------- |
-| token | yes |
+| Name | Secure setting |
+| ------- | -------------- |
+| `token` | yes |
#### Alert notification `MQTT`
-| Name | Secure setting |
-| ------------- | -------------- |
-| brokerUrl | |
-| clientId | |
-| topic | |
-| messageFormat | |
-| username | |
-| password | yes |
-| retain | |
-| qos | |
-| tlsConfig | |
+| Name | Secure setting |
+| --------------- | -------------- |
+| `brokerUrl` | |
+| `clientId` | |
+| `topic` | |
+| `messageFormat` | |
+| `username` | |
+| `password` | yes |
+| `retain` | |
+| `qos` | |
+| `tlsConfig` | |
-##### TLS config
+##### TLS configuration
-| Name | Secure setting |
-| ------------------ | -------------- |
-| insecureSkipVerify | |
-| clientCertificate | yes |
-| clientKey | yes |
-| caCertificate | yes |
+| Name | Secure setting |
+| -------------------- | -------------- |
+| `insecureSkipVerify` | |
+| `clientCertificate` | yes |
+| `clientKey` | yes |
+| `caCertificate` | yes |
#### Alert notification `pagerduty`
-| Name | Secure setting |
-| -------------- | -------------- |
-| integrationKey | yes |
-| autoResolve | |
+| Name | Secure setting |
+| ---------------- | -------------- |
+| `integrationKey` | yes |
+| `autoResolve` | |
#### Alert notification `sensu`
-| Name | Secure setting |
-| -------- | -------------- |
-| url | |
-| source | |
-| handler | |
-| username | |
-| password | yes |
+| Name | Secure setting |
+| ---------- | -------------- |
+| `url` | |
+| `source` | |
+| `handler` | |
+| `username` | |
+| `password` | yes |
#### Alert notification `sensugo`
-| Name | Secure setting |
-| --------- | -------------- |
-| url | |
-| apikey | yes |
-| entity | |
-| check | |
-| handler | |
-| namespace | |
+| Name | Secure setting |
+| ----------- | -------------- |
+| `url` | |
+| `apikey` | yes |
+| `entity` | |
+| `check` | |
+| `handler` | |
+| `namespace` | |
#### Alert notification `prometheus-alertmanager`
-| Name | Secure setting |
-| ----------------- | -------------- |
-| url | |
-| basicAuthUser | |
-| basicAuthPassword | yes |
+| Name | Secure setting |
+| ------------------- | -------------- |
+| `url` | |
+| `basicAuthUser` | |
+| `basicAuthPassword` | yes |
#### Alert notification `teams`
-| Name |
-| ---- |
-| url |
+| Name | Secure setting |
+| ----- | -------------- |
+| `url` | |
#### Alert notification `dingding`
-| Name |
-| ---- |
-| url |
+| Name | Secure setting |
+| ----- | -------------- |
+| `url` | |
#### Alert notification `email`
-| Name |
-| ----------- |
-| singleEmail |
-| addresses |
+| Name | Secure setting |
+| ------------- | -------------- |
+| `singleEmail` | |
+| `addresses` | |
#### Alert notification `hipchat`
-| Name |
-| ------ |
-| url |
-| apikey |
-| roomid |
+| Name | Secure setting |
+| -------- | -------------- |
+| `url` | |
+| `apikey` | |
+| `roomid` | |
#### Alert notification `opsgenie`
-| Name | Secure setting |
-| ---------------- | -------------- |
-| apiKey | yes |
-| apiUrl | |
-| autoClose | |
-| overridePriority | |
-| sendTagsAs | |
+| Name | Secure setting |
+| ------------------ | -------------- |
+| `apiKey` | yes |
+| `apiUrl` | |
+| `autoClose` | |
+| `overridePriority` | |
+| `sendTagsAs` | |
#### Alert notification `telegram`
-| Name | Secure setting |
-| ----------- | -------------- |
-| bottoken | yes |
-| chatid | |
-| uploadImage | |
+| Name | Secure setting |
+| ------------- | -------------- |
+| `bottoken` | yes |
+| `chatid` | |
+| `uploadImage` | |
#### Alert notification `threema`
-| Name | Secure setting |
-| ------------ | -------------- |
-| gateway_id | |
-| recipient_id | |
-| api_secret | yes |
+| Name | Secure setting |
+| -------------- | -------------- |
+| `gateway_id` | |
+| `recipient_id` | |
+| `api_secret` | yes |
#### Alert notification `webhook`
-| Name | Secure setting |
-| ----------- | -------------- |
-| url | |
-| http_method | |
-| username | |
-| password | yes |
-| tls_config | |
+| Name | Secure setting |
+| ------------- | -------------- |
+| `url` | |
+| `http_method` | |
+| `username` | |
+| `password` | yes |
+| `tls_config` | |
+| `hmac_config` | |
-##### TLS config
+##### TLS configuration
-| Name | Secure setting |
-| ------------------ | -------------- |
-| insecureSkipVerify | |
-| clientCertificate | yes |
-| clientKey | yes |
-| caCertificate | yes |
+| Name | Secure setting |
+| -------------------- | -------------- |
+| `insecureSkipVerify` | |
+| `clientCertificate` | yes |
+| `clientKey` | yes |
+| `caCertificate` | yes |
+
+##### HMAC signature configuration
+
+| Name | Secure setting |
+| ----------------- | -------------- |
+| `secret` | yes |
+| `header` | |
+| `timestampHeader` | |
#### Alert notification `googlechat`
-| Name |
-| ---- |
-| url |
+| Name | Secure setting |
+| ----- | -------------- |
+| `url` | |
#### Alert notification `Cisco Webex Teams`
-| Name | Secure setting |
-| --------- | -------------- |
-| message | |
-| room_id | |
-| api_url | |
-| bot_token | yes |
+| Name | Secure setting |
+| ----------- | -------------- |
+| `message` | |
+| `room_id` | |
+| `api_url` | |
+| `bot_token` | yes |
## Grafana Enterprise
Grafana Enterprise supports:
-- [Provisioning role-based access control with Grafana]({{< relref "../roles-and-permissions/access-control/rbac-grafana-provisioning/" >}})
-- [Provisioning role-based access control with Terraform]({{< relref "../roles-and-permissions/access-control/rbac-terraform-provisioning/" >}})
+- [Provisioning role-based access control with Grafana](../roles-and-permissions/access-control/rbac-grafana-provisioning/)
+- [Provisioning role-based access control with Terraform](../roles-and-permissions/access-control/rbac-terraform-provisioning/)
diff --git a/docs/sources/administration/recorded-queries/index.md b/docs/sources/administration/recorded-queries/index.md
index d61585f0da5..fdeaa7da656 100644
--- a/docs/sources/administration/recorded-queries/index.md
+++ b/docs/sources/administration/recorded-queries/index.md
@@ -35,7 +35,7 @@ Recorded queries only work with backend data source plugins. Refer to [Backend d
- single row and column - A query that returns a single row and column.
- row count - A query that returns meaningful rows to be counted.
-- expression - Any expression. To learn more about creating and using expressions, see [Write expression queries]({{< relref "../../panels-visualizations/query-transform-data/expression-queries" >}}).
+- expression - Any expression. To learn more about creating and using expressions, see [Write expression queries](../../panels-visualizations/query-transform-data/expression-queries/).
- dataplane numeric - A query that returns [dataplane numeric kind](/developers/dataplane/numeric) data.
After a recorded query is created or enabled, it immediately creates a snapshot and continues to create snapshots at the set interval. The recorded query stops taking snapshots when it is disabled, deleted, or when Grafana is not running. Data points are gathered in the backend by running the recorded query and forwarding each result to a remote-write enabled Prometheus instance.
@@ -48,7 +48,7 @@ To use a recorded query, create one and add it to a dashboard. After that, it ca
1. Find/create a query you want to record on a dashboard in an edit panel. The query must only return one row and column. If it returns more, you can still record the number of results returned using the “count” option.
- The query's data source must be a backend data source.
- - Expressions can be used to aggregate data from a time series query. Refer to [Write expression queries]({{< relref "../../panels-visualizations/query-transform-data/expression-queries" >}}) to learn more about creating and using expressions.
+ - Expressions can be used to aggregate data from a time series query. Refer to [Write expression queries](../../panels-visualizations/query-transform-data/expression-queries/) to learn more about creating and using expressions.
1. Click the record query button located in the top right of the query editor.
1. Enter recorded query information. All fields are required unless otherwise indicated.
- Name - Name of the recorded query.
@@ -68,7 +68,7 @@ You can add existing recorded queries to panels in a dashboard. For each recorde
1. If you want to filter recorded queries by data source, select a data source from the filter by data source drop down menu.
1. Click the `Add` button on your recorded query to add it to the panel.
-After adding your recorded query to the panel, the panel data source will become `-- Mixed --`. Your recorded query is represented by a `Prometheus` query with a name label matching your recorded query name. Refer to [Prometheus]({{< relref "../../datasources/prometheus/" >}}) to learn more about the `Prometheus` data source.
+After adding your recorded query to the panel, the panel data source will become `-- Mixed --`. Your recorded query is represented by a `Prometheus` query with a name label matching your recorded query name. Refer to [Prometheus](../../datasources/prometheus/) to learn more about the `Prometheus` data source.
If after adding a recorded query, a query with a `-- Mixed --` data source instead of `Prometheus` data source appears, this could mean that a Prometheus remote write target was not set up for recorded queries. Refer to [Remote write target](#remote-write-target) to set up a remote write point.
diff --git a/docs/sources/administration/roles-and-permissions/_index.md b/docs/sources/administration/roles-and-permissions/_index.md
index 87457d1d0fa..29c69087072 100644
--- a/docs/sources/administration/roles-and-permissions/_index.md
+++ b/docs/sources/administration/roles-and-permissions/_index.md
@@ -34,14 +34,14 @@ If you are running Grafana Enterprise, you can also control access to data sourc
A Grafana server administrator manages server-wide settings and access to resources such as organizations, users, and licenses. Grafana includes a default server administrator that you can use to manage all of Grafana, or you can divide that responsibility among other server administrators that you create.
{{% admonition type="note" %}}
-The server administrator role does not mean that the user is also a Grafana [organization administrator]({{< relref "#organization-roles" >}}).
+The server administrator role does not mean that the user is also a Grafana [organization administrator](#organization-roles).
{{% /admonition %}}
A server administrator can perform the following tasks:
- Manage users and permissions
- Create, edit, and delete organizations
-- View server-wide settings defined in the [Configuration]({{< relref "../../setup-grafana/configure-grafana/" >}}) file
+- View server-wide settings defined in the [Configuration](../../setup-grafana/configure-grafana/) file
- View Grafana server statistics, including total users and active sessions
- Upgrade the server to Grafana Enterprise.
@@ -49,7 +49,7 @@ A server administrator can perform the following tasks:
The server administrator role does not exist in Grafana Cloud.
{{% /admonition %}}
-To assign or remove server administrator privileges, see [Server user management]({{< relref "../user-management/server-user-management/assign-remove-server-admin-privileges/" >}}).
+To assign or remove server administrator privileges, see [Server user management](../user-management/server-user-management/assign-remove-server-admin-privileges/).
## Organization users and permissions
@@ -69,11 +69,11 @@ Permissions assigned to a user within an organization control the extent to whic
- library panels
- API keys
-For more information about managing organization users, see [User management]({{< relref "../user-management/manage-org-users/" >}}).
+For more information about managing organization users, see [User management](../user-management/manage-org-users/).
### Organization roles
-Organization role-based permissions are global, which means that each permission level applies to all Grafana resources within an given organization. For example, an editor can see and update _all_ dashboards in an organization, unless those dashboards have been specifically restricted using [dashboard permissions]({{< relref "../user-management/manage-dashboard-permissions/" >}}).
+Organization role-based permissions are global, which means that each permission level applies to all Grafana resources within an given organization. For example, an editor can see and update _all_ dashboards in an organization, unless those dashboards have been specifically restricted using [dashboard permissions](../user-management/manage-dashboard-permissions/).
Grafana uses the following roles to control user access:
@@ -117,9 +117,9 @@ You can specify the following permissions to dashboards and folders.
> Important: When a user creates a dashboard or a folder they are automatically granted **Admin** permissions for it.
-For more information about assigning dashboard folder permissions, refer to [Grant dashboard folder permissions]({{< relref "../user-management/manage-dashboard-permissions/#grant-dashboard-folder-permissions" >}}).
+For more information about assigning dashboard folder permissions, refer to [Grant dashboard folder permissions](../user-management/manage-dashboard-permissions/#grant-dashboard-folder-permissions).
-For more information about assigning dashboard permissions, refer to [Grant dashboard permissions]({{< relref "../user-management/manage-dashboard-permissions/#grant-dashboard-permissions" >}}).
+For more information about assigning dashboard permissions, refer to [Grant dashboard permissions](../user-management/manage-dashboard-permissions/#grant-dashboard-permissions).
## Teams and permissions
@@ -132,13 +132,13 @@ You can assign a team member one of the following permissions:
Because teams exist inside an organization, the organization administrator can manage all teams.
-For details on managing teams, see [Team management]({{< relref "../team-management/" >}}).
+For details on managing teams, see [Team management](../team-management/).
## Grafana Enterprise user permissions features
While Grafana OSS includes a robust set of permissions and settings that you can use to manage user access to server and organization resources, you might find that you require additional capabilities.
-[Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise">}}) provides the following permissions-related features:
+[Grafana Enterprise](../../introduction/grafana-enterprise/) provides the following permissions-related features:
- Data source permissions
- Role-based access control (RBAC)
@@ -147,13 +147,13 @@ While Grafana OSS includes a robust set of permissions and settings that you can
By default, a user can query any data source in an organization, even if the data source is not linked to the user's dashboards.
-Data source permissions enable you to restrict data source query permissions to specific **Users**, **Service Accounts**, and **Teams**. For more information about assigning data source permissions, refer to [Data source permissions]({{< relref "../data-source-management/#data-source-permissions/" >}}).
+Data source permissions enable you to restrict data source query permissions to specific **Users**, **Service Accounts**, and **Teams**. For more information about assigning data source permissions, refer to [Data source permissions](../data-source-management/#data-source-permissions/).
### Role-based access control
RBAC provides you a way of granting, changing, and revoking user read and write access to Grafana resources, such as users, reports, and authentication.
-For more information about RBAC, refer to [Role-based access control]({{< relref "../roles-and-permissions/access-control/" >}}).
+For more information about RBAC, refer to [Role-based access control](access-control/).
### Learn more
diff --git a/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md b/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md
index 2c328c749b8..8458e4d9355 100644
--- a/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md
+++ b/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md
@@ -94,7 +94,7 @@ To learn how to use the roles API to determine the role UUIDs, refer to [Manage
| `fixed:authentication.config:writer` | `fixed_0rYhZ2Qnzs8AdB1nX7gexk3fHDw` | `settings:read` for scope `settings:auth.saml:*`
`settings:write` for scope `settings:auth.saml:*` | Read and update authentication and SAML settings. |
| `fixed:dashboards:creator` | `fixed_ZorKUcEPCM01A1fPakEzGBUyU64` | `dashboards:create`
`folders:read` | Create dashboards. |
| `fixed:dashboards:reader` | `fixed_Sgr67JTOhjQGFlzYRahOe45TdWM` | `dashboards:read` | Read all dashboards. |
-| `fixed:dashboards:writer` | `fixed_OK2YOQGIoI1G031hVzJB6rAJQAs` | All permissions from `fixed:dashboards:reader` and
`dashboards:write`
`dashboards:edit`
`dashboards:delete`
`dashboards:create`
`dashboards.permissions:read`
`dashboards.permissions:write` | Read, create, update, and delete all dashboards. |
+| `fixed:dashboards:writer` | `fixed_OK2YOQGIoI1G031hVzJB6rAJQAs` | All permissions from `fixed:dashboards:reader` and
`dashboards:write`
`dashboards:delete`
`dashboards:create`
`dashboards.permissions:read`
`dashboards.permissions:write` | Read, create, update, and delete all dashboards. |
| `fixed:dashboards.insights:reader` | `fixed_JlBJ2_gizP8zhgaeGE2rjyZe2Rs` | `dashboards.insights:read` | Read dashboard insights data and see presence indicators. |
| `fixed:dashboards.permissions:reader` | `fixed_f17oxuXW_58LL8mYJsm4T_mCeIw` | `dashboards.permissions:read` | Read all dashboard permissions. |
| `fixed:dashboards.permissions:writer` | `fixed_CcznxhWX_Yqn8uWMXMQ-b5iFW9k` | All permissions from `fixed:dashboards.permissions:reader` and
`dashboards.permissions:write` | Read and update all dashboard permissions. |
diff --git a/docs/sources/administration/roles-and-permissions/access-control/rbac-terraform-provisioning/index.md b/docs/sources/administration/roles-and-permissions/access-control/rbac-terraform-provisioning/index.md
index ce6acbaf2b5..e262d6bc8d6 100644
--- a/docs/sources/administration/roles-and-permissions/access-control/rbac-terraform-provisioning/index.md
+++ b/docs/sources/administration/roles-and-permissions/access-control/rbac-terraform-provisioning/index.md
@@ -93,6 +93,75 @@ provider "grafana" {
}
```
+## Provision basic roles
+
+The following example shows how to assign basic roles to users, teams, and service accounts. Basic roles are predefined in Grafana and provide a set of permissions for common use cases.
+
+| Basic role | UID |
+| --------------- | --------------------- |
+| `None` | `basic_none` |
+| `Viewer` | `basic_viewer` |
+| `Editor` | `basic_editor` |
+| `Admin` | `basic_admin` |
+| `Grafana Admin` | `basic_grafana_admin` |
+
+You can use any of the basic role UIDs from the table above in your role assignments. For example, to assign the "None" role, use `basic_none` as the `role_uid`.
+
+```terraform
+resource "grafana_team" "viewer_team" {
+ name = "terraform_viewer_team"
+}
+
+resource "grafana_user" "editor_user" {
+ email = "terraform_editor@example.com"
+ login = "terraform_editor_user"
+ password =
+}
+
+resource "grafana_service_account" "admin_sa" {
+ name = "terraform_admin_sa"
+}
+
+# Assign Viewer role to a team
+resource "grafana_role_assignment" "viewer_role_assignment" {
+ role_uid = "basic_viewer"
+ teams = [grafana_team.viewer_team.id]
+}
+
+# Assign Editor role to a user
+resource "grafana_role_assignment" "editor_role_assignment" {
+ role_uid = "basic_editor"
+ users = [grafana_user.editor_user.id]
+}
+
+# Assign Admin role to a service account
+resource "grafana_role_assignment" "admin_role_assignment" {
+ role_uid = "basic_admin"
+ service_accounts = [grafana_service_account.admin_sa.id]
+}
+```
+
+### Provision basic role to multiple users
+
+```terraform
+resource "grafana_user" "editor_user_2" {
+ email = "terraform_editor_2@example.com"
+ login = "terraform_editor_2_user"
+ password =
+}
+resource "grafana_user" "editor_user_3" {
+ email = "terraform_editor_3@example.com"
+ login = "terraform_editor_3_user"
+ password =
+}
+
+# Assign Editor role to multiply users
+resource "grafana_role_assignment" "editor_role_assignment" {
+ role_uid = "basic_editor"
+ users = [grafana_user.editor_user_2.id, grafana_user.editor_user_3.id]
+}
+```
+
## Provision custom roles
The following example shows how to provision a custom role with some permissions.
diff --git a/docs/sources/administration/stats-and-license/index.md b/docs/sources/administration/stats-and-license/index.md
index 1643fd505cf..ec926f73c2f 100644
--- a/docs/sources/administration/stats-and-license/index.md
+++ b/docs/sources/administration/stats-and-license/index.md
@@ -25,11 +25,11 @@ This setting contains information about tools that Grafana Server Admins can use
## View Grafana server settings
-> Refer to [Role-based access control]({{< relref "../roles-and-permissions/access-control" >}}) in Grafana Enterprise to understand how you can control access with RBAC permissions.
+> Refer to [Role-based access control](../roles-and-permissions/access-control/) in Grafana Enterprise to understand how you can control access with RBAC permissions.
-If you are a Grafana server administrator, use the Settings tab to view the settings that are applied to your Grafana server via the [Configuration]({{< relref "../../setup-grafana/configure-grafana#configuration-file-location" >}}) file and any environmental variables.
+If you are a Grafana server administrator, use the Settings tab to view the settings that are applied to your Grafana server via the [Configuration](../../setup-grafana/configure-grafana/#configuration-file-location) file and any environmental variables.
-> **Note:** Only Grafana server administrators can access the **Server Admin** menu. For more information about about administrative permissions, refer to [Roles and permissions]({{< relref "../roles-and-permissions#grafana-server-administrators" >}}).
+> **Note:** Only Grafana server administrators can access the **Server Admin** menu. For more information about about administrative permissions, refer to [Roles and permissions](../roles-and-permissions/#grafana-server-administrators).
### View server settings
@@ -38,15 +38,15 @@ If you are a Grafana server administrator, use the Settings tab to view the sett
### Available settings
-For a full list of server settings, refer to [Configuration]({{< relref "../../setup-grafana/configure-grafana#server" >}}).
+For a full list of server settings, refer to [Configuration](../../setup-grafana/configure-grafana/#server).
## View Grafana server stats
-> Refer to [Role-based access control]({{< relref "../roles-and-permissions/access-control" >}}) in Grafana Enterprise to understand how you can control access with RBAC permissions.
+> Refer to [Role-based access control](../roles-and-permissions/access-control/) in Grafana Enterprise to understand how you can control access with RBAC permissions.
If you are a Grafana server admin, then you can view useful statistics about your Grafana server in the Stats & Licensing tab.
-> **Note:** Only Grafana server administrators can access the **Server Admin** menu. For more information about about administrative permissions, refer to [Roles and permissions]({{< relref "../roles-and-permissions#grafana-server-administrators" >}}).
+> **Note:** Only Grafana server administrators can access the **Server Admin** menu. For more information about about administrative permissions, refer to [Roles and permissions](../roles-and-permissions/#grafana-server-administrators).
### View server stats
diff --git a/docs/sources/administration/user-management/manage-dashboard-permissions/index.md b/docs/sources/administration/user-management/manage-dashboard-permissions/index.md
index b75f675cc5e..88087df89c2 100644
--- a/docs/sources/administration/user-management/manage-dashboard-permissions/index.md
+++ b/docs/sources/administration/user-management/manage-dashboard-permissions/index.md
@@ -14,7 +14,7 @@ weight: 500
Dashboard and folder permissions enable you to grant a viewer the ability to edit and save dashboard changes, or limit an editor's permission to modify a dashboard.
-For more information about dashboard permissions, refer to [Dashboard permissions]({{< relref "../../roles-and-permissions/#dashboard-permissions" >}}).
+For more information about dashboard permissions, refer to [Dashboard permissions](../../roles-and-permissions/#dashboard-permissions).
## Grant folder permissions
@@ -23,7 +23,7 @@ When you grant user permissions for folders, that setting applies to all dashboa
### Before you begin
- Ensure you have organization administrator privileges
-- Identify the dashboard folder permissions you want to modify and the users, service accounts or teams to which you want to grant access. For more information about dashboard permissions, refer to [Dashboard permissions]({{< relref "../../roles-and-permissions/#dashboard-permissions" >}}).
+- Identify the dashboard folder permissions you want to modify and the users, service accounts or teams to which you want to grant access. For more information about dashboard permissions, refer to [Dashboard permissions](../../roles-and-permissions/#dashboard-permissions).
**To grant dashboard folder permissions**:
@@ -65,7 +65,7 @@ Grant dashboard permissions when you want to restrict or enhance dashboard acces
# Edit dashboard permissions
-Edit dashboard permissions when you are want to enhance or restrict a user's access to a dashboard. For more information about dashboard permissions, refer to [Dashboard permissions]({{< relref "../../roles-and-permissions/#dashboard-permissions" >}}).
+Edit dashboard permissions when you are want to enhance or restrict a user's access to a dashboard. For more information about dashboard permissions, refer to [Dashboard permissions](../../roles-and-permissions/#dashboard-permissions).
### Before you begin
@@ -135,4 +135,4 @@ Folder permissions settings:
Result: User1 has editor permissions for the folder because user1 has permissions on a folder that contains this folder.
-> Refer to [Role-based access Control]({{< relref "../../roles-and-permissions/access-control/" >}}) in Grafana Enterprise to understand how to use RBAC permissions to restrict access to dashboards, folders, administrative functions, and other resources.
+> Refer to [Role-based access Control](../../roles-and-permissions/access-control/) in Grafana Enterprise to understand how to use RBAC permissions to restrict access to dashboards, folders, administrative functions, and other resources.
diff --git a/docs/sources/administration/user-management/manage-org-users/index.md b/docs/sources/administration/user-management/manage-org-users/index.md
index 85c8a8bb882..1364e55882f 100644
--- a/docs/sources/administration/user-management/manage-org-users/index.md
+++ b/docs/sources/administration/user-management/manage-org-users/index.md
@@ -19,7 +19,7 @@ weight: 400
Organization administrators can invite users to join their organization. Organization users have access to organization resources based on their role, which is **Admin**, **Editor**, or **Viewer**. Permissions associated with each role determine the tasks a user can perform in the system.
-For more information about organization user permissions, refer to [Organization users and permissions]({{< relref "../../roles-and-permissions/#organization-users-and-permissions" >}}).
+For more information about organization user permissions, refer to [Organization users and permissions](../../roles-and-permissions/#organization-users-and-permissions).
{{% admonition type="note" %}}
Users added at the organization level will have access to all stacks and services by default, without the ability to be filtered by stack unless Single Sign-On (SSO) or Role-Based Access Control (RBAC) is implemented.
@@ -41,15 +41,15 @@ You can see a list of users with accounts in your Grafana organization. If neces
1. Navigate to **Administration > Users and access > Users**.
{{% admonition type="note" %}}
-If you have [server administrator]({{< relref "../../roles-and-permissions/#grafana-server-administrators" >}}) permissions, you can also [view a global list of users]({{< relref "../server-user-management#view-a-list-of-users" >}}) in the Server Admin section of Grafana.
+If you have [server administrator](../../roles-and-permissions/#grafana-server-administrators) permissions, you can also [view a global list of users](../server-user-management/#view-a-list-of-users) in the Server Admin section of Grafana.
{{% /admonition %}}
## Change a user's organization permissions
-Update user permissions when you want to enhance or restrict a user's access to organization resources. For more information about organization permissions, refer to [Organization roles]({{< relref "../../roles-and-permissions/#organization-roles" >}}).
+Update user permissions when you want to enhance or restrict a user's access to organization resources. For more information about organization permissions, refer to [Organization roles](../../roles-and-permissions/#organization-roles).
{{% admonition type="note" %}}
-Organization roles sync from the authentication provider on user sign-in. To prevent synchronization of organization roles from the authentication provider regardless of their role in the authentication provider, then refer to the `skip_org_role_sync` setting in your Grafana configuration. Refer to [skip org role sync]({{< relref "../../../setup-grafana/configure-grafana/#authgrafana_com-skip_org_role_sync" >}}) for more information.
+Organization roles sync from the authentication provider on user sign-in. To prevent synchronization of organization roles from the authentication provider regardless of their role in the authentication provider, then refer to the `skip_org_role_sync` setting in your Grafana configuration. Refer to [skip org role sync](../../../setup-grafana/configure-grafana/#authgrafana_com-skip_org_role_sync) for more information.
{{% /admonition %}}
### Before you begin
@@ -69,7 +69,7 @@ Organization roles sync from the authentication provider on user sign-in. To pre
1. Click **Update**.
{{% admonition type="note" %}}
-If you have [server administrator]({{< relref "../../roles-and-permissions/#grafana-server-administrators" >}}) permissions, you can also [change a user's organization permissions]({{< relref "../server-user-management/change-user-org-permissions/" >}}) in the Server Admin section.
+If you have [server administrator](../../roles-and-permissions/#grafana-server-administrators) permissions, you can also [change a user's organization permissions](../server-user-management/change-user-org-permissions/) in the Server Admin section.
{{% /admonition %}}
## Invite a user to join an organization
@@ -80,14 +80,14 @@ When you invite users to join an organization, you assign the **Admin**, **Edito
- If the user is new to Grafana, then use their email address to issue an invitation. The system automatically creates the user account on first sign in.
{{% admonition type="note" %}}
-If you have [server administrator]({{< relref "../../roles-and-permissions/#grafana-server-administrators" >}}) permissions, you can also manually [add a user to an organization]({{< relref "../server-user-management/add-remove-user-to-org/" >}}).
+If you have [server administrator](../../roles-and-permissions/#grafana-server-administrators) permissions, you can also manually [add a user to an organization](../server-user-management/add-remove-user-to-org/).
{{% /admonition %}}
### Before you begin
- Ensure you have organization administrator privileges.
- If the user already has access to Grafana, obtain their user name.
-- Determine the permissions you want to assign to the user. For more information about organization permissions, refer to [Organization roles]({{< relref "../../roles-and-permissions/#organization-roles" >}}).
+- Determine the permissions you want to assign to the user. For more information about organization permissions, refer to [Organization roles](../../roles-and-permissions/#organization-roles).
**To invite or add an existing user account to your organization**:
@@ -105,7 +105,7 @@ If you have [server administrator]({{< relref "../../roles-and-permissions/#graf
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Email or username | Either the email or username that the user will use to sign in to Grafana. |
| Name | The user's name. |
- | Role | Click the organization role to assign this user. For more information about organization roles, refer to [Organization roles]({{< relref "../../roles-and-permissions/#organization-roles" >}}).. |
+ | Role | Click the organization role to assign this user. For more information about organization roles, refer to [Organization roles](../../roles-and-permissions/#organization-roles).. |
| Send invite email | Switch to on if your organization has configured. The system sends an email to the user inviting them to sign in to Grafana and join the organization. Switch to off if you are not using email. The user can sign in to Grafana with the email or username you entered. |
1. Click **Submit**.
@@ -156,4 +156,4 @@ This action does not remove the user account from the Grafana server.
1. Click the red **X** to remove the user from the organization.
-> **Note:** If you have [server administrator]({{< relref "../../roles-and-permissions/#grafana-server-administrators" >}}) permissions, you can also [remove a user from an organization]({{< relref "../server-user-management/add-remove-user-to-org/#remove-a-user-from-an-organization" >}}) on the Users page of the Server Admin section.
+> **Note:** If you have [server administrator](../../roles-and-permissions/#grafana-server-administrators) permissions, you can also [remove a user from an organization](../server-user-management/add-remove-user-to-org/#remove-a-user-from-an-organization) on the Users page of the Server Admin section.
diff --git a/docs/sources/administration/user-management/server-user-management/_index.md b/docs/sources/administration/user-management/server-user-management/_index.md
index f5d14efcd25..cd3640c8224 100644
--- a/docs/sources/administration/user-management/server-user-management/_index.md
+++ b/docs/sources/administration/user-management/server-user-management/_index.md
@@ -20,13 +20,13 @@ weight: 100
A _user_ is defined as any individual who can log in to Grafana. Each user is associated with a _role_ that includes _permissions_. Permissions determine the tasks a user can perform in the system.
-If you have [server administrator]({{< relref "../../roles-and-permissions/#grafana-server-administrators" >}}) permissions in Grafana, you can manage all users for a Grafana instance in the Server Admin section:
+If you have [server administrator](../../roles-and-permissions/#grafana-server-administrators) permissions in Grafana, you can manage all users for a Grafana instance in the Server Admin section:
{{< section >}}
-If you have [organization administrator]({{< relref "../../roles-and-permissions/#organization-roles" >}}) permissions and _not_ [server administrator]({{< relref "../../roles-and-permissions/#grafana-server-administrators" >}}) permissions, refer to [Manage users in a organization]({{< relref "../manage-org-users/" >}}).
+If you have [organization administrator](../../roles-and-permissions/#organization-roles) permissions and _not_ [server administrator](../../roles-and-permissions/#grafana-server-administrators) permissions, refer to [Manage users in a organization](../manage-org-users/).
-For more information about user roles and permissions, refer to [Roles and permissions]({{< relref "../../roles-and-permissions/" >}}). For more information about managing users in general, see [User management]({{< relref "../" >}}).
+For more information about user roles and permissions, refer to [Roles and permissions](../../roles-and-permissions/). For more information about managing users in general, see [User management](../).
## View a list of users
@@ -42,7 +42,7 @@ You can see a list of users with accounts on your Grafana server. This action mi
1. Click **Administration** in the left-side menu, **Users and access**, and then **Users**.
{{% admonition type="note" %}}
-If you have [organization administrator]({{< relref "../../roles-and-permissions/#organization-roles" >}}) permissions and _not_ [server administrator]({{< relref "../../roles-and-permissions/#grafana-server-administrators" >}}) permissions, you can still [view of list of users in a given organization]({{< relref "../manage-org-users/#view-a-list-of-organization-users" >}}).
+If you have [organization administrator](../../roles-and-permissions/#organization-roles) permissions and _not_ [server administrator](../../roles-and-permissions/#grafana-server-administrators) permissions, you can still [view of list of users in a given organization](../manage-org-users/#view-a-list-of-organization-users).
{{% /admonition %}}
## View user details
@@ -104,7 +104,7 @@ Edit a user account when you want to modify user login credentials, or delete, d
Add users when you want to manually provide individuals with access to Grafana.
-When you create a user using this method, you must create their password. The user does not receive a notification by email. To invite a user to Grafana and allow them to create their own password, [invite a user to join an organization]({{< relref "../manage-org-users#invite-a-user-to-join-an-organization" >}}).
+When you create a user using this method, you must create their password. The user does not receive a notification by email. To invite a user to Grafana and allow them to create their own password, [invite a user to join an organization](../manage-org-users/#invite-a-user-to-join-an-organization).
When you configure advanced authentication using Oauth, SAML, LDAP, or the Auth proxy, users are created automatically.
@@ -119,10 +119,10 @@ When you configure advanced authentication using Oauth, SAML, LDAP, or the Auth
1. Click **New user**.
1. Complete the fields and click **Create user**.
-When you create a user, the system assigns the user viewer permissions in a default organization, which you can change. You can now [add a user to a second organization]({{< relref "add-remove-user-to-org/" >}}).
+When you create a user, the system assigns the user viewer permissions in a default organization, which you can change. You can now [add a user to a second organization](add-remove-user-to-org/).
{{% admonition type="note" %}}
-If you have [organization administrator]({{< relref "../../roles-and-permissions/#organization-roles" >}}) permissions and _not_ [server administrator]({{< relref "../../roles-and-permissions/#grafana-server-administrators" >}}) permissions, you can still add users by [inviting a user to join an organization]({{< relref "../manage-org-users#invite-a-user-to-join-an-organization" >}}).
+If you have [organization administrator](../../roles-and-permissions/#organization-roles) permissions and _not_ [server administrator](../../roles-and-permissions/#grafana-server-administrators) permissions, you can still add users by [inviting a user to join an organization](../manage-org-users/#invite-a-user-to-join-an-organization).
{{% /admonition %}}
## Force a user to log out of Grafana
diff --git a/docs/sources/administration/user-management/server-user-management/add-remove-user-to-org/index.md b/docs/sources/administration/user-management/server-user-management/add-remove-user-to-org/index.md
index 04ddd0dc490..f67983d8e68 100644
--- a/docs/sources/administration/user-management/server-user-management/add-remove-user-to-org/index.md
+++ b/docs/sources/administration/user-management/server-user-management/add-remove-user-to-org/index.md
@@ -14,7 +14,7 @@ weight: 30
# Add or remove a user in an organization
-Server administrators can add and remove users in organizations. To do this as an organization administrator, see [Manage users in an organization]({{< relref "../../manage-org-users/" >}}).
+Server administrators can add and remove users in organizations. To do this as an organization administrator, see [Manage users in an organization](../../manage-org-users/).
## Add a user to an organization
@@ -24,9 +24,9 @@ You are required to specify an Admin role for each organization. The first user
### Before you begin
-- [Create an organization]({{< relref "../../../organization-management/#create-an-organization" >}})
-- [Add a user]({{< relref "./#add-a-user" >}}) to Grafana
-- Ensure you have [Grafana server administrator privileges]({{< relref "./assign-remove-server-admin-privileges" >}})
+- [Create an organization](../../../organization-management/#create-an-organization)
+- [Add a user](./#add-a-user) to Grafana
+- Ensure you have [Grafana server administrator privileges](../assign-remove-server-admin-privileges/)
**To add a user to an organization**:
@@ -36,14 +36,14 @@ You are required to specify an Admin role for each organization. The first user
1. In the Organizations section, click **Add user to organization**.
1. Select an organization and a role.
- For more information about user permissions, refer to [Organization roles]({{< relref "../../../roles-and-permissions#organization-roles" >}}).
+ For more information about user permissions, refer to [Organization roles](../../../roles-and-permissions/#organization-roles).
1. Click **Add to organization**.
The next time the user signs in, they will be able to navigate to their new organization using the Switch Organizations option in the user profile menu.
{{% admonition type="note" %}}
-If you have [organization administrator]({{< relref "../../../roles-and-permissions#organization-roles" >}}) permissions and _not_ [server administrator]({{< relref "../../../roles-and-permissions#grafana-server-administrators" >}}) permissions, you can still [invite a user to join an organization]({{< relref "../../manage-org-users#invite-a-user-to-join-an-organization" >}}).
+If you have [organization administrator](../../../roles-and-permissions/#organization-roles) permissions and _not_ [server administrator](../../../roles-and-permissions/#grafana-server-administrators) permissions, you can still [invite a user to join an organization](../../manage-org-users/#invite-a-user-to-join-an-organization).
{{% /admonition %}}
## Remove a user from an organization
@@ -62,4 +62,4 @@ Remove a user from an organization when they no longer require access to the das
1. In the Organization section, click **Remove from organization** next to the organization from which you want to remove the user.
1. Click **Confirm removal**.
-> **Note:** If you have [organization administrator]({{< relref "../../../roles-and-permissions#organization-roles" >}}) permissions and _not_ [server administrator]({{< relref "../../../roles-and-permissions#grafana-server-administrators" >}}) permissions, you can still [remove a user from an organization]({{< relref "../../manage-org-users#remove-a-user-from-an-organization" >}}) in the Users section of organization configuration.
+> **Note:** If you have [organization administrator](../../../roles-and-permissions/#organization-roles) permissions and _not_ [server administrator](../../../roles-and-permissions/#grafana-server-administrators) permissions, you can still [remove a user from an organization](../../manage-org-users/#remove-a-user-from-an-organization) in the Users section of organization configuration.
diff --git a/docs/sources/administration/user-management/server-user-management/assign-remove-server-admin-privileges/index.md b/docs/sources/administration/user-management/server-user-management/assign-remove-server-admin-privileges/index.md
index c017f104bdd..31523789db9 100644
--- a/docs/sources/administration/user-management/server-user-management/assign-remove-server-admin-privileges/index.md
+++ b/docs/sources/administration/user-management/server-user-management/assign-remove-server-admin-privileges/index.md
@@ -13,7 +13,7 @@ weight: 20
# Assign or remove Grafana server administrator privileges
-Grafana server administrators are responsible for creating users, organizations, and managing permissions. For more information about the server administration role, refer to [Grafana server administrators]({{< relref "../../../roles-and-permissions#grafana-server-administrators" >}}).
+Grafana server administrators are responsible for creating users, organizations, and managing permissions. For more information about the server administration role, refer to [Grafana server administrators](../../../roles-and-permissions/#grafana-server-administrators).
{{% admonition type="note" %}}
Server administrators are "super-admins" with full permissions to create, read, update, and delete all resources and users in all organizations, as well as update global settings such as licenses. Only grant this permission to trusted users.
@@ -21,7 +21,7 @@ Server administrators are "super-admins" with full permissions to create, read,
## Before you begin
-- [Add a user]({{< relref "../#add-a-user" >}})
+- [Add a user](../#add-a-user)
- Ensure you have Grafana server administrator privileges
**To assign or remove Grafana administrator privileges**:
diff --git a/docs/sources/administration/user-management/server-user-management/change-user-org-permissions/index.md b/docs/sources/administration/user-management/server-user-management/change-user-org-permissions/index.md
index 4569a5ac8f2..4bf9eac2862 100644
--- a/docs/sources/administration/user-management/server-user-management/change-user-org-permissions/index.md
+++ b/docs/sources/administration/user-management/server-user-management/change-user-org-permissions/index.md
@@ -11,11 +11,11 @@ weight: 50
# Change a user's organization permissions
-Update organization permissions when you want to enhance or restrict a user's access to organization resources. For more information about organization permissions, refer to [Organization roles]({{< relref "../../../roles-and-permissions/#organization-roles" >}}).
+Update organization permissions when you want to enhance or restrict a user's access to organization resources. For more information about organization permissions, refer to [Organization roles](../../../roles-and-permissions/#organization-roles).
## Before you begin
-- [Add a user to an organization]({{< relref "./add-remove-user-to-org/" >}})
+- [Add a user to an organization](../add-remove-user-to-org/)
- Ensure you have Grafana server administrator privileges
**To change a user's organization permissions**:
diff --git a/docs/sources/administration/user-management/user-preferences/index.md b/docs/sources/administration/user-management/user-preferences/index.md
index 41166419d52..eb1bae56a7f 100644
--- a/docs/sources/administration/user-management/user-preferences/index.md
+++ b/docs/sources/administration/user-management/user-preferences/index.md
@@ -50,7 +50,7 @@ Your profile includes your name, user name, and email address, which you can upd
## Edit your preferences
-You can choose the way you would like data to appear in Grafana, including the UI theme, home dashboard, timezone, and first day of the week. You can set these preferences for your own account, for a team, for an organization, or Grafana-wide using configuration settings. Your user preferences take precedence over team, organization, and Grafana default preferences. For more information, see [Grafana preferences]({{< relref "../../organization-preferences/" >}}).
+You can choose the way you would like data to appear in Grafana, including the UI theme, home dashboard, timezone, and first day of the week. You can set these preferences for your own account, for a team, for an organization, or Grafana-wide using configuration settings. Your user preferences take precedence over team, organization, and Grafana default preferences. For more information, see [Grafana preferences](../../organization-preferences/).
- **UI theme** determines whether Grafana appears in light mode or dark mode. By default, UI theme is set to dark mode.
- **Home dashboard** refers to the dashboard you see when you sign in to Grafana. By default, this is set to the Home dashboard.
@@ -85,7 +85,7 @@ Every user is a member of at least one organization. You can have different role
1. Click the user icon in the top right corner of the page and select **Profile**.
1. Scroll down to the Organizations section and review the following information:
- **Name**: The name of the organizations of which you are a member.
- - **Role**: The role to which you are assigned in the organization. For more information about roles and permissions, refer to [Organization users and permissions]({{< relref "../../roles-and-permissions/#organization-users-and-permissions" >}}).
+ - **Role**: The role to which you are assigned in the organization. For more information about roles and permissions, refer to [Organization users and permissions](../../roles-and-permissions/#organization-users-and-permissions).
- **Current**: Grafana indicates the organization that you are currently signed into as _Current_. If you are a member of multiple organizations, you can click **Select** to switch to that organization.
## View your Grafana sessions
diff --git a/docs/sources/alerting/alerting-rules/link-alert-rules-to-panels.md b/docs/sources/alerting/alerting-rules/link-alert-rules-to-panels.md
index 746cb778052..78cce1a5efa 100644
--- a/docs/sources/alerting/alerting-rules/link-alert-rules-to-panels.md
+++ b/docs/sources/alerting/alerting-rules/link-alert-rules-to-panels.md
@@ -33,6 +33,11 @@ refs:
destination: /docs/grafana//alerting/monitor-status/view-alert-state/#view-alert-state-on-panels
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/monitor-status/view-alert-state/#view-alert-state-on-panels
+ images-in-notifications:
+ - pattern: /docs/grafana/
+ destination: /docs/grafana//alerting/configure-notifications/template-notifications/images-in-notifications/
+ - pattern: /docs/grafana-cloud/
+ destination: /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/images-in-notifications/
---
# Create and link alert rules to panels
@@ -41,13 +46,10 @@ Grafana allows you to link an alert rule to a dashboard panel. This can help you
- Inform alert responders about where to investigate and which data to examine.
- Visualize the alert state directly from dashboards.
+- Include a screenshot of the panel in notification messages.
An alert rule is linked to a panel by setting the [`dashboardUId` and `panelId` annotations](ref:annotations). Both annotations must be set together.
-{{% admonition type="tutorial" %}}
-For a hands-on example of integrating alert rules with dashboards, check out [Part 5 of our Get Started with Grafana Alerting tutorial](http://www.grafana.com/tutorials/alerting-get-started-pt5/).
-{{% /admonition %}}
-
## Link alert rules to panels
When configuring the alert rule, you can set the dashboard and panel annotations as shown in this [video](https://youtu.be/ClLp-iSoaSY?si=qKWnvSVaQuvYcuw9&t=170).
@@ -59,6 +61,8 @@ When configuring the alert rule, you can set the dashboard and panel annotations
You can then [view the alert state on the panel](ref:view-alert-state-on-panels).
+By default, notification messages include a link to the dashboard panel. Additionally, you can [enable displaying panel screenshots in notifications](ref:images-in-notifications).
+
{{< figure src="/media/docs/alerting/panel-displays-alert-state.png" max-width="1200px" caption="A panel displaying the alert status and state changes." >}}
## Create alert rules from panels
@@ -75,6 +79,8 @@ To streamline alert creation, you can create an alert rule directly from a panel
You can then [view the alert state on the panel](ref:view-alert-state-on-panels).
+By default, notification messages include a link to the dashboard panel. Additionally, you can [enable displaying panel screenshots in notifications](ref:images-in-notifications).
+
{{% admonition type="note" %}}
Changes to panel and alert rule queries aren't synchronized. If you change a query, you have to update it in both the panel and the alert rule.
{{% /admonition %}}
@@ -86,3 +92,7 @@ This option is available only in [time series panels](ref:time-series-visualizat
1. Hover over the top-right corner of the panel and click the panel menu icon.
1. Click **Edit**.
1. Click the **Alert** tab to view existing alert rules or create a new one.
+
+{{< admonition type="tip" >}}
+For a practical example that links a panel to an alert rule, refer to [Part 5 of our Get Started with Grafana Alerting tutorial](http://www.grafana.com/tutorials/alerting-get-started-pt5/).
+{{% /admonition %}}
diff --git a/docs/sources/alerting/alerting-rules/templates/_index.md b/docs/sources/alerting/alerting-rules/templates/_index.md
index cf211fed7b6..cb12bf47513 100644
--- a/docs/sources/alerting/alerting-rules/templates/_index.md
+++ b/docs/sources/alerting/alerting-rules/templates/_index.md
@@ -176,7 +176,7 @@ Template labels when the labels returned by your queries are insufficient. For i
Here’s an example of templating a `severity` label based on the query value.
-```
+```go
{{ if (gt $values.A.Value 90.0) -}}
critical
{{ else if (gt $values.A.Value 80.0) -}}
@@ -190,9 +190,7 @@ low
In this example, the value of the `severity` label is determined by the query value, and the possible options are `critical`, `high`, `medium`, or `low`. You can then use the `severity` label to change their notifications—for instance, sending `critical` alerts immediately or routing `low` alerts to a specific team for further review.
-{{% admonition type="note" %}}
-You should avoid displaying query values in labels, as this may create numerous unique alert instances—one for each distinct label value. Instead, use annotations for query values.
-{{% /admonition %}}
+{{< docs/shared lookup="alerts/note-dynamic-labels.md" source="grafana" version="" >}}
### How to template a label
diff --git a/docs/sources/alerting/alerting-rules/templates/examples.md b/docs/sources/alerting/alerting-rules/templates/examples.md
index c8c6f9dbb40..e9ee1a8015b 100644
--- a/docs/sources/alerting/alerting-rules/templates/examples.md
+++ b/docs/sources/alerting/alerting-rules/templates/examples.md
@@ -209,9 +209,7 @@ In this example, the `severity` label is determined by the query value:
You can then use the `severity` label to control how alerts are handled. For instance, you could send `critical` alerts immediately, while routing `low` severity alerts to a team for further investigation.
-{{% admonition type="note" %}}
-You should avoid displaying query values in labels, as this may create many alert instances—one for each distinct label value. Instead, use annotations to convey query values.
-{{% /admonition %}}
+{{< docs/shared lookup="alerts/note-dynamic-labels.md" source="grafana" version="" >}}
### Based on query label
diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md
index e7741ac3b56..bf4e0cc90fe 100644
--- a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md
+++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md
@@ -72,6 +72,7 @@ For more details on contact points, including how to test them and enable notifi
| Authentication Header Credentials | Credentials for the `Authorization` Request header. |
| Max Alerts | Maximum number of alerts to include in a notification. Any alerts exceeding this limit are ignored. `0` means no limit. |
| TLS | TLS configuration options, including CA certificate, client certificate, and client key. |
+| HMAC Signature | HMAC signature configuration options. |
{{< admonition type="note" >}}
@@ -79,6 +80,37 @@ You can configure either HTTP Basic Authentication or the Authorization request
{{< /admonition >}}
+#### HMAC signature
+
+You can secure your webhook notifications using HMAC signatures to verify the authenticity and integrity of the requests. When enabled, Grafana signs the webhook payload with a shared secret using HMAC-SHA256.
+
+| Option | Description |
+| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| Secret | The shared secret key used to generate the HMAC signature. |
+| Header | The HTTP header where the signature will be set. Default is `X-Grafana-Alerting-Signature`. |
+| Timestamp Header | Optional header to include a timestamp in the signature calculation. When specified, Grafana will set a Unix timestamp in this header and include it in the HMAC calculation. This provides protection against replay attacks. |
+
+When HMAC signing is configured, Grafana generates a signature using HMAC-SHA256 with your secret key. If a timestamp header is specified, a Unix timestamp is included in the signature calculation. The signature is calculated as:
+
+```
+HMAC(timestamp + ":" + body)
+```
+
+The timestamp is sent in the specified header. If no timestamp header is specified, the signature is calculated just from the request body. The signature is sent as a hex-encoded string in the specified signature header.
+
+##### Validate a request
+
+To validate incoming webhook requests from Grafana, follow these steps:
+
+1. Extract the signature from the header (default is `X-Grafana-Alerting-Signature`).
+2. If you configured a timestamp header, extract the timestamp value and verify it's recent to prevent replay attacks.
+3. Calculate the expected signature:
+ - Create an HMAC-SHA256 hash using your shared secret
+ - If using timestamps, include the timestamp followed by a colon (`:`) before the request body
+ - Hash the raw request body
+ - Convert the result to a hexadecimal string
+4. Compare the calculated signature with the one in the request header.
+
#### Optional settings using templates
Use the following settings to include custom data within the [JSON payload](#body). Both options support using [notification templates](ref:notification-templates).
diff --git a/docs/sources/alerting/configure-notifications/template-notifications/reference.md b/docs/sources/alerting/configure-notifications/template-notifications/reference.md
index e20d31ee77b..905ad86e264 100644
--- a/docs/sources/alerting/configure-notifications/template-notifications/reference.md
+++ b/docs/sources/alerting/configure-notifications/template-notifications/reference.md
@@ -96,25 +96,25 @@ You can execute this template by passing the dot (`.`):
`Alert` contains data for an individual alert:
-| Name | Type | Description |
-| -------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
-| `Status` | string | Firing or resolved. |
-| `Labels` | [KV](#kv) | The labels for this alert. It includes all [types of labels](ref:label-types). |
-| `Annotations` | [KV](#kv) | The annotations for this alert. |
-| `StartsAt` | [Time](#time) | The time the alert fired |
-| `EndsAt` | [Time](#time) | Only set if the end time of an alert is known. Otherwise set to a configurable timeout period from the time since the last alert was received. |
-| `GeneratorURL` | string | A link to Grafana, or the source of the alert if using an external alert generator. |
-| `Fingerprint` | string | A unique string that identifies the alert. |
+| Name | Type | Description |
+| -------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `Status` | string | Firing or resolved. |
+| `Labels` | [KV](#kv) | The labels associated with this alert.
It includes all [types of labels](ref:label-types), but only query labels used in the alert condition. |
+| `Annotations` | [KV](#kv) | The annotations for this alert. |
+| `StartsAt` | [Time](#time) | The time the alert fired |
+| `EndsAt` | [Time](#time) | Only set if the end time of an alert is known. Otherwise set to a configurable timeout period from the time since the last alert was received. |
+| `GeneratorURL` | string | A link to Grafana, or the source of the alert if using an external alert generator. |
+| `Fingerprint` | string | A unique string that identifies the alert. |
Grafana-managed alerts include these additional properties:
-| Name | Type | Description |
-| -------------- | --------- | ------------------------------------------------------------------------------------ |
-| `DashboardURL` | string | A link to the Grafana Dashboard if the alert has a Dashboard UID annotation. |
-| `PanelURL` | string | A link to the panel if the alert has a Panel ID annotation. |
-| `SilenceURL` | string | A link to silence the alert. |
-| `Values` | [KV](#kv) | The values of all expressions, including Classic Conditions. |
-| `ValueString` | string | A string that contains the labels and value of each reduced expression in the alert. |
+| Name | Type | Description |
+| -------------- | --------- | -------------------------------------------------------------------------------------------------- |
+| `DashboardURL` | string | A link to the Grafana Dashboard if the alert has a Dashboard UID annotation. |
+| `PanelURL` | string | A link to the panel if the alert has a Panel ID annotation. |
+| `SilenceURL` | string | A link to silence the alert. |
+| `Values` | [KV](#kv) | The values of expressions used to evaluate the alert condition. Only relevant values are included. |
+| `ValueString` | string | A string that contains the labels and value of each reduced expression in the alert. |
This example iterates over the list of firing and resolved alerts (`.Alerts`) in the notification and prints the data for each alert:
diff --git a/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md b/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md
index bcfc5b27769..5438c8c377b 100644
--- a/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md
+++ b/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md
@@ -52,14 +52,16 @@ An alert instance can be in either of the following states:
| **No Data\*** | The state of an alert whose query returns no data or all values are null.
An alert in this state generates a new [DatasourceNoData alert](#no-data-and-error-alerts). You can [modify the default behavior of the no data state](#modify-the-no-data-or-error-state). |
| **Error\*** | The state of an alert when an error or timeout occurred evaluating the alert rule.
An alert in this state generates a new [DatasourceError alert](#no-data-and-error-alerts). You can [modify the default behavior of the error state](#modify-the-no-data-or-error-state). |
+If an alert rule changes (except for updates to annotations, the evaluation interval, or other internal fields), its alert instances reset to the `Normal` state. The alert instance state then updates accordingly during the next evaluation.
+
+{{< figure src="/media/docs/alerting/alert-instance-states-v3.png" caption="Alert instance state diagram" alt="A diagram of the distinct alert instance states and transitions." max-width="750px" >}}
+
{{< admonition type="note" >}}
`No Data` and `Error` states are supported only for Grafana-managed alert rules.
{{< /admonition >}}
-{{< figure src="/media/docs/alerting/alert-instance-states-v3.png" caption="Alert instance state diagram" alt="A diagram of the distinct alert instance states and transitions." max-width="750px" >}}
-
### Notification routing
Alert instances will be routed for [notifications](ref:notifications) when they are in the `Alerting` state or have been `Resolved`, transitioning from `Alerting` to `Normal` state.
@@ -68,7 +70,7 @@ Alert instances will be routed for [notifications](ref:notifications) when they
### `No Data` and `Error` alerts
-When evaluation of an alert rule produces state `No Data` or `Error`, Grafana Alerting generates a new alert instance that have the following additional labels:
+When an alert rule evaluation results in a `No Data` or `Error` state, Grafana Alerting immediately creates a new alert instance —skipping the pending period—with the following additional labels:
- `alertname`: Either `DatasourceNoData` or `DatasourceError` depending on the state.
- `datasource_uid`: The UID of the data source that caused the state.
diff --git a/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md b/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md
index 41d3c4c0220..ade6b016049 100644
--- a/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md
+++ b/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md
@@ -136,6 +136,8 @@ If multiple label keys are sanitized to the same value, the duplicates have a sh
Annotations add additional information to alert instances, helping responders identify and address potential issues.
+Create clear and self-explanatory annotations so that first responders can investigate without needing deeper knowledge of the alert setup.
+
Annotations are displayed in Grafana and are included by default in notifications. Grafana provides several optional annotations that you can edit:
- `summary`: A short summary of what the alert has detected and why.
diff --git a/docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md b/docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md
index 8e2eab652e8..64b1e83ef54 100644
--- a/docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md
+++ b/docs/sources/alerting/fundamentals/notifications/group-alert-notifications.md
@@ -55,7 +55,7 @@ Alert instances are grouped together if they have the same exact label values fo
For example, given the `Group by` option set to the `team` label:
- `alertname:foo, team=frontend`, and `alertname:bar, team=frontend` are in one group.
-- `alertname:foo, team=backend`, and `alertname:qux, team=backend` are in another group.
+- `alertname:foo, team=frontend`, and `alertname:qux, team=backend` are in another group.
### Group by alert rule or labels
@@ -99,7 +99,9 @@ flowchart LR
Group wait is the duration Grafana waits before sending the first notification for a new group of alerts.
-The longer the group wait, the more time other alerts have to be included in the initial notification of the new group. The shorter the group wait, the earlier the first notification is sent, but at the risk of not including some alerts.
+This option helps reduce the number of notifications sent for related alerts occurring within a short time frame. The longer the group wait, the more time other alerts have to be included in the initial notification of the new group. The shorter the group wait, the earlier the first notification is sent, but at the risk of not including some alerts.
+
+If an alert is resolved before the duration elapses, no notification is sent for that alert. This reduces noise from flapping alerts.
**Example**
@@ -125,7 +127,10 @@ Consider a notification policy that:
If an alert was too late to be included in the first notification due to group wait, it is included in subsequent notifications after group interval.
-Group interval is the duration to wait before sending notifications about group changes. For instance, a group change may be adding a new firing alert to the group, or resolving an existing alert.
+Group interval is the duration to wait before sending notifications about group changes. A group change occurs when:
+
+- A new firing alert is added to the group.
+- An existing alert is resolved.
**Example**
@@ -170,6 +175,8 @@ Repeat interval is evaluated every time the group interval resets. If the alert
Repeat interval must not only be greater than or equal to group interval, but also must be a multiple of Group interval. If Repeat interval is not a multiple of group interval it is coerced into one. For example, if your Group interval is 5 minutes, and your Repeat interval is 9 minutes, the Repeat interval is rounded up to the nearest multiple of 5 which is 10 minutes.
+The maximum duration of the repeat interval is 5 days, constrained by the default value of the `notification_log_retention` setting in Grafana.
+
**Example**
Here are the related excerpts from the previous example:
diff --git a/docs/sources/alerting/fundamentals/templates.md b/docs/sources/alerting/fundamentals/templates.md
index 3b2fa4de8c5..4e4243aee9c 100644
--- a/docs/sources/alerting/fundamentals/templates.md
+++ b/docs/sources/alerting/fundamentals/templates.md
@@ -63,6 +63,7 @@ In Grafana, you have various options to template your alert notification message
- Labels are used to differentiate an alert instance from all other alert instances.
- Template labels to add an additional label based on a query value, or when the labels from the query are incomplete or not descriptive enough.
+ - Avoid displaying query values in labels as this can create numerous alert instances—use annotations instead.
1. [Notification templates](#template-notifications)
- Notification templates are used by contact points for consistent messaging in notification titles and descriptions.
@@ -124,18 +125,16 @@ You can also template labels based on query results. This is helpful if the labe
- Add a new label to change how alerts are identified and grouped into different alert groups.
- Add a new label used by notification policies or silences to manage how the alert is handled.
-Here’s an example of templating a `severity` label based on the query value:
+Here’s an example of templating a new `env` label based on the value of a query label:
```go
-{{ if (gt $values.A.Value 90.0) -}}
-critical
-{{ else if (gt $values.A.Value 80.0) -}}
-high
-{{ else if (gt $values.A.Value 60.0) -}}
-medium
-{{ else -}}
-low
-{{- end }}
+{{- if eq $labels.instance "prod-server-1" -}}
+production
+{{- else if eq $labels.instance "staging-server-1" -}}
+staging
+{{- else -}}
+development
+{{- end -}}
```
For more details on how to template labels, refer to [Template annotations and labels](ref:templating-labels-annotations).
diff --git a/docs/sources/alerting/monitor-status/view-alert-rules.md b/docs/sources/alerting/monitor-status/view-alert-rules.md
index 8bc68611a2d..2d7a404b90b 100644
--- a/docs/sources/alerting/monitor-status/view-alert-rules.md
+++ b/docs/sources/alerting/monitor-status/view-alert-rules.md
@@ -5,7 +5,7 @@ aliases:
- ../../alerting/alerting-rules/rule-list/ # /docs/grafana//alerting/alerting-rules/rule-list
- ../../alerting/manage-notifications/view-alert-rules/ # /docs/grafana//alerting/manage-notifications/view-alert-rules/
canonical: https://grafana.com/docs/grafana/latest/alerting/monitor-status/view-alert-rules/
-description: View alert rules
+description: View alert rules, compare their versions, and restore previous alert rules.
keywords:
- grafana
- alerting
@@ -43,6 +43,8 @@ This view includes filters to simplify managing large volumes of alerts.
You can filter by data sources, dashboards, and alert rule properties such as state, type, health, and contact points. The **Search** input allows you to filter by additional parameters like folders, evaluation groups, labels, and more.
+## Change alert rules list view
+
You can also change how the rule list is displayed using the **View as** option.
- **Grouped**: Displays Grafana rules grouped by folder and evaluation group, and data-source rules by namespace and evaluation group. This is the default view.
@@ -56,3 +58,15 @@ Select a group to expand it and view the list of alert rules within that group.
{{< figure src="/media/docs/alerting/view-alert-rule-list-with-actions.png" max-width="750px" alt="View alert rule state and alert rule health in Grafana Alerting" >}}
For details on how rule states and alert instance states are displayed, refer to [View alert state](ref:view-alert-state).
+
+## View, compare and restore alert rules versions.
+
+To view or restore previous versions for an alert rule, complete the following steps.
+
+1. Navigate to **Alerts & IRM -> Alerting -> Alert rules**.
+1. Select an alert rule and click **View**.
+1. Click the **Versions** tab.
+ The page displays a list of the previous rule versions.
+
+On the Alert rule's Versions page you can view, compare and restore the previous rule versions.
+{{< figure src="/media/docs/alerting/screenshot-grafana-alerting-version-history-v3.png" max-width="750px" alt="View alert rule history to compare and restore previous alert rules." >}}
diff --git a/docs/sources/alerting/set-up/meta-monitoring.md b/docs/sources/alerting/set-up/meta-monitoring.md
index 4c29f6ac4a9..46d8c517f8c 100644
--- a/docs/sources/alerting/set-up/meta-monitoring.md
+++ b/docs/sources/alerting/set-up/meta-monitoring.md
@@ -2,6 +2,7 @@
aliases:
- ../meta-monitoring/ # /docs/grafana//alerting/meta-monitoring/
- ../monitoring/ # /docs/grafana//alerting/monitoring/
+ - ../monitor/ # /docs/grafana//alerting/monitor/
canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/meta-monitoring
description: Monitor your alerting metrics to ensure you identify potential issues before they become critical.
keywords:
diff --git a/docs/sources/alerting/set-up/provision-alerting-resources/export-alerting-resources/index.md b/docs/sources/alerting/set-up/provision-alerting-resources/export-alerting-resources/index.md
index 3a6f3576452..a7fac56ebe9 100644
--- a/docs/sources/alerting/set-up/provision-alerting-resources/export-alerting-resources/index.md
+++ b/docs/sources/alerting/set-up/provision-alerting-resources/export-alerting-resources/index.md
@@ -197,11 +197,7 @@ However, you can export it by manually copying the content and name of the notif
All notification policies are provisioned through a single resource: the root of the notification policy tree.
-{{% admonition type="warning" %}}
-
-Since the policy tree is a single resource, provisioning it overwrites a policy tree created through any other means.
-
-{{< /admonition >}}
+{{< docs/shared lookup="alerts/warning-provisioning-tree.md" source="grafana" version="" >}}
To export the notification policy tree from the Grafana UI, complete the following steps.
diff --git a/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md b/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md
index 850600cc074..898fdf894bf 100644
--- a/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md
+++ b/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md
@@ -628,6 +628,13 @@ settings:
clientKey: key in PEM format
#
caCertificate: CA certificate in PEM format
+ hmacConfig:
+ #
+ secret: secret-key
+ #
+ header: X-Grafana-Alerting-Signature
+ #
+ timestampHeader: X-Grafana-Alerting-Signature-Timestamp
```
{{< /collapse >}}
@@ -702,11 +709,7 @@ Create or reset the notification policy tree using provisioning files in your Gr
In Grafana, the entire notification policy tree is considered a single, large resource. Add new specific policies as sub-policies under the root policy. Since specific policies may depend on each other, you cannot provision subsets of the policy tree; the entire tree must be defined in a single place.
-{{% admonition type="warning" %}}
-
-Since the policy tree is a single resource, provisioning it will overwrite a policy tree created through any other means.
-
-{{< /admonition >}}
+{{< docs/shared lookup="alerts/warning-provisioning-tree.md" source="grafana" version="" >}}
1. Find the notification policy tree in Grafana.
1. [Export](ref:export_policies) and download a provisioning file for your notification policy tree.
diff --git a/docs/sources/alerting/set-up/provision-alerting-resources/terraform-provisioning/index.md b/docs/sources/alerting/set-up/provision-alerting-resources/terraform-provisioning/index.md
index 0821f5ec0b4..2a5f5d97211 100644
--- a/docs/sources/alerting/set-up/provision-alerting-resources/terraform-provisioning/index.md
+++ b/docs/sources/alerting/set-up/provision-alerting-resources/terraform-provisioning/index.md
@@ -341,11 +341,7 @@ In this section, we'll create Terraform configurations for each alerting resourc
[Notification policies](ref:notification-policy) defines how to route alert instances to your contact points.
-{{% admonition type="warning" %}}
-
-Since the policy tree is a single resource, provisioning the `grafana_notification_policy` resource will overwrite a policy tree created through any other means.
-
-{{< /admonition >}}
+{{< docs/shared lookup="alerts/warning-provisioning-tree.md" source="grafana" version="" >}}
1. Find the default notification policy tree. Alternatively, consider writing the resource in code as demonstrated in the example below.
diff --git a/docs/sources/breaking-changes/_index.md b/docs/sources/breaking-changes/_index.md
index af76c612b89..fa0628a51d9 100644
--- a/docs/sources/breaking-changes/_index.md
+++ b/docs/sources/breaking-changes/_index.md
@@ -25,7 +25,7 @@ For our purposes, a breaking change is any change that requires users or operato
{{% admonition type="note" %}}
-To learn what's available in a Grafana release, refer to the [What's new ]({{< relref "../whatsnew/" >}}) page for each version. For the steps we recommend when you upgrade, check out the [Upgrade guide]({{< relref "../upgrade-guide/" >}}) for each version.
+To learn what's available in a Grafana release, refer to the [What's new ](../whatsnew/) page for each version. For the steps we recommend when you upgrade, check out the [Upgrade guide](../upgrade-guide/) for each version.
{{% /admonition %}}
diff --git a/docs/sources/breaking-changes/breaking-changes-v10-0.md b/docs/sources/breaking-changes/breaking-changes-v10-0.md
index 946ba52c93c..8250dba93d2 100644
--- a/docs/sources/breaking-changes/breaking-changes-v10-0.md
+++ b/docs/sources/breaking-changes/breaking-changes-v10-0.md
@@ -34,7 +34,7 @@ For each change, the provided information:
- Guides you in how to mitigate for the change or migrate
- Provides more learning resources
-For release highlights and deprecations, refer to our [v10.0 What’s new]({{< relref "../whatsnew/whats-new-in-v10-0/" >}}). For the specific steps we recommend when you upgrade to v10.0, check out our [Upgrade guide]({{< relref "../upgrade-guide/upgrade-v10.0/index.md" >}}).
+For release highlights and deprecations, refer to our [v10.0 What’s new](../../whatsnew/whats-new-in-v10-0/). For the specific steps we recommend when you upgrade to v10.0, check out our [Upgrade guide](../../upgrade-guide/upgrade-v10.0/).
| Action | Scope |
@@ -123,7 +123,7 @@ The format for `time` and `timeEnd` should be epoch numbers in millisecond resol
**Required permissions**
-See note in the [introduction]({{< ref "#annotations-api" >}}) for an explanation.
+See note in the [introduction](#annotations-api) for an explanation.
| Action | Scope |
@@ -178,7 +178,7 @@ format (string with multiple tags being separated by a space).
**Required permissions**
-See note in the [introduction]({{< ref "#annotations-api" >}}) for an explanation.
+See note in the [introduction](#annotations-api) for an explanation.
| Action | Scope |
| -------------------- | ------------------------------- |
@@ -219,7 +219,7 @@ Updates all properties of an annotation that matches the specified id. To only u
**Required permissions**
-See note in the [introduction]({{< ref "#annotations-api" >}}) for an explanation.
+See note in the [introduction](#annotations-api) for an explanation.
| Action | Scope |
@@ -265,7 +265,7 @@ This operation currently supports updating of the `text`, `tags`, `time` and `ti
**Required permissions**
-See note in the [introduction]({{< ref "#annotations-api" >}}) for an explanation.
+See note in the [introduction](#annotations-api) for an explanation.
| Action | Scope |
@@ -307,7 +307,7 @@ Deletes the annotation that matches the specified id.
**Required permissions**
-See note in the [introduction]({{< ref "#annotations-api" >}}) for an explanation.
+See note in the [introduction](#annotations-api) for an explanation.
| Action | Scope |
@@ -344,7 +344,7 @@ Find all the event tags created in the annotations.
**Required permissions**
-See note in the [introduction]({{< ref "#annotations-api" >}}) for an explanation.
+See note in the [introduction](#annotations-api) for an explanation.
| Action | Scope |
| ------------------ | ----- |
diff --git a/docs/sources/developers/http_api/auth.md b/docs/sources/developers/http_api/auth.md
index be88ae5ccd0..898def0691b 100644
--- a/docs/sources/developers/http_api/auth.md
+++ b/docs/sources/developers/http_api/auth.md
@@ -22,10 +22,10 @@ title: 'Authentication HTTP API '
The Authentication HTTP API is used to manage API keys.
{{% admonition type="note" %}}
-Grafana recommends using service accounts instead of API keys. For more information, refer to [Grafana service account API reference]({{< relref "./serviceaccount/" >}}).
+Grafana recommends using service accounts instead of API keys. For more information, refer to [Grafana service account API reference](../serviceaccount/).
{{% /admonition %}}
-> If you are running Grafana Enterprise, for some endpoints you would need to have relevant permissions. Refer to [Role-based access control permissions]({{< relref "../../administration/roles-and-permissions/access-control/custom-role-actions-scopes/" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you would need to have relevant permissions. Refer to [Role-based access control permissions](../../../administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## List API keys
@@ -38,7 +38,7 @@ This endpoint is deprecated.
**Required permissions**
-See note in the [introduction]({{< ref "#authentication-api" >}}) for an explanation.
+See note in the [introduction](#authentication-api) for an explanation.
| Action | Scope |
| -------------- | ----------- |
@@ -85,7 +85,7 @@ This endpoint has been made obsolete in Grafana 11.3.0.
{{% /admonition %}}
-Endpoint is obsolete and has been moved to [Grafana service account API]({{< relref "./serviceaccount/" >}}). For more information, refer to [Migrate to Grafana service account API](/docs/grafana//administration/service-accounts/migrate-api-keys/).
+Endpoint is obsolete and has been moved to [Grafana service account API](../serviceaccount/). For more information, refer to [Migrate to Grafana service account API](/docs/grafana//administration/service-accounts/migrate-api-keys/).
`POST /api/auth/keys`
@@ -110,7 +110,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#authentication-api" >}}) for an explanation.
+See note in the [introduction](#authentication-api) for an explanation.
| Action | Scope |
| ---------------- | ---------- |
diff --git a/docs/sources/developers/http_api/dashboard.md b/docs/sources/developers/http_api/dashboard.md
index 54bfaf63156..75d1f8a50d3 100644
--- a/docs/sources/developers/http_api/dashboard.md
+++ b/docs/sources/developers/http_api/dashboard.md
@@ -18,7 +18,7 @@ title: Dashboard HTTP API
# Dashboard API
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Identifier (id) vs unique identifier (uid)
@@ -26,7 +26,7 @@ The identifier (id) of a dashboard is an auto-incrementing numeric value and is
The unique identifier (uid) of a dashboard can be used for uniquely identify a dashboard between multiple Grafana installs.
It's automatically generated if not provided when creating a dashboard. The uid allows having consistent URLs for accessing
-dashboards and when syncing dashboards between multiple Grafana installs, see [dashboard provisioning]({{< relref "/docs/grafana/latest/administration/provisioning#dashboards" >}})
+dashboards and when syncing dashboards between multiple Grafana installs, see [dashboard provisioning](/docs/grafana/latest/administration/provisioning/#dashboards)
for more information. This means that changing the title of a dashboard will not break any bookmarked links to that dashboard.
The uid can have a maximum length of 40 characters.
@@ -41,7 +41,7 @@ Creates a new dashboard or updates an existing dashboard. When updating existing
**Required permissions**
-See note in the [introduction]({{< ref "#dashboard-api" >}}) for an explanation.
+See note in the [introduction](#dashboard-api) for an explanation.
| Action | Scope |
@@ -80,7 +80,7 @@ JSON Body schema:
- **dashboard** – The complete dashboard model.
- **dashboard.id** – id = null to create a new dashboard.
- **dashboard.uid** – Optional unique identifier when creating a dashboard. uid = null will generate a new uid.
-- **dashboard.refresh** - Set the dashboard refresh interval. If this is lower than [the minimum refresh interval]({{< relref "/docs/grafana/latest/setup-grafana/configure-grafana#min_refresh_interval" >}}), then Grafana will ignore it and will enforce the minimum refresh interval.
+- **dashboard.refresh** - Set the dashboard refresh interval. If this is lower than [the minimum refresh interval](/docs/grafana/latest/setup-grafana/configure-grafana/#min_refresh_interval), then Grafana will ignore it and will enforce the minimum refresh interval.
- **folderId** – The id of the folder to save the dashboard in.
- **folderUid** – The UID of the folder to save the dashboard in. Overrides the `folderId`.
- **overwrite** – Set to true if you want to overwrite an existing dashboard with a given dashboard UID.
@@ -163,7 +163,7 @@ Will return the dashboard given the dashboard unique identifier (uid). Informati
**Required permissions**
-See note in the [introduction]({{< ref "#dashboard-api" >}}) for an explanation.
+See note in the [introduction](#dashboard-api) for an explanation.
| Action | Scope |
@@ -222,7 +222,7 @@ Will delete the dashboard given the specified unique identifier (uid).
**Required permissions**
-See note in the [introduction]({{< ref "#dashboard-api" >}}) for an explanation.
+See note in the [introduction](#dashboard-api) for an explanation.
| Action | Scope |
@@ -272,7 +272,7 @@ Will delete permanently the dashboard given the specified unique identifier (uid
**Required permissions**
-See note in the [introduction]({{< ref "#dashboard-api" >}}) for an explanation.
+See note in the [introduction](#dashboard-api) for an explanation.
| Action | Scope |
@@ -322,7 +322,7 @@ Will restore a deleted dashboard given the specified unique identifier (uid).
**Required permissions**
-See note in the [introduction]({{< ref "#dashboard-api" >}}) for an explanation.
+See note in the [introduction](#dashboard-api) for an explanation.
| Action | Scope |
@@ -450,4 +450,4 @@ Content-Type: application/json
## Dashboard Search
-See [Folder/Dashboard Search API]({{< relref "folder_dashboard_search/" >}}).
+See [Folder/Dashboard Search API](../folder_dashboard_search/).
diff --git a/docs/sources/developers/http_api/dashboard_permissions.md b/docs/sources/developers/http_api/dashboard_permissions.md
index 07242307875..3a12656faf5 100644
--- a/docs/sources/developers/http_api/dashboard_permissions.md
+++ b/docs/sources/developers/http_api/dashboard_permissions.md
@@ -32,7 +32,7 @@ The permission levels for the permission field:
- 2 = Edit
- 4 = Admin
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Get permissions for a dashboard
@@ -42,7 +42,7 @@ Gets all existing permissions for the dashboard with the given `uid`.
**Required permissions**
-See note in the [introduction]({{< ref "#dashboard-permission-api" >}}) for an explanation.
+See note in the [introduction](#dashboard-permission-api) for an explanation.
| Action | Scope |
@@ -124,7 +124,7 @@ Updates permissions for a dashboard. This operation will remove existing permiss
**Required permissions**
-See note in the [introduction]({{< ref "#dashboard-permission-api" >}}) for an explanation.
+See note in the [introduction](#dashboard-permission-api) for an explanation.
| Action | Scope |
diff --git a/docs/sources/developers/http_api/data_source.md b/docs/sources/developers/http_api/data_source.md
index e9d8a8b35ab..ddda447bcfc 100644
--- a/docs/sources/developers/http_api/data_source.md
+++ b/docs/sources/developers/http_api/data_source.md
@@ -19,7 +19,7 @@ title: Data source HTTP API
# Data source API
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Get all data sources
@@ -31,7 +31,7 @@ This API currently doesn't handle pagination. The default maximum number of data
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ---------------- | -------------- |
@@ -90,7 +90,7 @@ This API is deprecated since Grafana v9.0.0 and will be removed in a future rele
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ---------------- | ---------------------------------------------------------------------------- |
@@ -146,7 +146,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ---------------- | -------------------------------------------------------------------------------------- |
@@ -202,7 +202,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ---------------- | ---------------------------------------------------------------------------------------------- |
@@ -258,7 +258,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ------------------- | ---------------------------------------------------------------------------------------------- |
@@ -292,7 +292,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ------------------ | ----- |
@@ -446,7 +446,7 @@ This API is deprecated since Grafana v9.0.0 and will be removed in a future rele
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ----------------- | ---------------------------------------------------------------------------- |
@@ -529,7 +529,7 @@ Similar to [creating a data source](#create-a-data-source), `password` and `basi
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ----------------- | -------------------------------------------------------------------------------------- |
@@ -617,7 +617,7 @@ This API is deprecated since Grafana v9.0.0 and will be removed in a future rele
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ------------------ | ---------------------------------------------------------------------------- |
@@ -649,7 +649,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ------------------ | -------------------------------------------------------------------------------------- |
@@ -684,7 +684,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-api" >}}) for an explanation.
+See note in the [introduction](#data-source-api) for an explanation.
| Action | Scope |
| ------------------ | ---------------------------------------------------------------------------------------------- |
diff --git a/docs/sources/developers/http_api/datasource_permissions.md b/docs/sources/developers/http_api/datasource_permissions.md
index 9c0a0fc3ee8..b65464d0dba 100644
--- a/docs/sources/developers/http_api/datasource_permissions.md
+++ b/docs/sources/developers/http_api/datasource_permissions.md
@@ -23,9 +23,9 @@ title: Datasource Permissions HTTP API
# Data Source Permissions API
-> The Data Source Permissions is only available in Grafana Enterprise. Read more about [Grafana Enterprise]({{< relref "/docs/grafana/latest/introduction/grafana-enterprise" >}}).
+> The Data Source Permissions is only available in Grafana Enterprise. Read more about [Grafana Enterprise](/docs/grafana/latest/introduction/grafana-enterprise/).
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
This API can be used to list, add and remove permissions for a data source.
@@ -39,7 +39,7 @@ Gets all existing permissions for the data source with the given `uid`.
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-permissions-api" >}}) for an explanation.
+See note in the [introduction](#data-source-permissions-api) for an explanation.
| Action | Scope |
| ---------------------------- | ------------------------------------------------------------------------------------------ |
@@ -134,7 +134,7 @@ To remove a permission, set the `permission` field to an empty string.
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-permissions-api" >}}) for an explanation.
+See note in the [introduction](#data-source-permissions-api) for an explanation.
| Action | Scope |
| ----------------------------- | ------------------------------------------------------------------------------------------ |
@@ -206,7 +206,7 @@ To remove a permission, set the `permission` field to an empty string.
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-permissions-api" >}}) for an explanation.
+See note in the [introduction](#data-source-permissions-api) for an explanation.
| Action | Scope |
| ----------------------------- | ------------------------------------------------------------------------------------------ |
@@ -280,7 +280,7 @@ To remove a permission, set the `permission` field to an empty string.
**Required permissions**
-See note in the [introduction]({{< ref "#data-source-permissions-api" >}}) for an explanation.
+See note in the [introduction](#data-source-permissions-api) for an explanation.
| Action | Scope |
| ----------------------------- | ------------------------------------------------------------------------------------------ |
diff --git a/docs/sources/developers/http_api/examples/create-api-tokens-for-org.md b/docs/sources/developers/http_api/examples/create-api-tokens-for-org.md
index d5b2ded16a4..caa6bc90243 100644
--- a/docs/sources/developers/http_api/examples/create-api-tokens-for-org.md
+++ b/docs/sources/developers/http_api/examples/create-api-tokens-for-org.md
@@ -32,7 +32,7 @@ There are two authentication methods to access the API:
The task is to create a new organization and then add a Token that can be used by other users. In the examples below which use basic auth, the user is `admin` and the password is `admin`.
-1. [Create the org](http://docs.grafana.org/http_api/org/#create-organization). Here is an example using curl:
+1. [Create the org](/docs/grafana//http_api/org/#create-organization). Here is an example using curl:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"name":"apiorg"}' http://admin:admin@localhost:3000/api/orgs
@@ -40,25 +40,25 @@ The task is to create a new organization and then add a Token that can be used b
This should return a response: `{"message":"Organization created","orgId":6}`. Use the orgId for the next steps.
-1. Optional step. If the org was created previously and/or step 3 fails then first [add your Admin user to the org](http://docs.grafana.org/http_api/org/#add-user-in-organization):
+1. Optional step. If the org was created previously and/or step 3 fails then first [add your Admin user to the org](/docs/grafana//http_api/org/#add-user-in-organization):
```bash
curl -X POST -H "Content-Type: application/json" -d '{"loginOrEmail":"admin", "role": "Admin"}' http://admin:admin@localhost:3000/api/orgs//users
```
-1. [Switch the org context for the Admin user to the new org](http://docs.grafana.org/http_api/user/#switch-user-context-for-signed-in-user):
+1. [Switch the org context for the Admin user to the new org](/docs/grafana//http_api/user/#switch-user-context-for-signed-in-user):
```bash
curl -X POST http://admin:admin@localhost:3000/api/user/using/
```
-1. [Create a Service Account]({{< relref "./serviceaccount/#create-service-account" >}}):
+1. [Create a Service Account](../../serviceaccount/#create-service-account):
```bash
curl -X POST -H "Content-Type: application/json" -d '{"name":"test", "role": "Admin"}' http://admin:admin@localhost:3000/api/serviceaccounts
```
-1. [Create a Service Account token]({{< relref "./serviceaccount/#create-service-account-tokens" >}}) for the service account created in the previous step:
+1. [Create a Service Account token](../../serviceaccount/#create-service-account-tokens) for the service account created in the previous step:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"name":"test-token"}' http://admin:admin@localhost:3000/api/serviceaccounts//tokens
@@ -83,7 +83,7 @@ The task is to create a new organization and then add a Token that can be used b
Using the Token that was created in the previous step, you can create a dashboard or carry out other actions without having to switch organizations.
-1. [Add a dashboard](http://docs.grafana.org/http_api/dashboard/#create-update-dashboard) using the key (or bearer token as it is also called):
+1. [Add a dashboard](/docs/grafana//http_api/dashboard/#create-update-dashboard) using the key (or bearer token as it is also called):
```bash
curl -X POST --insecure -H "Authorization: Bearer eyJrIjoiR0ZXZmt1UFc0OEpIOGN5RWdUalBJTllUTk83VlhtVGwiLCJuIjoiYXBpa2V5Y3VybCIsImlkIjo2fQ==" -H "Content-Type: application/json" -d '{
diff --git a/docs/sources/developers/http_api/examples/curl-examples.md b/docs/sources/developers/http_api/examples/curl-examples.md
index a7f3c1ca2e8..b00e59feb4a 100644
--- a/docs/sources/developers/http_api/examples/curl-examples.md
+++ b/docs/sources/developers/http_api/examples/curl-examples.md
@@ -27,16 +27,16 @@ The most basic example for a dashboard for which there is no authentication. You
curl http://localhost:3000/api/search
```
-Here's a cURL command that works for getting the home dashboard when you are running Grafana locally with [basic authentication]({{< relref "/docs/grafana/latest/setup-grafana/configure-security/configure-authentication#basic-auth" >}}) enabled using the default admin credentials:
+Here's a cURL command that works for getting the home dashboard when you are running Grafana locally with [basic authentication](/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/#basic-auth) enabled using the default admin credentials:
```
curl http://admin:admin@localhost:3000/api/search
```
-To pass a username and password with [HTTP basic authorization]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/manage-rbac-roles" >}}), encode them as base64.
+To pass a username and password with [HTTP basic authorization](/docs/grafana/latest/administration/roles-and-permissions/access-control/manage-rbac-roles/), encode them as base64.
You can't use authorization tokens in the request.
-For example, to [list permissions associated with roles]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/manage-rbac-roles" >}}) given a username of `user` and password of `password`, use:
+For example, to [list permissions associated with roles](/docs/grafana/latest/administration/roles-and-permissions/access-control/manage-rbac-roles/) given a username of `user` and password of `password`, use:
```
curl --location '/api/access-control/builtin-roles' --user 'user:password'
diff --git a/docs/sources/developers/http_api/folder.md b/docs/sources/developers/http_api/folder.md
index dce1ff7eea7..73a9c54ba39 100644
--- a/docs/sources/developers/http_api/folder.md
+++ b/docs/sources/developers/http_api/folder.md
@@ -18,7 +18,7 @@ title: Folder HTTP API
# Folder API
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Identifier (id) vs unique identifier (uid)
@@ -40,7 +40,7 @@ that the authenticated user has permission to view.
**Required permissions**
-See note in the [introduction]({{< ref "#folder-api" >}}) for an explanation.
+See note in the [introduction](#folder-api) for an explanation.
| Action | Scope |
| -------------- | ----------- |
@@ -83,7 +83,7 @@ Will return the folder given the folder uid.
**Required permissions**
-See note in the [introduction]({{< ref "#folder-api" >}}) for an explanation.
+See note in the [introduction](#folder-api) for an explanation.
| Action | Scope |
| -------------- | ----------- |
@@ -141,7 +141,7 @@ Creates a new folder.
**Required permissions**
-See note in the [introduction]({{< ref "#folder-api" >}}) for an explanation.
+See note in the [introduction](#folder-api) for an explanation.
`folders:create` allows creating folders and subfolders. If granted with scope `folders:uid:general`, allows creating root level folders. Otherwise, allows creating subfolders under the specified folders.
@@ -167,7 +167,7 @@ Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
JSON Body schema:
-- **uid** – Optional [unique identifier]({{< ref "#identifier-id-vs-unique-identifier-uid" >}}).
+- **uid** – Optional [unique identifier](#identifier-id-vs-unique-identifier-uid).
- **title** – The title of the folder.
- **parentUid** - Optional field, the unique identifier of the parent folder under which the folder should be created. Requires nested folders to be enabled.
@@ -215,7 +215,7 @@ Updates an existing folder identified by uid.
**Required permissions**
-See note in the [introduction]({{< ref "#folder-api" >}}) for an explanation.
+See note in the [introduction](#folder-api) for an explanation.
| Action | Scope |
| --------------- | ----------- |
@@ -302,11 +302,11 @@ Content-Length: 97
Deletes an existing folder identified by UID along with all dashboards (and their alerts) stored in the folder. This operation cannot be reverted.
-If [Grafana Alerting]({{< relref "/docs/grafana/latest/alerting" >}}) is enabled, you can set an optional query parameter `forceDeleteRules=false` so that requests will fail with 400 (Bad Request) error if the folder contains any Grafana alerts. However, if this parameter is set to `true` then it will delete any Grafana alerts under this folder.
+If [Grafana Alerting](/docs/grafana/latest/alerting/) is enabled, you can set an optional query parameter `forceDeleteRules=false` so that requests will fail with 400 (Bad Request) error if the folder contains any Grafana alerts. However, if this parameter is set to `true` then it will delete any Grafana alerts under this folder.
**Required permissions**
-See note in the [introduction]({{< ref "#folder-api" >}}) for an explanation.
+See note in the [introduction](#folder-api) for an explanation.
| Action | Scope |
| ---------------- | ----------- |
@@ -352,7 +352,7 @@ This is relevant only if nested folders are enabled.
**Required permissions**
-See note in the [introduction]({{< ref "#folder-api" >}}) for an explanation.
+See note in the [introduction](#folder-api) for an explanation.
If moving the folder under another folder:
@@ -367,7 +367,7 @@ If moving the folder under root:
JSON body schema:
-- **parentUid** – Optional [unique identifier]({{< relref "#identifier-id-vs-unique-identifier-uid" >}}) of the new parent folder. If this is empty, then the folder is moved under the root.
+- **parentUid** – Optional [unique identifier](#identifier-id-vs-unique-identifier-uid) of the new parent folder. If this is empty, then the folder is moved under the root.
**Example Request**:
diff --git a/docs/sources/developers/http_api/folder_dashboard_search.md b/docs/sources/developers/http_api/folder_dashboard_search.md
index 5f945a60a03..af741927365 100644
--- a/docs/sources/developers/http_api/folder_dashboard_search.md
+++ b/docs/sources/developers/http_api/folder_dashboard_search.md
@@ -24,7 +24,7 @@ title: Folder/Dashboard Search HTTP API
`GET /api/search/`
-> Note: When using [Role-based access control]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control" >}}), search results will contain only dashboards and folders which you have access to.
+> Note: When using [Role-based access control](/docs/grafana/latest/administration/roles-and-permissions/access-control/), search results will contain only dashboards and folders which you have access to.
Query parameters:
diff --git a/docs/sources/developers/http_api/folder_permissions.md b/docs/sources/developers/http_api/folder_permissions.md
index 4e7b3ed31ff..74eeffff35a 100644
--- a/docs/sources/developers/http_api/folder_permissions.md
+++ b/docs/sources/developers/http_api/folder_permissions.md
@@ -32,7 +32,7 @@ The permission levels for the permission field:
- 2 = Edit
- 4 = Admin
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Get permissions for a folder
@@ -42,7 +42,7 @@ Gets all existing permissions for the folder with the given `uid`.
**Required permissions**
-See note in the [introduction]({{< ref "#folder-permission-api" >}}) for an explanation.
+See note in the [introduction](#folder-permission-api) for an explanation.
| Action | Scope |
| -------------------------- | ----------- |
@@ -121,7 +121,7 @@ Updates permissions for a folder. This operation will remove existing permission
**Required permissions**
-See note in the [introduction]({{< ref "#folder-permission-api" >}}) for an explanation.
+See note in the [introduction](#folder-permission-api) for an explanation.
| Action | Scope |
| --------------------------- | ----------- |
diff --git a/docs/sources/developers/http_api/group_attribute_sync.md b/docs/sources/developers/http_api/group_attribute_sync.md
index 82f4f67c0f8..f6d5e752297 100644
--- a/docs/sources/developers/http_api/group_attribute_sync.md
+++ b/docs/sources/developers/http_api/group_attribute_sync.md
@@ -22,8 +22,7 @@ The Group Attribute Sync API allows you to configure [group attribute sync featu
> **Note:** Available in [Grafana Enterprise](https://grafana.com/docs/grafana//introduction/grafana-enterprise) and [Grafana Cloud](https://grafana.com/docs/grafana-cloud/)
{{% admonition type="note" %}}
-This feature is behind the `groupAttributeSync` feature toggle.
-You can enable feature toggles through configuration file or environment variables. See configuration [docs](/docs/grafana//setup-grafana/configure-grafana/#feature_toggles) for details.
+This feature is currently in [private preview](https://grafana.com/docs/release-life-cycle/#private-preview) and behind the `groupAttributeSync` feature toggle. Please contact support to have this feature enabled.
{{% /admonition %}}
## List group mappings
diff --git a/docs/sources/developers/http_api/library_element.md b/docs/sources/developers/http_api/library_element.md
index c6efb1df45a..19a5577c202 100644
--- a/docs/sources/developers/http_api/library_element.md
+++ b/docs/sources/developers/http_api/library_element.md
@@ -286,7 +286,7 @@ JSON Body schema:
- `name`: Optional, the name of the library element.
- `model`: The JSON model for the library element.
- `kind`: Kind of element to create, Use `1` for library panels or `2` for library variables.
-- `uid`: Optional, the [unique identifier](/http_api/library_element/#identifier-id-vs-unique-identifier-uid).
+- `uid`: Optional, the [unique identifier](#identifier-id-vs-unique-identifier-uid).
**Example Request**:
@@ -366,7 +366,7 @@ JSON Body schema:
- `model`: The JSON model for the library element.
- `kind`: Kind of element to create. Use `1` for library panels or `2` for library variables.
- `version`: Version of the library element you are updating.
-- `uid`: Optional, the [unique identifier](/http_api/library_element/#identifier-id-vs-unique-identifier-uid).
+- `uid`: Optional, the [unique identifier](#identifier-id-vs-unique-identifier-uid).
**Example Request**:
diff --git a/docs/sources/developers/http_api/licensing.md b/docs/sources/developers/http_api/licensing.md
index 937f25a8468..0d09183750c 100644
--- a/docs/sources/developers/http_api/licensing.md
+++ b/docs/sources/developers/http_api/licensing.md
@@ -19,7 +19,7 @@ title: Licensing HTTP API
# Enterprise License API
-Licensing is only available in Grafana Enterprise. Read more about [Grafana Enterprise]({{< relref "/docs/grafana/latest/introduction/grafana-enterprise" >}}).
+Licensing is only available in Grafana Enterprise. Read more about [Grafana Enterprise](/docs/grafana/latest/introduction/grafana-enterprise/).
{{< admonition type="caution" >}}
You can't authenticate to the Licensing HTTP API with service account tokens.
@@ -31,7 +31,7 @@ To use these API endpoints you have to use Basic authentication and the Grafana
The `admin` user that Grafana is provisioned with by default has permissions to use these API endpoints.
{{< /admonition >}}
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Check license availability
@@ -43,7 +43,7 @@ Checks if a valid license is available.
**Required permissions**
-See note in the [introduction]({{< ref "#enterprise-license-api" >}}) for an explanation.
+See note in the [introduction](#enterprise-license-api) for an explanation.
| Action | Scope |
| -------------- | ----- |
@@ -85,7 +85,7 @@ Applies a license to a Grafana instance.
**Required permissions**
-See note in the [introduction]({{< ref "#enterprise-license-api" >}}) for an explanation.
+See note in the [introduction](#enterprise-license-api) for an explanation.
| Action | Scope |
| --------------- | ----- |
@@ -147,7 +147,7 @@ Manually ask license issuer for a new token.
**Required permissions**
-See note in the [introduction]({{< ref "#enterprise-license-api" >}}) for an explanation.
+See note in the [introduction](#enterprise-license-api) for an explanation.
| Action | Scope |
| --------------- | ----- |
@@ -208,7 +208,7 @@ Removes the license stored in the Grafana database.
**Required permissions**
-See note in the [introduction]({{< ref "#enterprise-license-api" >}}) for an explanation.
+See note in the [introduction](#enterprise-license-api) for an explanation.
| Action | Scope |
| ---------------- | ----- |
diff --git a/docs/sources/developers/http_api/org.md b/docs/sources/developers/http_api/org.md
index d79a60f95ef..d5fb8ab9cb5 100644
--- a/docs/sources/developers/http_api/org.md
+++ b/docs/sources/developers/http_api/org.md
@@ -23,7 +23,7 @@ The Organization HTTP API is divided in two resources, `/api/org` (current organ
and `/api/orgs` (admin organizations). One big difference between these are that
the admin of all organizations API only works with basic authentication, see [Admin Organizations API](#admin-organizations-api) for more information.
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Current Organization API
@@ -33,7 +33,7 @@ the admin of all organizations API only works with basic authentication, see [Ad
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| --------- | ----- |
@@ -69,7 +69,7 @@ Accessible to users with org admin role.
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| -------------- | -------- |
@@ -115,7 +115,7 @@ when editing folder/dashboard permissions.
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| -------------- | -------- |
@@ -151,7 +151,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| --------------- | -------- |
@@ -185,7 +185,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| ---------------- | -------- |
@@ -215,7 +215,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| ---------- | ----- |
@@ -251,7 +251,7 @@ Adds a global user to the current organization.
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| ------------- | -------- |
@@ -300,7 +300,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| --------- | ----- |
@@ -342,7 +342,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope | Note |
| --------- | ----- | ------------------------------ |
@@ -384,7 +384,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope | Note |
| ----------- | ----- | ------------------------------ |
@@ -427,7 +427,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope | Note |
| --------- | ----- | ------------------------------ |
@@ -469,7 +469,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| ---------- | ----- |
@@ -504,7 +504,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| ----------- | ----- |
@@ -534,7 +534,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| -------------- | -------- |
@@ -575,7 +575,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| ------------- | -------- |
@@ -611,7 +611,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| --------------- | -------- |
@@ -646,7 +646,7 @@ Only works with Basic Authentication (username and password), see [introduction]
**Required permissions**
-See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation.
+See note in the [introduction](#organization-api) for an explanation.
| Action | Scope |
| ---------------- | -------- |
diff --git a/docs/sources/developers/http_api/query_and_resource_caching.md b/docs/sources/developers/http_api/query_and_resource_caching.md
index 826292decb6..0b24456e2e2 100644
--- a/docs/sources/developers/http_api/query_and_resource_caching.md
+++ b/docs/sources/developers/http_api/query_and_resource_caching.md
@@ -24,7 +24,7 @@ title: Query and Resource Caching HTTP API
# Query and resource caching API
{{% admonition type="note" %}}
-If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
{{% /admonition %}}
## Enable caching for a data source
@@ -33,7 +33,7 @@ If you are running Grafana Enterprise, for some endpoints you'll need to have sp
**Required permissions**
-See note in the [introduction]({{< ref "#query-and-resource-caching-api" >}}) for an explanation.
+See note in the [introduction](#query-and-resource-caching-api) for an explanation.
| Action | Scope |
| ------------------------- | -------------- |
@@ -83,7 +83,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#query-and-resource-caching-api" >}}) for an explanation.
+See note in the [introduction](#query-and-resource-caching-api) for an explanation.
| Action | Scope |
| ------------------------- | -------------- |
@@ -135,7 +135,7 @@ Will clean cached data for _all_ data sources with caching enabled. The `dataSou
**Required permissions**
-See note in the [introduction]({{< ref "#query-and-resource-caching-api" >}}) for an explanation.
+See note in the [introduction](#query-and-resource-caching-api) for an explanation.
| Action | Scope |
| ------------------------- | -------------- |
@@ -185,7 +185,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#query-and-resource-caching-api" >}}) for an explanation.
+See note in the [introduction](#query-and-resource-caching-api) for an explanation.
| Action | Scope |
| ------------------------- | -------------- |
@@ -256,7 +256,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#query-and-resource-caching-api" >}}) for an explanation.
+See note in the [introduction](#query-and-resource-caching-api) for an explanation.
| Action | Scope |
| ------------------------ | -------------- |
diff --git a/docs/sources/developers/http_api/reporting.md b/docs/sources/developers/http_api/reporting.md
index 871775fe15a..8666f253e63 100644
--- a/docs/sources/developers/http_api/reporting.md
+++ b/docs/sources/developers/http_api/reporting.md
@@ -17,13 +17,13 @@ title: Reporting API
# Reporting API
-This API allows you to interact programmatically with the [Reporting]({{< relref "/docs/grafana/latest/dashboards/create-reports" >}}) feature.
+This API allows you to interact programmatically with the [Reporting](/docs/grafana/latest/dashboards/create-reports/) feature.
> The Reporting API is not stabilized yet, it is still in active development and may change without prior notice.
-> Reporting is only available in Grafana Enterprise. Read more about [Grafana Enterprise]({{< relref "/docs/grafana/latest/introduction/grafana-enterprise" >}}).
+> Reporting is only available in Grafana Enterprise. Read more about [Grafana Enterprise](/docs/grafana/latest/introduction/grafana-enterprise/).
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## List all reports
@@ -31,7 +31,7 @@ This API allows you to interact programmatically with the [Reporting]({{< relref
#### Required permissions
-See note in the [introduction]({{< relref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| ------------ | --------------------------- |
@@ -103,7 +103,7 @@ Content-Length: 1840
### Status Codes
- **200** – OK
-- **401** - Authentication failed, refer to [Authentication API]({{< relref "/docs/grafana/latest/developers/http_api/auth" >}}).
+- **401** - Authentication failed, refer to [Authentication API](/docs/grafana/latest/developers/http_api/auth/).
- **500** – Unexpected error or server misconfiguration. Refer to server logs for more details.
## Get a report
@@ -112,7 +112,7 @@ Content-Length: 1840
#### Required permissions
-See note in the [introduction]({{< relref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| ------------ | ---------------------------------------------------------- |
@@ -187,7 +187,7 @@ Content-Length: 940
- **200** – OK
- **400** – Bad request (invalid report ID).
-- **401** - Authentication failed, refer to [Authentication API]({{< relref "/docs/grafana/latest/developers/http_api/auth" >}}).
+- **401** - Authentication failed, refer to [Authentication API](/docs/grafana/latest/developers/http_api/auth/).
- **403** – Forbidden (access denied to a report or a dashboard used in the report).
- **404** – Not found (such report does not exist).
- **500** – Unexpected error or server misconfiguration. Refer to server logs for more details.
@@ -198,7 +198,7 @@ Content-Length: 940
#### Required permissions
-See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| -------------- | ----- |
@@ -308,7 +308,7 @@ Content-Length: 35
#### Required permissions
-See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| ------------- | --------------------------------------------------------- |
@@ -316,7 +316,7 @@ See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
### Example request
-See [JSON body schema]({{< ref "#config-json-body-schema" >}}) for fields description.
+See [JSON body schema](#config-json-body-schema) for fields description.
```http
GET /api/reports HTTP/1.1
@@ -381,7 +381,7 @@ Content-Length: 28
- **200** – OK
- **400** – Bad request (invalid json, missing or invalid fields values, etc.).
-- **401** - Authentication failed, refer to [Authentication API]({{< relref "/docs/grafana/latest/developers/http_api/auth" >}}).
+- **401** - Authentication failed, refer to [Authentication API](/docs/grafana/latest/developers/http_api/auth/).
- **403** – Forbidden (access denied to a report or a dashboard used in the report).
- **404** – Not found (such report does not exist).
- **500** – Unexpected error or server misconfiguration. Refer to server logs for more details.
@@ -392,7 +392,7 @@ Content-Length: 28
#### Required permissions
-See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| -------------- | --------------------------------------------------------- |
@@ -423,7 +423,7 @@ Content-Length: 39
- **200** – OK
- **400** – Bad request (invalid report ID).
-- **401** - Authentication failed, refer to [Authentication API]({{< relref "/docs/grafana/latest/developers/http_api/auth" >}}).
+- **401** - Authentication failed, refer to [Authentication API](/docs/grafana/latest/developers/http_api/auth/).
- **404** - Not found (report with this ID does not exist).
- **500** - Unexpected error or server misconfiguration. Refer to server logs for more details
@@ -435,7 +435,7 @@ Generate and send a report. This API waits for the report to be generated before
#### Required permissions
-See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| ------------ | ----- |
@@ -477,7 +477,7 @@ Content-Length: 29
- **200** – Report was sent.
- **400** – Bad request (invalid json, missing content-type, missing or invalid fields, etc.).
-- **401** - Authentication failed, refer to [Authentication API]({{< relref "/docs/grafana/latest/developers/http_api/auth" >}}).
+- **401** - Authentication failed, refer to [Authentication API](/docs/grafana/latest/developers/http_api/auth/).
- **403** - Forbidden (access denied to a report or a dashboard used in the report).
- **404** - Report not found.
- **500** - Unexpected error or server misconfiguration. Refer to server logs for more details.
@@ -490,7 +490,7 @@ Returns reports branding settings that are global and used across all the report
#### Required permissions
-See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| --------------------- | ----- |
@@ -529,7 +529,7 @@ Content-Length: 181
### Status Codes
- **200** – OK
-- **401** - Authentication failed, refer to [Authentication API]({{< relref "/docs/grafana/latest/developers/http_api/auth" >}}).
+- **401** - Authentication failed, refer to [Authentication API](/docs/grafana/latest/developers/http_api/auth/).
- **500** - Unexpected error or server misconfiguration. Refer to server logs for more detail
## Save reports branding settings
@@ -540,7 +540,7 @@ Creates settings if they don't exist, otherwise updates them. These settings are
#### Required permissions
-See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| ---------------------- | ----- |
@@ -591,7 +591,7 @@ Content-Length: 35
- **200** – OK
- **400** – Bad request (invalid json, missing or invalid fields values, etc.).
-- **401** - Authentication failed, refer to [Authentication API]({{< relref "/docs/grafana/latest/developers/http_api/auth" >}}).
+- **401** - Authentication failed, refer to [Authentication API](/docs/grafana/latest/developers/http_api/auth/).
- **500** - Unexpected error or server misconfiguration. Refer to server logs for more detail
## Send a test email
@@ -602,7 +602,7 @@ Sends a test email with a report without persisting it in the database.
#### Required permissions
-See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
+See note in the [introduction](#reporting-api) for an explanation.
| Action | Scope |
| ------------ | ----- |
@@ -610,7 +610,7 @@ See note in the [introduction]({{< ref "#reporting-api" >}}) for an explanation.
### Example request
-See [JSON body schema]({{< ref "#config-json-body-schema" >}}) for fields description.
+See [JSON body schema](#config-json-body-schema) for fields description.
```http
POST /api/reports/test-email HTTP/1.1
@@ -674,6 +674,6 @@ Content-Length: 29
- **200** – OK
- **400** – Bad request (invalid json, missing or invalid fields values, etc.).
-- **401** - Authentication failed, refer to [Authentication API]({{< relref "/docs/grafana/latest/developers/http_api/auth" >}}).
+- **401** - Authentication failed, refer to [Authentication API](/docs/grafana/latest/developers/http_api/auth/).
- **403** - Forbidden (access denied to a report or a dashboard used in the report).
- **500** - Unexpected error or server misconfiguration. Refer to server logs for more details
diff --git a/docs/sources/developers/http_api/serviceaccount.md b/docs/sources/developers/http_api/serviceaccount.md
index 680c3472647..559ecc05b3a 100644
--- a/docs/sources/developers/http_api/serviceaccount.md
+++ b/docs/sources/developers/http_api/serviceaccount.md
@@ -18,7 +18,7 @@ title: Service account HTTP API
# Service account API
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
> For Grafana Cloud instances, please use a Bearer token to authenticate. The examples within this section reference Basic authentication which is for On-Prem Grafana instances.
## Search service accounts with Paging
@@ -27,7 +27,7 @@ title: Service account HTTP API
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| -------------------- | ----- |
@@ -94,7 +94,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| ---------------------- | ----- |
@@ -141,7 +141,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| -------------------- | --------------------- |
@@ -182,7 +182,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| --------------------- | --------------------- |
@@ -228,7 +228,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| ---------------------- | --------------------- |
@@ -262,7 +262,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| --------------------- | ------------------ |
@@ -294,7 +294,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| --------------------- | ------------------ |
@@ -326,7 +326,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| -------------------- | ------------------ |
@@ -358,7 +358,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| --------------------- | ------------------ |
@@ -390,7 +390,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| -------------------- | --------------------- |
@@ -430,7 +430,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| --------------------- | --------------------- |
@@ -471,7 +471,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| --------------------- | --------------------- |
@@ -505,7 +505,7 @@ This operation will delete the service account and create a legacy API Key for t
**Required permissions**
-See note in the [introduction]({{< ref "#service-account-api" >}}) for an explanation.
+See note in the [introduction](#service-account-api) for an explanation.
| Action | Scope |
| ---------------------- | --------------------- |
diff --git a/docs/sources/developers/http_api/short_url.md b/docs/sources/developers/http_api/short_url.md
index 03390a5f655..84c754a42a5 100644
--- a/docs/sources/developers/http_api/short_url.md
+++ b/docs/sources/developers/http_api/short_url.md
@@ -41,7 +41,7 @@ Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
JSON body schema:
-- **path** – The path to shorten, relative to the Grafana [root_url]({{< relref "/docs/grafana/latest/setup-grafana/configure-grafana#root_url" >}}).
+- **path** – The path to shorten, relative to the Grafana [root_url](/docs/grafana/latest/setup-grafana/configure-grafana/#root_url).
**Example response:**
diff --git a/docs/sources/developers/http_api/sso-settings.md b/docs/sources/developers/http_api/sso-settings.md
index cb426373485..dfb10ebf71e 100644
--- a/docs/sources/developers/http_api/sso-settings.md
+++ b/docs/sources/developers/http_api/sso-settings.md
@@ -20,7 +20,7 @@ title: SSO Settings API
# SSO Settings API
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
{{% admonition type="note" %}}
Available since Grafana 11. SAML support is in public preview behind the `ssoSettingsSAML` feature flag.
@@ -29,7 +29,7 @@ Available since Grafana 11. SAML support is in public preview behind the `ssoSet
The API can be used to create, update, delete, get, and list SSO Settings for OAuth2 and SAML.
The settings managed by this API are stored in the database and override
-[settings from other sources]({{< relref "../../setup-grafana/configure-security/configure-authentication" >}})
+[settings from other sources](../../../setup-grafana/configure-security/configure-authentication/)
(arguments, environment variables, settings file, etc).
Therefore, every time settings for a specific provider are removed or reset to the default settings at runtime,
the settings are inherited from the other sources in the reverse order of precedence
@@ -45,7 +45,7 @@ The providers or SSO keys that are not managed by this API are retrieved from th
**Required permissions**
-See note in the [introduction]({{< ref "#sso-settings" >}}) for an explanation.
+See note in the [introduction](#sso-settings) for an explanation.
| Action | Scope |
| --------------- | ---------------------------- |
@@ -112,7 +112,7 @@ The SSO keys that are not managed by this API are retrieved from the other sourc
**Required permissions**
-See note in the [introduction]({{< ref "#sso-settings" >}}) for an explanation.
+See note in the [introduction](#sso-settings) for an explanation.
| Action | Scope |
| --------------- | ---------------------------- |
@@ -175,7 +175,7 @@ to wait a few minutes for the configuration to propagate to all Grafana instance
**Required permissions**
-See note in the [introduction]({{< ref "#sso-settings" >}}) for an explanation.
+See note in the [introduction](#sso-settings) for an explanation.
| Action | Scope |
| ---------------- | ---------------------------- |
@@ -222,7 +222,7 @@ Deletes an existing SSO Settings entry for a provider.
**Required permissions**
-See note in the [introduction]({{< ref "#sso-settings" >}}) for an explanation.
+See note in the [introduction](#sso-settings) for an explanation.
| Action | Scope |
| ---------------- | ---------------------------- |
diff --git a/docs/sources/developers/http_api/team.md b/docs/sources/developers/http_api/team.md
index e94d80be650..db73f9d11f1 100644
--- a/docs/sources/developers/http_api/team.md
+++ b/docs/sources/developers/http_api/team.md
@@ -27,7 +27,7 @@ Access to these API endpoints is restricted as follows:
- All authenticated users are able to view details of teams they are a member of.
- Organization Admins are able to manage all teams and team members.
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Team Search With Paging
@@ -39,7 +39,7 @@ or
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ---------- | -------- |
@@ -105,7 +105,7 @@ The `name` parameter returns a single team if the parameter matches the `name` f
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ---------- | -------- |
@@ -151,7 +151,7 @@ The Team `name` needs to be unique. `name` is required and `email` is optional.
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ------------ | ----- |
@@ -195,7 +195,7 @@ There are two fields that can be updated for a team: `name` and `email`.
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ----------- | -------- |
@@ -238,7 +238,7 @@ Status Codes:
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ------------ | -------- |
@@ -275,7 +275,7 @@ Status Codes:
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ---------------------- | -------- |
@@ -328,7 +328,7 @@ Status Codes:
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ----------------------- | -------- |
@@ -370,7 +370,7 @@ Status Codes:
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ----------------------- | -------- |
@@ -410,7 +410,7 @@ Will override all current members and administrators for the specified team.
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ----------------------- | -------- |
@@ -453,7 +453,7 @@ Status Codes:
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ---------- | -------- |
@@ -487,7 +487,7 @@ Content-Type: application/json
**Required permissions**
-See note in the [introduction]({{< ref "#team-api" >}}) for an explanation.
+See note in the [introduction](#team-api) for an explanation.
| Action | Scope |
| ----------- | -------- |
diff --git a/docs/sources/developers/http_api/team_sync.md b/docs/sources/developers/http_api/team_sync.md
index 84a5b15679f..c4c0e607a2d 100644
--- a/docs/sources/developers/http_api/team_sync.md
+++ b/docs/sources/developers/http_api/team_sync.md
@@ -23,9 +23,9 @@ title: Team Sync HTTP API
# Team Sync API
-> Team Sync is only available in Grafana Enterprise. Read more about [Grafana Enterprise]({{< relref "/docs/grafana/latest/introduction/grafana-enterprise" >}}).
+> Team Sync is only available in Grafana Enterprise. Read more about [Grafana Enterprise](/docs/grafana/latest/introduction/grafana-enterprise/).
-> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information.
+> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes/) for more information.
## Get External Groups
@@ -33,7 +33,7 @@ title: Team Sync HTTP API
**Required permissions**
-See note in the [introduction]({{< ref "#external-group-synchronization-api" >}}) for an explanation.
+See note in the [introduction](#external-group-synchronization-api) for an explanation.
| Action | Scope |
| ---------------------- | -------- |
@@ -75,7 +75,7 @@ Status Codes:
**Required permissions**
-See note in the [introduction]({{< ref "#external-group-synchronization-api" >}}) for an explanation.
+See note in the [introduction](#external-group-synchronization-api) for an explanation.
| Action | Scope |
| ----------------------- | -------- |
@@ -117,7 +117,7 @@ Status Codes:
**Required permissions**
-See note in the [introduction]({{< ref "#external-group-synchronization-api" >}}) for an explanation.
+See note in the [introduction](#external-group-synchronization-api) for an explanation.
| Action | Scope |
| ----------------------- | -------- |
diff --git a/docs/sources/getting-started/_index.md b/docs/sources/getting-started/_index.md
index 6252d05cd40..752757401dd 100644
--- a/docs/sources/getting-started/_index.md
+++ b/docs/sources/getting-started/_index.md
@@ -14,6 +14,6 @@ weight: 9
Grafana helps you collect, correlate, and visualize data with beautiful dashboards — the open source data visualization and monitoring solution that drives informed decisions, enhances system performance, and streamlines troubleshooting.
-This section provides guidance to our open source community about how to build your first dashboard after you have installed Grafana. It also provides step-by-step instructions on how to add a Prometheus, InfluxDB, or an MS SQL Server data source. If you are connecting a different data source, please refer to our complete list of supported [Data sources]({{< relref "../datasources" >}}). If you would like to learn how to get started with Grafana Cloud, our fully managed observability stack, visit the [Grafana Cloud documentation](https://grafana.com/docs/grafana-cloud/quickstart/) for more information.
+This section provides guidance to our open source community about how to build your first dashboard after you have installed Grafana. It also provides step-by-step instructions on how to add a Prometheus, InfluxDB, or an MS SQL Server data source. If you are connecting a different data source, please refer to our complete list of supported [Data sources](../datasources/). If you would like to learn how to get started with Grafana Cloud, our fully managed observability stack, visit the [Grafana Cloud documentation](https://grafana.com/docs/grafana-cloud/quickstart/) for more information.
{{< section >}}
diff --git a/docs/sources/getting-started/get-started-grafana-influxdb.md b/docs/sources/getting-started/get-started-grafana-influxdb.md
index d6a163a1219..fed06324346 100644
--- a/docs/sources/getting-started/get-started-grafana-influxdb.md
+++ b/docs/sources/getting-started/get-started-grafana-influxdb.md
@@ -38,11 +38,11 @@ Windows users might need to make additional adjustments. Look for special instru
You can have more than one InfluxDB data source defined in Grafana.
-1. Follow the general instructions to [add a data source]({{< relref "../datasources#add-a-data-source" >}}).
+1. Follow the general instructions to [add a data source](../../datasources/#add-a-data-source).
1. Decide if you will use InfluxQL or Flux as your query language.
- - [Configure the data source]({{< relref "../datasources/influxdb#configure-the-data-source" >}}) for your chosen query language.
+ - [Configure the data source](../../datasources/influxdb/#configure-the-data-source) for your chosen query language.
Each query language has its own unique data source settings.
- - For querying features specific to each language, see the data source's [query editor documentation]({{< relref "../datasources/influxdb/query-editor" >}}).
+ - For querying features specific to each language, see the data source's [query editor documentation](../../datasources/influxdb/query-editor/).
##### InfluxDB guides
@@ -75,8 +75,8 @@ Grafana displays a list of possible series. Click one to select it, and Grafana
Create a simple Flux query.
-1. [Add a panel]({{< relref "../dashboards/build-dashboards/create-dashboard" >}}).
-1. In the query editor, select your InfluxDB-Flux data source. For more information, refer to [Queries]({{< relref "../panels-visualizations/query-transform-data" >}}).
+1. [Add a panel](../../dashboards/build-dashboards/create-dashboard/).
+1. In the query editor, select your InfluxDB-Flux data source. For more information, refer to [Queries](../../panels-visualizations/query-transform-data/).
1. Select the **Table** visualization.
1. In the query editor text field, enter `buckets()` and then click outside of the query editor.
@@ -96,12 +96,12 @@ You can also create Flux queries in the InfluxDB Explore view.

-1. In Grafana, [add a panel]({{< relref "../dashboards/build-dashboards/create-dashboard" >}}) and then paste your Flux code into the query editor.
+1. In Grafana, [add a panel](../../dashboards/build-dashboards/create-dashboard/) and then paste your Flux code into the query editor.
1. Click **Apply**. Your new panel should be visible with data from your Flux query.
#### Check InfluxDB metrics in Grafana Explore
-In your Grafana instance, go to the [Explore]({{< relref "../explore" >}}) view and build queries to experiment with the metrics you want to monitor. Here you can also debug issues related to collecting metrics.
+In your Grafana instance, go to the [Explore](../../explore/) view and build queries to experiment with the metrics you want to monitor. Here you can also debug issues related to collecting metrics.
#### Start building dashboards
@@ -109,5 +109,5 @@ There you go! Use Explore and Data Explorer to experiment with your data, and ad
Here are some resources to learn more:
-- Grafana documentation: [InfluxDB data source]({{< relref "../datasources/influxdb" >}})
+- Grafana documentation: [InfluxDB data source](../../datasources/influxdb/)
- InfluxDB documentation: [Comparison of Flux vs InfluxQL](https://docs.influxdata.com/influxdb/v1.8/flux/flux-vs-influxql/)
diff --git a/docs/sources/getting-started/get-started-grafana-ms-sql-server.md b/docs/sources/getting-started/get-started-grafana-ms-sql-server.md
index 4518d2adfc3..9b714940d4b 100644
--- a/docs/sources/getting-started/get-started-grafana-ms-sql-server.md
+++ b/docs/sources/getting-started/get-started-grafana-ms-sql-server.md
@@ -99,6 +99,6 @@ Optionally, play around this dashboard and customize it to:
Now that you have gained some idea of using the pre-packaged MS SQL data source and some test data, the next step is to setup your own instance of MS SQL Server database and data your development or sandbox area.
-To fetch data from your own instance of MS SQL Server, add the data source using instructions in Step 4 of this topic. In Grafana [Explore]({{< relref "../explore" >}}) build queries to experiment with the metrics you want to monitor.
+To fetch data from your own instance of MS SQL Server, add the data source using instructions in Step 4 of this topic. In Grafana [Explore](../../explore/) build queries to experiment with the metrics you want to monitor.
-Once you have a curated list of queries, create [dashboards]({{< relref "../dashboards" >}}) to render metrics from the SQL Server database. For troubleshooting, user permissions, known issues, and query examples, refer to [Using Microsoft SQL Server in Grafana]({{< relref "../datasources/mssql" >}}).
+Once you have a curated list of queries, create [dashboards](../../dashboards/) to render metrics from the SQL Server database. For troubleshooting, user permissions, known issues, and query examples, refer to [Using Microsoft SQL Server in Grafana](../../datasources/mssql/).
diff --git a/docs/sources/getting-started/get-started-grafana-prometheus.md b/docs/sources/getting-started/get-started-grafana-prometheus.md
index 1ed833b034a..188460d7896 100644
--- a/docs/sources/getting-started/get-started-grafana-prometheus.md
+++ b/docs/sources/getting-started/get-started-grafana-prometheus.md
@@ -114,11 +114,11 @@ To configure your Prometheus instance to work with Grafana locally instead of Gr
#### Check Prometheus metrics in Grafana Explore view
-In your Grafana instance, go to the [Explore]({{< relref "../explore" >}}) view and build queries to experiment with the metrics you want to monitor. Here you can also debug issues related to collecting metrics from Prometheus.
+In your Grafana instance, go to the [Explore](../../explore/) view and build queries to experiment with the metrics you want to monitor. Here you can also debug issues related to collecting metrics from Prometheus.
#### Start building dashboards
-Now that you have a curated list of queries, create [dashboards]({{< relref "../dashboards" >}}) to render system metrics monitored by Prometheus. When you install Prometheus and node_exporter or windows_exporter, you will find recommended dashboards for use.
+Now that you have a curated list of queries, create [dashboards](../../dashboards/) to render system metrics monitored by Prometheus. When you install Prometheus and node_exporter or windows_exporter, you will find recommended dashboards for use.
The following image shows a dashboard with three panels showing some system metrics.
@@ -126,5 +126,5 @@ The following image shows a dashboard with three panels showing some system metr
To learn more:
-- Grafana documentation: [Prometheus data source]({{< relref "../datasources/prometheus" >}})
+- Grafana documentation: [Prometheus data source](../../datasources/prometheus/)
- Prometheus documentation: [What is Prometheus?](https://prometheus.io/docs/introduction/overview/)
diff --git a/docs/sources/introduction/_index.md b/docs/sources/introduction/_index.md
index 0c64bc5f355..9aba0f1cd48 100644
--- a/docs/sources/introduction/_index.md
+++ b/docs/sources/introduction/_index.md
@@ -16,35 +16,35 @@ weight: 5
[Grafana open source software](/oss/) enables you to query, visualize, alert on, and explore your metrics, logs, and traces wherever they are stored. Grafana OSS provides you with tools to turn your time-series database (TSDB) data into insightful graphs and visualizations. The Grafana OSS plugin framework also enables you to connect other data sources like NoSQL/SQL databases, ticketing tools like Jira or ServiceNow, and CI/CD tooling like GitLab.
-After you have [installed Grafana]({{< relref "../setup-grafana/installation" >}}) and set up your first dashboard using instructions in [Getting started with Grafana]({{< relref "../getting-started/build-first-dashboard" >}}), you will have many options to choose from depending on your requirements. For example, if you want to view weather data and statistics about your smart home, then you can create a [playlist]({{< relref "../dashboards/create-manage-playlists" >}}). If you are the administrator for an enterprise and are managing Grafana for multiple teams, then you can set up [provisioning]({{< relref "../administration/provisioning" >}}) and [authentication]({{< relref "../setup-grafana/configure-security/configure-authentication" >}}).
+After you have [installed Grafana](../setup-grafana/installation/) and set up your first dashboard using instructions in [Getting started with Grafana](../getting-started/build-first-dashboard/), you will have many options to choose from depending on your requirements. For example, if you want to view weather data and statistics about your smart home, then you can create a [playlist](../dashboards/create-manage-playlists/). If you are the administrator for an enterprise and are managing Grafana for multiple teams, then you can set up [provisioning](../administration/provisioning/) and [authentication](../setup-grafana/configure-security/configure-authentication/).
The following sections provide an overview of Grafana features and links to product documentation to help you learn more. For more guidance and ideas, check out our [Grafana Community forums](https://community.grafana.com/).
## Explore metrics, logs, and traces
-Explore your data through ad-hoc queries and dynamic drilldown. Split view and compare different time ranges, queries and data sources side by side. Refer to [Explore]({{< relref "../explore" >}}) for more information.
+Explore your data through ad-hoc queries and dynamic drilldown. Split view and compare different time ranges, queries and data sources side by side. Refer to [Explore](../explore/) for more information.
## Alerts
If you're using Grafana Alerting, then you can have alerts sent through a number of different alert notifiers, including PagerDuty, SMS, email, VictorOps, OpsGenie, or Slack.
-Alert hooks allow you to create different notifiers with a bit of code if you prefer some other channels of communication. Visually define [alert rules]({{< relref "../alerting/alerting-rules" >}}) for your most important metrics.
+Alert hooks allow you to create different notifiers with a bit of code if you prefer some other channels of communication. Visually define [alert rules](../alerting/alerting-rules/) for your most important metrics.
## Annotations
Annotate graphs with rich events from different data sources. Hover over events to see the full event metadata and tags.
-This feature, which shows up as a graph marker in Grafana, is useful for correlating data in case something goes wrong. You can create the annotations manually—just control-click on a graph and input some text—or you can fetch data from any data source. Refer to [Annotations]({{< relref "../dashboards/build-dashboards/annotate-visualizations" >}}) for more information.
+This feature, which shows up as a graph marker in Grafana, is useful for correlating data in case something goes wrong. You can create the annotations manually—just control-click on a graph and input some text—or you can fetch data from any data source. Refer to [Annotations](../dashboards/build-dashboards/annotate-visualizations/) for more information.
## Dashboard variables
-[Template variables]({{< relref "../dashboards/variables" >}}) allow you to create dashboards that can be reused for lots of different use cases. Values aren't hard-coded with these templates, so for instance, if you have a production server and a test server, you can use the same dashboard for both.
+[Template variables](../dashboards/variables/) allow you to create dashboards that can be reused for lots of different use cases. Values aren't hard-coded with these templates, so for instance, if you have a production server and a test server, you can use the same dashboard for both.
Templating allows you to drill down into your data, say, from all data to North America data, down to Texas data, and beyond. You can also share these dashboards across teams within your organization—or if you create a great dashboard template for a popular data source, you can contribute it to the whole community to customize and use.
## Configure Grafana
-If you're a Grafana administrator, then you'll want to thoroughly familiarize yourself with [Grafana configuration options]({{< relref "../setup-grafana/configure-grafana" >}}) and the [Grafana CLI]({{< relref "../cli" >}}).
+If you're a Grafana administrator, then you'll want to thoroughly familiarize yourself with [Grafana configuration options](../setup-grafana/configure-grafana/) and the [Grafana CLI](../cli/).
Configuration covers both config files and environment variables. You can set up default ports, logging levels, email IP addresses, security, and more.
@@ -54,19 +54,19 @@ Discover hundreds of [dashboards](/grafana/dashboards) and [plugins](/grafana/pl
## Authentication
-Grafana supports different authentication methods, such as LDAP and OAuth, and allows you to map users to organizations. Refer to the [User authentication overview]({{< relref "../setup-grafana/configure-security/configure-authentication" >}}) for more information.
+Grafana supports different authentication methods, such as LDAP and OAuth, and allows you to map users to organizations. Refer to the [User authentication overview](../setup-grafana/configure-security/configure-authentication/) for more information.
-In Grafana Enterprise, you can also map users to teams: If your company has its own authentication system, Grafana allows you to map the teams in your internal systems to teams in Grafana. That way, you can automatically give people access to the dashboards designated for their teams. Refer to [Grafana Enterprise]({{< relref "./grafana-enterprise" >}}) for more information.
+In Grafana Enterprise, you can also map users to teams: If your company has its own authentication system, Grafana allows you to map the teams in your internal systems to teams in Grafana. That way, you can automatically give people access to the dashboards designated for their teams. Refer to [Grafana Enterprise](grafana-enterprise/) for more information.
## Provisioning
While it's easy to click, drag, and drop to create a single dashboard, power users in need of many dashboards will want to automate the setup with a script. You can script anything in Grafana.
-For example, if you're spinning up a new Kubernetes cluster, you can also spin up a Grafana automatically with a script that would have the right server, IP address, and data sources preset and locked in so users cannot change them. It's also a way of getting control over a lot of dashboards. Refer to [Provisioning]({{< relref "../administration/provisioning" >}}) for more information.
+For example, if you're spinning up a new Kubernetes cluster, you can also spin up a Grafana automatically with a script that would have the right server, IP address, and data sources preset and locked in so users cannot change them. It's also a way of getting control over a lot of dashboards. Refer to [Provisioning](../administration/provisioning/) for more information.
## Permissions
-When organizations have one Grafana and multiple teams, they often want the ability to both keep things separate and share dashboards. You can create a team of users and then set permissions on [folders and dashboards]({{< relref "../administration/user-management/manage-dashboard-permissions" >}}), and down to the [data source level]({{< relref "../administration/data-source-management#data-source-permissions" >}}) if you're using [Grafana Enterprise]({{< relref "./grafana-enterprise" >}}).
+When organizations have one Grafana and multiple teams, they often want the ability to both keep things separate and share dashboards. You can create a team of users and then set permissions on [folders and dashboards](../administration/user-management/manage-dashboard-permissions/), and down to the [data source level](../administration/data-source-management/#data-source-permissions) if you're using [Grafana Enterprise](grafana-enterprise/).
## Other Grafana Labs OSS Projects
diff --git a/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md b/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md
index 9fef087e422..cfc5a5e29e5 100644
--- a/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md
+++ b/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md
@@ -104,6 +104,16 @@ When there are multiple transformations, Grafana applies them in the order they
The order in which Grafana applies transformations directly impacts the results. For example, if you use a Reduce transformation to condense all the results of one column into a single value, then you can only apply transformations to that single value.
+## Dashboard variables in transformations
+
+All text input fields in transformations accept [variable syntax](ref:dashboard-variable):
+
+{{< figure src="/media/docs/grafana/panels-visualizations/screenshot-transformation-variables-v11.6.png" alt="Transformation with a mock variable in a text field" >}}
+
+When you use dashboard variables in transformations, the variables are automatically interpolated before the transformations are applied to the data.
+
+For an example, refer to [Use a dashboard variable](#use-a-dashboard-variable) in the **Filter fields by name** transformation.
+
## Add a transformation function to data
The following steps guide you in adding a transformation to data. This documentation does not include steps for each type of transformation. For a complete list of transformations, refer to [Transformation functions](#transformation-functions).
diff --git a/docs/sources/panels-visualizations/visualizations/flame-graph/index.md b/docs/sources/panels-visualizations/visualizations/flame-graph/index.md
index beb660f660f..b4096fa4d09 100644
--- a/docs/sources/panels-visualizations/visualizations/flame-graph/index.md
+++ b/docs/sources/panels-visualizations/visualizations/flame-graph/index.md
@@ -19,7 +19,7 @@ weight: 100
# Flame graph
-Flame graphs let you visualize [profiling](https://grafana.com/docs/pyroscope/latest/introduction/profiling/) data. Using this visualization, a [profile](https://grafana.com/docs/pyroscope/latest/view-and-analyze-profile-data/profiling-types/) can be represented as a [flame graph](#flame-graph-mode), [top table](#top-table-mode), or both.
+Flame graphs let you visualize [profiling](https://grafana.com/docs/pyroscope/latest/introduction/what-is-profiling/) data. Using this visualization, a [profile](https://grafana.com/docs/pyroscope/latest/view-and-analyze-profile-data/profiling-types/) can be represented as a [flame graph](#flame-graph-mode), [top table](#top-table-mode), or both.
For example, if you want to understand which parts of a program consume the most resources, such as CPU time, memory, or I/O operations, you can use a flame graph to visualize and analyze where potential performance issues are:
diff --git a/docs/sources/panels-visualizations/visualizations/traces/index.md b/docs/sources/panels-visualizations/visualizations/traces/index.md
index ac99c3a07bd..d89ea25b559 100644
--- a/docs/sources/panels-visualizations/visualizations/traces/index.md
+++ b/docs/sources/panels-visualizations/visualizations/traces/index.md
@@ -59,7 +59,7 @@ For more information about traces and how to use them, refer to the following do
- [Tempo data source](ref:tempo-data-source)
- [Getting started with Tempo](/docs/tempo/latest/getting-started)
-{{< figure src="/static/img/docs/explore/trace-view-9-4.png" class="docs-image--no-shadow" max-width= "900px" caption="Screenshot of the trace view" >}}
+{{< figure src="/media/docs/grafana/panels-visualizations/screenshot-traces-visualization-11.5.png" max-width= "700px" alt="Screenshot of the trace view" >}}
{{< docs/play title="Traces Panel" url="https://play.grafana.org/d/edodkfmj0tce8f/" >}}
@@ -77,7 +77,7 @@ To use this procedure, you need:
- A Grafana instance
- A [Tempo data source](ref:tempo-data-source) connected to your Grafana instance
-### Add the traces visualization query {#add-the-traces-panel-query}
+### Steps {#add-the-traces-panel-query}
To view and analyze traces data in a dashboard, you need to add the traces visualization to your dashboard and define a query using the panel editor.
The query determines the data that is displayed in the visualization.
@@ -100,19 +100,19 @@ This procedure uses dashboard variables and templates to allow you to enter trac
1. In the query editor, click the **TraceQL** query type tab.
1. Enter `${traceId}` in the TraceQL query field to create a dashboard variable. This variable is used as the template query.
- {{< figure src="/static/img/docs/panels/traces/screenshot-traces-template-query.png" caption="Add a template query" >}}
+ {{< figure src="/static/img/docs/panels/traces/screenshot-traces-template-query.png" alt="Add a template query" >}}
1. Click **Back to dashboard**.
1. Click **Settings** and go to the **Variables** tab.
1. Add a new variable called `traceId`, of variable type **Custom**, giving it a label if required.
- {{< figure src="/media/docs/grafana/dashboards/screenshot-traces-custom-variable-11.2.png" max-width="50%" caption="Add a Custom variable" >}}
+ {{< figure src="/media/docs/grafana/panels-visualizations/screenshot-traces-custom-variable-v11.5.png" max-width="400px" alt="Add a template query" >}}
1. Click **Save dashboard**.
1. Click **Back to dashboard** and **Exit edit**.
1. Verify that the panel works by using a valid trace ID for the data source used for the trace panel and editing the ID in the dashboard variable.
- {{< figure src="/static/img/docs/panels/traces/screenshot-traces-traceid-panel.png" caption="Results of query in trace panel" >}}
+ {{< figure src="/static/img/docs/panels/traces/screenshot-traces-traceid-panel.png" alt="Results of query in trace panel" >}}
## Add TraceQL with table visualizations
@@ -127,14 +127,14 @@ It’s more useful to instead be able to use TraceQL queries to search for speci
1. Under the **Panel options**, enter a **Title** for your trace panel or have Grafana create one using [generative AI features](ref:generative-ai-features).
1. Add an appropriate TraceQL query to search for traces that you would like to visualize in the dashboard. This example uses a simple, static query. You can write the TraceQL query as a template query to take advantage of other dashboard variables, if they exist. This lets you create dynamic queries based on these variables.
- {{< figure src="/static/img/docs/panels/traces/screenshot-traces-dynamic-query.png" caption="Create a dynamic query" >}}
+ {{< figure src="/static/img/docs/panels/traces/screenshot-traces-dynamic-query.png" alt="Create a dynamic query" >}}
1. Click **Save dashboard**.
1. Click **Back to dashboard** and **Exit edit**.
When results are returned from a query, the results are rendered in the panel’s table.
-{{< figure src="/static/img/docs/panels/traces/screenshot-traces-returned-query.png" caption="Results of a returned query in the panel table" >}}
+{{< figure src="/static/img/docs/panels/traces/screenshot-traces-returned-query.png" alt="Results of a returned query in the panel table" >}}
### Use a variable to add other links to traces
@@ -146,12 +146,12 @@ To create a set of data links in the panel, use the following steps:
1. Add a **Title** for the data link.
1. Find the UUID of the dashboard by looking in your browser’s address bar when the full dashboard is being rendered. Because this is a link to a dashboard in the same Grafana stack, only the path of the dashboard is required.
- {{< figure src="/static/img/docs/panels/traces/screensnot-traces-uuid-url.png" caption="Unique identifier for the dashboard" >}}
+ {{< figure src="/static/img/docs/panels/traces/screensnot-traces-uuid-url.png" alt="Unique identifier for the dashboard" >}}
1. In the **URL** field, make a self-reference to the dashboard that contains both of the panels. This self-reference uses the value of the selected trace in the table to fill in the dashboard variable. Use the path for the dashboard from the previous step and then fill in the value of `traceId` using the selected results from the TraceQL table.
The trace ID is exposed using the `traceID` data field in the returned results, so use that as the value for the dashboard variable.
- {{< figure src="/static/img/docs/panels/traces/screenshot-traces-edit-link.png" caption="Edit link and add the Trace link" >}}
+ {{< figure src="/static/img/docs/panels/traces/screenshot-traces-edit-link.png" alt="Edit link and add the Trace link" >}}
1. Select **Save** to save the data link.
1. Click **Save dashboard**.
@@ -159,24 +159,35 @@ To create a set of data links in the panel, use the following steps:
You should now see a list of matching traces in the table visualization. While selecting the **TraceID** or **SpanID** fields will give you the option to either open the **Explore** page to visualize the trace or following the data link, selecting any other field (such as **Start time**, **Name** or **Duration**) automatically follows the data link, filling in the `traceId` dashboard variable, and then shows the relevant trace in the trace panel.
-{{< figure src="/static/img/docs/panels/traces/screenshot-traces-trace-link.png" caption="Selecting the trace link" >}}
+{{< figure src="/static/img/docs/panels/traces/screenshot-traces-trace-link.png" alt="Selecting the trace link" >}}
{{< figure src="/static/img/docs/panels/traces/screenshot-traces-trace-link-follow.png" caption="Follow the trace link populates the trace ID and displays the traces view" >}}
-## Panel options
+## Configuration options
+
+{{< docs/shared lookup="visualizations/config-options-intro.md" source="grafana" version="" >}}
+
+### Panel options
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
-## Span filters
+### Span filters options
The **Span filters** options control the initial state of the span filters when the visualization loads, allowing you to customize your trace analysis view.
-- **Find in trace** - Set the initial value to focus on spans relevant to your query.
-- **Show matches only** - Toggle the switch on to display only spans that match the defined filter criteria. This helps simplify trace interpretation.
-- **Show critical path only** - Toggle the switch on to highlight only the spans in the critical path, which helps identify performance bottlenecks and their impact on overall latency.
-- **Service name** and **Service name operator** - Define a specific service or pattern to narrow analysis to spans related to particular services.
-- **Span name** and **Span name operator** - Filter spans by name or pattern to focus on specific span types or processes.
-- **Min duration** and **Max duration** - Set duration thresholds to exclude spans outside the desired time range.
-- **Tags** - Add one or more tags to further refine the filtering criteria so only relevant spans are displayed.
+The following options support variable interpolation, where you can set the service name to a variable `$var` and the visualization will replace it with the value for the variable named `$var` in the span filters: **Service name**, **Span name**, **Min duration**, **Max duration**, and **Tags**.
-The options support variable interpolation, where you can set the service name to a variable `$var` and the visualization will replace it with the value for the variable named `$var` in the span filters. This applies to the service name, span name, duration fields, and tags.
+
+
+| Option | Description |
+| ------ | ----------- |
+| Find in trace | Set the initial value to focus on spans relevant to your query. |
+| Show matches only | Toggle the switch on to display only spans that match the defined filter criteria. This helps simplify trace interpretation. |
+| Show critical path only | Toggle the switch on to highlight only the spans in the critical path, which helps identify performance bottlenecks and their impact on overall latency. |
+| Service name | Along with the **Service name operator**, define a specific service or pattern to narrow analysis to spans related to particular services. |
+| Span name | Along with the **Span name operator**, filter spans by name or pattern to focus on specific span types or processes. |
+| Min duration | Set the minimum duration threshold to exclude spans outside the desired time range. |
+| Max duration | Set the maximum duration threshold to exclude spans outside the desired time range. |
+| Tags | Add one or more tags to further refine the filtering criteria so only relevant spans are displayed. |
+
+
diff --git a/docs/sources/release-notes/_index.md b/docs/sources/release-notes/_index.md
index bdc839a1df3..8409c58c6a7 100644
--- a/docs/sources/release-notes/_index.md
+++ b/docs/sources/release-notes/_index.md
@@ -16,127 +16,127 @@ as well as notices about deprecations, breaking changes, and changes related to
{{% admonition type="note" %}}
As of Grafana v9.2 we no longer publish release notes, which are redundant with other release lists that we publish:
-- For details about new features, deprecations, and breaking changes in new Grafana releases, see [What's New in Grafana]({{< relref "../whatsnew/" >}}).
+- For details about new features, deprecations, and breaking changes in new Grafana releases, see [What's New in Grafana](../whatsnew/).
- For lists of changes to Grafana, with links to pull requests and related issues when available, see the [Changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md).
{{% /admonition %}}
-- [Release notes for 9.1.7]({{< relref "release-notes-9-1-7" >}})
-- [Release notes for 9.1.6]({{< relref "release-notes-9-1-6" >}})
-- [Release notes for 9.1.5]({{< relref "release-notes-9-1-5" >}})
-- [Release notes for 9.1.4]({{< relref "release-notes-9-1-4" >}})
-- [Release notes for 9.1.3]({{< relref "release-notes-9-1-3" >}})
-- [Release notes for 9.1.2]({{< relref "release-notes-9-1-2" >}})
-- [Release notes for 9.1.1]({{< relref "release-notes-9-1-1" >}})
-- [Release notes for 9.1.0]({{< relref "release-notes-9-1-0" >}})
-- [Release notes for 9.1.0-beta1]({{< relref "release-notes-9-1-0-beta1" >}})
-- [Release notes for 9.0.9]({{< relref "release-notes-9-0-9" >}})
-- [Release notes for 9.0.8]({{< relref "release-notes-9-0-8" >}})
-- [Release notes for 9.0.7]({{< relref "release-notes-9-0-7" >}})
-- [Release notes for 9.0.6]({{< relref "release-notes-9-0-6" >}})
-- [Release notes for 9.0.5]({{< relref "release-notes-9-0-5" >}})
-- [Release notes for 9.0.4]({{< relref "release-notes-9-0-4" >}})
-- [Release notes for 9.0.3]({{< relref "release-notes-9-0-3" >}})
-- [Release notes for 9.0.2]({{< relref "release-notes-9-0-2" >}})
-- [Release notes for 9.0.1]({{< relref "release-notes-9-0-1" >}})
-- [Release notes for 9.0.0]({{< relref "release-notes-9-0-0/" >}})
-- [Release notes for 9.0.0-beta3]({{< relref "release-notes-9-0-0-beta3/" >}})
-- [Release notes for 9.0.0-beta2]({{< relref "release-notes-9-0-0-beta2/" >}})
-- [Release notes for 9.0.0-beta1]({{< relref "release-notes-9-0-0-beta1/" >}})
-- [Release notes for 8.5.13]({{< relref "release-notes-8-5-13" >}})
-- [Release notes for 8.5.11]({{< relref "release-notes-8-5-11" >}})
-- [Release notes for 8.5.10]({{< relref "release-notes-8-5-10" >}})
-- [Release notes for 8.5.9]({{< relref "release-notes-8-5-9" >}})
-- [Release notes for 8.5.6]({{< relref "release-notes-8-5-6/" >}})
-- [Release notes for 8.5.5]({{< relref "release-notes-8-5-5/" >}})
-- [Release notes for 8.5.4]({{< relref "release-notes-8-5-4/" >}})
-- [Release notes for 8.5.3]({{< relref "release-notes-8-5-3/" >}})
-- [Release notes for 8.5.2]({{< relref "release-notes-8-5-2/" >}})
-- [Release notes for 8.5.1]({{< relref "release-notes-8-5-1/" >}})
-- [Release notes for 8.5.0]({{< relref "release-notes-8-5-0/" >}})
-- [Release notes for 8.5.0-beta1]({{< relref "release-notes-8-5-0-beta1/" >}})
-- [Release notes for 8.4.11]({{< relref "release-notes-8-4-11" >}})
-- [Release notes for 8.4.10]({{< relref "release-notes-8-4-10" >}})
-- [Release notes for 8.4.7]({{< relref "release-notes-8-4-7/" >}})
-- [Release notes for 8.4.6]({{< relref "release-notes-8-4-6/" >}})
-- [Release notes for 8.4.5]({{< relref "release-notes-8-4-5/" >}})
-- [Release notes for 8.4.4]({{< relref "release-notes-8-4-4/" >}})
-- [Release notes for 8.4.3]({{< relref "release-notes-8-4-3/" >}})
-- [Release notes for 8.4.2]({{< relref "release-notes-8-4-2/" >}})
-- [Release notes for 8.4.1]({{< relref "release-notes-8-4-1/" >}})
-- [Release notes for 8.4.0-beta1]({{< relref "release-notes-8-4-0-beta1/" >}})
-- [Release notes for 8.3.11]({{< relref "release-notes-8-3-11/" >}})
-- [Release notes for 8.3.7]({{< relref "release-notes-8-3-7/" >}})
-- [Release notes for 8.3.6]({{< relref "release-notes-8-3-6/" >}})
-- [Release notes for 8.3.5]({{< relref "release-notes-8-3-5/" >}})
-- [Release notes for 8.3.4]({{< relref "release-notes-8-3-4/" >}})
-- [Release notes for 8.3.3]({{< relref "release-notes-8-3-3/" >}})
-- [Release notes for 8.3.2]({{< relref "release-notes-8-3-2/" >}})
-- [Release notes for 8.3.1]({{< relref "release-notes-8-3-1/" >}})
-- [Release notes for 8.3.0]({{< relref "release-notes-8-3-0/" >}})
-- [Release notes for 8.3.0-beta2]({{< relref "release-notes-8-3-0-beta2/" >}})
-- [Release notes for 8.3.0-beta1]({{< relref "release-notes-8-3-0-beta1/" >}})
-- [Release notes for 8.2.7]({{< relref "release-notes-8-2-7/" >}})
-- [Release notes for 8.2.6]({{< relref "release-notes-8-2-6/" >}})
-- [Release notes for 8.2.5]({{< relref "release-notes-8-2-5/" >}})
-- [Release notes for 8.2.4]({{< relref "release-notes-8-2-4/" >}})
-- [Release notes for 8.2.3]({{< relref "release-notes-8-2-3/" >}})
-- [Release notes for 8.2.2]({{< relref "release-notes-8-2-2/" >}})
-- [Release notes for 8.2.1]({{< relref "release-notes-8-2-1/" >}})
-- [Release notes for 8.2.0]({{< relref "release-notes-8-2-0/" >}})
-- [Release notes for 8.2.0-beta2]({{< relref "release-notes-8-2-0-beta2/" >}})
-- [Release notes for 8.2.0-beta1]({{< relref "release-notes-8-2-0-beta1/" >}})
-- [Release notes for 8.1.8]({{< relref "release-notes-8-1-8/" >}})
-- [Release notes for 8.1.7]({{< relref "release-notes-8-1-7/" >}})
-- [Release notes for 8.1.6]({{< relref "release-notes-8-1-6/" >}})
-- [Release notes for 8.1.5]({{< relref "release-notes-8-1-5/" >}})
-- [Release notes for 8.1.4]({{< relref "release-notes-8-1-4/" >}})
-- [Release notes for 8.1.3]({{< relref "release-notes-8-1-3/" >}})
-- [Release notes for 8.1.2]({{< relref "release-notes-8-1-2/" >}})
-- [Release notes for 8.1.1]({{< relref "release-notes-8-1-1/" >}})
-- [Release notes for 8.1.0]({{< relref "release-notes-8-1-0/" >}})
-- [Release notes for 8.1.0-beta3]({{< relref "release-notes-8-1-0-beta3/" >}})
-- [Release notes for 8.1.0-beta2]({{< relref "release-notes-8-1-0-beta2/" >}})
-- [Release notes for 8.1.0-beta1]({{< relref "release-notes-8-1-0-beta1/" >}})
-- [Release notes for 8.0.7]({{< relref "release-notes-8-0-7/" >}})
-- [Release notes for 8.0.6]({{< relref "release-notes-8-0-6/" >}})
-- [Release notes for 8.0.5]({{< relref "release-notes-8-0-5/" >}})
-- [Release notes for 8.0.4]({{< relref "release-notes-8-0-4/" >}})
-- [Release notes for 8.0.3]({{< relref "release-notes-8-0-3/" >}})
-- [Release notes for 8.0.2]({{< relref "release-notes-8-0-2/" >}})
-- [Release notes for 8.0.1]({{< relref "release-notes-8-0-1/" >}})
-- [Release notes for 8.0.0]({{< relref "release-notes-8-0-0/" >}})
-- [Release notes for 8.0.0-beta3]({{< relref "release-notes-8-0-0-beta3/" >}})
-- [Release notes for 8.0.0-beta2]({{< relref "release-notes-8-0-0-beta2/" >}})
-- [Release notes for 8.0.0-beta1]({{< relref "release-notes-8-0-0-beta1/" >}})
-- [Release notes for 7.5.15]({{< relref "release-notes-7-5-15/" >}})
-- [Release notes for 7.5.13]({{< relref "release-notes-7-5-13/" >}})
-- [Release notes for 7.5.12]({{< relref "release-notes-7-5-12/" >}})
-- [Release notes for 7.5.11]({{< relref "release-notes-7-5-11/" >}})
-- [Release notes for 7.5.10]({{< relref "release-notes-7-5-10/" >}})
-- [Release notes for 7.5.9]({{< relref "release-notes-7-5-9/" >}})
-- [Release notes for 7.5.8]({{< relref "release-notes-7-5-8/" >}})
-- [Release notes for 7.5.7]({{< relref "release-notes-7-5-7/" >}})
-- [Release notes for 7.5.6]({{< relref "release-notes-7-5-6/" >}})
-- [Release notes for 7.5.5]({{< relref "release-notes-7-5-5/" >}})
-- [Release notes for 7.5.4]({{< relref "release-notes-7-5-4/" >}})
-- [Release notes for 7.5.3]({{< relref "release-notes-7-5-3/" >}})
-- [Release notes for 7.5.2]({{< relref "release-notes-7-5-2/" >}})
-- [Release notes for 7.5.1]({{< relref "release-notes-7-5-1/" >}})
-- [Release notes for 7.5.0]({{< relref "release-notes-7-5-0/" >}})
-- [Release notes for 7.5.0-beta2]({{< relref "release-notes-7-5-0-beta2/" >}})
-- [Release notes for 7.5.0-beta1]({{< relref "release-notes-7-5-0-beta1/" >}})
-- [Release notes for 7.4.5]({{< relref "release-notes-7-4-5/" >}})
-- [Release notes for 7.4.3]({{< relref "release-notes-7-4-3/" >}})
-- [Release notes for 7.4.2]({{< relref "release-notes-7-4-2/" >}})
-- [Release notes for 7.4.1]({{< relref "release-notes-7-4-1/" >}})
-- [Release notes for 7.4.0]({{< relref "release-notes-7-4-0/" >}})
-- [Release notes for 7.3.10]({{< relref "release-notes-7-3-10/" >}})
-- [Release notes for 7.3.7]({{< relref "release-notes-7-3-7/" >}})
-- [Release notes for 7.3.6]({{< relref "release-notes-7-3-6/" >}})
-- [Release notes for 7.3.5]({{< relref "release-notes-7-3-5/" >}})
-- [Release notes for 7.3.4]({{< relref "release-notes-7-3-4/" >}})
-- [Release notes for 7.3.3]({{< relref "release-notes-7-3-3/" >}})
-- [Release notes for 7.3.2]({{< relref "release-notes-7-3-2/" >}})
-- [Release notes for 7.3.1]({{< relref "release-notes-7-3-1/" >}})
-- [Release notes for 7.3.0]({{< relref "release-notes-7-3-0/" >}})
+- [Release notes for 9.1.7](release-notes-9-1-7/)
+- [Release notes for 9.1.6](release-notes-9-1-6/)
+- [Release notes for 9.1.5](release-notes-9-1-5/)
+- [Release notes for 9.1.4](release-notes-9-1-4/)
+- [Release notes for 9.1.3](release-notes-9-1-3/)
+- [Release notes for 9.1.2](release-notes-9-1-2/)
+- [Release notes for 9.1.1](release-notes-9-1-1/)
+- [Release notes for 9.1.0](release-notes-9-1-0/)
+- [Release notes for 9.1.0-beta1](release-notes-9-1-0-beta1/)
+- [Release notes for 9.0.9](release-notes-9-0-9/)
+- [Release notes for 9.0.8](release-notes-9-0-8/)
+- [Release notes for 9.0.7](release-notes-9-0-7/)
+- [Release notes for 9.0.6](release-notes-9-0-6/)
+- [Release notes for 9.0.5](release-notes-9-0-5/)
+- [Release notes for 9.0.4](release-notes-9-0-4/)
+- [Release notes for 9.0.3](release-notes-9-0-3/)
+- [Release notes for 9.0.2](release-notes-9-0-2/)
+- [Release notes for 9.0.1](release-notes-9-0-1/)
+- [Release notes for 9.0.0](release-notes-9-0-0/)
+- [Release notes for 9.0.0-beta3](release-notes-9-0-0-beta3/)
+- [Release notes for 9.0.0-beta2](release-notes-9-0-0-beta2/)
+- [Release notes for 9.0.0-beta1](release-notes-9-0-0-beta1/)
+- [Release notes for 8.5.13](release-notes-8-5-13/)
+- [Release notes for 8.5.11](release-notes-8-5-11/)
+- [Release notes for 8.5.10](release-notes-8-5-10/)
+- [Release notes for 8.5.9](release-notes-8-5-9/)
+- [Release notes for 8.5.6](release-notes-8-5-6/)
+- [Release notes for 8.5.5](release-notes-8-5-5/)
+- [Release notes for 8.5.4](release-notes-8-5-4/)
+- [Release notes for 8.5.3](release-notes-8-5-3/)
+- [Release notes for 8.5.2](release-notes-8-5-2/)
+- [Release notes for 8.5.1](release-notes-8-5-1/)
+- [Release notes for 8.5.0](release-notes-8-5-0/)
+- [Release notes for 8.5.0-beta1](release-notes-8-5-0-beta1/)
+- [Release notes for 8.4.11](release-notes-8-4-11/)
+- [Release notes for 8.4.10](release-notes-8-4-10/)
+- [Release notes for 8.4.7](release-notes-8-4-7/)
+- [Release notes for 8.4.6](release-notes-8-4-6/)
+- [Release notes for 8.4.5](release-notes-8-4-5/)
+- [Release notes for 8.4.4](release-notes-8-4-4/)
+- [Release notes for 8.4.3](release-notes-8-4-3/)
+- [Release notes for 8.4.2](release-notes-8-4-2/)
+- [Release notes for 8.4.1](release-notes-8-4-1/)
+- [Release notes for 8.4.0-beta1](release-notes-8-4-0-beta1/)
+- [Release notes for 8.3.11](release-notes-8-3-11/)
+- [Release notes for 8.3.7](release-notes-8-3-7/)
+- [Release notes for 8.3.6](release-notes-8-3-6/)
+- [Release notes for 8.3.5](release-notes-8-3-5/)
+- [Release notes for 8.3.4](release-notes-8-3-4/)
+- [Release notes for 8.3.3](release-notes-8-3-3/)
+- [Release notes for 8.3.2](release-notes-8-3-2/)
+- [Release notes for 8.3.1](release-notes-8-3-1/)
+- [Release notes for 8.3.0](release-notes-8-3-0/)
+- [Release notes for 8.3.0-beta2](release-notes-8-3-0-beta2/)
+- [Release notes for 8.3.0-beta1](release-notes-8-3-0-beta1/)
+- [Release notes for 8.2.7](release-notes-8-2-7/)
+- [Release notes for 8.2.6](release-notes-8-2-6/)
+- [Release notes for 8.2.5](release-notes-8-2-5/)
+- [Release notes for 8.2.4](release-notes-8-2-4/)
+- [Release notes for 8.2.3](release-notes-8-2-3/)
+- [Release notes for 8.2.2](release-notes-8-2-2/)
+- [Release notes for 8.2.1](release-notes-8-2-1/)
+- [Release notes for 8.2.0](release-notes-8-2-0/)
+- [Release notes for 8.2.0-beta2](release-notes-8-2-0-beta2/)
+- [Release notes for 8.2.0-beta1](release-notes-8-2-0-beta1/)
+- [Release notes for 8.1.8](release-notes-8-1-8/)
+- [Release notes for 8.1.7](release-notes-8-1-7/)
+- [Release notes for 8.1.6](release-notes-8-1-6/)
+- [Release notes for 8.1.5](release-notes-8-1-5/)
+- [Release notes for 8.1.4](release-notes-8-1-4/)
+- [Release notes for 8.1.3](release-notes-8-1-3/)
+- [Release notes for 8.1.2](release-notes-8-1-2/)
+- [Release notes for 8.1.1](release-notes-8-1-1/)
+- [Release notes for 8.1.0](release-notes-8-1-0/)
+- [Release notes for 8.1.0-beta3](release-notes-8-1-0-beta3/)
+- [Release notes for 8.1.0-beta2](release-notes-8-1-0-beta2/)
+- [Release notes for 8.1.0-beta1](release-notes-8-1-0-beta1/)
+- [Release notes for 8.0.7](release-notes-8-0-7/)
+- [Release notes for 8.0.6](release-notes-8-0-6/)
+- [Release notes for 8.0.5](release-notes-8-0-5/)
+- [Release notes for 8.0.4](release-notes-8-0-4/)
+- [Release notes for 8.0.3](release-notes-8-0-3/)
+- [Release notes for 8.0.2](release-notes-8-0-2/)
+- [Release notes for 8.0.1](release-notes-8-0-1/)
+- [Release notes for 8.0.0](release-notes-8-0-0/)
+- [Release notes for 8.0.0-beta3](release-notes-8-0-0-beta3/)
+- [Release notes for 8.0.0-beta2](release-notes-8-0-0-beta2/)
+- [Release notes for 8.0.0-beta1](release-notes-8-0-0-beta1/)
+- [Release notes for 7.5.15](release-notes-7-5-15/)
+- [Release notes for 7.5.13](release-notes-7-5-13/)
+- [Release notes for 7.5.12](release-notes-7-5-12/)
+- [Release notes for 7.5.11](release-notes-7-5-11/)
+- [Release notes for 7.5.10](release-notes-7-5-10/)
+- [Release notes for 7.5.9](release-notes-7-5-9/)
+- [Release notes for 7.5.8](release-notes-7-5-8/)
+- [Release notes for 7.5.7](release-notes-7-5-7/)
+- [Release notes for 7.5.6](release-notes-7-5-6/)
+- [Release notes for 7.5.5](release-notes-7-5-5/)
+- [Release notes for 7.5.4](release-notes-7-5-4/)
+- [Release notes for 7.5.3](release-notes-7-5-3/)
+- [Release notes for 7.5.2](release-notes-7-5-2/)
+- [Release notes for 7.5.1](release-notes-7-5-1/)
+- [Release notes for 7.5.0](release-notes-7-5-0/)
+- [Release notes for 7.5.0-beta2](release-notes-7-5-0-beta2/)
+- [Release notes for 7.5.0-beta1](release-notes-7-5-0-beta1/)
+- [Release notes for 7.4.5](release-notes-7-4-5/)
+- [Release notes for 7.4.3](release-notes-7-4-3/)
+- [Release notes for 7.4.2](release-notes-7-4-2/)
+- [Release notes for 7.4.1](release-notes-7-4-1/)
+- [Release notes for 7.4.0](release-notes-7-4-0/)
+- [Release notes for 7.3.10](release-notes-7-3-10/)
+- [Release notes for 7.3.7](release-notes-7-3-7/)
+- [Release notes for 7.3.6](release-notes-7-3-6/)
+- [Release notes for 7.3.5](release-notes-7-3-5/)
+- [Release notes for 7.3.4](release-notes-7-3-4/)
+- [Release notes for 7.3.3](release-notes-7-3-3/)
+- [Release notes for 7.3.2](release-notes-7-3-2/)
+- [Release notes for 7.3.1](release-notes-7-3-1/)
+- [Release notes for 7.3.0](release-notes-7-3-0/)
diff --git a/docs/sources/setup-grafana/configure-docker.md b/docs/sources/setup-grafana/configure-docker.md
index 0ad1aecabbd..f5c706f1845 100644
--- a/docs/sources/setup-grafana/configure-docker.md
+++ b/docs/sources/setup-grafana/configure-docker.md
@@ -84,9 +84,9 @@ For a list of available tags, refer to [grafana/grafana-oss](https://hub.docker.
## Default paths
-Grafana comes with default configuration parameters that remain the same among versions regardless of the operating system or the environment (for example, virtual machine, Docker, Kubernetes, etc.). You can refer to the [Configure Grafana]({{< relref "./configure-grafana" >}}) documentation to view all the default configuration settings.
+Grafana comes with default configuration parameters that remain the same among versions regardless of the operating system or the environment (for example, virtual machine, Docker, Kubernetes, etc.). You can refer to the [Configure Grafana](../configure-grafana/) documentation to view all the default configuration settings.
-The following configurations are set by default when you start the Grafana Docker container. When running in Docker you cannot change the configurations by editing the `conf/grafana.ini` file. Instead, you can modify the configuration using [environment variables]({{< relref "./configure-grafana#override-configuration-with-environment-variables" >}}).
+The following configurations are set by default when you start the Grafana Docker container. When running in Docker you cannot change the configurations by editing the `conf/grafana.ini` file. Instead, you can modify the configuration using [environment variables](../configure-grafana/#override-configuration-with-environment-variables).
| Setting | Default value |
| --------------------- | ------------------------- |
@@ -99,7 +99,7 @@ The following configurations are set by default when you start the Grafana Docke
## Install plugins in the Docker container
-You can install publicly available plugins and plugins that are private or used internally in an organization. For plugin installation instructions, refer to [Install plugins in the Docker container]({{< relref "./installation/docker#install-plugins-in-the-docker-container" >}}).
+You can install publicly available plugins and plugins that are private or used internally in an organization. For plugin installation instructions, refer to [Install plugins in the Docker container](../installation/docker/#install-plugins-in-the-docker-container).
### Install plugins from other sources
@@ -209,7 +209,7 @@ docker run -d -p 3000:3000 --name=grafana grafana-custom
## Logging
-By default, Docker container logs are directed to `STDOUT`, a common practice in the Docker community. You can change this by setting a different [log mode]({{< relref "./configure-grafana#mode" >}}) such as `console`, `file`, or `syslog`. You can use one or more modes by separating them with spaces, for example, `console file`. By default, both `console` and `file` modes are enabled.
+By default, Docker container logs are directed to `STDOUT`, a common practice in the Docker community. You can change this by setting a different [log mode](../configure-grafana/#mode) such as `console`, `file`, or `syslog`. You can use one or more modes by separating them with spaces, for example, `console file`. By default, both `console` and `file` modes are enabled.
Example:
@@ -235,7 +235,7 @@ The following example demonstrates how to set the admin password:
### Configure Docker secrets credentials for AWS CloudWatch
-Grafana ships with built-in support for the [Amazon CloudWatch datasource]({{< relref "../datasources/aws-cloudwatch" >}}). To configure the data source, you must provide information such as the AWS ID-Key, secret access key, region, and so on. You can use Docker secrets as a way to provide this information.
+Grafana ships with built-in support for the [Amazon CloudWatch datasource](../../datasources/aws-cloudwatch/). To configure the data source, you must provide information such as the AWS ID-Key, secret access key, region, and so on. You can use Docker secrets as a way to provide this information.
Example:
@@ -309,7 +309,7 @@ The following list includes the supported environment variables:
By default, the Grafana log level is set to `INFO`, but you can increase the log level to `DEBUG` mode when you want to reproduce a problem.
-For more information about logging, refer to [logs]({{< relref "./configure-grafana#log" >}}).
+For more information about logging, refer to [logs](../configure-grafana/#log).
### Increase log level using the Docker run (CLI) command
diff --git a/docs/sources/setup-grafana/configure-grafana/_index.md b/docs/sources/setup-grafana/configure-grafana/_index.md
index babe3619b35..c77d5cab8d7 100644
--- a/docs/sources/setup-grafana/configure-grafana/_index.md
+++ b/docs/sources/setup-grafana/configure-grafana/_index.md
@@ -203,13 +203,13 @@ Override log path using the command line argument `cfg:default.paths.logs`:
#### `plugins`
-Directory where Grafana automatically scans and looks for plugins. For information about manually or automatically installing plugins, refer to [Install Grafana plugins]({{< relref "../../administration/plugin-management#install-grafana-plugins" >}}).
+Directory where Grafana automatically scans and looks for plugins. For information about manually or automatically installing plugins, refer to [Install Grafana plugins](../../administration/plugin-management/#install-grafana-plugins).
**macOS:** By default, the Mac plugin location is: `/usr/local/var/lib/grafana/plugins`.
#### `provisioning`
-Directory that contains [provisioning]({{< relref "../../administration/provisioning" >}}) configuration files that Grafana applies on startup.
+Directory that contains [provisioning](../../administration/provisioning/) configuration files that Grafana applies on startup.
Dashboards are reloaded when the JSON files change.
@@ -475,7 +475,7 @@ Set to `true` to add metrics and tracing for database queries. The default value
### `[remote_cache]`
-Caches authentication details and session information in the configured database, Redis or Memcached. This setting does not configure [Query Caching in Grafana Enterprise]({{< relref "../../administration/data-source-management#query-and-resource-caching" >}}).
+Caches authentication details and session information in the configured database, Redis or Memcached. This setting does not configure [Query Caching in Grafana Enterprise](../../administration/data-source-management/#query-and-resource-caching).
#### `type`
@@ -491,11 +491,13 @@ Leave empty when using `database` and Grafana uses the primary database.
##### `redis`
-Example connection string: `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`
+Example connection string: `addr=127.0.0.1:6379,pool_size=100,db=0,username=grafana,password=grafanaRocks,ssl=false`
- `addr` is the host `:` port of the Redis server.
- `pool_size` (optional) is the number of underlying connections that can be made to Redis.
- `db` (optional) is the number identifier of the Redis database you want to use.
+- `username` (optional) is the connection identifier to authenticate the current connection.
+- `password` (optional) is the connection secret to authenticate the current connection.
- `ssl` (optional) is if SSL should be used to connect to Redis server. The value may be `true`, `false`, or `insecure`. Setting the value to `insecure` skips verification of the certificate chain and hostname when making the connection.
##### `memcache`
@@ -783,7 +785,7 @@ The following example limits access to the backend of a single plugin:
#### `angular_support_enabled`
This is set to false by default, meaning that the angular framework and support components aren't be loaded.
-This means that all [plugins]({{< relref "../../developers/angular_deprecation/angular-plugins" >}}) and core features that depend on angular support won't work.
+This means that all [plugins](../../developers/angular_deprecation/angular-plugins/) and core features that depend on angular support won't work.
The core features that depend on angular are:
@@ -884,7 +886,7 @@ For SQL data sources (MySql, Postgres, MSSQL) you can override the default maxim
Set to `false` to prohibit users from being able to sign up or create user accounts.
Default is `false`.
A Grafana Admin can still create users.
-For more information about creating a user, refer to [Add a user]({{< relref "../../administration/user-management/server-user-management#add-a-user" >}}).
+For more information about creating a user, refer to [Add a user](../../administration/user-management/server-user-management/#add-a-user).
#### `allow_org_create`
@@ -954,7 +956,7 @@ If you manage users externally you can replace the user invite button for organi
This option is deprecated - assign your viewers as editors, if you are using RBAC assign the data sources explorer role to your users.
{{< /admonition >}}
-Viewers can access and use [Explore]({{< relref "../../explore" >}}) and perform temporary edits on panels in dashboards they have access to. They cannot save their changes. Default is `false`.
+Viewers can access and use [Explore](../../explore/) and perform temporary edits on panels in dashboards they have access to. They cannot save their changes. Default is `false`.
#### `editors_can_admin`
@@ -991,7 +993,7 @@ This is a comma-separated list of usernames. Users specified here are hidden in
### `[auth]`
-Grafana provides many ways to authenticate users. Refer to the Grafana [Authentication overview]({{< relref "../configure-security/configure-authentication" >}}) and other authentication documentation for detailed instructions on how to set up and configure authentication.
+Grafana provides many ways to authenticate users. Refer to the Grafana [Authentication overview](../configure-security/configure-authentication/) and other authentication documentation for detailed instructions on how to set up and configure authentication.
#### `login_cookie_name`
@@ -1196,25 +1198,25 @@ This means the plugin can only access data and resources within that specific or
### `[auth.anonymous]`
-Refer to [Anonymous authentication]({{< relref "../configure-security/configure-authentication/grafana#anonymous-authentication" >}}) for detailed instructions.
+Refer to [Anonymous authentication](../configure-security/configure-authentication/grafana/#anonymous-authentication) for detailed instructions.
### `[auth.github]`
-Refer to [GitHub OAuth2 authentication]({{< relref "../configure-security/configure-authentication/github" >}}) for detailed instructions.
+Refer to [GitHub OAuth2 authentication](../configure-security/configure-authentication/github/) for detailed instructions.
### `[auth.gitlab]`
-Refer to [GitLab OAuth 2.0 authentication]({{< relref "../configure-security/configure-authentication/gitlab" >}}) for detailed instructions.
+Refer to [GitLab OAuth 2.0 authentication](../configure-security/configure-authentication/gitlab/) for detailed instructions.
### `[auth.google]`
-Refer to [Google OAuth2 authentication]({{< relref "../configure-security/configure-authentication/google" >}}) for detailed instructions.
+Refer to [Google OAuth2 authentication](../configure-security/configure-authentication/google/) for detailed instructions.
@@ -1232,37 +1234,37 @@ Legacy key names, still in the configuration file so they work in environment va
### `[auth.azuread]`
-Refer to [Azure AD OAuth2 authentication]({{< relref "../configure-security/configure-authentication/azuread" >}}) for detailed instructions.
+Refer to [Azure AD OAuth2 authentication](../configure-security/configure-authentication/azuread/) for detailed instructions.
### `[auth.okta]`
-Refer to [Okta OAuth2 authentication]({{< relref "../configure-security/configure-authentication/okta" >}}) for detailed instructions.
+Refer to [Okta OAuth2 authentication](../configure-security/configure-authentication/okta/) for detailed instructions.
### `[auth.generic_oauth]`
-Refer to [Generic OAuth authentication]({{< relref "../configure-security/configure-authentication/generic-oauth" >}}) for detailed instructions.
+Refer to [Generic OAuth authentication](../configure-security/configure-authentication/generic-oauth/) for detailed instructions.
### `[auth.basic]`
-Refer to [Basic authentication]({{< relref "../configure-security/configure-authentication#basic-authentication" >}}) for detailed instructions.
+Refer to [Basic authentication](../configure-security/configure-authentication/#basic-authentication) for detailed instructions.
### `[auth.proxy]`
-Refer to [Auth proxy authentication]({{< relref "../configure-security/configure-authentication/auth-proxy" >}}) for detailed instructions.
+Refer to [Auth proxy authentication](../configure-security/configure-authentication/auth-proxy/) for detailed instructions.
### `[auth.ldap]`
-Refer to [LDAP authentication]({{< relref "../configure-security/configure-authentication/ldap" >}}) for detailed instructions.
+Refer to [LDAP authentication](../configure-security/configure-authentication/ldap/) for detailed instructions.
### `[aws]`
@@ -1421,7 +1423,7 @@ Disabled by default, needs to be explicitly enabled.
### `[auth.jwt]`
-Refer to [JWT authentication]({{< relref "../configure-security/configure-authentication/jwt" >}}) for more information.
+Refer to [JWT authentication](../configure-security/configure-authentication/jwt/) for more information.
@@ -1726,7 +1728,7 @@ Limit the number of query evaluation results per alert rule. If the condition qu
### `[unified_alerting]`
-For more information about the Grafana alerts, refer to [Grafana Alerting]({{< relref "../../alerting" >}}).
+For more information about the Grafana alerts, refer to [Grafana Alerting](../../alerting/).
#### `enabled`
@@ -1858,7 +1860,7 @@ If a rule frequency is lower than this value, then this value is enforced.
### `[unified_alerting.screenshots]`
-For more information about screenshots, refer to [Images in notifications]({{< relref "../../alerting/configure-notifications/template-notifications/images-in-notifications" >}}).
+For more information about screenshots, refer to [Images in notifications](../../alerting/configure-notifications/template-notifications/images-in-notifications/).
#### `capture`
@@ -1949,7 +1951,7 @@ Configures max number of API annotations that Grafana keeps. Default value is 0,
### `[explore]`
-For more information about this feature, refer to [Explore]({{< relref "../../explore" >}}).
+For more information about this feature, refer to [Explore](../../explore/).
#### `enabled`
@@ -2026,7 +2028,7 @@ Short links without an expiration increase the size of the database and can't be
### `[metrics]`
-For detailed instructions, refer to [Internal Grafana metrics]({{< relref "../set-up-grafana-monitoring" >}}).
+For detailed instructions, refer to [Internal Grafana metrics](../set-up-grafana-monitoring/).
#### `enabled`
@@ -2423,7 +2425,7 @@ Set to `true` if you want to test alpha plugins that are not yet ready for gener
Enter a comma-separated list of plugin identifiers to identify plugins to load even if they are unsigned. Plugins with modified signatures are never loaded.
-We do _not_ recommend using this option. For more information, refer to [Plugin signatures]({{< relref "../../administration/plugin-management#plugin-signatures" >}}).
+We do _not_ recommend using this option. For more information, refer to [Plugin signatures](../../administration/plugin-management/#plugin-signatures).
#### `plugin_admin_enabled`
@@ -2431,7 +2433,7 @@ Available to Grafana administrators only, enables installing, uninstalling, and
Set to `true` by default.
Setting it to `false` hides the controls.
-For more information, refer to [Plugin catalog]({{< relref "../../administration/plugin-management#plugin-catalog" >}}).
+For more information, refer to [Plugin catalog](../../administration/plugin-management/#plugin-catalog).
#### `plugin_admin_external_manage_enabled`
@@ -2493,7 +2495,7 @@ This option disables all preinstalled plugins. The default is `false`. To disabl
The `max_connections` option specifies the maximum number of connections to the Grafana Live WebSocket endpoint per Grafana server instance. Default is `100`.
-Refer to [Grafana Live configuration documentation]({{< relref "../set-up-grafana-live" >}}) if you specify a number higher than default since this can require some operating system and infrastructure tuning.
+Refer to [Grafana Live configuration documentation](../set-up-grafana-live/) if you specify a number higher than default since this can require some operating system and infrastructure tuning.
0 disables Grafana Live, -1 means unlimited connections.
@@ -2501,7 +2503,7 @@ Refer to [Grafana Live configuration documentation]({{< relref "../set-up-grafan
The `allowed_origins` option is a comma-separated list of additional origins (`Origin` header of HTTP Upgrade request during WebSocket connection establishment) that is accepted by Grafana Live.
-If not set (default), then the origin is matched over [root_url]({{< relref "#root_url" >}}) which should be sufficient for most scenarios.
+If not set (default), then the origin is matched over [root_url](#root_url) which should be sufficient for most scenarios.
Origin patterns support wildcard symbol "\*".
@@ -2518,7 +2520,7 @@ allowed_origins = "https://*.example.com"
The high availability (HA) engine name for Grafana Live. By default, it's not set. The only possible value is `redis`.
-For more information, refer to the [Configure Grafana Live HA setup]({{< relref "../set-up-grafana-live#configure-grafana-live-ha-setup" >}}).
+For more information, refer to the [Configure Grafana Live HA setup](../set-up-grafana-live/#configure-grafana-live-ha-setup).
#### `ha_engine_address`
@@ -2558,7 +2560,7 @@ Experimental. Requires the feature toggle `externalCorePlugins` to be enabled.
### `[plugin.grafana-image-renderer]`
-For more information, refer to [Image rendering]({{< relref "../image-rendering" >}}).
+For more information, refer to [Image rendering](../image-rendering/).
#### `rendering_timezone`
@@ -2665,7 +2667,7 @@ Change the listening port of the gRPC server. Default port is `0` and uses a por
### `[enterprise]`
-For more information about Grafana Enterprise, refer to [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise" >}}).
+For more information about Grafana Enterprise, refer to [Grafana Enterprise](../../introduction/grafana-enterprise/).
@@ -2685,7 +2687,7 @@ Some feature toggles for stable features are on by default. Use this setting to
The options in this section configure the experimental Feature Toggle Admin Page feature, which is enabled using the `featureToggleAdminPage` feature toggle. Grafana Labs offers support on a best-effort basis, and breaking changes might occur prior to the feature being made generally available.
-For more information, refer to [Configure feature toggles]({{< relref "./feature-toggles" >}}).
+For more information, refer to [Configure feature toggles](feature-toggles/).
#### `allow_editing`
@@ -2753,6 +2755,10 @@ Set the default start of the week, valid values are: `saturday`, `sunday`, `mond
Set this to `false` to disable expressions and hide them in the Grafana UI. Default is `true`.
+#### `sql_expression_cell_limit`
+
+Set the maximum number of cells that can be passed to a SQL expression. Default is `100000`.
+
### `[geomap]`
This section controls the defaults settings for **Geomap Plugin**.
@@ -2778,7 +2784,7 @@ Set this to `false` to disable loading other custom base maps and hide them in t
### `[rbac]`
-Refer to [Role-based access control]({{< relref "../../administration/roles-and-permissions/access-control" >}}) for more information.
+Refer to [Role-based access control](../../administration/roles-and-permissions/access-control/) for more information.
### `[navigation.app_sections]`
diff --git a/docs/sources/setup-grafana/configure-grafana/configure-custom-branding/index.md b/docs/sources/setup-grafana/configure-grafana/configure-custom-branding/index.md
index 8a16c6e293d..a0a33ea3229 100644
--- a/docs/sources/setup-grafana/configure-grafana/configure-custom-branding/index.md
+++ b/docs/sources/setup-grafana/configure-grafana/configure-custom-branding/index.md
@@ -15,7 +15,7 @@ weight: 300
Custom branding enables you to replace the Grafana Labs brand and logo with your corporate brand and logo.
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../../introduction/grafana-enterprise" >}}) and [Grafana Cloud](/docs/grafana-cloud). For Cloud Advanced and Enterprise customers, please provide custom elements and logos to our Support team. We will help you host your images and update your custom branding.
+Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud](/docs/grafana-cloud). For Cloud Advanced and Enterprise customers, please provide custom elements and logos to our Support team. We will help you host your images and update your custom branding.
This feature is not available for Grafana Free and Pro tiers.
For more information on feature availability across plans, refer to our [feature comparison page](/docs/grafana-cloud/cost-management-and-billing/understand-grafana-cloud-features/)
@@ -39,7 +39,7 @@ With custom branding, you have the ability to modify the following elements:
> You will have to host your logo and other images used by the custom branding feature separately. Make sure Grafana can access the URL where the assets are stored.
-The configuration file in Grafana Enterprise contains the following options. For more information about configuring Grafana, refer to [Configure Grafana]({{< relref "../../configure-grafana" >}}).
+The configuration file in Grafana Enterprise contains the following options. For more information about configuring Grafana, refer to [Configure Grafana](../).
```ini
# Enterprise only
diff --git a/docs/sources/setup-grafana/configure-grafana/enterprise-configuration/index.md b/docs/sources/setup-grafana/configure-grafana/enterprise-configuration/index.md
index a7ef4fa0733..bf4b6fc65c6 100644
--- a/docs/sources/setup-grafana/configure-grafana/enterprise-configuration/index.md
+++ b/docs/sources/setup-grafana/configure-grafana/enterprise-configuration/index.md
@@ -12,7 +12,7 @@ weight: 100
# Configure Grafana Enterprise
-This page describes Grafana Enterprise-specific configuration options that you can specify in a `.ini` configuration file or using environment variables. Refer to [Configuration]({{< relref "../../configure-grafana" >}}) for more information about available configuration options.
+This page describes Grafana Enterprise-specific configuration options that you can specify in a `.ini` configuration file or using environment variables. Refer to [Configuration](../) for more information about available configuration options.
## [enterprise]
@@ -41,7 +41,7 @@ The license only automatically updates once per day. To immediately update the t
### license_validation_type
-When set to `aws`, Grafana will validate its license status with Amazon Web Services (AWS) instead of with Grafana Labs. Only use this setting if you purchased an Enterprise license from AWS Marketplace. Defaults to empty, which means that by default Grafana Enterprise will validate using a license issued by Grafana Labs. For details about licenses issued by AWS, refer to [Activate a Grafana Enterprise license purchased through AWS Marketplace]({{< relref "../../../administration/enterprise-licensing/activate-aws-marketplace-license" >}}).
+When set to `aws`, Grafana will validate its license status with Amazon Web Services (AWS) instead of with Grafana Labs. Only use this setting if you purchased an Enterprise license from AWS Marketplace. Defaults to empty, which means that by default Grafana Enterprise will validate using a license issued by Grafana Labs. For details about licenses issued by AWS, refer to [Activate a Grafana Enterprise license purchased through AWS Marketplace](../../../administration/enterprise-licensing/activate-aws-marketplace-license/).
## [white_labeling]
@@ -84,7 +84,7 @@ List the link IDs to use here. Grafana will look for matching link configuration
## [usage_insights.export]
-By [exporting usage logs]({{< relref "../../configure-security/export-logs" >}}), you can directly query them and create dashboards of the information that matters to you most, such as dashboard errors, most active organizations, or your top-10 most-used queries.
+By [exporting usage logs](../../configure-security/export-logs/), you can directly query them and create dashboards of the information that matters to you most, such as dashboard errors, most active organizations, or your top-10 most-used queries.
### enabled
@@ -184,7 +184,7 @@ Allowed domains to receive reports. Use an asterisk (`*`) to allow all domains.
## [auditing]
-[Auditing]({{< relref "../../configure-security/audit-grafana" >}}) allows you to track important changes to your Grafana instance. By default, audit logs are logged to file but the auditing feature also supports sending logs directly to Loki.
+[Auditing](../../configure-security/audit-grafana/) allows you to track important changes to your Grafana instance. By default, audit logs are logged to file but the auditing feature also supports sending logs directly to Loki.
### enabled
@@ -409,7 +409,7 @@ Setting 'enabled' to `true` allows users to configure query caching for data sou
This value is `true` by default.
{{% admonition type="note" %}}
-This setting enables the caching feature, but it does not turn on query caching for any data source. To turn on query caching for a data source, update the setting on the data source configuration page. For more information, refer to the [query caching docs]({{< relref "../../../administration/data-source-management#enable-and-configure-query-caching" >}}).
+This setting enables the caching feature, but it does not turn on query caching for any data source. To turn on query caching for a data source, update the setting on the data source configuration page. For more information, refer to the [query caching docs](../../../administration/data-source-management/#enable-and-configure-query-caching).
{{% /admonition %}}
### ttl
diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
index 7ceb0dc3460..23849201ec7 100644
--- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
+++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
@@ -13,7 +13,7 @@ weight: 150
You use feature toggles, also known as feature flags, to enable or disable features in Grafana. You can turn on feature toggles to try out new functionality in development or test environments.
-This page contains a list of available feature toggles. To learn how to turn on feature toggles, refer to our [Configure Grafana documentation]({{< relref "../_index.md#feature_toggles" >}}). Feature toggles are also available to Grafana Cloud Advanced customers. If you use Grafana Cloud Advanced, you can open a support ticket and specify the feature toggles and stack for which you want them enabled.
+This page contains a list of available feature toggles. To learn how to turn on feature toggles, refer to our [Configure Grafana documentation](../#feature_toggles). Feature toggles are also available to Grafana Cloud Advanced customers. If you use Grafana Cloud Advanced, you can open a support ticket and specify the feature toggles and stack for which you want them enabled.
For more information about feature release stages, refer to [Release life cycle for Grafana Labs](https://grafana.com/docs/release-life-cycle/) and [Manage feature toggles](https://grafana.com/docs/grafana//administration/feature-toggles/#manage-feature-toggles).
@@ -21,67 +21,66 @@ For more information about feature release stages, refer to [Release life cycle
Most [generally available](https://grafana.com/docs/release-life-cycle/#general-availability) features are enabled by default. You can disable these feature by setting the feature flag to "false" in the configuration.
-| Feature toggle name | Description | Enabled by default |
-| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
-| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | |
-| `publicDashboardsScene` | Enables public dashboard rendering using scenes | Yes |
-| `featureHighlights` | Highlight Grafana Enterprise features | |
-| `correlations` | Correlations page | Yes |
-| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes |
-| `nestedFolders` | Enable folder nesting | Yes |
-| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes |
-| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes |
-| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes |
-| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes |
-| `unifiedRequestLog` | Writes error logs to the request logger | Yes |
-| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes |
-| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes |
-| `transformationsRedesign` | Enables the transformations redesign | Yes |
-| `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | |
-| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes |
-| `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes |
-| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes |
-| `dashgpt` | Enable AI powered features in dashboards | Yes |
-| `alertingInsights` | Show the new alerting insights landing page | Yes |
-| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes |
-| `formatString` | Enable format string transformer | Yes |
-| `kubernetesPlaylists` | Use the kubernetes API in the frontend for playlists, and route /api/playlist requests to k8s | Yes |
-| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | Yes |
-| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes |
-| `addFieldFromCalculationStatFunctions` | Add cumulative and window functions to the add field from calculation transformation | Yes |
-| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes |
-| `dashboardSceneForViewers` | Enables dashboard rendering using Scenes for viewer roles | Yes |
-| `dashboardSceneSolo` | Enables rendering dashboards using scenes for solo panels | Yes |
-| `dashboardScene` | Enables dashboard rendering using scenes for all roles | Yes |
-| `ssoSettingsApi` | Enables the SSO settings API and the OAuth configuration UIs in Grafana | Yes |
-| `logsInfiniteScrolling` | Enables infinite scrolling for the Logs panel in Explore and Dashboards | Yes |
-| `exploreMetrics` | Enables the new Grafana Metrics Drilldown core app | Yes |
-| `alertingSimplifiedRouting` | Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule | Yes |
-| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes |
-| `lokiQueryHints` | Enables query hints for Loki | Yes |
-| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | |
-| `promQLScope` | In-development feature that will allow injection of labels into prometheus queries. | Yes |
-| `groupToNestedTableTransformation` | Enables the group to nested table transformation | Yes |
-| `newPDFRendering` | New implementation for the dashboard-to-PDF rendering | Yes |
-| `tlsMemcached` | Use TLS-enabled memcached in the enterprise caching feature | Yes |
-| `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes |
-| `accessActionSets` | Introduces action sets for resource permissions. Also ensures that all folder editors and admins can create subfolders without needing any additional permissions. | Yes |
-| `newDashboardSharingComponent` | Enables the new sharing drawer design | Yes |
-| `pluginProxyPreserveTrailingSlash` | Preserve plugin proxy trailing slash. | |
-| `pinNavItems` | Enables pinning of nav items | Yes |
-| `alertingApiServer` | Register Alerting APIs with the K8s API server | Yes |
-| `cloudWatchRoundUpEndTime` | Round up end time for metric queries to the next minute to avoid missing data | Yes |
-| `newFiltersUI` | Enables new combobox style UI for the Ad hoc filters variable in scenes architecture | Yes |
-| `alertingQueryAndExpressionsStepMode` | Enables step mode for alerting queries and expressions | Yes |
-| `useSessionStorageForRedirection` | Use session storage for handling the redirection after login | Yes |
-| `userStorageAPI` | Enables the user storage API | Yes |
-| `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | |
-| `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes |
-| `reportingUseRawTimeRange` | Uses the original report or dashboard time range instead of making an absolute transformation | Yes |
-| `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes |
-| `azureMonitorEnableUserAuth` | Enables user auth for Azure Monitor datasource only | Yes |
-| `alertingNotificationsStepMode` | Enables simplified step mode in the notifications section | Yes |
-| `lokiLabelNamesQueryApi` | Defaults to using the Loki `/labels` API instead of `/series` | Yes |
+| Feature toggle name | Description | Enabled by default |
+| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
+| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | |
+| `publicDashboardsScene` | Enables public dashboard rendering using scenes | Yes |
+| `featureHighlights` | Highlight Grafana Enterprise features | |
+| `correlations` | Correlations page | Yes |
+| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes |
+| `nestedFolders` | Enable folder nesting | Yes |
+| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes |
+| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes |
+| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes |
+| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes |
+| `unifiedRequestLog` | Writes error logs to the request logger | Yes |
+| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes |
+| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes |
+| `transformationsRedesign` | Enables the transformations redesign | Yes |
+| `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | |
+| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes |
+| `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes |
+| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes |
+| `dashgpt` | Enable AI powered features in dashboards | Yes |
+| `alertingInsights` | Show the new alerting insights landing page | Yes |
+| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes |
+| `formatString` | Enable format string transformer | Yes |
+| `kubernetesPlaylists` | Use the kubernetes API in the frontend for playlists, and route /api/playlist requests to k8s | Yes |
+| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | Yes |
+| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes |
+| `addFieldFromCalculationStatFunctions` | Add cumulative and window functions to the add field from calculation transformation | Yes |
+| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes |
+| `dashboardSceneForViewers` | Enables dashboard rendering using Scenes for viewer roles | Yes |
+| `dashboardSceneSolo` | Enables rendering dashboards using scenes for solo panels | Yes |
+| `dashboardScene` | Enables dashboard rendering using scenes for all roles | Yes |
+| `ssoSettingsApi` | Enables the SSO settings API and the OAuth configuration UIs in Grafana | Yes |
+| `logsInfiniteScrolling` | Enables infinite scrolling for the Logs panel in Explore and Dashboards | Yes |
+| `exploreMetrics` | Enables the new Grafana Metrics Drilldown core app | Yes |
+| `alertingSimplifiedRouting` | Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule | Yes |
+| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes |
+| `lokiQueryHints` | Enables query hints for Loki | Yes |
+| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | |
+| `groupToNestedTableTransformation` | Enables the group to nested table transformation | Yes |
+| `newPDFRendering` | New implementation for the dashboard-to-PDF rendering | Yes |
+| `tlsMemcached` | Use TLS-enabled memcached in the enterprise caching feature | Yes |
+| `ssoSettingsSAML` | Use the new SSO Settings API to configure the SAML connector | Yes |
+| `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes |
+| `newDashboardSharingComponent` | Enables the new sharing drawer design | Yes |
+| `pluginProxyPreserveTrailingSlash` | Preserve plugin proxy trailing slash. | |
+| `pinNavItems` | Enables pinning of nav items | Yes |
+| `alertingApiServer` | Register Alerting APIs with the K8s API server | Yes |
+| `cloudWatchRoundUpEndTime` | Round up end time for metric queries to the next minute to avoid missing data | Yes |
+| `newFiltersUI` | Enables new combobox style UI for the Ad hoc filters variable in scenes architecture | Yes |
+| `alertingQueryAndExpressionsStepMode` | Enables step mode for alerting queries and expressions | Yes |
+| `useSessionStorageForRedirection` | Use session storage for handling the redirection after login | Yes |
+| `userStorageAPI` | Enables the user storage API | Yes |
+| `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | |
+| `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes |
+| `reportingUseRawTimeRange` | Uses the original report or dashboard time range instead of making an absolute transformation | Yes |
+| `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes |
+| `azureMonitorEnableUserAuth` | Enables user auth for Azure Monitor datasource only | Yes |
+| `alertingNotificationsStepMode` | Enables simplified step mode in the notifications section | Yes |
+| `lokiLabelNamesQueryApi` | Defaults to using the Loki `/labels` API instead of `/series` | Yes |
## Public preview feature toggles
@@ -111,12 +110,13 @@ Most [generally available](https://grafana.com/docs/release-life-cycle/#general-
| `regressionTransformation` | Enables regression analysis transformation |
| `onPremToCloudMigrations` | Enable the Grafana Migration Assistant, which helps you easily migrate on-prem resources, such as dashboards, folders, and data source configurations, to your Grafana Cloud stack. |
| `alertingSaveStateCompressed` | Enables the compressed protobuf-based alert state storage |
-| `ssoSettingsSAML` | Use the new SSO Settings API to configure the SAML connector |
| `azureMonitorPrometheusExemplars` | Allows configuration of Azure Monitor as a data source that can provide Prometheus exemplars |
| `ssoSettingsLDAP` | Use the new SSO Settings API to configure LDAP |
| `improvedExternalSessionHandling` | Enables improved support for OAuth external sessions. After enabling this feature, users might need to re-authenticate themselves. |
| `elasticsearchCrossClusterSearch` | Enables cross cluster search in the Elasticsearch datasource |
| `improvedExternalSessionHandlingSAML` | Enables improved support for SAML external sessions. Ensure the NameID format is correctly configured in Grafana for SAML Single Logout to function properly. |
+| `exploreMetricsUseExternalAppPlugin` | Use the externalized Grafana Metrics Drilldown (formerly known as Explore Metrics) app plugin |
+| `alertRuleRestore` | Enables the alert rule restore feature |
## Experimental feature toggles
@@ -183,7 +183,7 @@ Experimental features might be changed or removed without prior notice.
| `kubernetesFeatureToggles` | Use the kubernetes API for feature toggle management in the frontend |
| `newFolderPicker` | Enables the nested folder picker without having nested folders enabled |
| `scopeApi` | In-development feature flag for the scope api using the app platform. |
-| `sqlExpressions` | Enables using SQL and DuckDB functions as Expressions. |
+| `sqlExpressions` | Enables SQL Expressions, which can execute SQL queries against data source results. |
| `nodeGraphDotLayout` | Changed the layout algorithm for the node graph |
| `kubernetesAggregator` | Enable grafana's embedded kube-aggregator |
| `expressionParser` | Enable new expression parser |
@@ -214,7 +214,6 @@ Experimental features might be changed or removed without prior notice.
| `enableSCIM` | Enables SCIM support for user and group management |
| `crashDetection` | Enables browser crash detection reporting to Faro. |
| `jaegerBackendMigration` | Enables querying the Jaeger data source without the proxy |
-| `useV2DashboardsAPI` | Use the v2 kubernetes API in the frontend for dashboards |
| `unifiedHistory` | Displays the navigation history so the user can navigate back to previous pages |
| `investigationsBackend` | Enable the investigations backend API |
| `k8SFolderCounts` | Enable folder's api server counts |
@@ -227,10 +226,11 @@ Experimental features might be changed or removed without prior notice.
| `newLogsPanel` | Enables the new logs panel in Explore |
| `pluginsCDNSyncLoader` | Load plugins from CDN synchronously |
| `assetSriChecks` | Enables SRI checks for Grafana JavaScript assets |
+| `extraLanguages` | Enables additional languages |
## Development feature toggles
-The following toggles require explicitly setting Grafana's [app mode]({{< relref "../_index.md#app_mode" >}}) to 'development' before you can enable this feature toggle. These features tend to be experimental.
+The following toggles require explicitly setting Grafana's [app mode](../#app_mode) to 'development' before you can enable this feature toggle. These features tend to be experimental.
| Feature toggle name | Description |
| -------------------------------------- | ----------------------------------------------------------------------------- |
diff --git a/docs/sources/setup-grafana/configure-grafana/proxy/index.md b/docs/sources/setup-grafana/configure-grafana/proxy/index.md
index e38f5e5aae0..7f17909ad5d 100644
--- a/docs/sources/setup-grafana/configure-grafana/proxy/index.md
+++ b/docs/sources/setup-grafana/configure-grafana/proxy/index.md
@@ -44,6 +44,6 @@ To complete this task, you must first deploy a socks proxy server that supports
1. Set up a data source and configure it to send data source connections through the proxy.
- To configure your data sources to send connections through the proxy, `enableSecureSocksProxy=true` must be specified in the data source json. You can do this in the [API]({{< relref "../../../developers/http_api/data_source" >}}) or use [file based provisioning]({{< relref "../../../administration/provisioning#data-sources" >}}).
+ To configure your data sources to send connections through the proxy, `enableSecureSocksProxy=true` must be specified in the data source json. You can do this in the [API](../../../developers/http_api/data_source/) or use [file based provisioning](../../../administration/provisioning/#data-sources).
Additionally, you can set the socks5 username and password by adding `secureSocksProxyUsername` in the data source json and `secureSocksProxyPassword` in the secure data source json.
diff --git a/docs/sources/setup-grafana/configure-grafana/settings-updates-at-runtime/index.md b/docs/sources/setup-grafana/configure-grafana/settings-updates-at-runtime/index.md
index 046c0528c43..f755b6d0246 100644
--- a/docs/sources/setup-grafana/configure-grafana/settings-updates-at-runtime/index.md
+++ b/docs/sources/setup-grafana/configure-grafana/settings-updates-at-runtime/index.md
@@ -17,13 +17,13 @@ weight: 500
# Settings updates at runtime
{{% admonition type="note" %}}
-This functionality is deprecated and will be removed in a future release. For configuring SAML authentication, please use the new [SSO settings API]({{< relref "../../../developers/http_api/sso-settings" >}}).
+This functionality is deprecated and will be removed in a future release. For configuring SAML authentication, please use the new [SSO settings API](../../../developers/http_api/sso-settings/).
{{% /admonition %}}
By updating settings at runtime, you can update Grafana settings without needing to restart the Grafana server.
Updates that happen at runtime are stored in the database and override
-[settings from other sources]({{< relref "../../configure-grafana" >}})
+[settings from other sources](../)
(arguments, environment variables, settings file, etc). Therefore, every time a specific setting key is removed at runtime,
the value used for that key is the inherited one from the other sources in the reverse order of precedence
(`arguments > environment variables > settings file`). When no value is provided through any of these options, then the value used will be the application default
@@ -32,7 +32,7 @@ Currently, **it only supports updates on the `auth.saml` section.**
## Update settings via the API
-You can update settings through the [Admin API]({{< relref "../../../developers/http_api/admin#update-settings" >}}).
+You can update settings through the [Admin API](../../../developers/http_api/admin/#update-settings).
When you submit a settings update via API, Grafana verifies if the given settings updates are allowed and valid. If they are, then Grafana stores the settings in the database and reloads
Grafana services with no need to restart the instance.
@@ -99,5 +99,5 @@ HTTP API, then the other instances are synchronized through the database and the
## Control access with role-based access control
-If you have [role-based access control]({{< relref "../../../administration/roles-and-permissions/access-control" >}}) enabled, you can control who can read or update settings.
-Refer to the [Admin API]({{< relref "../../../developers/http_api/admin#update-settings" >}}) for more information.
+If you have [role-based access control](../../../administration/roles-and-permissions/access-control/) enabled, you can control who can read or update settings.
+Refer to the [Admin API](../../../developers/http_api/admin/#update-settings) for more information.
diff --git a/docs/sources/setup-grafana/configure-security/_index.md b/docs/sources/setup-grafana/configure-security/_index.md
index c638203fc8d..af6d0d9307b 100644
--- a/docs/sources/setup-grafana/configure-security/_index.md
+++ b/docs/sources/setup-grafana/configure-security/_index.md
@@ -19,11 +19,11 @@ To prevent this type of exploitation from happening, we recommend that you apply
## Limit IP addresses/hostnames for data source URL
-You can configure Grafana to only allow certain IP addresses or hostnames to be used as data source URLs and proxied through the Grafana data source proxy. Refer to [data_source_proxy_whitelist]({{< relref "../configure-grafana#data_source_proxy_whitelist" >}}) for usage instructions.
+You can configure Grafana to only allow certain IP addresses or hostnames to be used as data source URLs and proxied through the Grafana data source proxy. Refer to [data_source_proxy_whitelist](../configure-grafana/#data_source_proxy_whitelist) for usage instructions.
## Request security
-The request security configuration option allows users to limit requests from the Grafana server. It targets requests that are generated by users. For more information, refer to [Request security]({{< relref "./configure-request-security" >}}).
+The request security configuration option allows users to limit requests from the Grafana server. It targets requests that are generated by users. For more information, refer to [Request security](configure-request-security/).
{{% admonition type="note" %}}
Request security is available in Grafana Enterprise v7.4 and later versions.
@@ -53,7 +53,7 @@ For example, in a Grafana instance with one data source, one dashboard, and one
To address this vulnerability, you can restrict data source query access in the following ways:
-- Create multiple data sources with some restrictions added in data source configuration that restrict access (like database name or credentials). Then use the [Data Source Permissions]({{< relref "../../administration/data-source-management#data-source-permissions" >}}) Enterprise feature to restrict user access to the data source in Grafana.
+- Create multiple data sources with some restrictions added in data source configuration that restrict access (like database name or credentials). Then use the [Data Source Permissions](../../administration/data-source-management/#data-source-permissions) Enterprise feature to restrict user access to the data source in Grafana.
- Create a separate Grafana organization, and in that organization, create a separate data source. Make sure the data source has some option/user/credentials setting that limits access to a subset of the data. Not all data sources have an option to limit access.
## Implications of enabling anonymous access to dashboards
diff --git a/docs/sources/setup-grafana/configure-security/audit-grafana.md b/docs/sources/setup-grafana/configure-security/audit-grafana.md
index 9bafd16630e..7353235d90a 100644
--- a/docs/sources/setup-grafana/configure-security/audit-grafana.md
+++ b/docs/sources/setup-grafana/configure-security/audit-grafana.md
@@ -26,7 +26,7 @@ To enable sending Grafana Cloud audit logs to your Grafana Cloud Logs instance,
Only API requests or UI actions that trigger an API request generate an audit log.
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise" >}}) and [Grafana Cloud](/docs/grafana-cloud).
+Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud](/docs/grafana-cloud).
{{% /admonition %}}
## Audit logs
@@ -145,7 +145,7 @@ to the action when the user requests a report's preview to be sent through email
\* Where `AUTH-MODULE` is the name of the authentication module: `grafana`, `saml`,
`ldap`, etc. \
-\*\* Includes manual log out, token expired/revoked, and [SAML Single Logout]({{< relref "./configure-authentication/saml#single-logout" >}}).
+\*\* Includes manual log out, token expired/revoked, and [SAML Single Logout](../configure-authentication/saml/#single-logout).
#### Service accounts
@@ -359,7 +359,7 @@ The auditing feature is disabled by default.
{{% /admonition %}}
Audit logs can be saved into files, sent to a Loki instance or sent to the Grafana default logger. By default, only the file exporter is enabled.
-You can choose which exporter to use in the [configuration file]({{< relref "../configure-grafana" >}}).
+You can choose which exporter to use in the [configuration file](../../configure-grafana/).
Options are `file`, `loki`, and `logger`. Use spaces to separate multiple modes, such as `file loki`.
@@ -437,4 +437,4 @@ url = user:password@localhost:3000
### Console exporter
-Audit logs are sent to the Grafana default logger. The audit logs use the `auditing.console` logger and are logged on `debug`-level, learn how to enable debug logging in the [log configuration]({{< relref "../configure-grafana#log" >}}) section of the documentation. Accessing the audit logs in this way is not recommended for production use.
+Audit logs are sent to the Grafana default logger. The audit logs use the `auditing.console` logger and are logged on `debug`-level, learn how to enable debug logging in the [log configuration](../../configure-grafana/#log) section of the documentation. Accessing the audit logs in this way is not recommended for production use.
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/_index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/_index.md
index 3e20606bb1e..41132550368 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/_index.md
@@ -17,24 +17,24 @@ weight: 200
Grafana provides many ways to authenticate users. Some authentication integrations also enable syncing user permissions and org memberships.
-The following table shows all supported authentication methods and the features available for them. [Team sync]({{< relref "../configure-team-sync" >}}) and [active sync]({{< relref "./enhanced-ldap#active-ldap-synchronization" >}}) are only available in Grafana Enterprise.
+The following table shows all supported authentication methods and the features available for them. [Team sync](../configure-team-sync/) and [active sync](enhanced-ldap/#active-ldap-synchronization) are only available in Grafana Enterprise.
-| Authentication method | Multi Org Mapping | Enforce Sync | Role Mapping | Grafana Admin Mapping | Team Sync | Allowed groups | Active Sync | Skip OrgRole mapping | Auto Login | Single Logout |
-| :---------------------------------------------------- | :---------------- | :----------- | :----------- | :-------------------- | :-------- | :------------- | :---------- | :------------------- | :--------- | :------------ |
-| [Anonymous access]({{< relref "./anonymous-auth" >}}) | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
-| [Auth Proxy]({{< relref "./auth-proxy" >}}) | no | yes | yes | no | yes | no | N/A | no | N/A | N/A |
-| [Azure AD OAuth]({{< relref "./azuread" >}}) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
-| [Basic auth]({{< relref "./grafana" >}}) | yes | N/A | yes | yes | N/A | N/A | N/A | N/A | N/A | N/A |
-| [Passwordless auth]({{< relref "./passwordless" >}}) | yes | N/A | yes | yes | N/A | N/A | N/A | N/A | N/A | N/A |
-| [Generic OAuth]({{< relref "./generic-oauth" >}}) | yes | yes | yes | yes | yes | no | N/A | yes | yes | yes |
-| [GitHub OAuth]({{< relref "./github" >}}) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
-| [GitLab OAuth]({{< relref "./gitlab" >}}) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
-| [Google OAuth]({{< relref "./google" >}}) | yes | no | no | no | yes | no | N/A | no | yes | yes |
-| [Grafana.com OAuth]({{< relref "./grafana-cloud" >}}) | no | no | yes | no | N/A | N/A | N/A | yes | yes | yes |
-| [Okta OAuth]({{< relref "./okta" >}}) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
-| [SAML]({{< relref "./saml" >}}) (Enterprise only) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
-| [LDAP]({{< relref "./ldap" >}}) | yes | yes | yes | yes | yes | yes | yes | no | N/A | N/A |
-| [JWT Proxy]({{< relref "./jwt" >}}) | no | yes | yes | yes | no | no | N/A | no | N/A | N/A |
+| Authentication method | Multi Org Mapping | Enforce Sync | Role Mapping | Grafana Admin Mapping | Team Sync | Allowed groups | Active Sync | Skip OrgRole mapping | Auto Login | Single Logout |
+| :---------------------------------- | :---------------- | :----------- | :----------- | :-------------------- | :-------- | :------------- | :---------- | :------------------- | :--------- | :------------ |
+| [Anonymous access](anonymous-auth/) | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
+| [Auth Proxy](auth-proxy/) | no | yes | yes | no | yes | no | N/A | no | N/A | N/A |
+| [Azure AD OAuth](azuread/) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
+| [Basic auth](grafana/) | yes | N/A | yes | yes | N/A | N/A | N/A | N/A | N/A | N/A |
+| [Passwordless auth](passwordless/) | yes | N/A | yes | yes | N/A | N/A | N/A | N/A | N/A | N/A |
+| [Generic OAuth](generic-oauth/) | yes | yes | yes | yes | yes | no | N/A | yes | yes | yes |
+| [GitHub OAuth](github/) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
+| [GitLab OAuth](gitlab/) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
+| [Google OAuth](google/) | yes | no | no | no | yes | no | N/A | no | yes | yes |
+| [Grafana.com OAuth](grafana-cloud/) | no | no | yes | no | N/A | N/A | N/A | yes | yes | yes |
+| [Okta OAuth](okta/) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
+| [SAML](saml/) (Enterprise only) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes |
+| [LDAP](ldap/) | yes | yes | yes | yes | yes | yes | yes | no | N/A | N/A |
+| [JWT Proxy](jwt/) | no | yes | yes | yes | no | no | N/A | no | N/A | N/A |
Fields explanation:
@@ -61,7 +61,7 @@ Fields explanation:
## Configuring multiple identity providers
Grafana allows you to configure more than one authentication provider, however it is not possible to configure the same type of authentication provider twice.
-For example, you can have [SAML]({{< relref "./saml" >}}) (Enterprise only) and [Generic OAuth]({{< relref "./generic-oauth" >}}) configured, but you can not have two different [Generic OAuth]({{< relref "./generic-oauth" >}}) configurations.
+For example, you can have [SAML](saml/) (Enterprise only) and [Generic OAuth](generic-oauth/) configured, but you can not have two different [Generic OAuth](generic-oauth/) configurations.
> Note: Grafana does not support multiple identity providers resolving the same user. Ensure there are no user account overlaps between the different providers
@@ -69,7 +69,7 @@ In scenarios where you have multiple identity providers of the same type, there
- Use different Grafana instances each configured with a given identity provider.
- Check if the identity provider supports account federation. In such cases, you can configure it once and let your identity provider federate the accounts from different providers.
-- If SAML is supported by the identity provider, you can configure one [Generic OAuth]({{< relref "./generic-oauth" >}}) and one [SAML]({{< relref "./saml" >}}) (Enterprise only).
+- If SAML is supported by the identity provider, you can configure one [Generic OAuth](generic-oauth/) and one [SAML](saml/) (Enterprise only).
## Using the same email address to login with different identity providers
@@ -142,7 +142,7 @@ oauth_allow_insecure_email_lookup = true
You can also enable email lookup using the API:
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../../introduction/grafana-enterprise" >}}) and [Grafana Cloud]({{< relref "../../../introduction/grafana-cloud" >}}) since Grafana v10.4.
+Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud](../../../introduction/grafana-cloud/) since Grafana v10.4.
{{% /admonition %}}
```
@@ -208,7 +208,7 @@ a Grafana admin user, you can also do the same for any user from the Server Admi
### Protected roles
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../../introduction/grafana-enterprise" >}}) and [Grafana Cloud]({{< relref "../../../introduction/grafana-cloud" >}}).
+Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud](../../../introduction/grafana-cloud/).
{{% /admonition %}}
By default, after you configure an authorization provider, Grafana will adopt existing users into the new authentication scheme. For example, if you have created a user with basic authentication having the login `jsmith@example.com`, then set up SAML authentication where `jsmith@example.com` is an account, the user's authentication type will be changed to SAML if they perform a SAML sign-in.
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/auth-proxy/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/auth-proxy/index.md
index 5ed036bb6ed..357cd103714 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/auth-proxy/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/auth-proxy/index.md
@@ -251,7 +251,7 @@ headers = "Groups:X-WEBAUTH-GROUPS"
You use the `X-WEBAUTH-GROUPS` header to send the team information for each user. Specifically, the set of Grafana's group IDs that the user belongs to.
-First, we need to set up the mapping between your authentication provider and Grafana. Follow [these instructions]({{< relref "../../configure-team-sync#synchronize-a-grafana-team-with-an-external-group" >}}) to add groups to a team within Grafana.
+First, we need to set up the mapping between your authentication provider and Grafana. Follow [these instructions](../../configure-team-sync/#synchronize-a-grafana-team-with-an-external-group) to add groups to a team within Grafana.
Once that's done. You can verify your mappings by querying the API.
@@ -313,7 +313,7 @@ With this, the user `leonard` will be automatically placed into the Loki team as
An empty `X-WEBAUTH-GROUPS` or the absence of a groups header will remove the user from all teams.
{{% /admonition %}}
-[Learn more about Team Sync]({{< relref "../../configure-team-sync" >}})
+[Learn more about Team Sync](../../configure-team-sync/)
## Login token and session cookie
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md
index 8ac7d9bd79f..fd1b2773749 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md
@@ -22,7 +22,7 @@ weight: 800
The Azure AD authentication allows you to use a Microsoft Entra ID (formerly known as Azure Active Directory) tenant as an identity provider for Grafana. You can use Entra ID application roles to assign users and groups to Grafana roles from the Azure Portal.
{{% admonition type="note" %}}
-If Users use the same email address in Microsoft Entra ID that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) for more information.
+If Users use the same email address in Microsoft Entra ID that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to [Using the same email address to login with different identity providers](../#using-the-same-email-address-to-login-with-different-identity-providers) for more information.
{{% /admonition %}}
## Create the Microsoft Entra ID application
@@ -253,11 +253,11 @@ Refer to [Terraform Registry](https://registry.terraform.io/providers/grafana/gr
## Configure Azure AD authentication client using the Grafana configuration file
-Ensure that you have access to the [Grafana configuration file]({{< relref "../../../configure-grafana#configuration-file-location" >}}).
+Ensure that you have access to the [Grafana configuration file](../../../configure-grafana/#configuration-file-location).
### Enable Azure AD OAuth in Grafana
-Add the following to the [Grafana configuration file]({{< relref "../../../configure-grafana#configuration-file-location" >}}):
+Add the following to the [Grafana configuration file](../../../configure-grafana/#configuration-file-location):
```
[auth.azuread]
@@ -293,7 +293,7 @@ GF_AUTH_AZUREAD_FEDERATED_CREDENTIAL_AUDIENCE
```
{{% admonition type="note" %}}
-Verify that the Grafana [root_url]({{< relref "../../../configure-grafana#root_url" >}}) is set in your Azure Application Redirect URLs.
+Verify that the Grafana [root_url](../../../configure-grafana/#root_url) is set in your Azure Application Redirect URLs.
{{% /admonition %}}
### Configure refresh token
@@ -417,7 +417,7 @@ Entra ID does not emit the groups claim in the token and emits a group overage c
If Grafana receives a token with a group overage claim instead of a groups claim,
Grafana attempts to retrieve the user's group membership by calling the included endpoint.
-To ensure this functionality works correctly, you must enable [`force_use_graph_api`]({{< relref "./#force-fetching-groups-from-microsoft-graph-api" >}}) in your configuration.
+To ensure this functionality works correctly, you must enable [`force_use_graph_api`](./#force-fetching-groups-from-microsoft-graph-api) in your configuration.
{{% admonition type="note" %}}
The 'App registration' must include the `GroupMember.Read.All` API permission for group overage claim calls to succeed.
@@ -451,7 +451,7 @@ force_use_graph_api = true
By default, Azure AD authentication will map users to organization roles based on the most privileged application role assigned to the user in Entra ID.
If no application role is found, the user is assigned the role specified by
-[the `auto_assign_org_role` option]({{< relref "../../../configure-grafana#auto_assign_org_role" >}}).
+[the `auto_assign_org_role` option](../../../configure-grafana/#auto_assign_org_role).
You can disable this default role assignment by setting `role_attribute_strict = true`. This setting denies user access if no role or an invalid role is returned and the `org_mapping` expression evaluates to an empty mapping.
You can use the `org_mapping` configuration option to assign the user to multiple organizations and specify their role based on their Entra ID group membership. For more information, refer to [Org roles mapping example](#org-roles-mapping-example). If the org role mapping (`org_mapping`) is specified and Entra ID returns a valid role, then the user will get the highest of the two roles.
@@ -476,7 +476,7 @@ org_mapping = ["032cb8e0-240f-4347-9120-6f33013e817a:org_foo:Viewer", "bce1c492-
## Skip organization role sync
If Azure AD authentication is not intended to sync user roles and organization membership and prevent the sync of org roles from Entra ID, set `skip_org_role_sync` to `true`. This is useful if you want to manage the organization roles for your users from within Grafana or that your organization roles are synced from another provider.
-See [Configure Grafana]({{< relref "../../../configure-grafana#authazuread" >}}) for more details.
+See [Configure Grafana](../../../configure-grafana/#authazuread) for more details.
```ini
[auth.azuread]
@@ -487,7 +487,7 @@ skip_org_role_sync = true
## Configuration options
-The following table outlines the various Azure AD/Entra ID configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables]({{< relref "../../../configure-grafana#override-configuration-with-environment-variables" >}}).
+The following table outlines the various Azure AD/Entra ID configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables](../../../configure-grafana/#override-configuration-with-environment-variables).
| Setting | Required | Supported on Cloud | Description | Default |
| ---------------------------- | -------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
@@ -502,12 +502,12 @@ The following table outlines the various Azure AD/Entra ID configuration options
| `scopes` | No | Yes | List of comma- or space-separated OAuth2 scopes. | `openid email profile` |
| `allow_sign_up` | No | Yes | Controls Grafana user creation through the Azure AD/Entra ID login. Only existing Grafana users can log in with Azure AD/Entra ID if set to `false`. | `true` |
| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` |
-| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Map roles]({{< relref "#map-roles" >}}). | `false` |
+| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Map roles](#map-roles). | `false` |
| `org_attribute_path` | No | No | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana org to role lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no value is returned, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation will be mapped to org roles based on `org_mapping`. For more information on org to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
-| `allow_assign_grafana_admin` | No | No | Set to `true` to automatically sync the Grafana server administrator role. When enabled, if the Azure AD/Entra ID user's App role is `GrafanaAdmin`, Grafana grants the user server administrator privileges and the organization administrator role. If disabled, the user will only receive the organization administrator role. For more details on user role mapping, refer to [Map roles]({{< relref "#map-roles" >}}). | `false` |
+| `allow_assign_grafana_admin` | No | No | Set to `true` to automatically sync the Grafana server administrator role. When enabled, if the Azure AD/Entra ID user's App role is `GrafanaAdmin`, Grafana grants the user server administrator privileges and the organization administrator role. If disabled, the user will only receive the organization administrator role. For more details on user role mapping, refer to [Map roles](#map-roles). | `false` |
| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. This will allow you to set organization roles for your users from within Grafana manually. | `false` |
-| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. If you configure `allowed_groups`, you must also configure Azure AD/Entra ID to include the `groups` claim following [Configure group membership claims on the Azure Portal]({{< relref "#configure-group-membership-claims-on-the-azure-portal" >}}). | |
+| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. If you configure `allowed_groups`, you must also configure Azure AD/Entra ID to include the `groups` claim following [Configure group membership claims on the Azure Portal](#configure-group-membership-claims-on-the-azure-portal). | |
| `allowed_organizations` | No | Yes | List of comma- or space-separated Azure tenant identifiers. The user should be a member of at least one tenant to log in. | |
| `allowed_domains` | No | Yes | List of comma- or space-separated domains. The user should belong to at least one domain to log in. | |
| `tls_skip_verify_insecure` | No | No | If set to `true`, the client accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks. | `false` |
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/enhanced-ldap/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/enhanced-ldap/index.md
index a8992e015d6..ee6f7c6335f 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/enhanced-ldap/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/enhanced-ldap/index.md
@@ -21,12 +21,12 @@ weight: 400
# Configure enhanced LDAP integration
-The enhanced LDAP integration adds additional functionality on top of the [LDAP integration]({{< relref "../ldap" >}}) available in the open source edition of Grafana.
+The enhanced LDAP integration adds additional functionality on top of the [LDAP integration](../ldap/) available in the open source edition of Grafana.
-> **Note:** Available in [Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise" >}}) and [Grafana Cloud](/docs/grafana-cloud).
+> **Note:** Available in [Grafana Enterprise](../../../../introduction/grafana-enterprise/) and [Grafana Cloud](/docs/grafana-cloud).
> If you are a Grafana Cloud customer, please [open a support ticket in the Cloud Portal](/profile/org#support) to request this feature.
-> To control user access with role-based permissions, refer to [role-based access control]({{< relref "../../../../administration/roles-and-permissions/access-control" >}}).
+> To control user access with role-based permissions, refer to [role-based access control](../../../../administration/roles-and-permissions/access-control/).
## LDAP group synchronization
@@ -70,7 +70,7 @@ sync_cron = "0 1 * * *" # This is default value (At 1 am every day)
active_sync_enabled = true # enabled by default
```
-Single bind configuration (as in the [Single bind example]({{< relref "../ldap#single-bind-example" >}})) is not supported with active LDAP synchronization because Grafana needs user information to perform LDAP searches.
+Single bind configuration (as in the [Single bind example](../ldap/#single-bind-example)) is not supported with active LDAP synchronization because Grafana needs user information to perform LDAP searches.
For the synchronization to work, the `servers.search_filter` and `servers.attributes.username` in the ldap.toml config file must match. By default, the `servers.attributes.username` is `cn`, so if you use another attribute as the search filter, you must also update the username attribute.
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md
index 1c9571f712d..99e9abb057a 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md
@@ -23,17 +23,17 @@ weight: 700
Grafana provides OAuth2 integrations for the following auth providers:
-- [Azure AD OAuth]({{< relref "../azuread" >}})
-- [GitHub OAuth]({{< relref "../github" >}})
-- [GitLab OAuth]({{< relref "../gitlab" >}})
-- [Google OAuth]({{< relref "../google" >}})
-- [Grafana Com OAuth]({{< relref "../grafana-cloud" >}})
-- [Keycloak OAuth]({{< relref "../keycloak" >}})
-- [Okta OAuth]({{< relref "../okta" >}})
+- [Azure AD OAuth](../azuread/)
+- [GitHub OAuth](../github/)
+- [GitLab OAuth](../gitlab/)
+- [Google OAuth](../google/)
+- [Grafana Com OAuth](../grafana-cloud/)
+- [Keycloak OAuth](../keycloak/)
+- [Okta OAuth](../okta/)
If your OAuth2 provider is not listed, you can use Generic OAuth authentication.
-This topic describes how to configure Generic OAuth authentication using different methods and includes [examples of setting up Generic OAuth]({{< relref "#examples-of-setting-up-generic-oauth2" >}}) with specific OAuth2 providers.
+This topic describes how to configure Generic OAuth authentication using different methods and includes [examples of setting up Generic OAuth](#examples-of-setting-up-generic-oauth2) with specific OAuth2 providers.
## Before you begin
@@ -44,7 +44,7 @@ To follow this guide:
- If you are using refresh tokens, ensure you know how to set them up with your OAuth2 provider. Consult the documentation of your OAuth2 provider for more information.
{{% admonition type="note" %}}
-If Users use the same email address in Azure AD that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information.
+If Users use the same email address in Azure AD that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers](../#using-the-same-email-address-to-login-with-different-identity-providers) documentation for more information.
{{% /admonition %}}
## Configure generic OAuth authentication client using the Grafana UI
@@ -63,7 +63,7 @@ If you need to reset changes you made in the UI back to the default values, clic
If you run Grafana in high availability mode, configuration changes may not get applied to all Grafana instances immediately. You may need to wait a few minutes for the configuration to propagate to all Grafana instances.
{{% /admonition %}}
-Refer to [configuration options]({{< relref "#configuration-options" >}}) for more information.
+Refer to [configuration options](#configuration-options) for more information.
## Configure generic OAuth authentication client using the Terraform provider
@@ -94,7 +94,7 @@ Refer to [Terraform Registry](https://registry.terraform.io/providers/grafana/gr
## Configure generic OAuth authentication client using the Grafana configuration file
-Ensure that you have access to the [Grafana configuration file]({{< relref "../../../configure-grafana#configuration-file-location" >}}).
+Ensure that you have access to the [Grafana configuration file](../../../configure-grafana/#configuration-file-location).
### Steps
@@ -116,9 +116,9 @@ To integrate your OAuth2 provider with Grafana using our Generic OAuth authentic
| `api_url` | The user information endpoint of your OAuth2 provider. Information returned by this endpoint must be compatible with [OpenID UserInfo](https://connect2id.com/products/server/docs/api/userinfo). |
| `enabled` | Enables Generic OAuth authentication. Set this value to `true`. |
- Review the list of other Generic OAuth [configuration options]({{< relref "#configuration-options" >}}) and complete them, as necessary.
+ Review the list of other Generic OAuth [configuration options](#configuration-options) and complete them, as necessary.
-1. Optional: [Configure a refresh token]({{< relref "#configure-a-refresh-token" >}}):
+1. Optional: [Configure a refresh token](#configure-a-refresh-token):
a. Extend the `scopes` field of `[auth.generic_oauth]` section in Grafana configuration file with refresh token scope used by your OAuth2 provider.
@@ -126,8 +126,8 @@ To integrate your OAuth2 provider with Grafana using our Generic OAuth authentic
c. Enable the refresh token on the provider if required.
-1. [Configure role mapping]({{< relref "#configure-role-mapping" >}}).
-1. Optional: [Configure group synchronization]({{< relref "#configure-group-synchronization" >}}).
+1. [Configure role mapping](#configure-role-mapping).
+1. Optional: [Configure group synchronization](#configure-group-synchronization).
1. Restart Grafana.
You should now see a Generic OAuth login button on the login page and be able to log in or sign up with your OAuth2 provider.
@@ -198,9 +198,9 @@ Unless `skip_org_role_sync` option is enabled, the user's role will be set to th
The user's role is retrieved using a [JMESPath](http://jmespath.org/examples.html) expression from the `role_attribute_path` configuration option.
To map the server administrator role, use the `allow_assign_grafana_admin` configuration option.
-Refer to [configuration options]({{< relref "#configuration-options" >}}) for more information.
+Refer to [configuration options](#configuration-options) for more information.
-If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option]({{< relref "../../../configure-grafana#auto_assign_org_role" >}}).
+If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option](../../../configure-grafana/#auto_assign_org_role).
You can disable this default role assignment by setting `role_attribute_strict = true`. This setting denies user access if no role or an invalid role is returned after evaluating the `role_attribute_path` and the `org_mapping` expressions.
You can use the `org_attribute_path` and `org_mapping` configuration options to assign the user to organizations and specify their role. For more information, refer to [Org roles mapping example](#org-roles-mapping-example). If both org role mapping (`org_mapping`) and the regular role mapping (`role_attribute_path`) are specified, then the user will get the highest of the two mapped roles.
@@ -320,7 +320,7 @@ Grafana supports synchronization of OAuth2 groups with Grafana teams and roles.
Teams and roles get synchronized when the user logs in.
Generic OAuth groups can be referenced by group ID, such as `8bab1c86-8fba-33e5-2089-1d1c80ec267d` or `myteam`.
-For information on configuring OAuth2 groups with Grafana using the `groups_attribute_path` configuration option, refer to [configuration options]({{< relref "#configuration-options" >}}).
+For information on configuring OAuth2 groups with Grafana using the `groups_attribute_path` configuration option, refer to [configuration options](#configuration-options).
To learn more about group synchronization, refer to [Configure team sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-team-sync) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync).
@@ -347,52 +347,52 @@ Payload:
## Configuration options
-The following table outlines the various Generic OAuth configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables]({{< relref "../../../configure-grafana#override-configuration-with-environment-variables" >}}).
+The following table outlines the various Generic OAuth configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables](../../../configure-grafana/#override-configuration-with-environment-variables).
{{< admonition type="note" >}}
If the configuration option requires a JMESPath expression that includes a colon, enclose the entire expression in quotes to prevent parsing errors. For example `role_attribute_path: "role:view"`
{{< /admonition >}}
-| Setting | Required | Supported on Cloud | Description | Default |
-| ---------------------------- | -------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
-| `enabled` | No | Yes | Enables Generic OAuth authentication. | `false` |
-| `name` | No | Yes | Name that refers to the Generic OAuth authentication from the Grafana user interface. | `OAuth` |
-| `icon` | No | Yes | Icon used for the Generic OAuth authentication in the Grafana user interface. | `signin` |
-| `client_id` | Yes | Yes | Client ID provided by your OAuth2 app. | |
-| `client_secret` | Yes | Yes | Client secret provided by your OAuth2 app. | |
-| `auth_url` | Yes | Yes | Authorization endpoint of your OAuth2 provider. | |
-| `token_url` | Yes | Yes | Endpoint used to obtain the OAuth2 access token. | |
-| `api_url` | Yes | Yes | Endpoint used to obtain user information compatible with [OpenID UserInfo](https://connect2id.com/products/server/docs/api/userinfo). | |
-| `auth_style` | No | Yes | Name of the [OAuth2 AuthStyle](https://pkg.go.dev/golang.org/x/oauth2#AuthStyle) to be used when ID token is requested from OAuth2 provider. It determines how `client_id` and `client_secret` are sent to Oauth2 provider. Available values are `AutoDetect`, `InParams` and `InHeader`. | `AutoDetect` |
-| `scopes` | No | Yes | List of comma- or space-separated OAuth2 scopes. | `user:email` |
-| `empty_scopes` | No | Yes | Set to `true` to use an empty scope during authentication. | `false` |
-| `allow_sign_up` | No | Yes | Controls Grafana user creation through the Generic OAuth login. Only existing Grafana users can log in with Generic OAuth if set to `false`. | `true` |
-| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` |
-| `id_token_attribute_name` | No | Yes | The name of the key used to extract the ID token from the returned OAuth2 token. | `id_token` |
-| `login_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for user login lookup from the user ID token. For more information on how user login is retrieved, refer to [Configure login]({{< relref "#configure-login" >}}). | |
-| `name_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for user name lookup from the user ID token. This name will be used as the user's display name. For more information on how user display name is retrieved, refer to [Configure display name]({{< relref "#configure-display-name" >}}). | |
-| `email_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for user email lookup from the user information. For more information on how user email is retrieved, refer to [Configure email address]({{< relref "#configure-email-address" >}}). | |
-| `email_attribute_name` | No | Yes | Name of the key to use for user email lookup within the `attributes` map of OAuth2 ID token. For more information on how user email is retrieved, refer to [Configure email address]({{< relref "#configure-email-address" >}}). | `email:primary` |
-| `role_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana role lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no role is found, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation should be a valid Grafana role (`None`, `Viewer`, `Editor`, `Admin` or `GrafanaAdmin`). For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | |
-| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | `false` |
-| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. This will allow you to set organization roles for your users from within Grafana manually. | `false` |
-| `org_attribute_path` | No | No | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana org to role lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no value is returned, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation will be mapped to org roles based on `org_mapping`. For more information on org to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
-| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
-| `allow_assign_grafana_admin` | No | No | Set to `true` to enable automatic sync of the Grafana server administrator role. If this option is set to `true` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user the server administrator privileges and organization administrator role. If this option is set to `false` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user only organization administrator role. For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | `false` |
-| `groups_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for user group lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no groups are found, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation should be a string array of groups. | |
-| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. If you configure `allowed_groups`, you must also configure `groups_attribute_path`. | |
-| `allowed_organizations` | No | Yes | List of comma- or space-separated organizations. The user should be a member of at least one organization to log in. | |
-| `allowed_domains` | No | Yes | List of comma- or space-separated domains. The user should belong to at least one domain to log in. | |
-| `team_ids` | No | Yes | String list of team IDs. If set, the user must be a member of one of the given teams to log in. If you configure `team_ids`, you must also configure `teams_url` and `team_ids_attribute_path`. | |
-| `team_ids_attribute_path` | No | Yes | The [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana team ID lookup within the results returned by the `teams_url` endpoint. | |
-| `teams_url` | No | Yes | The URL used to query for team IDs. If not set, the default value is `/teams`. If you configure `teams_url`, you must also configure `team_ids_attribute_path`. | |
-| `tls_skip_verify_insecure` | No | No | If set to `true`, the client accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks. | `false` |
-| `tls_client_cert` | No | No | The path to the certificate. | |
-| `tls_client_key` | No | No | The path to the key. | |
-| `tls_client_ca` | No | No | The path to the trusted certificate authority list. | |
-| `use_pkce` | No | Yes | Set to `true` to use [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636). Grafana uses the SHA256 based `S256` challenge method and a 128 bytes (base64url encoded) code verifier. | `false` |
-| `use_refresh_token` | No | Yes | Set to `true` to use refresh token and check access token expiration. | `false` |
-| `signout_redirect_url` | No | Yes | URL to redirect to after the user logs out. | |
+| Setting | Required | Supported on Cloud | Description | Default |
+| ---------------------------- | -------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
+| `enabled` | No | Yes | Enables Generic OAuth authentication. | `false` |
+| `name` | No | Yes | Name that refers to the Generic OAuth authentication from the Grafana user interface. | `OAuth` |
+| `icon` | No | Yes | Icon used for the Generic OAuth authentication in the Grafana user interface. | `signin` |
+| `client_id` | Yes | Yes | Client ID provided by your OAuth2 app. | |
+| `client_secret` | Yes | Yes | Client secret provided by your OAuth2 app. | |
+| `auth_url` | Yes | Yes | Authorization endpoint of your OAuth2 provider. | |
+| `token_url` | Yes | Yes | Endpoint used to obtain the OAuth2 access token. | |
+| `api_url` | Yes | Yes | Endpoint used to obtain user information compatible with [OpenID UserInfo](https://connect2id.com/products/server/docs/api/userinfo). | |
+| `auth_style` | No | Yes | Name of the [OAuth2 AuthStyle](https://pkg.go.dev/golang.org/x/oauth2#AuthStyle) to be used when ID token is requested from OAuth2 provider. It determines how `client_id` and `client_secret` are sent to Oauth2 provider. Available values are `AutoDetect`, `InParams` and `InHeader`. | `AutoDetect` |
+| `scopes` | No | Yes | List of comma- or space-separated OAuth2 scopes. | `user:email` |
+| `empty_scopes` | No | Yes | Set to `true` to use an empty scope during authentication. | `false` |
+| `allow_sign_up` | No | Yes | Controls Grafana user creation through the Generic OAuth login. Only existing Grafana users can log in with Generic OAuth if set to `false`. | `true` |
+| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` |
+| `id_token_attribute_name` | No | Yes | The name of the key used to extract the ID token from the returned OAuth2 token. | `id_token` |
+| `login_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for user login lookup from the user ID token. For more information on how user login is retrieved, refer to [Configure login](#configure-login). | |
+| `name_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for user name lookup from the user ID token. This name will be used as the user's display name. For more information on how user display name is retrieved, refer to [Configure display name](#configure-display-name). | |
+| `email_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for user email lookup from the user information. For more information on how user email is retrieved, refer to [Configure email address](#configure-email-address). | |
+| `email_attribute_name` | No | Yes | Name of the key to use for user email lookup within the `attributes` map of OAuth2 ID token. For more information on how user email is retrieved, refer to [Configure email address](#configure-email-address). | `email:primary` |
+| `role_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana role lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no role is found, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation should be a valid Grafana role (`None`, `Viewer`, `Editor`, `Admin` or `GrafanaAdmin`). For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | |
+| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | `false` |
+| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. This will allow you to set organization roles for your users from within Grafana manually. | `false` |
+| `org_attribute_path` | No | No | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana org to role lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no value is returned, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation will be mapped to org roles based on `org_mapping`. For more information on org to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
+| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
+| `allow_assign_grafana_admin` | No | No | Set to `true` to enable automatic sync of the Grafana server administrator role. If this option is set to `true` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user the server administrator privileges and organization administrator role. If this option is set to `false` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user only organization administrator role. For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | `false` |
+| `groups_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for user group lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no groups are found, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation should be a string array of groups. | |
+| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. If you configure `allowed_groups`, you must also configure `groups_attribute_path`. | |
+| `allowed_organizations` | No | Yes | List of comma- or space-separated organizations. The user should be a member of at least one organization to log in. | |
+| `allowed_domains` | No | Yes | List of comma- or space-separated domains. The user should belong to at least one domain to log in. | |
+| `team_ids` | No | Yes | String list of team IDs. If set, the user must be a member of one of the given teams to log in. If you configure `team_ids`, you must also configure `teams_url` and `team_ids_attribute_path`. | |
+| `team_ids_attribute_path` | No | Yes | The [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana team ID lookup within the results returned by the `teams_url` endpoint. | |
+| `teams_url` | No | Yes | The URL used to query for team IDs. If not set, the default value is `/teams`. If you configure `teams_url`, you must also configure `team_ids_attribute_path`. | |
+| `tls_skip_verify_insecure` | No | No | If set to `true`, the client accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks. | `false` |
+| `tls_client_cert` | No | No | The path to the certificate. | |
+| `tls_client_key` | No | No | The path to the key. | |
+| `tls_client_ca` | No | No | The path to the trusted certificate authority list. | |
+| `use_pkce` | No | Yes | Set to `true` to use [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636). Grafana uses the SHA256 based `S256` challenge method and a 128 bytes (base64url encoded) code verifier. | `false` |
+| `use_refresh_token` | No | Yes | Set to `true` to use refresh token and check access token expiration. | `false` |
+| `signout_redirect_url` | No | Yes | URL to redirect to after the user logs out. | |
## Examples of setting up Generic OAuth
@@ -435,7 +435,7 @@ To set up Generic OAuth authentication with Descope, follow these steps:
### Set up OAuth2 with Auth0
{{< admonition type="note" >}}
-Support for the Auth0 "audience" feature is not currently available in Grafana. For roles and permissions, the available options are described [here]({{< relref "../../../../administration/roles-and-permissions/" >}}).
+Support for the Auth0 "audience" feature is not currently available in Grafana. For roles and permissions, the available options are described [here](../../../../administration/roles-and-permissions/).
{{< /admonition >}}
To set up Generic OAuth authentication with Auth0, follow these steps:
@@ -577,4 +577,4 @@ steps:
`` corresponds to the `issuer: ` configuration in Dex (e.g. the Dex
domain possibly including a path such as e.g. `/dex`). The `offline_access` scope is
- needed when using [refresh tokens]({{< relref "#configure-a-refresh-token" >}}).
+ needed when using [refresh tokens](#configure-a-refresh-token).
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/github/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/github/index.md
index 5792c3a4a70..ffde83ab6d1 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/github/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/github/index.md
@@ -24,7 +24,7 @@ weight: 900
This topic describes how to configure GitHub OAuth authentication.
{{% admonition type="note" %}}
-If Users use the same email address in GitHub that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information.
+If Users use the same email address in GitHub that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers](../#using-the-same-email-address-to-login-with-different-identity-providers) documentation for more information.
{{% /admonition %}}
## Before you begin
@@ -57,7 +57,7 @@ If you need to reset changes you made in the UI back to the default values, clic
If you run Grafana in high availability mode, configuration changes may not get applied to all Grafana instances immediately. You may need to wait a few minutes for the configuration to propagate to all Grafana instances.
{{% /admonition %}}
-Refer to [configuration options]({{< relref "#configuration-options" >}}) for more information.
+Refer to [configuration options](#configuration-options) for more information.
## Configure GitHub authentication client using the Terraform provider
@@ -87,7 +87,7 @@ Go to [Terraform Registry](https://registry.terraform.io/providers/grafana/grafa
## Configure GitHub authentication client using the Grafana configuration file
-Ensure that you have access to the [Grafana configuration file]({{< relref "../../../configure-grafana#configuration-file-location" >}}).
+Ensure that you have access to the [Grafana configuration file](../../../configure-grafana/#configuration-file-location).
### Configure GitHub authentication
@@ -107,10 +107,10 @@ To configure GitHub authentication with Grafana, follow these steps:
| `client_id`, `client_secret` | These values must match the client ID and client secret from your GitHub OAuth app. |
| `enabled` | Enables GitHub authentication. Set this value to `true`. |
- Review the list of other GitHub [configuration options]({{< relref "#configuration-options" >}}) and complete them, as necessary.
+ Review the list of other GitHub [configuration options](#configuration-options) and complete them, as necessary.
-1. [Configure role mapping]({{< relref "#configure-role-mapping" >}}).
-1. Optional: [Configure group synchronization]({{< relref "#configure-group-synchronization" >}}).
+1. [Configure role mapping](#configure-role-mapping).
+1. Optional: [Configure group synchronization](#configure-group-synchronization).
1. Restart Grafana.
You should now see a GitHub login button on the login page and be able to log in or sign up with your GitHub accounts.
@@ -121,9 +121,9 @@ Unless `skip_org_role_sync` option is enabled, the user's role will be set to th
The user's role is retrieved using a [JMESPath](http://jmespath.org/examples.html) expression from the `role_attribute_path` configuration option.
To map the server administrator role, use the `allow_assign_grafana_admin` configuration option.
-Refer to [configuration options]({{< relref "#configuration-options" >}}) for more information.
+Refer to [configuration options](#configuration-options) for more information.
-If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option]({{< relref "../../../configure-grafana#auto_assign_org_role" >}}).
+If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option](../../../configure-grafana/#auto_assign_org_role).
You can disable this default role assignment by setting `role_attribute_strict = true`. This setting denies user access if no role or an invalid role is returned after evaluating the `role_attribute_path` and the `org_mapping` expressions.
You can use the `org_mapping` configuration options to assign the user to organizations and specify their role based on their GitHub team membership. For more information, refer to [Org roles mapping example](#org-roles-mapping-example). If both org role mapping (`org_mapping`) and the regular role mapping (`role_attribute_path`) are specified, then the user will get the highest of the two mapped roles.
@@ -236,7 +236,7 @@ To learn more about group synchronization, refer to [Configure team sync](https:
## Configuration options
-The table below describes all GitHub OAuth configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables]({{< relref "../../../configure-grafana#override-configuration-with-environment-variables" >}}).
+The table below describes all GitHub OAuth configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables](../../../configure-grafana/#override-configuration-with-environment-variables).
{{< admonition type="note" >}}
If the configuration option requires a JMESPath expression that includes a colon, enclose the entire expression in quotes to prevent parsing errors. For example `role_attribute_path: "role:view"`
@@ -259,7 +259,7 @@ If the configuration option requires a JMESPath expression that includes a colon
| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Configure role mapping](#org-roles-mapping-example). | `false` |
| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. | `false` |
-| `allow_assign_grafana_admin` | No | No | Set to `true` to enable automatic sync of the Grafana server administrator role. If this option is set to `true` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user the server administrator privileges and organization administrator role. If this option is set to `false` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user only organization administrator role. For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | `false` |
+| `allow_assign_grafana_admin` | No | No | Set to `true` to enable automatic sync of the Grafana server administrator role. If this option is set to `true` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user the server administrator privileges and organization administrator role. If this option is set to `false` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user only organization administrator role. For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | `false` |
| `allowed_organizations` | No | Yes | List of comma- or space-separated organizations. User must be a member of at least one organization to log in. | |
| `allowed_domains` | No | Yes | List of comma- or space-separated domains. User must belong to at least one domain to log in. | |
| `team_ids` | No | Yes | Integer list of team IDs. If set, user has to be a member of one of the given teams to log in. | |
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/gitlab/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/gitlab/index.md
index d1503808910..230eeb1873f 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/gitlab/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/gitlab/index.md
@@ -24,7 +24,7 @@ weight: 1000
This topic describes how to configure GitLab OAuth authentication.
{{% admonition type="note" %}}
-If Users use the same email address in GitLab that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information.
+If Users use the same email address in GitLab that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers](../#using-the-same-email-address-to-login-with-different-identity-providers) documentation for more information.
{{% /admonition %}}
## Before you begin
@@ -57,7 +57,7 @@ If you need to reset changes you made in the UI back to the default values, clic
If you run Grafana in high availability mode, configuration changes may not get applied to all Grafana instances immediately. You may need to wait a few minutes for the configuration to propagate to all Grafana instances.
{{% /admonition %}}
-Refer to [configuration options]({{< relref "#configuration-options" >}}) for more information.
+Refer to [configuration options](#configuration-options) for more information.
## Configure GitLab authentication client using the Terraform provider
@@ -89,7 +89,7 @@ Go to [Terraform Registry](https://registry.terraform.io/providers/grafana/grafa
## Configure GitLab authentication client using the Grafana configuration file
-Ensure that you have access to the [Grafana configuration file]({{< relref "../../../configure-grafana#configuration-file-location" >}}).
+Ensure that you have access to the [Grafana configuration file](../../../configure-grafana/#configuration-file-location).
### Steps
@@ -112,14 +112,14 @@ To configure GitLab authentication with Grafana, follow these steps:
| `client_id`, `client_secret` | These values must match the `Application ID` and `Secret` from your GitLab OAuth application. |
| `enabled` | Enables GitLab authentication. Set this value to `true`. |
- Review the list of other GitLab [configuration options]({{< relref "#configuration-options" >}}) and complete them, as necessary.
+ Review the list of other GitLab [configuration options](#configuration-options) and complete them, as necessary.
-1. Optional: [Configure a refresh token]({{< relref "#configure-a-refresh-token" >}}):
+1. Optional: [Configure a refresh token](#configure-a-refresh-token):
a. Set `use_refresh_token` to `true` in `[auth.gitlab]` section in Grafana configuration file.
-1. [Configure role mapping]({{< relref "#configure-role-mapping" >}}).
-1. Optional: [Configure group synchronization]({{< relref "#configure-group-synchronization" >}}).
+1. [Configure role mapping](#configure-role-mapping).
+1. Optional: [Configure group synchronization](#configure-group-synchronization).
1. Restart Grafana.
You should now see a GitLab login button on the login page and be able to log in or sign up with your GitLab accounts.
@@ -154,11 +154,11 @@ Unless `skip_org_role_sync` option is enabled, the user's role will be set to th
The user's role is retrieved using a [JMESPath](http://jmespath.org/examples.html) expression from the `role_attribute_path` configuration option.
To map the server administrator role, use the `allow_assign_grafana_admin` configuration option.
-Refer to [configuration options]({{< relref "#configuration-options" >}}) for more information.
+Refer to [configuration options](#configuration-options) for more information.
You can use the `org_mapping` configuration option to assign the user to multiple organizations and specify their role based on their GitLab group membership. For more information, refer to [Org roles mapping example](#org-roles-mapping-example). If the org role mapping (`org_mapping`) is specified and Entra ID returns a valid role, then the user will get the highest of the two roles.
-If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option]({{< relref "../../../configure-grafana#auto_assign_org_role" >}}).
+If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option](../../../configure-grafana/#auto_assign_org_role).
You can disable this default role assignment by setting `role_attribute_strict = true`. This setting denies user access if no role or an invalid role is returned after evaluating the `role_attribute_path` and the `org_mapping` expressions.
To ease configuration of a proper JMESPath expression, go to [JMESPath](http://jmespath.org/) to test and evaluate expressions with custom payloads.
@@ -259,36 +259,36 @@ To learn more about group synchronization, refer to [Configure team sync](https:
## Configuration options
-The table below describes all GitLab OAuth configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables]({{< relref "../../../configure-grafana#override-configuration-with-environment-variables" >}}).
+The table below describes all GitLab OAuth configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables](../../../configure-grafana/#override-configuration-with-environment-variables).
{{< admonition type="note" >}}
If the configuration option requires a JMESPath expression that includes a colon, enclose the entire expression in quotes to prevent parsing errors. For example `role_attribute_path: "role:view"`
{{< /admonition >}}
-| Setting | Required | Supported on Cloud | Description | Default |
-| ---------------------------- | -------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
-| `enabled` | Yes | Yes | Whether GitLab OAuth authentication is allowed. | `false` |
-| `client_id` | Yes | Yes | Client ID provided by your GitLab OAuth app. | |
-| `client_secret` | Yes | Yes | Client secret provided by your GitLab OAuth app. | |
-| `auth_url` | Yes | Yes | Authorization endpoint of your GitLab OAuth provider. If you use your own instance of GitLab instead of gitlab.com, adjust `auth_url` by replacing the `gitlab.com` hostname with your own. | `https://gitlab.com/oauth/authorize` |
-| `token_url` | Yes | Yes | Endpoint used to obtain GitLab OAuth access token. If you use your own instance of GitLab instead of gitlab.com, adjust `token_url` by replacing the `gitlab.com` hostname with your own. | `https://gitlab.com/oauth/token` |
-| `api_url` | No | Yes | Grafana uses `/user` endpoint to obtain GitLab user information compatible with [OpenID UserInfo](https://connect2id.com/products/server/docs/api/userinfo). | `https://gitlab.com/api/v4` |
-| `name` | No | Yes | Name used to refer to the GitLab authentication in the Grafana user interface. | `GitLab` |
-| `icon` | No | Yes | Icon used for GitLab authentication in the Grafana user interface. | `gitlab` |
-| `scopes` | No | Yes | List of comma or space-separated GitLab OAuth scopes. | `openid email profile` |
-| `allow_sign_up` | No | Yes | Whether to allow new Grafana user creation through GitLab login. If set to `false`, then only existing Grafana users can log in with GitLab OAuth. | `true` |
-| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` |
-| `role_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana role lookup. Grafana will first evaluate the expression using the GitLab OAuth token. If no role is found, Grafana creates a JSON data with `groups` key that maps to groups obtained from GitLab's `/oauth/userinfo` endpoint, and evaluates the expression using this data. Finally, if a valid role is still not found, the expression is evaluated against the user information retrieved from `api_url/users` endpoint and groups retrieved from `api_url/groups` endpoint. The result of the evaluation should be a valid Grafana role (`None`, `Viewer`, `Editor`, `Admin` or `GrafanaAdmin`). For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | |
-| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana role cannot be extracted using `role_attribute_path`. For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | `false` |
-| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
-| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. | `false` |
-| `allow_assign_grafana_admin` | No | No | Set to `true` to enable automatic sync of the Grafana server administrator role. If this option is set to `true` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user the server administrator privileges and organization administrator role. If this option is set to `false` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user only organization administrator role. For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | `false` |
-| `allowed_domains` | No | Yes | List of comma or space-separated domains. User must belong to at least one domain to log in. | |
-| `allowed_groups` | No | Yes | List of comma or space-separated groups. The user should be a member of at least one group to log in. | |
-| `tls_skip_verify_insecure` | No | No | If set to `true`, the client accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks. | `false` |
-| `tls_client_cert` | No | No | The path to the certificate. | |
-| `tls_client_key` | No | No | The path to the key. | |
-| `tls_client_ca` | No | No | The path to the trusted certificate authority list. | |
-| `use_pkce` | No | Yes | Set to `true` to use [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636). Grafana uses the SHA256 based `S256` challenge method and a 128 bytes (base64url encoded) code verifier. | `true` |
-| `use_refresh_token` | No | Yes | Set to `true` to use refresh token and check access token expiration. The `accessTokenExpirationCheck` feature toggle should also be enabled to use refresh token. | `true` |
-| `signout_redirect_url` | No | Yes | URL to redirect to after the user logs out. | |
+| Setting | Required | Supported on Cloud | Description | Default |
+| ---------------------------- | -------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
+| `enabled` | Yes | Yes | Whether GitLab OAuth authentication is allowed. | `false` |
+| `client_id` | Yes | Yes | Client ID provided by your GitLab OAuth app. | |
+| `client_secret` | Yes | Yes | Client secret provided by your GitLab OAuth app. | |
+| `auth_url` | Yes | Yes | Authorization endpoint of your GitLab OAuth provider. If you use your own instance of GitLab instead of gitlab.com, adjust `auth_url` by replacing the `gitlab.com` hostname with your own. | `https://gitlab.com/oauth/authorize` |
+| `token_url` | Yes | Yes | Endpoint used to obtain GitLab OAuth access token. If you use your own instance of GitLab instead of gitlab.com, adjust `token_url` by replacing the `gitlab.com` hostname with your own. | `https://gitlab.com/oauth/token` |
+| `api_url` | No | Yes | Grafana uses `/user` endpoint to obtain GitLab user information compatible with [OpenID UserInfo](https://connect2id.com/products/server/docs/api/userinfo). | `https://gitlab.com/api/v4` |
+| `name` | No | Yes | Name used to refer to the GitLab authentication in the Grafana user interface. | `GitLab` |
+| `icon` | No | Yes | Icon used for GitLab authentication in the Grafana user interface. | `gitlab` |
+| `scopes` | No | Yes | List of comma or space-separated GitLab OAuth scopes. | `openid email profile` |
+| `allow_sign_up` | No | Yes | Whether to allow new Grafana user creation through GitLab login. If set to `false`, then only existing Grafana users can log in with GitLab OAuth. | `true` |
+| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` |
+| `role_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana role lookup. Grafana will first evaluate the expression using the GitLab OAuth token. If no role is found, Grafana creates a JSON data with `groups` key that maps to groups obtained from GitLab's `/oauth/userinfo` endpoint, and evaluates the expression using this data. Finally, if a valid role is still not found, the expression is evaluated against the user information retrieved from `api_url/users` endpoint and groups retrieved from `api_url/groups` endpoint. The result of the evaluation should be a valid Grafana role (`None`, `Viewer`, `Editor`, `Admin` or `GrafanaAdmin`). For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | |
+| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana role cannot be extracted using `role_attribute_path`. For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | `false` |
+| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
+| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. | `false` |
+| `allow_assign_grafana_admin` | No | No | Set to `true` to enable automatic sync of the Grafana server administrator role. If this option is set to `true` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user the server administrator privileges and organization administrator role. If this option is set to `false` and the result of evaluating `role_attribute_path` for a user is `GrafanaAdmin`, Grafana grants the user only organization administrator role. For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | `false` |
+| `allowed_domains` | No | Yes | List of comma or space-separated domains. User must belong to at least one domain to log in. | |
+| `allowed_groups` | No | Yes | List of comma or space-separated groups. The user should be a member of at least one group to log in. | |
+| `tls_skip_verify_insecure` | No | No | If set to `true`, the client accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks. | `false` |
+| `tls_client_cert` | No | No | The path to the certificate. | |
+| `tls_client_key` | No | No | The path to the key. | |
+| `tls_client_ca` | No | No | The path to the trusted certificate authority list. | |
+| `use_pkce` | No | Yes | Set to `true` to use [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636). Grafana uses the SHA256 based `S256` challenge method and a 128 bytes (base64url encoded) code verifier. | `true` |
+| `use_refresh_token` | No | Yes | Set to `true` to use refresh token and check access token expiration. The `accessTokenExpirationCheck` feature toggle should also be enabled to use refresh token. | `true` |
+| `signout_redirect_url` | No | Yes | URL to redirect to after the user logs out. | |
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/google/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/google/index.md
index 9e4740c6914..ce130da6e0d 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/google/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/google/index.md
@@ -17,7 +17,7 @@ weight: 1100
To enable Google OAuth you must register your application with Google. Google will generate a client ID and secret key for you to use.
{{% admonition type="note" %}}
-If Users use the same email address in Google that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information.
+If Users use the same email address in Google that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers](../#using-the-same-email-address-to-login-with-different-identity-providers) documentation for more information.
{{% /admonition %}}
## Create Google OAuth keys
@@ -86,11 +86,11 @@ Go to [Terraform Registry](https://registry.terraform.io/providers/grafana/grafa
## Configure Google authentication client using the Grafana configuration file
-Ensure that you have access to the [Grafana configuration file]({{< relref "../../../configure-grafana#configuration-file-location" >}}).
+Ensure that you have access to the [Grafana configuration file](../../../configure-grafana/#configuration-file-location).
### Enable Google OAuth in Grafana
-Specify the Client ID and Secret in the [Grafana configuration file]({{< relref "../../../configure-grafana#configuration-file-location" >}}). For example:
+Specify the Client ID and Secret in the [Grafana configuration file](../../../configure-grafana/#configuration-file-location). For example:
```bash
[auth.google]
@@ -189,7 +189,7 @@ To set up group sync for Google OAuth:
The external group ID for a Google group is the group's email address, such as `dev@grafana.com`.
-To learn more about how to configure group synchronization, refer to [Configure team sync]({{< relref "../../configure-team-sync" >}}) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
+To learn more about how to configure group synchronization, refer to [Configure team sync](../../configure-team-sync/) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
#### Configure allowed groups
@@ -209,7 +209,7 @@ Unless `skip_org_role_sync` option is enabled, the user's role will be set to th
The user's role is retrieved using a [JMESPath](http://jmespath.org/examples.html) expression from the `role_attribute_path` configuration option.
To map the server administrator role, use the `allow_assign_grafana_admin` configuration option.
-If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option]({{< relref "../../../configure-grafana#auto_assign_org_role" >}}).
+If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option](../../../configure-grafana/#auto_assign_org_role).
You can disable this default role assignment by setting `role_attribute_strict = true`. This setting denies user access if no role or an invalid role is returned after evaluating the `role_attribute_path` and the `org_mapping` expressions.
To ease configuration of a proper JMESPath expression, go to [JMESPath](http://jmespath.org/) to test and evaluate expressions with custom payloads.
@@ -281,7 +281,7 @@ skip_org_role_sync = false
## Configuration options
-The following table outlines the various Google OAuth configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables]({{< relref "../../../configure-grafana#override-configuration-with-environment-variables" >}}).
+The following table outlines the various Google OAuth configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables](../../../configure-grafana/#override-configuration-with-environment-variables).
| Setting | Required | Supported on Cloud | Description | Default |
| ---------------------------- | -------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
@@ -298,13 +298,13 @@ The following table outlines the various Google OAuth configuration options. You
| `allow_sign_up` | No | Yes | Controls Grafana user creation through the Google login. Only existing Grafana users can log in with Google if set to `false`. | `true` |
| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` |
| `hosted_domain` | No | Yes | Specifies the domain to restrict access to users from that domain. This value is appended to the authorization request using the `hd` parameter. | |
-| `validate_hd` | No | Yes | Set to `false` to disable the validation of the `hd` parameter from the Google ID token. For more informatiion, refer to [Enable Google OAuth in Grafana]({{< relref "#enable-google-oauth-in-grafana" >}}). | `true` |
-| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | `false` |
+| `validate_hd` | No | Yes | Set to `false` to disable the validation of the `hd` parameter from the Google ID token. For more informatiion, refer to [Enable Google OAuth in Grafana](#enable-google-oauth-in-grafana). | `true` |
+| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | `false` |
| `org_attribute_path` | No | No | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana org to role lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no value is returned, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation will be mapped to org roles based on `org_mapping`. For more information on org to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
-| `allow_assign_grafana_admin` | No | No | Set to `true` to automatically sync the Grafana server administrator role. When enabled, if the Google user's App role is `GrafanaAdmin`, Grafana grants the user server administrator privileges and the organization administrator role. If disabled, the user will only receive the organization administrator role. For more details on user role mapping, refer to [Map roles]({{< relref "#map-roles" >}}). | `false` |
+| `allow_assign_grafana_admin` | No | No | Set to `true` to automatically sync the Grafana server administrator role. When enabled, if the Google user's App role is `GrafanaAdmin`, Grafana grants the user server administrator privileges and the organization administrator role. If disabled, the user will only receive the organization administrator role. For more details on user role mapping, refer to [Map roles](#map-roles). | `false` |
| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. This will allow you to set organization roles for your users from within Grafana manually. | `false` |
-| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. If you configure `allowed_groups`, you must also configure Google to include the `groups` claim following [Configure allowed groups]({{< relref "#configure-allowed-groups" >}}). | |
+| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. If you configure `allowed_groups`, you must also configure Google to include the `groups` claim following [Configure allowed groups](#configure-allowed-groups). | |
| `allowed_organizations` | No | Yes | List of comma- or space-separated Azure tenant identifiers. The user should be a member of at least one tenant to log in. | |
| `allowed_domains` | No | Yes | List of comma- or space-separated domains. The user should belong to at least one domain to log in. | |
| `tls_skip_verify_insecure` | No | No | If set to `true`, the client accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks. | `false` |
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/jwt/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/jwt/index.md
index dc73b488a1b..29dfa1f17ae 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/jwt/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/jwt/index.md
@@ -31,7 +31,7 @@ Grafana does not currently support refresh tokens.
To use JWT authentication:
-1. Enable JWT in the [main config file]({{< relref "../../../configure-grafana" >}}).
+1. Enable JWT in the [main config file](../../../configure-grafana/).
1. Specify the header name that contains a token.
```ini
@@ -106,7 +106,7 @@ provided in the HTTP header and a reverse proxy should rewrite requests to the
Grafana instance to include the JWT in the request's headers.
{{% admonition type="note" %}}
-For embedding to work, you must enable `allow_embedding` in the [security section]({{< relref "../../../configure-grafana#allow_embedding" >}}). This setting is not available in Grafana Cloud.
+For embedding to work, you must enable `allow_embedding` in the [security section](../../../configure-grafana/#allow_embedding). This setting is not available in Grafana Cloud.
{{% /admonition %}}
In a scenario where it is not possible to rewrite the request headers you
@@ -200,7 +200,7 @@ expect_claims = {"iss": "https://your-token-issuer", "your-custom-claim": "foo"}
Grafana checks for the presence of a role using the [JMESPath](http://jmespath.org/examples.html) specified via the `role_attribute_path` configuration option. The JMESPath is applied to JWT token claims. The result after evaluation of the `role_attribute_path` JMESPath expression should be a valid Grafana role, for example, `None`, `Viewer`, `Editor` or `Admin`.
To assign the role to a specific organization include the `X-Grafana-Org-Id` header along with your JWT when making API requests to Grafana.
-To learn more about the header, please refer to the [documentation]({{< relref "../../../../developers/http_api#x-grafana-org-id-header" >}}).
+To learn more about the header, please refer to the [documentation](../../../../developers/http_api/#x-grafana-org-id-header).
### JMESPath examples
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md
index 323e6e1614d..347d5fbc4dc 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md
@@ -22,10 +22,10 @@ weight: 1300
Keycloak OAuth2 authentication allows users to log in to Grafana using their Keycloak credentials. This guide explains how to set up Keycloak as an authentication provider in Grafana.
-Refer to [Generic OAuth authentication]({{< relref "../generic-oauth" >}}) for extra configuration options available for this provider.
+Refer to [Generic OAuth authentication](../generic-oauth/) for extra configuration options available for this provider.
{{% admonition type="note" %}}
-If Users use the same email address in Keycloak that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information.
+If Users use the same email address in Keycloak that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers](../#using-the-same-email-address-to-login-with-different-identity-providers) documentation for more information.
{{% /admonition %}}
You may have to set the `root_url` option of `[server]` for the callback URL to be
@@ -143,7 +143,7 @@ If you use nested groups containing special characters such as quotes or colons,
groups_attribute_path = reverse("Global:department")
```
-To learn more about how to configure group synchronization, refer to [Configure team sync]({{< relref "../../configure-team-sync" >}}) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
+To learn more about how to configure group synchronization, refer to [Configure team sync](../../configure-team-sync/) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
## Enable Single Logout
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/ldap-ui/_index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/ldap-ui/_index.md
index 89ae937a995..0710af26b0e 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/ldap-ui/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/ldap-ui/_index.md
@@ -14,7 +14,7 @@ weight: 300
# Configure LDAP authentication using the Grafana user interface
-This page explains how to configure LDAP authentication in Grafana using the Grafana user interface. For more detailed information about configuring LDAP authentication using the configuration file, refer to [LDAP authentication]({{< relref "../ldap" >}}).
+This page explains how to configure LDAP authentication in Grafana using the Grafana user interface. For more detailed information about configuring LDAP authentication using the configuration file, refer to [LDAP authentication](../ldap/).
Benefits of using the Grafana user interface to configure LDAP authentication include:
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/ldap/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/ldap/index.md
index 68e45f10032..bde7f28b541 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/ldap/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/ldap/index.md
@@ -19,10 +19,10 @@ The LDAP integration in Grafana allows your Grafana users to login with their LD
group memberships and Grafana Organization user roles.
{{% admonition type="note" %}}
-[Enhanced LDAP authentication]({{< relref "../enhanced-ldap" >}}) is available in [Grafana Cloud](/docs/grafana-cloud/) and in [Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise" >}}).
+[Enhanced LDAP authentication](../enhanced-ldap/) is available in [Grafana Cloud](/docs/grafana-cloud/) and in [Grafana Enterprise](../../../../introduction/grafana-enterprise/).
{{% /admonition %}}
-Refer to [Role-based access control]({{< relref "../../../../administration/roles-and-permissions/access-control" >}}) to understand how you can control access with role-based permissions.
+Refer to [Role-based access control](../../../../administration/roles-and-permissions/access-control/) to understand how you can control access with role-based permissions.
## Supported LDAP Servers
@@ -32,7 +32,7 @@ This means that you should be able to configure LDAP integration using any compl
## Enable LDAP
-In order to use LDAP integration you'll first need to enable LDAP in the [main config file]({{< relref "../../../configure-grafana" >}}) as well as specify the path to the LDAP
+In order to use LDAP integration you'll first need to enable LDAP in the [main config file](../../../configure-grafana/) as well as specify the path to the LDAP
specific configuration file (default: `/etc/grafana/ldap.toml`).
After enabling LDAP, the default behavior is for Grafana users to be created automatically upon successful LDAP authentication. If you prefer for only existing Grafana users to be able to sign in, you can change `allow_sign_up` to `false` in the `[auth.ldap]` section.
@@ -160,7 +160,7 @@ Note that this does not work if you are using the single bind configuration outl
{{< figure src="/static/img/docs/ldap_debug_mapping_testing.png" class="docs-image--no-shadow" max-width="600px" alt="LDAP mapping displayed" >}}
-[Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise" >}}) users with [enhanced LDAP integration]({{< relref "../enhanced-ldap" >}}) enabled can also see sync status in the debug view. This requires the `ldap.status:read` permission.
+[Grafana Enterprise](../../../../introduction/grafana-enterprise/) users with [enhanced LDAP integration](../enhanced-ldap/) enabled can also see sync status in the debug view. This requires the `ldap.status:read` permission.
{{< figure src="/static/img/docs/ldap_sync_debug.png" class="docs-image--no-shadow" max-width="600px" alt="LDAP sync status" >}}
@@ -414,7 +414,7 @@ Please inspect your Active Directory configuration and documentation to find the
## Troubleshooting
-To troubleshoot and get more log info enable LDAP debug logging in the [main config file]({{< relref "../../../configure-grafana" >}}).
+To troubleshoot and get more log info enable LDAP debug logging in the [main config file](../../../configure-grafana/).
```bash
[log]
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/okta/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/okta/index.md
index 39d77ca3f7f..4cc50a36f2a 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/okta/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/okta/index.md
@@ -17,7 +17,7 @@ weight: 1400
{{< docs/shared lookup="auth/intro.md" source="grafana" version="" >}}
{{% admonition type="note" %}}
-If Users use the same email address in Okta that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information.
+If Users use the same email address in Okta that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers](../#using-the-same-email-address-to-login-with-different-identity-providers) documentation for more information.
{{% /admonition %}}
## Before you begin
@@ -67,7 +67,7 @@ To follow this guide, ensure you have permissions in your Okta workspace to crea
The remaining attributes are optional and can be set as needed.
1. Click **Save**.
-1. (Optional) You can add the role attribute to the default User profile. To do this, please follow the steps in the [Optional: Add the role attribute to the User (default) Okta profile]({{< relref "#optional-add-the-role-attribute-to-the-user-default-okta-profile" >}}) section.
+1. (Optional) You can add the role attribute to the default User profile. To do this, please follow the steps in the [Optional: Add the role attribute to the User (default) Okta profile](#optional-add-the-role-attribute-to-the-user-default-okta-profile) section.
### Configure Groups claim
@@ -115,7 +115,7 @@ If you need to reset changes you made in the UI back to the default values, clic
If you run Grafana in high availability mode, configuration changes may not get applied to all Grafana instances immediately. You may need to wait a few minutes for the configuration to propagate to all Grafana instances.
{{% /admonition %}}
-Refer to [configuration options]({{< relref "#configuration-options" >}}) for more information.
+Refer to [configuration options](#configuration-options) for more information.
## Configure Okta authentication client using the Terraform provider
@@ -147,13 +147,13 @@ Go to [Terraform Registry](https://registry.terraform.io/providers/grafana/grafa
## Configure Okta authentication client using the Grafana configuration file
-Ensure that you have access to the [Grafana configuration file]({{< relref "../../../configure-grafana#configuration-file-location" >}}).
+Ensure that you have access to the [Grafana configuration file](../../../configure-grafana/#configuration-file-location).
### Steps
To integrate your Okta OIDC provider with Grafana using our Okta OIDC integration, follow these steps:
-1. Follow the [Create an Okta app]({{< relref "#create-an-okta-app" >}}) steps to create an OIDC app in Okta.
+1. Follow the [Create an Okta app](#create-an-okta-app) steps to create an OIDC app in Okta.
1. Refer to the following table to update field values located in the `[auth.okta]` section of the Grafana configuration file:
@@ -165,11 +165,11 @@ To integrate your Okta OIDC provider with Grafana using our Okta OIDC integratio
| `api_url` | The user information endpoint of your Okta OIDC provider. `https://.okta.com/oauth2/v1/userinfo` |
| `enabled` | Enables Okta OIDC authentication. Set this value to `true`. |
-1. Review the list of other Okta OIDC [configuration options]({{< relref "#configuration-options" >}}) and complete them as necessary.
+1. Review the list of other Okta OIDC [configuration options](#configuration-options) and complete them as necessary.
-1. Optional: [Configure a refresh token]({{< relref "#configure-a-refresh-token" >}}).
-1. [Configure role mapping]({{< relref "#configure-role-mapping" >}}).
-1. Optional: [Configure group synchronization]({{< relref "#configure-group-synchronization-enterprise-only" >}}).
+1. Optional: [Configure a refresh token](#configure-a-refresh-token).
+1. [Configure role mapping](#configure-role-mapping).
+1. Optional: [Configure group synchronization](#configure-group-synchronization-enterprise-only).
1. Restart Grafana.
You should now see a Okta OIDC login button on the login page and be able to log in or sign up with your OIDC provider.
@@ -214,17 +214,17 @@ Unless `skip_org_role_sync` option is enabled, the user's role will be set to th
The user's role is retrieved using a [JMESPath](http://jmespath.org/examples.html) expression from the `role_attribute_path` configuration option against the `api_url` (`/userinfo` OIDC endpoint) endpoint payload.
-If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option]({{< relref "../../../configure-grafana#auto_assign_org_role" >}}).
+If no valid role is found, the user is assigned the role specified by [the `auto_assign_org_role` option](../../../configure-grafana/#auto_assign_org_role).
You can disable this default role assignment by setting `role_attribute_strict = true`. This setting denies user access if no role or an invalid role is returned after evaluating the `role_attribute_path` and the `org_mapping` expressions.
You can use the `org_attribute_path` and `org_mapping` configuration options to assign the user to organizations and specify their role. For more information, refer to [Org roles mapping example](#org-roles-mapping-example). If both org role mapping (`org_mapping`) and the regular role mapping (`role_attribute_path`) are specified, then the user will get the highest of the two mapped roles.
To allow mapping Grafana server administrator role, use the `allow_assign_grafana_admin` configuration option.
-Refer to [configuration options]({{< relref "../generic-oauth/index.md#configuration-options" >}}) for more information.
+Refer to [configuration options](../generic-oauth/#configuration-options) for more information.
-In [Create an Okta app]({{< relref "#create-an-okta-app" >}}), you created a custom attribute in Okta to store the role. You can use this attribute to map the role to a Grafana role by setting the `role_attribute_path` configuration option to the custom attribute name: `role_attribute_path = grafana_role`.
+In [Create an Okta app](#create-an-okta-app), you created a custom attribute in Okta to store the role. You can use this attribute to map the role to a Grafana role by setting the `role_attribute_path` configuration option to the custom attribute name: `role_attribute_path = grafana_role`.
-If you want to map the role based on the user's group, you can use the `groups` attribute from the user info endpoint. An example of this is `role_attribute_path = contains(groups[*], 'Example::DevOps') && 'Admin' || 'None'`. You can find more examples of JMESPath expressions on the Generic OAuth page for [JMESPath examples]({{< relref "../generic-oauth/index.md#role-mapping-examples" >}}).
+If you want to map the role based on the user's group, you can use the `groups` attribute from the user info endpoint. An example of this is `role_attribute_path = contains(groups[*], 'Example::DevOps') && 'Admin' || 'None'`. You can find more examples of JMESPath expressions on the Generic OAuth page for [JMESPath examples](../generic-oauth/#role-mapping-examples).
To learn about adding custom claims to the user info in Okta, refer to [add custom claims](https://developer.okta.com/docs/guides/customize-tokens-returned-from-okta/main/#add-a-custom-claim-to-a-token).
@@ -254,36 +254,36 @@ Teams and roles get synchronized when the user logs in.
Okta groups can be referenced by group names, like `Admins` or `Editors`.
-To learn more about how to configure group synchronization, refer to [Configure team sync]({{< relref "../../configure-team-sync" >}}) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
+To learn more about how to configure group synchronization, refer to [Configure team sync](../../configure-team-sync/) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
## Configuration options
-The following table outlines the various Okta OIDC configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables]({{< relref "../../../configure-grafana#override-configuration-with-environment-variables" >}}).
+The following table outlines the various Okta OIDC configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables](../../../configure-grafana/#override-configuration-with-environment-variables).
{{< admonition type="note" >}}
If the configuration option requires a JMESPath expression that includes a colon, enclose the entire expression in quotes to prevent parsing errors. For example `role_attribute_path: "role:view"`
{{< /admonition >}}
-| Setting | Required | Supported on Cloud | Description | Default |
-| ----------------------- | -------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------- |
-| `enabled` | No | Yes | Enables Okta OIDC authentication. | `false` |
-| `name` | No | Yes | Name that refers to the Okta OIDC authentication from the Grafana user interface. | `Okta` |
-| `icon` | No | Yes | Icon used for the Okta OIDC authentication in the Grafana user interface. | `okta` |
-| `client_id` | Yes | Yes | Client ID provided by your Okta OIDC app. | |
-| `client_secret` | Yes | Yes | Client secret provided by your Okta OIDC app. | |
-| `auth_url` | Yes | Yes | Authorization endpoint of your Okta OIDC provider. | |
-| `token_url` | Yes | Yes | Endpoint used to obtain the Okta OIDC access token. | |
-| `api_url` | Yes | Yes | Endpoint used to obtain user information. | |
-| `scopes` | No | Yes | List of comma- or space-separated Okta OIDC scopes. | `openid profile email groups` |
-| `allow_sign_up` | No | Yes | Controls Grafana user creation through the Okta OIDC login. Only existing Grafana users can log in with Okta OIDC if set to `false`. | `true` |
-| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` |
-| `role_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana role lookup. Grafana will first evaluate the expression using the Okta OIDC ID token. If no role is found, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation should be a valid Grafana role (`None`, `Viewer`, `Editor`, `Admin` or `GrafanaAdmin`). For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | |
-| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Configure role mapping]({{< relref "#configure-role-mapping" >}}). | `false` |
-| `org_attribute_path` | No | No | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana org to role lookup. The result of the evaluation will be mapped to org roles based on `org_mapping`. For more information on org to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
-| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
-| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. This will allow you to set organization roles for your users from within Grafana manually. | `false` |
-| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. | |
-| `allowed_domains` | No | Yes | List of comma- or space-separated domains. The user should belong to at least one domain to log in. | |
-| `use_pkce` | No | Yes | Set to `true` to use [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636). Grafana uses the SHA256 based `S256` challenge method and a 128 bytes (base64url encoded) code verifier. | `true` |
-| `use_refresh_token` | No | Yes | Set to `true` to use refresh token and check access token expiration. | `false` |
-| `signout_redirect_url` | No | Yes | URL to redirect to after the user logs out. | |
+| Setting | Required | Supported on Cloud | Description | Default |
+| ----------------------- | -------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
+| `enabled` | No | Yes | Enables Okta OIDC authentication. | `false` |
+| `name` | No | Yes | Name that refers to the Okta OIDC authentication from the Grafana user interface. | `Okta` |
+| `icon` | No | Yes | Icon used for the Okta OIDC authentication in the Grafana user interface. | `okta` |
+| `client_id` | Yes | Yes | Client ID provided by your Okta OIDC app. | |
+| `client_secret` | Yes | Yes | Client secret provided by your Okta OIDC app. | |
+| `auth_url` | Yes | Yes | Authorization endpoint of your Okta OIDC provider. | |
+| `token_url` | Yes | Yes | Endpoint used to obtain the Okta OIDC access token. | |
+| `api_url` | Yes | Yes | Endpoint used to obtain user information. | |
+| `scopes` | No | Yes | List of comma- or space-separated Okta OIDC scopes. | `openid profile email groups` |
+| `allow_sign_up` | No | Yes | Controls Grafana user creation through the Okta OIDC login. Only existing Grafana users can log in with Okta OIDC if set to `false`. | `true` |
+| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` |
+| `role_attribute_path` | No | Yes | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana role lookup. Grafana will first evaluate the expression using the Okta OIDC ID token. If no role is found, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation should be a valid Grafana role (`None`, `Viewer`, `Editor`, `Admin` or `GrafanaAdmin`). For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | |
+| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Configure role mapping](#configure-role-mapping). | `false` |
+| `org_attribute_path` | No | No | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana org to role lookup. The result of the evaluation will be mapped to org roles based on `org_mapping`. For more information on org to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
+| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | |
+| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. This will allow you to set organization roles for your users from within Grafana manually. | `false` |
+| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. | |
+| `allowed_domains` | No | Yes | List of comma- or space-separated domains. The user should belong to at least one domain to log in. | |
+| `use_pkce` | No | Yes | Set to `true` to use [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636). Grafana uses the SHA256 based `S256` challenge method and a 128 bytes (base64url encoded) code verifier. | `true` |
+| `use_refresh_token` | No | Yes | Set to `true` to use refresh token and check access token expiration. | `false` |
+| `signout_redirect_url` | No | Yes | URL to redirect to after the user logs out. | |
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/saml-ui/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/saml-ui/index.md
index 0a192c80baf..fc71df3b8bc 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/saml-ui/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/saml-ui/index.md
@@ -12,10 +12,10 @@ weight: 600
# Configure SAML authentication using the Grafana user interface
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise" >}}) version 10.0 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
+Available in [Grafana Enterprise](../../../../introduction/grafana-enterprise/) version 10.0 and later, and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
{{% /admonition %}}
-You can configure SAML authentication in Grafana through the user interface (UI) or the Grafana configuration file. For instructions on how to set up SAML using the Grafana configuration file, refer to [Configure SAML authentication using the configuration file]({{< relref "../saml" >}}).
+You can configure SAML authentication in Grafana through the user interface (UI) or the Grafana configuration file. For instructions on how to set up SAML using the Grafana configuration file, refer to [Configure SAML authentication using the configuration file](../saml/).
The Grafana SAML UI provides the following advantages over configuring SAML in the Grafana configuration file:
@@ -25,7 +25,7 @@ The Grafana SAML UI provides the following advantages over configuring SAML in t
- Access to the SAML UI only requires access to authentication settings, so it can be used by users with limited access to Grafana's configuration
{{% admonition type="note" %}}
-Any configuration changes made through the Grafana user interface (UI) will take precedence over settings specified in the Grafana configuration file or through environment variables. This means that if you modify any configuration settings in the UI, they will override any corresponding settings set via environment variables or defined in the configuration file. For more information on how Grafana determines the order of precedence for its settings, please refer to the [Settings update at runtime]({{< relref "../../../configure-grafana/settings-updates-at-runtime" >}}).
+Any configuration changes made through the Grafana user interface (UI) will take precedence over settings specified in the Grafana configuration file or through environment variables. This means that if you modify any configuration settings in the UI, they will override any corresponding settings set via environment variables or defined in the configuration file. For more information on how Grafana determines the order of precedence for its settings, please refer to the [Settings update at runtime](../../../configure-grafana/settings-updates-at-runtime/).
{{% /admonition %}}
{{% admonition type="note" %}}
@@ -36,13 +36,13 @@ Disabling the UI does not affect any configuration settings that were previously
To follow this guide, you need:
-- Knowledge of SAML authentication. Refer to [SAML authentication in Grafana]({{< relref "../saml" >}}) for an overview of Grafana's SAML integration.
+- Knowledge of SAML authentication. Refer to [SAML authentication in Grafana](../saml/) for an overview of Grafana's SAML integration.
- Permissions `settings:read` and `settings:write` with scope `settings:auth.saml:*` that allow you to read and update SAML authentication settings.
These permissions are granted by `fixed:authentication.config:writer` role.
By default, this role is granted to Grafana server administrator in self-hosted instances and to Organization admins in Grafana Cloud instances.
-- Grafana instance running Grafana version 10.0 or later with [Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise" >}}) or [Grafana Cloud Pro or Advanced](/docs/grafana-cloud/) license.
+- Grafana instance running Grafana version 10.0 or later with [Grafana Enterprise](../../../../introduction/grafana-enterprise/) or [Grafana Cloud Pro or Advanced](/docs/grafana-cloud/) license.
{{% admonition type="note" %}}
It is possible to set up Grafana with SAML authentication using Azure AD. However, if an Azure AD user belongs to more than 150 groups, a Graph API endpoint is shared instead.
@@ -54,8 +54,8 @@ As of Grafana 11.2, the SAML integration offers a mechanism to retrieve user gro
Related links:
- [Azure AD SAML limitations](https://learn.microsoft.com/en-us/entra/identity-platform/id-token-claims-reference#groups-overage-claim)
-- [Set up SAML with Azure AD]({{< relref "../saml#set-up-saml-with-azure-ad" >}})
-- [Configure a Graph API application in Azure AD]({{< relref "../saml#configure-a-graph-api-application-in-azure-ad" >}})
+- [Set up SAML with Azure AD](../saml/#set-up-saml-with-azure-ad)
+- [Configure a Graph API application in Azure AD](../saml/#configure-a-graph-api-application-in-azure-ad)
{{% /admonition %}}
## Steps To Configure SAML Authentication
@@ -68,12 +68,12 @@ Sign in to Grafana and navigate to **Administration > Authentication > Configure
For assistance, consult the following table for additional guidance about certain fields:
- | Field | Description |
- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | **Allow signup** | If enabled, you can create new users through the SAML login. If disabled, then only existing Grafana users can log in with SAML. |
- | **Auto login** | If enabled, Grafana will attempt to automatically log in with SAML skipping the login screen. |
- | **Single logout** | The SAML single logout feature enables users to log out from all applications associated with the current IdP session established using SAML SSO. For more information, refer to [SAML single logout documentation]]({{< relref "../saml#single-logout" >}}). |
- | **Identity provider initiated login** | Enables users to log in to Grafana directly from the SAML IdP. For more information, refer to [IdP initiated login documentation]({{< relref "../saml#idp-initiated-single-sign-on-sso" >}}). |
+ | Field | Description |
+ | ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | **Allow signup** | If enabled, you can create new users through the SAML login. If disabled, then only existing Grafana users can log in with SAML. |
+ | **Auto login** | If enabled, Grafana will attempt to automatically log in with SAML skipping the login screen. |
+ | **Single logout** | The SAML single logout feature enables users to log out from all applications associated with the current IdP session established using SAML SSO. For more information, refer to [SAML single logout documentation]](../saml/#single-logout). |
+ | **Identity provider initiated login** | Enables users to log in to Grafana directly from the SAML IdP. For more information, refer to [IdP initiated login documentation](../saml/#idp-initiated-single-sign-on-sso). |
1. Click **Next: Sign requests**.
@@ -85,7 +85,7 @@ Sign in to Grafana and navigate to **Administration > Authentication > Configure
Use the [PKCS #8](https://en.wikipedia.org/wiki/PKCS_8) format to issue the private key.
- For more information, refer to an [example on how to generate SAML credentials]({{< relref "../saml#generate-private-key-for-saml-authentication" >}}).
+ For more information, refer to an [example on how to generate SAML credentials](../saml/#generate-private-key-for-saml-authentication).
Alternatively, you can generate a new private key and certificate pair directly from the UI. Click on the `Generate key and certificate` button to open a form where you enter some information you want to be embedded into the new certificate.
@@ -111,7 +111,7 @@ Sign in to Grafana and navigate to **Administration > Authentication > Configure
### 4. User Mapping Section
-1. If you wish to [map user information from SAML assertions]({{< relref "../saml#assertion-mapping" >}}), complete the **Assertion attributes mappings** section.
+1. If you wish to [map user information from SAML assertions](../saml/#assertion-mapping), complete the **Assertion attributes mappings** section.
If Azure is the Identity Provider over SAML there are caveats for the assertion attribute mappings. Due to how Azure interprets these attributes the full URL will need to be entered in the corresponding fields within the UI, which should match the URLs from the metadata XML. There are differences depending on whether it's a Role or Group claim vs other assertions which Microsoft has [documented](https://learn.microsoft.com/en-us/entra/identity-platform/reference-claims-customization#table-2-saml-restricted-claim-set).
@@ -132,15 +132,15 @@ http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress

You also need to configure the **Groups attribute** field if you want to use group synchronization. Group sync allows you to automatically map users to Grafana teams or role-based access control roles based on their SAML group membership.
-To learn more about how to configure group synchronization, refer to [Configure team sync]({{< relref "../../configure-team-sync" >}}) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
+To learn more about how to configure group synchronization, refer to [Configure team sync](../../configure-team-sync/) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
1. If you want to automatically assign users' roles based on their SAML roles, complete the **Role mapping** section.
First, you need to configure the **Role attribute** field to specify which SAML attribute should be used to retrieve SAML role information.
Then enter the SAML roles that you want to map to Grafana roles in **Role mapping** section. If you want to map multiple SAML roles to a Grafana role, separate them by a comma and a space. For example, `Editor: editor, developer`.
- Role mapping will automatically update user's [basic role]({{< relref "../../../../administration/roles-and-permissions/access-control#basic-roles" >}}) based on their SAML roles every time the user logs in to Grafana.
- Learn more about [SAML role synchronization]({{< relref "../saml#configure-role-sync" >}}).
+ Role mapping will automatically update user's [basic role](../../../../administration/roles-and-permissions/access-control/#basic-roles) based on their SAML roles every time the user logs in to Grafana.
+ Learn more about [SAML role synchronization](../saml/#configure-role-sync).
1. If you're setting up Grafana with Azure AD using the SAML protocol and want to fetch user groups from the Graph API, complete the **Azure AD Service Account Configuration** subsection.
1. Set up a service account in Azure AD and provide the necessary details in the **Azure AD Service Account Configuration** section.
@@ -155,7 +155,7 @@ To learn more about how to configure group synchronization, refer to [Configure
If you want users to have different roles in different organizations, you can additionally specify a role. For example, `Org mapping: Engineering:2:Editor` will map users who belong to `Engineering` organizations in SAML to Grafana organization with ID 2 and assign them Editor role.
Organization mapping will automatically update user's organization memberships (and roles, if they have been configured) based on their SAML organization every time the user logs in to Grafana.
- Learn more about [SAML organization mapping]({{< relref "../saml#configure-organization-mapping" >}}).
+ Learn more about [SAML organization mapping](../saml/#configure-organization-mapping).
1. If you want to limit the access to Grafana based on user's SAML organization membership, fill in the **Allowed organizations** field.
1. Click **Next: Test and enable**.
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
index 0a438b8c727..a04761c8b13 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
@@ -22,23 +22,23 @@ weight: 500
# Configure SAML authentication using the configuration file
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise" >}}) and [Grafana Cloud](/docs/grafana-cloud).
+Available in [Grafana Enterprise](/docs/grafana//introduction/grafana-enterprise/) and [Grafana Cloud](/docs/grafana-cloud).
{{% /admonition %}}
SAML authentication integration allows your Grafana users to log in by using an external SAML 2.0 Identity Provider (IdP). To enable this, Grafana becomes a Service Provider (SP) in the authentication flow, interacting with the IdP to exchange user information.
You can configure SAML authentication in Grafana through one of the following methods:
-- the Grafana configuration file
-- the API (refer to [SSO Settings API]({{< relref "../../../../developers/http_api/sso-settings" >}}))
-- the user interface (refer to [Configure SAML authentication using the Grafana user interface]({{< relref "../saml-ui" >}}))
-- the Terraform provider (refer to [Terraform docs](https://registry.terraform.io/providers/grafana/grafana/latest/docs/resources/sso_settings))
+- The Grafana configuration file
+- The API (refer to [SSO Settings API](/docs/grafana//developers/http_api/sso-settings/)
+- The user interface (refer to [Configure SAML authentication using the Grafana user interface](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-authentication/saml-ui/)
+- The Terraform provider (refer to [Terraform docs](https://registry.terraform.io/providers/grafana/grafana//docs/resources/sso_settings))
{{% admonition type="note" %}}
The API and Terraform support are available in Public Preview in Grafana v11.1 behind the `ssoSettingsSAML` feature toggle. You must also enable the `ssoSettingsApi` flag.
{{% /admonition %}}
-All methods offer the same configuration options, but you might prefer using the Grafana configuration file or the Terraform provider if you want to keep all of Grafana's authentication settings in one place. Grafana Cloud users do not have access to Grafana configuration file, so they should configure SAML through the other methods.
+All methods offer the same configuration options. However, if you want to keep all of Grafana authentication settings in one place, use the Grafana configuration file or the Terraform provider. If you are a Grafana Cloud user, you do not have access to Grafana configuration file. Instead, configure SAML through the other methods.
{{% admonition type="note" %}}
Configuration in the API takes precedence over the configuration in the Grafana configuration file. SAML settings from the API will override any SAML configuration set in the Grafana configuration file.
@@ -46,6 +46,10 @@ Configuration in the API takes precedence over the configuration in the Grafana
## Supported SAML
+The following indicate what Grafana supports.
+
+### Bindings
+
Grafana supports the following SAML 2.0 bindings:
- From the Service Provider (SP) to the Identity Provider (IdP):
@@ -56,44 +60,45 @@ Grafana supports the following SAML 2.0 bindings:
- From the Identity Provider (IdP) to the Service Provider (SP):
- `HTTP-POST` binding
-In terms of security:
+### Security
-- Grafana supports signed and encrypted assertions.
-- Grafana does not support signed or encrypted requests.
+Grafana supports signed and encrypted assertions, and does _not_ support encrypted requests.
-In terms of initiation, Grafana supports:
+### Initiation
+
+Grafana supports:
- SP-initiated requests
- IdP-initiated requests
-By default, SP-initiated requests are enabled. For instructions on how to enable IdP-initiated logins, see [IdP-initiated Single Sign-On (SSO)]({{< relref "#idp-initiated-single-sign-on-sso" >}}).
+By default, SP-initiated requests are enabled. For instructions on how to enable IdP-initiated logins, see [IdP-initiated Single Sign-On (SSO)](#idp-initiated-single-sign-on-sso).
{{% admonition type="note" %}}
It is possible to set up Grafana with SAML authentication using Azure AD. However, if an Azure AD user belongs to more than 150 groups, a Graph API endpoint is shared instead.
-Grafana versions 11.1 and below, do not support fetching the groups from the Graph API endpoint. As a result, users with more than 150 groups will not be able to retrieve their groups. Instead, it is recommended that you use OIDC/OAuth workflows,.
+Grafana versions 11.1 and below, do not support fetching the groups from the Graph API endpoint. As a result, users with more than 150 groups will not be able to retrieve their groups. Instead, it is recommended that you use OIDC/OAuth workflows.
As of Grafana 11.2, the SAML integration offers a mechanism to retrieve user groups from the Graph API.
Related links:
- [Azure AD SAML limitations](https://learn.microsoft.com/en-us/entra/identity-platform/id-token-claims-reference#groups-overage-claim)
-- [Set up SAML with Azure AD]({{< relref "#set-up-saml-with-azure-ad" >}})
-- [Configure a Graph API application in Azure AD]({{< relref "#configure-a-graph-api-application-in-azure-ad" >}})
+- [Set up SAML with Azure AD](#set-up-saml-with-azure-ad)
+- [Configure a Graph API application in Azure AD](#configure-a-graph-api-application-in-azure-ad)
{{% /admonition %}}
### Edit SAML options in the Grafana config file
-1. In the `[auth.saml]` section in the Grafana configuration file, set [`enabled`]({{< relref "../../../configure-grafana/enterprise-configuration#enabled" >}}) to `true`.
-1. Configure the [certificate and private key]({{< relref "#certificate-and-private-key" >}}).
+1. In the `[auth.saml]` section in the Grafana configuration file, set [`enabled`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#enabled-3) to `true`.
+1. Optionally, configure the [certificate and private key](#certificate-and-private-key").
1. On the Okta application page where you have been redirected after application created, navigate to the **Sign On** tab and find **Identity Provider metadata** link in the **Settings** section.
-1. Set the [`idp_metadata_url`]({{< relref "../../../configure-grafana/enterprise-configuration#idp_metadata_url" >}}) to the URL obtained from the previous step. The URL should look like `https://.okta.com/app//sso/saml/metadata`.
+1. Set the [`idp_metadata_url`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#idp_metadata_url) to the URL obtained from the previous step. The URL should look like `https://.okta.com/app//sso/saml/metadata`.
1. Set the following options to the attribute names configured at the **step 10** of the SAML integration setup. You can find this attributes on the **General** tab of the application page (**ATTRIBUTE STATEMENTS** and **GROUP ATTRIBUTE STATEMENTS** in the **SAML Settings** section).
- - [`assertion_attribute_login`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_login" >}})
- - [`assertion_attribute_email`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_email" >}})
- - [`assertion_attribute_name`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_name" >}})
- - [`assertion_attribute_groups`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_groups" >}})
-1. (Optional) Set the `name` parameter in the `[auth.saml]` section in the Grafana configuration file. This parameter replaces SAML in the Grafana user interface in locations such as the sign-in button.
+ - [`assertion_attribute_login`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#assertion_attribute_login)
+ - [`assertion_attribute_email`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#assertion_attribute_email)
+ - [`assertion_attribute_name`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#assertion_attribute_name)
+ - [`assertion_attribute_groups`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#assertion_attribute_groups)
+1. Optionally, set the `name` parameter in the `[auth.saml]` section in the Grafana configuration file. This parameter replaces SAML in the Grafana user interface in locations such as the sign-in button.
1. Save the configuration file and then restart the Grafana server.
When you are finished, the Grafana configuration might look like this example:
@@ -119,7 +124,7 @@ assertion_attribute_groups = Group
To use the SAML integration, in the `auth.saml` section of in the Grafana custom configuration file, set `enabled` to `true`.
-Refer to [Configuration]({{< relref "../../../configure-grafana" >}}) for more information about configuring Grafana.
+Refer to [Configuration](/docs/grafana//setup-grafana/configure-grafana/) for more information about configuring Grafana.
## Additional configuration for HTTP-Post binding
@@ -133,9 +138,11 @@ For Grafana Cloud instances, please contact Grafana Support to update the `conte
## Certificate and private key
+Commonly, the certificate and key are embedded in the [IDP metadata](#configure-the-saml-toolkit-application-endpoints) and refreshed as needed by Grafana automatically. However, if your IdP expects signed requests, you must supply a certificate and private key.
+
The SAML SSO standard uses asymmetric encryption to exchange information between the SP (Grafana) and the IdP. To perform such encryption, you need a public part and a private part. In this case, the X.509 certificate provides the public part, while the private key provides the private part. The private key needs to be issued in a [PKCS#8](https://en.wikipedia.org/wiki/PKCS_8) format.
-Grafana supports two ways of specifying both the `certificate` and `private_key`.
+If you are directly supplying the certificate and key, Grafana supports two ways of specifying both the `certificate` and `private_key`:
- Without a suffix (`certificate` or `private_key`), the configuration assumes you've supplied the base64-encoded file contents.
- With the `_path` suffix (`certificate_path` or `private_key_path`), then Grafana treats the value entered as a file path and attempts to read the file from the file system.
@@ -144,9 +151,9 @@ Grafana supports two ways of specifying both the `certificate` and `private_key`
You can only use one form of each configuration option. Using multiple forms, such as both `certificate` and `certificate_path`, results in an error.
{{% /admonition %}}
----
+Always work with your company's security team on setting up certificates and private keys. If you need to generate them yourself (such as in the short term, for testing purposes, and so on), use the following example to generate your certificate and private key, including the step of ensuring that the key is generated with the [PKCS#8](https://en.wikipedia.org/wiki/PKCS_8) format.
-### Generate private key for SAML authentication:
+### Example of private key generation for SAML authentication
An example of how to generate a self-signed certificate and private key that's valid for one year:
@@ -154,7 +161,15 @@ An example of how to generate a self-signed certificate and private key that's v
$ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
```
-The generated `key.pem` and `cert.pem` files are then used for certificate and private_key.
+Base64-encode the cert.pem and key.pem files:
+(-w0 switch is not needed on Mac, only for Linux)
+
+```sh
+$ base64 -i key.pem -o key.pem.base64
+$ base64 -i cert.pem -o cert.pem.base64
+```
+
+The base64-encoded values (`key.pem.base64, cert.pem.base64` files) are then used for certificate and private key.
The key you provide should look like:
@@ -169,16 +184,15 @@ The key you provide should look like:
Grafana supports user authentication through Azure AD, which is useful when you want users to access Grafana using single sign-on. This topic shows you how to configure SAML authentication in Grafana with [Azure AD](https://azure.microsoft.com/en-us/services/active-directory/).
-**Before you begin:**
+**Before you begin**
-- Ensure you have permission to administer SAML authentication. For more information about roles and permissions in Grafana.
- - [Roles and permissions]({{< relref "../../../../administration/roles-and-permissions" >}}).
-- Learn the limitations of Azure AD SAML integration.
- - [Azure AD SAML limitations](https://learn.microsoft.com/en-us/entra/identity-platform/id-token-claims-reference#groups-overage-claim)
-- Configure SAML integration with Azure AD, create an app integration inside the Azure AD organization first.
- - [Add app integration in Azure AD](https://docs.microsoft.com/en-us/azure/active-directory/manage-apps/add-application-portal-configure)
-- If you have users that belong to more than 150 groups, you need to configure a registered application to provide an Azure Graph API to retrieve the groups.
- - [Setup Azure AD Graph API applications]({{< relref "#set-up-saml-with-azure-ad" >}})
+Ensure you have permission to administer SAML authentication. For more information about roles and permissions in Grafana, refer to [Roles and permissions](/docs/grafana//administration/roles-and-permissions/).
+
+Learn the [limitations of Azure AD SAML] (https://learn.microsoft.com/en-us/entra/identity-platform/id-token-claims-reference#groups-overage-claim) integration.
+
+Configure SAML integration with Azure AD, [creating an Enterprise Application](#add-microsoft-entra-saml-toolkit-from-the-gallery) inside the Azure AD organization first and then [enable single sign-on](#configure-the-saml-toolkit-application-endpoints).
+
+If you have users that belong to more than 150 groups, configure a registered application to provide an Azure Graph API to retrieve the groups. Refer to [Setup Azure AD Graph API applications](#configure-a-graph-api-application-in-azure-ad).
### Generate self-signed certificates
@@ -277,7 +291,7 @@ Grafana supports user authentication through Okta, which is useful when you want
**Before you begin:**
- To configure SAML integration with Okta, create an app integration inside the Okta organization first. [Add app integration in Okta](https://help.okta.com/en/prod/Content/Topics/Apps/apps-overview-add-apps.htm)
-- Ensure you have permission to administer SAML authentication. For more information about roles and permissions in Grafana, refer to [Roles and permissions]({{< relref "../../../../administration/roles-and-permissions" >}}).
+- Ensure you have permission to administer SAML authentication. For more information about roles and permissions in Grafana, refer to [Roles and permissions](/docs/grafana//administration/roles-and-permissions/).
**To set up SAML with Okta:**
@@ -391,7 +405,7 @@ Additionally, Grafana did not support IdP sessions and could not include the `Se
Starting from Grafana version 11.5, Grafana uses the `NameID` from the SAML assertion to create the logout request. If the `NameID` is not present in the assertion, Grafana defaults to using the user's `Login` attribute. Additionally, Grafana supports including the `SessionIndex` in the logout request if it is provided in the SAML assertion by the IdP.
{{% admonition type="note" %}}
-These improvements are available in public preview behind the `improvedExternalSessionHandling` feature toggle, starting from Grafana v11.5. To enable it, refer to the [Configure feature toggles]({{< relref "../../../../setup-grafana/configure-grafana/feature-toggles/" >}})
+These improvements are available in public preview behind the `improvedExternalSessionHandlingSAML` feature toggle, starting from Grafana v11.5. To enable it, refer to the [Configure feature toggles](/docs/grafana//setup-grafana/configure-grafana/feature-toggles/)
{{% /admonition %}}
### Assertion mapping
@@ -435,11 +449,11 @@ auto_login = true
Group synchronization allows you to map user groups from an identity provider to Grafana teams and roles.
-To use SAML group synchronization, set [`assertion_attribute_groups`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_groups" >}}) to the attribute name where you store user groups.
+To use SAML group synchronization, set [`assertion_attribute_groups`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#assertion_attribute_groups) to the attribute name where you store user groups.
Then Grafana will use attribute values extracted from SAML assertion to add user to Grafana teams and grant them roles.
{{% admonition type="note" %}}
-Team sync allows you sync users from SAML to Grafana teams. It does not automatically create teams in Grafana. You need to create teams in Grafana before you can use this feature.
+Team sync allows you sync users from SAML to Grafana teams, but you must create teams in Grafana before you can use this feature. It does not automatically create teams in Grafana.
{{% /admonition %}}
Given the following partial SAML assertion:
@@ -474,22 +488,22 @@ The following `External Group ID`s would be valid for configuring team sync or r
- `admins_group`
- `division_1`
-To learn more about how to configure group synchronization, refer to [Configure team sync]({{< relref "../../configure-team-sync" >}}) and [Configure group attribute sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
+To learn more about how to configure group synchronization, refer to [Configure team sync](/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync/) and [Configure group attribute sync](/docs/grafana//setup-grafana/configure-security/configure-group-attribute-sync) documentation.
### Configure role sync
-Role sync allows you to map user roles from an identity provider to Grafana. To enable role sync, configure role attribute and possible values for the Editor, Admin, and Grafana Admin roles. For more information about user roles, refer to [Roles and permissions]({{< relref "../../../../administration/roles-and-permissions" >}}).
+Role sync allows you to map user roles from an identity provider to Grafana. To enable role sync, configure role attribute and possible values for the Editor, Admin, and Grafana Admin roles. For more information about user roles, refer to [Roles and permissions](/docs/grafana//administration/roles-and-permissions/).
-1. In the configuration file, set [`assertion_attribute_role`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_role" >}}) option to the attribute name where the role information will be extracted from.
-1. Set the [`role_values_none`]({{< relref "../../../configure-grafana/enterprise-configuration#role_values_none" >}}) option to the values mapped to the `None` role.
-1. Set the [`role_values_viewer`]({{< relref "../../../configure-grafana/enterprise-configuration#role_values_viewer" >}}) option to the values mapped to the `Viewer` role.
-1. Set the [`role_values_editor`]({{< relref "../../../configure-grafana/enterprise-configuration#role_values_editor" >}}) option to the values mapped to the `Editor` role.
-1. Set the [`role_values_admin`]({{< relref "../../../configure-grafana/enterprise-configuration#role_values_admin" >}}) option to the values mapped to the organization `Admin` role.
-1. Set the [`role_values_grafana_admin`]({{< relref "../../../configure-grafana/enterprise-configuration#role_values_grafana_admin" >}}) option to the values mapped to the `Grafana Admin` role.
+1. In the configuration file, set [`assertion_attribute_role`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#assertion_attribute_role) option to the attribute name where the role information will be extracted from.
+1. Set the [`role_values_none`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#role_values_none) option to the values mapped to the `None` role.
+1. Set the [`role_values_viewer`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#role_values_viewer) option to the values mapped to the `Viewer` role.
+1. Set the [`role_values_editor`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#role_values_editor) option to the values mapped to the `Editor` role.
+1. Set the [`role_values_admin`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#role_values_admin) option to the values mapped to the organization `Admin` role.
+1. Set the [`role_values_grafana_admin`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#role_values_grafana_admin) option to the values mapped to the `Grafana Admin` role.
If a user role doesn't match any of configured values, then the role specified by the `auto_assign_org_role` config option will be assigned. If the `auto_assign_org_role` field is not set then the user role will default to `Viewer`.
-For more information about roles and permissions in Grafana, refer to [Roles and permissions]({{< relref "../../../../administration/roles-and-permissions" >}}).
+For more information about roles and permissions in Grafana, refer to [Roles and permissions](/docs/grafana//administration/roles-and-permissions/).
Example configuration:
@@ -518,8 +532,8 @@ skip_org_role_sync = true
Organization mapping allows you to assign users to particular organization in Grafana depending on attribute value obtained from identity provider.
-1. In configuration file, set [`assertion_attribute_org`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_org" >}}) to the attribute name you store organization info in. This attribute can be an array if you want a user to be in multiple organizations.
-1. Set [`org_mapping`]({{< relref "../../../configure-grafana/enterprise-configuration#org_mapping" >}}) option to the comma-separated list of `Organization:OrgId` pairs to map organization from IdP to Grafana organization specified by ID. If you want users to have different roles in multiple organizations, you can set this option to a comma-separated list of `Organization:OrgId:Role` mappings.
+1. In configuration file, set [`assertion_attribute_org`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#assertion_attribute_org) to the attribute name you store organization info in. This attribute can be an array if you want a user to be in multiple organizations.
+1. Set [`org_mapping`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#org_mapping) option to the comma-separated list of `Organization:OrgId` pairs to map organization from IdP to Grafana organization specified by ID. If you want users to have different roles in multiple organizations, you can set this option to a comma-separated list of `Organization:OrgId:Role` mappings.
For example, use following configuration to assign users from `Engineering` organization to the Grafana organization with ID `2` as Editor and users from `Sales` - to the org with ID `3` as Admin, based on `Org` assertion attribute value:
@@ -566,7 +580,7 @@ You can use `*` as the Grafana organization in the mapping if you want all users
### Configure allowed organizations
-With the [`allowed_organizations`]({{< relref "../../../configure-grafana/enterprise-configuration#allowed_organizations" >}}) option you can specify a list of organizations where the user must be a member of at least one of them to be able to log in to Grafana.
+With the [`allowed_organizations`](/docs/grafana//setup-grafana/configure-grafana/enterprise-configuration/#allowed_organizations) option you can specify a list of organizations where the user must be a member of at least one of them to be able to log in to Grafana.
To put values containing spaces in the list, use the following JSON syntax:
@@ -632,11 +646,11 @@ resource "grafana_sso_settings" "saml_sso_settings" {
}
```
-Go to [Terraform Registry](https://registry.terraform.io/providers/grafana/grafana/latest/docs/resources/sso_settings) for a complete reference on using the `grafana_sso_settings` resource.
+Go to [Terraform Registry](https://registry.terraform.io/providers/grafana/grafana//docs/resources/sso_settings) for a complete reference on using the `grafana_sso_settings` resource.
## Troubleshoot SAML authentication in Grafana
-To troubleshoot and get more log information, enable SAML debug logging in the configuration file. Refer to [Configuration]({{< relref "../../../configure-grafana#filters" >}}) for more information.
+To troubleshoot and get more log information, enable SAML debug logging in the configuration file. Refer to [Configuration](/docs/grafana//setup-grafana/configure-grafana/#filters) for more information.
```ini
[log]
@@ -692,7 +706,7 @@ The keys you provide should look like:
When the user logs in using SAML and gets presented with "origin not allowed", the user might be issuing the login from an IdP (identity provider) service or the user is behind a reverse proxy. This potentially happens as Grafana's CSRF checks deem the requests to be invalid. For more information [CSRF](https://owasp.org/www-community/attacks/csrf).
-To solve this issue, you can configure either the [`csrf_trusted_origins`]({{< relref "../../../configure-grafana#csrf_trusted_origins" >}}) or [`csrf_additional_headers`]({{< relref "../../../configure-grafana#csrf_additional_headers" >}}) option in the SAML configuration.
+To solve this issue, you can configure either the [`csrf_trusted_origins`](/docs/grafana//setup-grafana/configure-grafana/#csrf_trusted_origins) or [`csrf_additional_headers`](/docs/grafana//setup-grafana/configure-grafana/#csrf_additional_headers) option in the SAML configuration.
Example of a configuration file:
@@ -735,7 +749,7 @@ Ensure cookie_secure is set to true to ensure that cookies are only sent over HT
## Configure SAML authentication in Grafana
-The table below describes all SAML configuration options. Continue reading below for details on specific options. Like any other Grafana configuration, you can apply these options as [environment variables]({{< relref "../../../configure-grafana#override-configuration-with-environment-variables" >}}).
+The table below describes all SAML configuration options. Continue reading below for details on specific options. Like any other Grafana configuration, you can apply these options as [environment variables](/docs/grafana//setup-grafana/configure-grafana/#override-configuration-with-environment-variables).
| Setting | Required | Description | Default |
| ---------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------- |
diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/_index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/_index.md
index 52a34ebc39b..a6f7f132ca0 100644
--- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/_index.md
@@ -16,32 +16,32 @@ weight: 700
Grafana’s database contains secrets, which are used to query data sources, send alert notifications, and perform other functions within Grafana.
-Grafana encrypts these secrets before they are written to the database, by using a symmetric-key encryption algorithm called Advanced Encryption Standard (AES). These secrets are signed using a [secret key]({{< relref "../../configure-grafana#secret_key" >}}) that you can change when you configure a new Grafana instance.
+Grafana encrypts these secrets before they are written to the database, by using a symmetric-key encryption algorithm called Advanced Encryption Standard (AES). These secrets are signed using a [secret key](../../configure-grafana/#secret_key) that you can change when you configure a new Grafana instance.
{{% admonition type="note" %}}
Grafana v9.0 and newer use [envelope encryption](#envelope-encryption) by default, which adds a layer of indirection to the encryption process that introduces an [**implicit breaking change**](#implicit-breaking-change) for older versions of Grafana.
{{% /admonition %}}
-For further details about how to operate a Grafana instance with envelope encryption, see the [Operational work]({{< relref "#operational-work" >}}) section.
+For further details about how to operate a Grafana instance with envelope encryption, see the [Operational work](#operational-work) section.
{{% admonition type="note" %}}
-In Grafana Enterprise, you can also [encrypt secrets in AES-GCM (Galois/Counter Mode)]({{< relref "#changing-your-encryption-mode-to-aes-gcm" >}}) instead of the default AES-CFB (Cipher FeedBack mode).
+In Grafana Enterprise, you can also [encrypt secrets in AES-GCM (Galois/Counter Mode)](#changing-your-encryption-mode-to-aes-gcm) instead of the default AES-CFB (Cipher FeedBack mode).
{{% /admonition %}}
## Envelope encryption
{{% admonition type="note" %}}
-Since Grafana v9.0, you can turn envelope encryption off by adding the feature toggle `disableEnvelopeEncryption` to your [Grafana configuration]({{< relref "../../configure-grafana#feature_toggles" >}}).
+Since Grafana v9.0, you can turn envelope encryption off by adding the feature toggle `disableEnvelopeEncryption` to your [Grafana configuration](../../configure-grafana/#feature_toggles).
{{% /admonition %}}
Instead of encrypting all secrets with a single key, Grafana uses a set of keys called data encryption keys (DEKs) to encrypt them. These data encryption keys are themselves encrypted with a single key encryption key (KEK), configured through the `secret_key` attribute in your
-[Grafana configuration]({{< relref "../../configure-grafana#secret_key" >}}) or by [Encrypting your database with a key from a key management service (KMS)](#encrypting-your-database-with-a-key-from-a-key-management-service-kms).
+[Grafana configuration](../../configure-grafana/#secret_key) or by [Encrypting your database with a key from a key management service (KMS)](#encrypting-your-database-with-a-key-from-a-key-management-service-kms).
### Implicit breaking change
Envelope encryption introduces an implicit breaking change to versions of Grafana prior to v9.0, because it changes how secrets stored in the Grafana database are encrypted. Grafana administrators can upgrade to Grafana v9.0 with no action required from the database encryption perspective, but must be extremely careful if they need to roll an upgrade back to Grafana v8.5 or earlier because secrets created or modified after upgrading to Grafana v9.0 can’t be decrypted by previous versions.
-Grafana v8.5 implemented envelope encryption behind an optional feature toggle. Grafana administrators who need to downgrade to Grafana v8.5 can enable envelope encryption as a workaround by adding the feature toggle `envelopeEncryption` to the [Grafana configuration]({{< relref "../../configure-grafana#feature_toggles" >}}).
+Grafana v8.5 implemented envelope encryption behind an optional feature toggle. Grafana administrators who need to downgrade to Grafana v8.5 can enable envelope encryption as a workaround by adding the feature toggle `envelopeEncryption` to the [Grafana configuration](../../configure-grafana/#feature_toggles).
## Operational work
@@ -59,19 +59,19 @@ You can re-encrypt secrets in order to:
- Move already existing secrets' encryption forward from legacy to envelope encryption.
- Re-encrypt secrets after a [data keys rotation](#rotate-data-keys).
-To re-encrypt secrets, use the [Grafana CLI]({{< relref "../../../cli" >}}) by running the `grafana cli admin secrets-migration re-encrypt` command or the `/encryption/reencrypt-secrets` endpoint of the Grafana [Admin API]({{< relref "../../../developers/http_api/admin#roll-back-secrets" >}}). It's safe to run more than once, more recommended under maintenance mode.
+To re-encrypt secrets, use the [Grafana CLI](../../../cli/) by running the `grafana cli admin secrets-migration re-encrypt` command or the `/encryption/reencrypt-secrets` endpoint of the Grafana [Admin API](../../../developers/http_api/admin/#roll-back-secrets). It's safe to run more than once, more recommended under maintenance mode.
### Roll back secrets
You can roll back secrets encrypted with envelope encryption to legacy encryption. This might be necessary to downgrade to Grafana versions prior to v9.0 after an unsuccessful upgrade.
-To roll back secrets, use the [Grafana CLI]({{< relref "../../../cli" >}}) by running the `grafana cli admin secrets-migration rollback` command or the `/encryption/rollback-secrets` endpoint of the Grafana [Admin API]({{< relref "../../../developers/http_api/admin#re-encrypt-secrets" >}}). It's safe to run more than once, more recommended under maintenance mode.
+To roll back secrets, use the [Grafana CLI](../../../cli/) by running the `grafana cli admin secrets-migration rollback` command or the `/encryption/rollback-secrets` endpoint of the Grafana [Admin API](../../../developers/http_api/admin/#re-encrypt-secrets). It's safe to run more than once, more recommended under maintenance mode.
### Re-encrypt data keys
You can re-encrypt data keys encrypted with a specific key encryption key (KEK). This allows you to either re-encrypt existing data keys with a new KEK version or to re-encrypt them with a completely different KEK.
-To re-encrypt data keys, use the [Grafana CLI]({{< relref "../../../cli" >}}) by running the `grafana cli admin secrets-migration re-encrypt-data-keys` command or the `/encryption/reencrypt-data-keys` endpoint of the Grafana [Admin API]({{< relref "../../../developers/http_api/admin#re-encrypt-data-encryption-keys" >}}). It's safe to run more than once, more recommended under maintenance mode.
+To re-encrypt data keys, use the [Grafana CLI](../../../cli/) by running the `grafana cli admin secrets-migration re-encrypt-data-keys` command or the `/encryption/reencrypt-data-keys` endpoint of the Grafana [Admin API](../../../developers/http_api/admin/#re-encrypt-data-encryption-keys). It's safe to run more than once, more recommended under maintenance mode.
### Rotate data keys
@@ -85,7 +85,7 @@ secrets still encrypted with them. To completely stop using
rotated data keys for both encryption and decryption, see [secrets re-encryption](#re-encrypt-secrets).
{{% /admonition %}}
-To rotate data keys, use the `/encryption/rotate-data-keys` endpoint of the Grafana [Admin API]({{< relref "../../../developers/http_api/admin#rotate-data-encryption-keys" >}}). It's safe to call more than once, more recommended under maintenance mode.
+To rotate data keys, use the `/encryption/rotate-data-keys` endpoint of the Grafana [Admin API](../../../developers/http_api/admin/#rotate-data-encryption-keys). It's safe to call more than once, more recommended under maintenance mode.
## Encrypting your database with a key from a key management service (KMS)
@@ -95,13 +95,13 @@ You can choose to encrypt secrets stored in the Grafana database using a key fro
Grafana integrates with the following key management services:
-- [AWS KMS]({{< relref "./encrypt-secrets-using-aws-kms" >}})
-- [Azure Key Vault]({{< relref "./encrypt-secrets-using-azure-key-vault" >}})
-- [Google Cloud KMS]({{< relref "./encrypt-secrets-using-google-cloud-kms" >}})
-- [Hashicorp Key Vault]({{< relref "./encrypt-secrets-using-hashicorp-key-vault" >}})
+- [AWS KMS](encrypt-secrets-using-aws-kms/)
+- [Azure Key Vault](encrypt-secrets-using-azure-key-vault/)
+- [Google Cloud KMS](encrypt-secrets-using-google-cloud-kms/)
+- [Hashicorp Key Vault](encrypt-secrets-using-hashicorp-key-vault/)
## Changing your encryption mode to AES-GCM
Grafana encrypts secrets using Advanced Encryption Standard in Cipher FeedBack mode (AES-CFB). You might prefer to use AES in Galois/Counter Mode (AES-GCM) instead, to meet your company’s security requirements or in order to maintain consistency with other services.
-To change your encryption mode, update the `algorithm` value in the `[security.encryption]` section of your Grafana configuration file. For further details, refer to [Enterprise configuration]({{< relref "../../configure-grafana/enterprise-configuration#securityencryption" >}}).
+To change your encryption mode, update the `algorithm` value in the `[security.encryption]` section of your Grafana configuration file. For further details, refer to [Enterprise configuration](../../configure-grafana/enterprise-configuration/#securityencryption).
diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-aws-kms/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-aws-kms/index.md
index f27851f1bd4..d081a085cb6 100644
--- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-aws-kms/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-aws-kms/index.md
@@ -17,7 +17,7 @@ You can use an encryption key from AWS Key Management Service to encrypt secrets
**Prerequisites:**
- An AWS account with permission to view and create KMS keys and programmatic credentials to access those keys
-- Access to the Grafana [configuration]({{< relref "../../../configure-grafana#configuration-file-location" >}}) file
+- Access to the Grafana [configuration](../../../configure-grafana/#configuration-file-location) file
1. Create a symmetric API key either from the AWS Management Console or by using the AWS KMS API.
For detailed instructions, refer to [Creating keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html).
diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-azure-key-vault/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-azure-key-vault/index.md
index e90f81bc6d0..a13d6f7b41e 100644
--- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-azure-key-vault/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-azure-key-vault/index.md
@@ -17,7 +17,7 @@ You can use an encryption key from Azure Key Vault to encrypt secrets in the Gra
**Prerequisites:**
- An Azure account with permission to view and create Key Vault keys and programmatic credentials to access those keys
-- Access to the Grafana [configuration]({{< relref "../../../configure-grafana#configuration-file-location" >}}) file
+- Access to the Grafana [configuration](../../../configure-grafana/#configuration-file-location) file
1. [Create a vault](https://docs.microsoft.com/en-us/azure/key-vault/general/quick-create-portal#create-a-vault).
diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-google-cloud-kms/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-google-cloud-kms/index.md
index 240836fa303..3d90697e310 100644
--- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-google-cloud-kms/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-google-cloud-kms/index.md
@@ -17,7 +17,7 @@ You can use an encryption key from Google Cloud Key Management Service to encryp
**Prerequisites:**
- A Google Cloud account with permission to list and create KMS keys and service accounts to access those keys
-- Access to the Grafana [configuration]({{< relref "../../../configure-grafana#configuration-file-location" >}}) file
+- Access to the Grafana [configuration](../../../configure-grafana/#configuration-file-location) file
1. [Create a key ring](https://cloud.google.com/kms/docs/creating-keys#kms-create-key-ring-console) in Google Cloud KMS.
diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/index.md
index 76bfd46686a..e15a46679b0 100644
--- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/index.md
@@ -17,7 +17,7 @@ You can use an encryption key from Hashicorp Vault to encrypt secrets in the Gra
**Prerequisites:**
- Permissions to manage Hashicorp Vault to enable secrets engines and issue tokens.
-- Access to the Grafana [configuration]({{< relref "../../../configure-grafana#configuration-file-location" >}}) file
+- Access to the Grafana [configuration](../../../configure-grafana/#configuration-file-location) file
1. [Enable the transit secrets engine](https://www.vaultproject.io/docs/secrets/transit#setup) in Hashicorp Vault.
diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/integrate-with-hashicorp-vault/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/integrate-with-hashicorp-vault/index.md
index 12e8707d459..4af6636eaef 100644
--- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/integrate-with-hashicorp-vault/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/integrate-with-hashicorp-vault/index.md
@@ -13,14 +13,14 @@ weight: 500
# Integrate Grafana with Hashicorp Vault
-If you manage your secrets with [Hashicorp Vault](https://www.hashicorp.com/products/vault), you can use them for [Configuration]({{< relref "../../../configure-grafana" >}}) and [Provisioning]({{< relref "../../../../administration/provisioning" >}}).
+If you manage your secrets with [Hashicorp Vault](https://www.hashicorp.com/products/vault), you can use them for [Configuration](../../../configure-grafana/) and [Provisioning](../../../../administration/provisioning/).
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../../../introduction/grafana-enterprise" >}}).
+Available in [Grafana Enterprise](../../../../introduction/grafana-enterprise/).
{{% /admonition %}}
{{% admonition type="note" %}}
-If you have Grafana [set up for high availability]({{< relref "../../../set-up-for-high-availability" >}}), then we advise not to use dynamic secrets for provisioning files.
+If you have Grafana [set up for high availability](../../../set-up-for-high-availability/), then we advise not to use dynamic secrets for provisioning files.
Each Grafana instance is responsible for renewing its own leases. Your data source leases might expire when one of your Grafana servers shuts down.
{{% /admonition %}}
@@ -63,7 +63,7 @@ token = s.sAZLyI0r7sFLMPq6MWtoOhAN # replace with your key
## Using the Vault expander
After you configure Vault, you must set the configuration or provisioning files you wish to
-use Vault. Vault configuration is an extension of configuration's [variable expansion]({{< relref "../../../configure-grafana#variable-expansion" >}}) and follows the
+use Vault. Vault configuration is an extension of configuration's [variable expansion](../../../configure-grafana/#variable-expansion) and follows the
`$__vault{}` syntax.
The argument to Vault consists of three parts separated by a colon:
@@ -101,12 +101,12 @@ $__vault{database:database/creds/grafana:username}
### Examples
-The following examples show you how to set your [configuration]({{< relref "../../../configure-grafana" >}}) or [provisioning]({{< relref "../../../../administration/provisioning" >}}) files to use Vault to retrieve configuration values.
+The following examples show you how to set your [configuration](../../../configure-grafana/) or [provisioning](../../../../administration/provisioning/) files to use Vault to retrieve configuration values.
#### Configuration
The following is a partial example for using Vault to set up a Grafana configuration file's email and database credentials.
-Refer to [Configuration]({{< relref "../../../configure-grafana" >}}) for more information.
+Refer to [Configuration](../../../configure-grafana/) for more information.
```ini
[smtp]
@@ -127,7 +127,7 @@ password = $__vault{database:database/creds/grafana:password}
The following is a full examples of a provisioning YAML file setting up a MySQL data source using Vault's
database secrets engine.
-Refer to [Provisioning]({{< relref "../../../../administration/provisioning" >}}) for more information.
+Refer to [Provisioning](../../../../administration/provisioning/) for more information.
**provisioning/custom.yaml**
diff --git a/docs/sources/setup-grafana/configure-security/configure-group-attribute-sync.md b/docs/sources/setup-grafana/configure-security/configure-group-attribute-sync.md
index 0ebe9f3db6c..ff963122050 100644
--- a/docs/sources/setup-grafana/configure-security/configure-group-attribute-sync.md
+++ b/docs/sources/setup-grafana/configure-security/configure-group-attribute-sync.md
@@ -16,8 +16,7 @@ Groups are mapped to [fixed](https://grafana.com/docs/grafana//
> **Note:** Available in [Grafana Enterprise](https://grafana.com/docs/grafana//introduction/grafana-enterprise) and [Grafana Cloud](/docs/grafana-cloud/).
{{% admonition type="note" %}}
-This feature is behind the `groupAttributeSync` feature toggle.
-You can enable feature toggles through configuration file or environment variables. See configuration [docs](/docs/grafana//setup-grafana/configure-grafana/#feature_toggles) for details.
+This feature is currently in [private preview](https://grafana.com/docs/release-life-cycle/#private-preview) and behind the `groupAttributeSync` feature toggle. Please contact support to have this feature enabled.
{{% /admonition %}}
When a user logs in, Grafana checks the user's external group memberships and the configured group to role mappings to assign the corresponding roles to the user.
diff --git a/docs/sources/setup-grafana/configure-security/configure-request-security.md b/docs/sources/setup-grafana/configure-security/configure-request-security.md
index 3a5c393a22d..3ef83ccdcb6 100644
--- a/docs/sources/setup-grafana/configure-security/configure-request-security.md
+++ b/docs/sources/setup-grafana/configure-security/configure-request-security.md
@@ -19,7 +19,7 @@ Request security allows you to limit requests from the Grafana server by targeti
This can be used to limit access to internal systems that the server Grafana runs on can access but that users of Grafana should not be able to access. This feature does not affect traffic from the Grafana users browser.
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise" >}}) and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
+Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
{{% /admonition %}}
{{% admonition type="note" %}}
diff --git a/docs/sources/setup-grafana/configure-security/configure-security-hardening/index.md b/docs/sources/setup-grafana/configure-security/configure-security-hardening/index.md
index bc0dae58b4a..f5e66394faf 100644
--- a/docs/sources/setup-grafana/configure-security/configure-security-hardening/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-security-hardening/index.md
@@ -15,7 +15,7 @@ title: Configure security hardening
Security hardening enables you to apply additional security, which can help stop certain vulnerabilities from being exploited by a malicious attacker.
{{% admonition type="note" %}}
-These settings are available in the [grafana.ini configuration file]({{< relref "../../configure-grafana#configuration-file-location" >}}). To apply changes to the configuration file, restart the Grafana server.
+These settings are available in the [grafana.ini configuration file](../../configure-grafana/#configuration-file-location). To apply changes to the configuration file, restart the Grafana server.
{{% /admonition %}}
## Additional security for cookies
diff --git a/docs/sources/setup-grafana/configure-security/configure-team-sync.md b/docs/sources/setup-grafana/configure-security/configure-team-sync.md
index 89665525574..dfe6d4f2c99 100644
--- a/docs/sources/setup-grafana/configure-security/configure-team-sync.md
+++ b/docs/sources/setup-grafana/configure-security/configure-team-sync.md
@@ -16,7 +16,7 @@ weight: 1000
Team sync lets you set up synchronization between your auth providers teams and teams in Grafana. This enables LDAP, OAuth, or SAML users who are members of certain teams or groups to automatically be added or removed as members of certain teams in Grafana.
-> **Note:** Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise" >}}) and [Grafana Cloud Advanced](/docs/grafana-cloud/).
+> **Note:** Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud Advanced](/docs/grafana-cloud/).
Grafana keeps track of all synchronized users in teams, and you can see which users have been synchronized in the team members list, see `LDAP` label in screenshot.
This mechanism allows Grafana to remove an existing synchronized user from a team when its group membership changes. This mechanism also enables you to manually add a user as member of a team, and it will not be removed when the user signs in. This gives you flexibility to combine LDAP group memberships and Grafana team memberships.
diff --git a/docs/sources/setup-grafana/configure-security/export-logs.md b/docs/sources/setup-grafana/configure-security/export-logs.md
index 56c6dfc9831..d3b1c1e1530 100644
--- a/docs/sources/setup-grafana/configure-security/export-logs.md
+++ b/docs/sources/setup-grafana/configure-security/export-logs.md
@@ -18,7 +18,7 @@ weight: 900
# Export logs of usage insights
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise" >}}) and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
+Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud Pro and Advanced](/docs/grafana-cloud/).
{{% /admonition %}}
By exporting usage logs to Loki, you can directly query them and create dashboards of the information that matters to you most, such as dashboard errors, most active organizations, or your top-10 most-used queries. This configuration is done for you in Grafana Cloud, with provisioned dashboards. Read about them in the [Grafana Cloud documentation](/docs/grafana-cloud/usage-insights/).
@@ -66,7 +66,7 @@ Logs of usage insights contain the following fields, where the fields followed b
## Configuration
-To export your logs, enable the usage insights feature and [configure]({{< relref "../../setup-grafana/configure-grafana" >}}) an export location in the configuration file:
+To export your logs, enable the usage insights feature and [configure](../../configure-grafana/) an export location in the configuration file:
```ini
[usage_insights.export]
@@ -96,7 +96,7 @@ tls = true
tenant_id =
```
-Using `logger` will print usage insights to your [Grafana server log]({{< relref "../../setup-grafana/configure-grafana#log" >}}).
+Using `logger` will print usage insights to your [Grafana server log](../../configure-grafana/#log).
There is no option for configuring the `logger` storage type.
## Visualize Loki usage insights in Grafana
@@ -110,4 +110,4 @@ If you export logs into Loki, you can build Grafana dashboards to understand you
1. Play with usage insights to understand them:
- In Explore, you can use the query `{datasource="gdev-loki",kind="usage_insights"}` to retrieve all logs related to your `gdev-loki` data source.
- In a dashboard, you can build a table panel with the query `topk(10, sum by (error) (count_over_time({kind="usage_insights", datasource="gdev-prometheus"} | json | error != "" [$__interval])))` to display the 10 most common errors your users see using the `gdev-prometheus` data source.
- - In a dashboard, you can build a graph panel with the queries `sum by(host) (count_over_time({kind="usage_insights"} | json | eventName="data-request" | error != "" [$__interval]))` and `sum by(host) (count_over_time({kind="usage_insights"} | json | eventName="data-request" | error = "" [$__interval]))` to show the evolution of the data request count over time. Using `by (host)` allows you to have more information for each Grafana server you have if you have set up Grafana for [high availability](<{{< relref "../../setup-grafana/set-up-for-high-availability/" >}}>).
+ - In a dashboard, you can build a graph panel with the queries `sum by(host) (count_over_time({kind="usage_insights"} | json | eventName="data-request" | error != "" [$__interval]))` and `sum by(host) (count_over_time({kind="usage_insights"} | json | eventName="data-request" | error = "" [$__interval]))` to show the evolution of the data request count over time. Using `by (host)` allows you to have more information for each Grafana server you have if you have set up Grafana for [high availability](../../set-up-for-high-availability/).
diff --git a/docs/sources/setup-grafana/configure-security/planning-iam-strategy/index.md b/docs/sources/setup-grafana/configure-security/planning-iam-strategy/index.md
index 92ac9f1c5f3..d553d33c343 100644
--- a/docs/sources/setup-grafana/configure-security/planning-iam-strategy/index.md
+++ b/docs/sources/setup-grafana/configure-security/planning-iam-strategy/index.md
@@ -12,7 +12,7 @@ keywords:
# Plan your IAM integration strategy
-This section describes the decisions you should make when using an Identity and Access Management (IAM) provider to manage access to Grafana. IAM ensures that users have secure access to sensitive data and [other resources]({{< relref "../../../administration/data-source-management" >}}), simplifying user management and authentication.
+This section describes the decisions you should make when using an Identity and Access Management (IAM) provider to manage access to Grafana. IAM ensures that users have secure access to sensitive data and [other resources](../../../administration/data-source-management/), simplifying user management and authentication.
## Benefits of integrating with an IAM provider
@@ -33,12 +33,12 @@ In order to plan an integration with Grafana, assess your organization's current
As a first step, determine how you want to manage users who will access Grafana.
Do you already use an identity provider to manage users? If so, Grafana might be able to integrate with your identity provider through one of our IdP integrations.
-Refer to [Configure authentication documentation]({{< relref "../../configure-security/configure-authentication" >}}) for the list of supported providers.
+Refer to [Configure authentication documentation](../configure-authentication/) for the list of supported providers.
If you are not interested in setting up an external identity provider, but still want to limit access to your Grafana instance, consider using Grafana's basic authentication.
Finally, if you want your Grafana instance to be accessible to everyone, you can enable anonymous access to Grafana.
-For information, refer to the [anonymous authentication documentation]({{< relref "../../configure-security/configure-authentication#anonymous-authentication" >}}).
+For information, refer to the [anonymous authentication documentation](../configure-authentication/#anonymous-authentication).
## Ways to organize users
@@ -51,7 +51,7 @@ Organize users in subgroups that are sensible to the organization. For example:
### Users in Grafana teams
-You can organize users into [teams]({{< relref "../../../administration/team-management" >}}) and assign them roles and permissions reflecting the current organization. For example, instead of assigning five users access to the same dashboard, you can create a team of those users and assign dashboard permissions to the team.
+You can organize users into [teams](../../../administration/team-management/) and assign them roles and permissions reflecting the current organization. For example, instead of assigning five users access to the same dashboard, you can create a team of those users and assign dashboard permissions to the team.
A user can belong to multiple teams and be a member or an administrator for a given team. Team members inherit permissions from the team but cannot edit the team itself. Team administrators can add members to a team and update its settings, such as the team name, team members, roles assigned, and UI preferences.
@@ -59,17 +59,17 @@ Teams are a perfect solution for working with a subset of users. Teams can share
### Users in Grafana organizations
-[Grafana organizations]({{< relref "../../../administration/organization-management" >}}) allow complete isolation of resources, such as dashboards and data sources. Users can be members of one or several organizations, and they can only access resources from an organization they belong to.
+[Grafana organizations](../../../administration/organization-management/) allow complete isolation of resources, such as dashboards and data sources. Users can be members of one or several organizations, and they can only access resources from an organization they belong to.
Having multiple organizations in a single instance of Grafana lets you manage your users in one place while completely separating resources.
-Organizations provide a higher measure of isolation within Grafana than teams do and can be helpful in certain scenarios. However, because organizations lack the scalability and flexibility of teams and [folders]({{< relref "../../../dashboards/manage-dashboards#create-a-dashboard-folder" >}}), we do not recommend using them as the default way to group users and resources.
+Organizations provide a higher measure of isolation within Grafana than teams do and can be helpful in certain scenarios. However, because organizations lack the scalability and flexibility of teams and [folders](../../../dashboards/manage-dashboards/#create-a-dashboard-folder), we do not recommend using them as the default way to group users and resources.
Note that Grafana Cloud does not support having more than 1 organizations per instance.
### Choosing between teams and organizations
-[Grafana teams]({{< relref "../../../administration/team-management" >}}) and Grafana organizations serve similar purposes in the Grafana platform. Both are designed to help group users and manage and control access to resources.
+[Grafana teams](../../../administration/team-management/) and Grafana organizations serve similar purposes in the Grafana platform. Both are designed to help group users and manage and control access to resources.
Teams provide more flexibility, as resources can be accessible by multiple teams, and team creation and management are simple.
@@ -106,7 +106,7 @@ A common use case for creating a service account is to perform operations on aut
- Set up an external SAML authentication provider
- Interact with Grafana without signing in as a user
-In [Grafana Enterprise]({{< relref "../../../introduction/grafana-enterprise" >}}), you can also use service accounts in combination with [role-based access control]({{< relref "../../../administration/roles-and-permissions/access-control" >}}) to grant very specific permissions to applications that interact with Grafana.
+In [Grafana Enterprise](../../../introduction/grafana-enterprise/), you can also use service accounts in combination with [role-based access control](../../../administration/roles-and-permissions/access-control/) to grant very specific permissions to applications that interact with Grafana.
{{% admonition type="note" %}}
Service accounts can only act in the organization they are created for. We recommend creating service accounts in each organization if you have the same task needed for multiple organizations.
@@ -136,7 +136,7 @@ Service account access tokens inherit permissions from the service account.
### API keys
{{% admonition type="note" %}}
-Grafana recommends using service accounts instead of API keys. API keys will be deprecated in the near future. For more information, refer to [Grafana service accounts]({{< relref ".#service-accounts" >}}).
+Grafana recommends using service accounts instead of API keys. API keys will be deprecated in the near future. For more information, refer to [Grafana service accounts](./#service-accounts).
{{% /admonition %}}
You can use Grafana API keys to interact with data sources via HTTP APIs.
@@ -149,7 +149,7 @@ You can assign roles through the user interface or APIs, establish them through
### What are roles?
-Within an organization, Grafana has established three primary [organization roles]({{< relref "../../../administration/roles-and-permissions#organization-roles" >}}) - organization administrator, editor, and viewer - which dictate the user's level of access and permissions, including the ability to edit data sources or create teams. Grafana also has an empty role that you can start with and to which you can gradually add custom permissions.
+Within an organization, Grafana has established three primary [organization roles](../../../administration/roles-and-permissions/#organization-roles) - organization administrator, editor, and viewer - which dictate the user's level of access and permissions, including the ability to edit data sources or create teams. Grafana also has an empty role that you can start with and to which you can gradually add custom permissions.
To be a member of any organization, every user must be assigned a role.
In addition, Grafana provides a server administrator role that grants access to and enables interaction with resources that affect the entire instance, including organizations, users, and server-wide settings.
@@ -157,23 +157,23 @@ This particular role can only be accessed by users of self-hosted Grafana instan
### What are permissions?
-Each role consists of a set of [permissions]({{< relref "../../../administration/roles-and-permissions#dashboard-permissions" >}}) that determine the tasks a user can perform in the system.
+Each role consists of a set of [permissions](../../../administration/roles-and-permissions/#dashboard-permissions) that determine the tasks a user can perform in the system.
For example, the **Admin** role includes permissions that let an administrator create and delete users.
Grafana allows for precise permission settings on both dashboards and folders, giving you the ability to control which users and teams can view, edit, and administer them.
For example, you might want a certain viewer to be able to edit a dashboard. While that user can see all dashboards, you can grant them access to update only one of them.
-In [Grafana Enterprise]({{< relref "../../../introduction/grafana-enterprise" >}}), you can also grant granular permissions for data sources to control who can query and edit them.
+In [Grafana Enterprise](../../../introduction/grafana-enterprise/), you can also grant granular permissions for data sources to control who can query and edit them.
Dashboard, folder, and data source permissions can be set through the UI or APIs or provisioned through Terraform.
### Role-based access control
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../../introduction/grafana-enterprise" >}}) and [Grafana Cloud](/docs/grafana-cloud/).
+Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud](/docs/grafana-cloud/).
{{% /admonition %}}
-If you think that the basic organization and server administrator roles are too limiting, it might be beneficial to employ [role-based access control (RBAC)]({{< relref "../../../administration/roles-and-permissions/access-control" >}}).
+If you think that the basic organization and server administrator roles are too limiting, it might be beneficial to employ [role-based access control (RBAC)](../../../administration/roles-and-permissions/access-control/).
RBAC is a flexible approach to managing user access to Grafana resources, including users, data sources, and reports. It enables easy granting, changing, and revoking of read and write access for users.
RBAC comes with pre-defined roles, such as data source writer, which allows updating, reading, or querying all data sources.
@@ -190,7 +190,7 @@ When connecting Grafana to an identity provider, it's important to think beyond
Team sync is a feature that allows you to synchronize teams or groups from your authentication provider with teams in Grafana. This means that users of specific teams or groups in LDAP, OAuth, or SAML will be automatically added or removed as members of corresponding teams in Grafana. Whenever a user logs in, Grafana will check for any changes in the teams or groups of the authentication provider and update the user's teams in Grafana accordingly. This makes it easy to manage user permissions across multiple systems.
{{% admonition type="note" %}}
-Available in [Grafana Enterprise]({{< relref "../../../introduction/grafana-enterprise" >}}) and [Grafana Cloud Advanced](/docs/grafana-cloud/).
+Available in [Grafana Enterprise](../../../introduction/grafana-enterprise/) and [Grafana Cloud Advanced](/docs/grafana-cloud/).
{{% /admonition %}}
{{% admonition type="note" %}}
diff --git a/docs/sources/setup-grafana/configure-security/secret-scan.md b/docs/sources/setup-grafana/configure-security/secret-scan.md
index 031c1c06175..8029c476ded 100644
--- a/docs/sources/setup-grafana/configure-security/secret-scan.md
+++ b/docs/sources/setup-grafana/configure-security/secret-scan.md
@@ -11,7 +11,7 @@ weight: 1000
# Configure Grafana secret scanning and notifications
-With Grafana, you can use the GitHub Secret Scanning service to determine if your [service account tokens]({{< relref "../../administration/service-accounts" >}}) have been leaked on GitHub.
+With Grafana, you can use the GitHub Secret Scanning service to determine if your [service account tokens](../../../administration/service-accounts/) have been leaked on GitHub.
When GitHub Secret Scanning detects a Grafana secret, its hash is stored in Grafana Labs' secret scanning service.
diff --git a/docs/sources/setup-grafana/image-rendering/_index.md b/docs/sources/setup-grafana/image-rendering/_index.md
index c3f1fc0425a..a445d0d2072 100644
--- a/docs/sources/setup-grafana/image-rendering/_index.md
+++ b/docs/sources/setup-grafana/image-rendering/_index.md
@@ -18,17 +18,17 @@ weight: 1000
# Set up image rendering
-Grafana supports automatic rendering of panels as PNG images. This allows Grafana to automatically generate images of your panels to include in alert notifications, [PDF export]({{< relref "../../dashboards/create-reports#export-dashboard-as-pdf" >}}), and [Reporting]({{< relref "../../dashboards/create-reports" >}}). PDF Export and Reporting are available only in [Grafana Enterprise]({{< relref "../../introduction/grafana-enterprise" >}}) and [Grafana Cloud](/docs/grafana-cloud/).
+Grafana supports automatic rendering of panels as PNG images. This allows Grafana to automatically generate images of your panels to include in alert notifications, [PDF export](../../dashboards/create-reports/#export-dashboard-as-pdf), and [Reporting](../../dashboards/create-reports/). PDF Export and Reporting are available only in [Grafana Enterprise](../../introduction/grafana-enterprise/) and [Grafana Cloud](/docs/grafana-cloud/).
While an image is being rendered, the PNG image is temporarily written to the file system. When the image is rendered, the PNG image is temporarily written to the `png` folder in the Grafana `data` folder.
-A background job runs every 10 minutes and removes temporary images. You can configure how long an image should be stored before being removed by configuring the [temp_data_lifetime]({{< relref "../configure-grafana#temp_data_lifetime" >}}) setting.
+A background job runs every 10 minutes and removes temporary images. You can configure how long an image should be stored before being removed by configuring the [temp_data_lifetime](../configure-grafana/#temp_data_lifetime) setting.
You can also render a PNG by hovering over the panel to display the actions menu in the top-right corner, and then clicking **Share > Share link**. The **Render image** option is displayed in the link settings.
## Alerting and render limits
-Alert notifications can include images, but rendering many images at the same time can overload the server where the renderer is running. For instructions of how to configure this, see [max_concurrent_screenshots]({{< relref "../configure-grafana#max_concurrent_screenshots" >}}).
+Alert notifications can include images, but rendering many images at the same time can overload the server where the renderer is running. For instructions of how to configure this, see [max_concurrent_screenshots](../configure-grafana/#max_concurrent_screenshots).
## Install Grafana Image Renderer plugin
@@ -48,7 +48,7 @@ Rendering multiple images in parallel requires an even bigger memory footprint.
The Grafana Image Renderer plugin has a number of configuration options that are used in plugin or remote rendering modes.
-In plugin mode, you can specify them directly in the [Grafana configuration file]({{< relref "../configure-grafana#plugingrafana-image-renderer" >}}).
+In plugin mode, you can specify them directly in the [Grafana configuration file](../configure-grafana/#plugingrafana-image-renderer).
In remote rendering mode, you can specify them in a `.json` [configuration file](#configuration-file) or, for some of them, you can override the configuration defaults using environment variables.
@@ -94,7 +94,7 @@ AUTH_TOKEN=-
}
```
-See [Grafana configuration]({{< relref "../configure-grafana#renderer_token" >}}) for how to configure the token in Grafana.
+See [Grafana configuration](../configure-grafana/#renderer_token) for how to configure the token in Grafana.
### Rendering mode
@@ -164,7 +164,7 @@ RENDERING_MODE=reusable
#### Optimize the performance, CPU and memory usage of the image renderer
-The performance and resources consumption of the different modes depend a lot on the number of concurrent requests your service is handling. To understand how many concurrent requests your service is handling, [monitor your image renderer service]({{< relref "./monitoring" >}}).
+The performance and resources consumption of the different modes depend a lot on the number of concurrent requests your service is handling. To understand how many concurrent requests your service is handling, [monitor your image renderer service](monitoring/).
With no concurrent requests, the different modes show very similar performance and CPU / memory usage.
@@ -269,7 +269,7 @@ HTTP_MIN_TLS_VERSION=TLSv1.2
#### Enable Prometheus metrics
-You can enable [Prometheus](https://prometheus.io/) metrics endpoint `/metrics` using the environment variable `ENABLE_METRICS`. Node.js and render request duration metrics are included, see [Enable Prometheus metrics endpoint]({{< relref "./monitoring#enable-prometheus-metrics-endpoint" >}}) for details.
+You can enable [Prometheus](https://prometheus.io/) metrics endpoint `/metrics` using the environment variable `ENABLE_METRICS`. Node.js and render request duration metrics are included, see [Enable Prometheus metrics endpoint](monitoring/#enable-prometheus-metrics-endpoint) for details.
Default is `false`.
@@ -580,3 +580,21 @@ RENDERING_VIEWPORT_PAGE_ZOOM_LEVEL=1
}
}
```
+
+#### Tracing
+
+Enable OpenTelemetry Tracing by setting the tracing URL. Default is empty (disabled).
+
+```bash
+RENDERING_TRACING_URL="http://localhost:4318/v1/traces"
+```
+
+```json
+{
+ "rendering": {
+ "tracing": {
+ "url": "http://localhost:4318/v1/traces"
+ }
+ }
+}
+```
diff --git a/docs/sources/setup-grafana/image-rendering/monitoring/index.md b/docs/sources/setup-grafana/image-rendering/monitoring/index.md
index 1d6779133d5..ad4334f52e3 100644
--- a/docs/sources/setup-grafana/image-rendering/monitoring/index.md
+++ b/docs/sources/setup-grafana/image-rendering/monitoring/index.md
@@ -18,7 +18,7 @@ weight: 100
# Monitor the image renderer
-Rendering images requires a lot of memory, mainly because Grafana creates browser instances in the background for the actual rendering. Monitoring your service can help you allocate the right amount of resources to your rendering service and set the right [rendering mode]({{< relref "../../image-rendering#rendering-mode" >}}).
+Rendering images requires a lot of memory, mainly because Grafana creates browser instances in the background for the actual rendering. Monitoring your service can help you allocate the right amount of resources to your rendering service and set the right [rendering mode](../#rendering-mode).
## Enable Prometheus metrics endpoint
diff --git a/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md b/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
index aa4ce5c8d96..a42ee69df2c 100644
--- a/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
+++ b/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
@@ -32,7 +32,7 @@ You can enable debug log messages for rendering in the Grafana configuration fil
filters = rendering:debug
```
-You can also enable more logs in image renderer service itself by enabling [debug logging]({{< relref "#enable-debug-logging" >}}).
+You can also enable more logs in image renderer service itself by enabling [debug logging](#enable-debug-logging).
## Missing libraries
diff --git a/docs/sources/setup-grafana/installation/_index.md b/docs/sources/setup-grafana/installation/_index.md
index 44c69f8ab47..be7a51d7518 100644
--- a/docs/sources/setup-grafana/installation/_index.md
+++ b/docs/sources/setup-grafana/installation/_index.md
@@ -31,11 +31,11 @@ Grafana relies on other open source software to operate. For a list of open sour
Grafana supports the following operating systems:
-- [Debian or Ubuntu]({{< relref "./debian" >}})
-- [RHEL or Fedora]({{< relref "./rhel-fedora" >}})
-- [SUSE or openSUSE]({{< relref "./suse-opensuse" >}})
-- [macOS]({{< relref "./mac" >}})
-- [Windows]({{< relref "./windows" >}})
+- [Debian or Ubuntu](debian/)
+- [RHEL or Fedora](redhat-rhel-fedora/)
+- [SUSE or openSUSE](suse-opensuse/)
+- [macOS](mac/)
+- [Windows](windows/)
{{% admonition type="note" %}}
Installation of Grafana on other operating systems is possible, but is not recommended or supported.
@@ -51,8 +51,8 @@ Grafana requires the minimum system resources:
Some features might require more memory or CPUs, including:
- [Server side rendering of images](/grafana/plugins/grafana-image-renderer#requirements)
-- [Alerting]({{< relref "../../alerting" >}})
-- [Data source proxy]({{< relref "../../developers/http_api/data_source" >}})
+- [Alerting](../../alerting/)
+- [Data source proxy](../../developers/http_api/data_source/)
## Supported databases
diff --git a/docs/sources/setup-grafana/installation/debian/index.md b/docs/sources/setup-grafana/installation/debian/index.md
index 09965c27678..36fc5451ef5 100644
--- a/docs/sources/setup-grafana/installation/debian/index.md
+++ b/docs/sources/setup-grafana/installation/debian/index.md
@@ -217,4 +217,4 @@ To uninstall Grafana, run the following commands in a terminal window:
## Next steps
-- [Start the Grafana server]({{< relref "../../start-restart-grafana" >}})
+- [Start the Grafana server](../../start-restart-grafana/)
diff --git a/docs/sources/setup-grafana/installation/docker/index.md b/docs/sources/setup-grafana/installation/docker/index.md
index 91ab60a7764..da578681fca 100644
--- a/docs/sources/setup-grafana/installation/docker/index.md
+++ b/docs/sources/setup-grafana/installation/docker/index.md
@@ -24,7 +24,7 @@ Grafana Docker images come in two editions:
> **Note:** The recommended and default edition of Grafana is Grafana Enterprise. It is free and includes all the features of the OSS edition. Additionally, you have the option to upgrade to the [full Enterprise feature set](/products/enterprise/?utm_source=grafana-install-page), which includes support for [Enterprise plugins](/grafana/plugins/?enterprise=1&utcm_source=grafana-install-page).
-The default images for Grafana are created using the Alpine Linux project and can be found in the Alpine official image. For instructions on configuring a Docker image for Grafana, refer to [Configure a Grafana Docker image]({{< relref "../../configure-docker" >}}).
+The default images for Grafana are created using the Alpine Linux project and can be found in the Alpine official image. For instructions on configuring a Docker image for Grafana, refer to [Configure a Grafana Docker image](../../configure-docker/).
## Run Grafana via Docker CLI
@@ -114,7 +114,7 @@ docker run -d -p 3000:3000 --name=grafana \
### Use environment variables to configure Grafana
-Grafana supports specifying custom configuration settings using [environment variables]({{< relref "../../../setup-grafana/configure-grafana#override-configuration-with-environment-variables" >}}).
+Grafana supports specifying custom configuration settings using [environment variables](../../configure-grafana/#override-configuration-with-environment-variables).
```bash
# enable debug logs
@@ -128,7 +128,7 @@ docker run -d -p 3000:3000 --name=grafana \
You can install plugins in Grafana from the official and community [plugins page](/grafana/plugins) or by using a custom URL to install a private plugin. These plugins allow you to add new visualization types, data sources, and applications to help you better visualize your data.
-Grafana currently supports three types of plugins: panel, data source, and app. For more information on managing plugins, refer to [Plugin Management]({{< relref "../../../administration/plugin-management" >}}).
+Grafana currently supports three types of plugins: panel, data source, and app. For more information on managing plugins, refer to [Plugin Management](../../../administration/plugin-management/).
To install plugins in the Docker container, complete the following steps:
@@ -150,7 +150,7 @@ To install plugins in the Docker container, complete the following steps:
```bash
docker run -d -p 3000:3000 --name=grafana \
- -e "GF_PLUGINS_PREINSTALL=grafana-clock-panel 1.0.1" \
+ -e "GF_PLUGINS_PREINSTALL=grafana-clock-panel@1.0.1" \
grafana/grafana-enterprise
```
@@ -368,12 +368,12 @@ volumes:
## Next steps
-Refer to the [Getting Started]({{< relref "../../../getting-started/build-first-dashboard" >}}) guide for information about logging in, setting up data sources, and so on.
+Refer to the [Getting Started](../../../getting-started/build-first-dashboard/) guide for information about logging in, setting up data sources, and so on.
## Configure Docker image
-Refer to [Configure a Grafana Docker image]({{< relref "../../configure-docker" >}}) page for details on options for customizing your environment, logging, database, and so on.
+Refer to [Configure a Grafana Docker image](../../configure-docker/) page for details on options for customizing your environment, logging, database, and so on.
## Configure Grafana
-Refer to the [Configuration]({{< relref "../../configure-grafana" >}}) page for details on options for customizing your environment, logging, database, and so on.
+Refer to the [Configuration](../../configure-grafana/) page for details on options for customizing your environment, logging, database, and so on.
diff --git a/docs/sources/setup-grafana/installation/mac/index.md b/docs/sources/setup-grafana/installation/mac/index.md
index 55d447c17ae..f4c3f5d7342 100644
--- a/docs/sources/setup-grafana/installation/mac/index.md
+++ b/docs/sources/setup-grafana/installation/mac/index.md
@@ -87,4 +87,4 @@ Alternatively, watch the Grafana for Beginners video below:
## Next steps
-- [Start the Grafana server]({{< relref "../../start-restart-grafana" >}})
+- [Start the Grafana server](../../start-restart-grafana/)
diff --git a/docs/sources/setup-grafana/installation/redhat-rhel-fedora/index.md b/docs/sources/setup-grafana/installation/redhat-rhel-fedora/index.md
index 4a23ffb832c..66e02b66f66 100644
--- a/docs/sources/setup-grafana/installation/redhat-rhel-fedora/index.md
+++ b/docs/sources/setup-grafana/installation/redhat-rhel-fedora/index.md
@@ -168,7 +168,7 @@ Complete the following steps to install Grafana using the standalone binaries:
sudo chown -R grafana:users /usr/local/grafana
```
-1. [Configure the Grafana server to start at boot time using systemd]({{< relref "../../start-restart-grafana#configure-the-grafana-server-to-start-at-boot-using-systemd" >}}).
+1. [Configure the Grafana server to start at boot time using systemd](../../start-restart-grafana/#configure-the-grafana-server-to-start-at-boot-using-systemd).
## Uninstall on RHEL or Fedora
@@ -206,4 +206,4 @@ To uninstall Grafana, run the following commands in a terminal window:
## Next steps
-Refer to [Start the Grafana server]({{< relref "../../start-restart-grafana" >}}).
+Refer to [Start the Grafana server](../../start-restart-grafana/).
diff --git a/docs/sources/setup-grafana/installation/suse-opensuse/index.md b/docs/sources/setup-grafana/installation/suse-opensuse/index.md
index 09f76c8dd5e..1fb76c24104 100644
--- a/docs/sources/setup-grafana/installation/suse-opensuse/index.md
+++ b/docs/sources/setup-grafana/installation/suse-opensuse/index.md
@@ -194,4 +194,4 @@ To uninstall Grafana, run the following commands in a terminal window:
## Next steps
-Refer to [Start the Grafana server]({{< relref "../../start-restart-grafana" >}}).
+Refer to [Start the Grafana server](../../start-restart-grafana/).
diff --git a/docs/sources/setup-grafana/installation/windows/index.md b/docs/sources/setup-grafana/installation/windows/index.md
index 11aca8e3723..e5673ea51cb 100644
--- a/docs/sources/setup-grafana/installation/windows/index.md
+++ b/docs/sources/setup-grafana/installation/windows/index.md
@@ -44,7 +44,7 @@ You install Grafana using the Windows installer or using the standalone Windows
Start Grafana by executing `grafana-server.exe`, located in the `bin` directory, preferably from the command line. If you want to run Grafana as a Windows service, then download
[NSSM](https://nssm.cc/). It is very easy to add Grafana as a Windows service using that tool.
-1. To run Grafana, open your browser and go to the Grafana port (http://localhost:3000/ is default) and then follow the instructions in [Getting Started]({{< relref "../../../getting-started/build-first-dashboard" >}}).
+1. To run Grafana, open your browser and go to the Grafana port (http://localhost:3000/ is default) and then follow the instructions in [Getting Started](../../../getting-started/build-first-dashboard/).
> **Note:** The default Grafana port is `3000`. This port might require extra permissions on Windows. If it does not appear in the default port, you can change the port number.
@@ -64,4 +64,4 @@ Start Grafana by executing `grafana-server.exe`, located in the `bin` directory,
## Next steps
-- [Start the Grafana server]({{< relref "../../start-restart-grafana" >}})
+- [Start the Grafana server](../../start-restart-grafana/)
diff --git a/docs/sources/setup-grafana/set-up-for-high-availability.md b/docs/sources/setup-grafana/set-up-for-high-availability.md
index b36b64f1dd8..2db5cdba95b 100644
--- a/docs/sources/setup-grafana/set-up-for-high-availability.md
+++ b/docs/sources/setup-grafana/set-up-for-high-availability.md
@@ -37,13 +37,13 @@ Before you complete the following tasks, configure a MySQL or Postgres database
## Configure multiple Grafana servers to use the same database
-Once you have a Postgres or MySQL database available, you can configure your multiple Grafana instances to use a shared backend database. Grafana has default and custom configuration files, and you can update the database settings by updating your custom configuration file as described in the [[database]]({{< relref "./configure-grafana#database" >}}). Once configured to use a shared database, your multiple Grafana instances will persist all long-term data in that database.
+Once you have a Postgres or MySQL database available, you can configure your multiple Grafana instances to use a shared backend database. Grafana has default and custom configuration files, and you can update the database settings by updating your custom configuration file as described in the [[database]](../configure-grafana/#database). Once configured to use a shared database, your multiple Grafana instances will persist all long-term data in that database.
## Alerting high availability
Grafana Alerting provides a high availability mode. It preserves the semantics of legacy dashboard alerting by executing all alerts on every server and by sending notifications only once per alert. Load distribution between servers is not supported at this time.
-For further information and instructions on setting up alerting high availability, refer to [Enable alerting high availability]({{< relref "../alerting/set-up/configure-high-availability" >}}).
+For further information and instructions on setting up alerting high availability, refer to [Enable alerting high availability](../../alerting/set-up/configure-high-availability/).
**Legacy dashboard alerts**
@@ -51,7 +51,7 @@ Legacy Grafana Alerting supports a limited form of high availability. In this mo
## Grafana Live
-Grafana Live works with limitations in highly available setup. For details, refer to the [Configure Grafana Live HA setup]({{< relref "./set-up-grafana-live#configure-grafana-live-ha-setup" >}}).
+Grafana Live works with limitations in highly available setup. For details, refer to the [Configure Grafana Live HA setup](../set-up-grafana-live/#configure-grafana-live-ha-setup).
## User sessions
diff --git a/docs/sources/setup-grafana/set-up-grafana-live.md b/docs/sources/setup-grafana/set-up-grafana-live.md
index db747f4652b..b2d1c605384 100644
--- a/docs/sources/setup-grafana/set-up-grafana-live.md
+++ b/docs/sources/setup-grafana/set-up-grafana-live.md
@@ -29,9 +29,9 @@ By `real-time`, we indicate a soft real-time. Due to network latencies, garbage
## Concepts
-Grafana Live sends data to clients over persistent WebSocket connection. Grafana frontend subscribes on channels to receive data which was published into that channel – in other words PUB/SUB mechanics is used. All subscriptions on a page multiplexed inside a single WebSocket connection. There are some rules regarding Live channel names – see [Grafana Live channel]({{< relref "#grafana-live-channel" >}}).
+Grafana Live sends data to clients over persistent WebSocket connection. Grafana frontend subscribes on channels to receive data which was published into that channel – in other words PUB/SUB mechanics is used. All subscriptions on a page multiplexed inside a single WebSocket connection. There are some rules regarding Live channel names – see [Grafana Live channel](#grafana-live-channel).
-Handling persistent connections like WebSocket in scale may require operating system and infrastructure tuning. That's why by default Grafana Live supports 100 simultaneous connections max. For more details on how to tune this limit, refer to [Live configuration section]({{< relref "#configure-grafana-live" >}}).
+Handling persistent connections like WebSocket in scale may require operating system and infrastructure tuning. That's why by default Grafana Live supports 100 simultaneous connections max. For more details on how to tune this limit, refer to [Live configuration section](#configure-grafana-live).
## Features
@@ -99,7 +99,7 @@ Grafana Live uses persistent connections (WebSocket at the moment) to deliver re
WebSocket is a persistent connection that starts with an HTTP Upgrade request (using the same HTTP port as the rest of Grafana) and then switches to a TCP mode where WebSocket frames can travel in both directions between a client and a server. Each logged-in user opens a WebSocket connection – one per browser tab.
-The number of maximum WebSocket connections users can establish with Grafana is limited to 100 by default. See [max_connections]({{< relref "./configure-grafana#max_connections" >}}) option.
+The number of maximum WebSocket connections users can establish with Grafana is limited to 100 by default. See [max_connections](../configure-grafana/#max_connections) option.
In case you want to increase this limit, ensure that your server and infrastructure allow handling more connections. The following sections discuss several common problems which could happen when managing persistent connections, in particular WebSocket connections.
@@ -107,9 +107,9 @@ In case you want to increase this limit, ensure that your server and infrastruct
To avoid hijacking of WebSocket connection Grafana Live checks the Origin request header sent by a client in an HTTP Upgrade request. Requests without Origin header pass through without any origin check.
-By default, Live accepts connections with Origin header that matches configured [root_url]({{< relref "./configure-grafana#root_url" >}}) (which is a public Grafana URL).
+By default, Live accepts connections with Origin header that matches configured [root_url](../configure-grafana/#root_url) (which is a public Grafana URL).
-It is possible to provide a list of additional origin patterns to allow WebSocket connections from. This can be achieved using the [allowed_origins]({{< relref "./configure-grafana#allowed_origins" >}}) option of Grafana Live configuration.
+It is possible to provide a list of additional origin patterns to allow WebSocket connections from. This can be achieved using the [allowed_origins](../configure-grafana/#allowed_origins) option of Grafana Live configuration.
#### Resource usage
@@ -215,7 +215,7 @@ ha_engine = redis
ha_engine_address = 127.0.0.1:6379
```
-For additional information, refer to the [ha_engine]({{< relref "./configure-grafana#ha_engine" >}}) and [ha_engine_address]({{< relref "./configure-grafana#ha_engine_address" >}}) options.
+For additional information, refer to the [ha_engine](../configure-grafana/#ha_engine) and [ha_engine_address](../configure-grafana/#ha_engine_address) options.
After running:
diff --git a/docs/sources/setup-grafana/set-up-grafana-monitoring.md b/docs/sources/setup-grafana/set-up-grafana-monitoring.md
index 5422e4f7325..1cf7563fd45 100644
--- a/docs/sources/setup-grafana/set-up-grafana-monitoring.md
+++ b/docs/sources/setup-grafana/set-up-grafana-monitoring.md
@@ -24,13 +24,13 @@ Grafana can emit Jaeger or OpenTelemetry Protocol (OTLP) traces for its HTTP API
All HTTP endpoints are logged evenly (annotations, dashboard, tags, and so on).
When a trace ID is propagated, it is reported with operation 'HTTP /datasources/proxy/:id/\*'.
-Refer to [Configuration's OpenTelemetry section]({{< relref "./configure-grafana#tracingopentelemetry" >}}) for a reference of tracing options available in Grafana.
+Refer to [Configuration's OpenTelemetry section](../configure-grafana/#tracingopentelemetry) for a reference of tracing options available in Grafana.
## View Grafana internal metrics
Grafana collects some metrics about itself internally. Grafana supports pushing metrics to Graphite or exposing them to be scraped by Prometheus.
-For more information about configuration options related to Grafana metrics, refer to [metrics]({{< relref "./configure-grafana#metrics" >}}) and [metrics.graphite]({{< relref "./configure-grafana#metricsgraphite" >}}) in [Configuration]({{< relref "./configure-grafana" >}}).
+For more information about configuration options related to Grafana metrics, refer to [metrics](../configure-grafana/#metrics) and [metrics.graphite](../configure-grafana/#metricsgraphite) in [Configuration](../configure-grafana/).
### Available metrics
diff --git a/docs/sources/setup-grafana/set-up-https.md b/docs/sources/setup-grafana/set-up-https.md
index cb508a87898..a8e564a3baf 100644
--- a/docs/sources/setup-grafana/set-up-https.md
+++ b/docs/sources/setup-grafana/set-up-https.md
@@ -224,7 +224,7 @@ To adjust permissions, perform the following steps:
## Configure Grafana HTTPS and restart Grafana
-In this section you edit the `grafana.ini` file so that it includes the certificate you created. If you need help identifying where to find this file, or what each key means, refer to [Configuration file location]({{< relref "./configure-grafana#configuration-file-location" >}}).
+In this section you edit the `grafana.ini` file so that it includes the certificate you created. If you need help identifying where to find this file, or what each key means, refer to [Configuration file location](../configure-grafana/#configuration-file-location).
To configure Grafana HTTPS and restart Grafana, complete the following steps.
@@ -246,7 +246,7 @@ To configure Grafana HTTPS and restart Grafana, complete the following steps.
1. Optional. From Grafana v11.2, edit the `cert_pass` configuration option with the decryption password if you are using encrypted certificates.
-1. [Restart the Grafana server]({{< relref "./start-restart-grafana#linux" >}}) using `systemd`, `init.d`, or the binary as appropriate for your environment.
+1. [Restart the Grafana server](../start-restart-grafana/#linux) using `systemd`, `init.d`, or the binary as appropriate for your environment.
## Troubleshooting
diff --git a/docs/sources/setup-grafana/sign-in-to-grafana.md b/docs/sources/setup-grafana/sign-in-to-grafana.md
index d33ea496821..1d8d240f328 100644
--- a/docs/sources/setup-grafana/sign-in-to-grafana.md
+++ b/docs/sources/setup-grafana/sign-in-to-grafana.md
@@ -14,13 +14,13 @@ This topic describes how to sign in to Grafana.
## Before you begin
-- [Install Grafana]({{< relref "./installation" >}})
+- [Install Grafana](../installation/)
## Steps
To sign in to Grafana for the first time, follow these steps:
-1. Open your web browser and go to root URL specified in [Grafana configuration file]({{< relref "./configure-grafana" >}}).
+1. Open your web browser and go to root URL specified in [Grafana configuration file](../configure-grafana/).
Unless you have configured Grafana differently, it is set to use `http://localhost:3000` by default.
diff --git a/docs/sources/setup-grafana/start-restart-grafana.md b/docs/sources/setup-grafana/start-restart-grafana.md
index 49f99a2cf30..6e1db25203c 100644
--- a/docs/sources/setup-grafana/start-restart-grafana.md
+++ b/docs/sources/setup-grafana/start-restart-grafana.md
@@ -210,5 +210,5 @@ To restart Grafana:
After the Grafana server is up and running, consider taking the next steps:
-- Refer to [Get Started]({{< relref "../getting-started" >}}) to learn how to build your first dashboard.
-- Refer to [Configuration]({{< relref "./configure-grafana" >}}) to learn about how you can customize your environment.
+- Refer to [Get Started](../../getting-started/) to learn how to build your first dashboard.
+- Refer to [Configuration](../configure-grafana/) to learn about how you can customize your environment.
diff --git a/docs/sources/shared/alerts/alerting-provisioning-export-produces.md b/docs/sources/shared/alerts/alerting-provisioning-export-produces.md
new file mode 100644
index 00000000000..032a72d96d0
--- /dev/null
+++ b/docs/sources/shared/alerts/alerting-provisioning-export-produces.md
@@ -0,0 +1,13 @@
+---
+title: 'Alerting Produces '
+---
+
+#### Produces
+
+- `application/json`
+- `application/yaml`
+- `application/terraform+hcl`
+- `text/yaml`
+- `text/hcl`
+
+These outputs are for [file provisioning](https://grafana.com/docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning) or [Terraform provisioning](https://grafana.com/docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning), and they-including the JSON output—cannot be used to update resources via the HTTP API.
diff --git a/docs/sources/shared/alerts/alerting_provisioning.md b/docs/sources/shared/alerts/alerting_provisioning.md
index e928b0015da..40d3c72622d 100644
--- a/docs/sources/shared/alerts/alerting_provisioning.md
+++ b/docs/sources/shared/alerts/alerting_provisioning.md
@@ -14,7 +14,12 @@ For more information on the differences between Grafana-managed and data source-
## Grafana-managed endpoints
-Note that the JSON format from most of the following endpoints is not fully compatible with [provisioning via configuration JSON files](https://grafana.com/docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning/).
+{{< admonition type="note" >}}
+In the Alerting provisioning HTTP API, the endpoints use a JSON format that differs from the format returned by the `export` endpoints.
+
+The `export` endpoints allow you to export alerting resources in a JSON format suitable for [provisioning via files](https://grafana.com/docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning/). However, this format cannot be used to update resources via the HTTP API.
+
+{{< /admonition >}}
### Alert rules
@@ -373,16 +378,21 @@ Content-Type: application/json
### Edit resources in the Grafana UI
-By default, you cannot edit API-provisioned alerting resources in Grafana. To enable editing these resources in the Grafana UI, add the `X-Disable-Provenance` header to the following requests in the API:
+By default, you cannot edit API-provisioned alerting resources in Grafana.
+
+To enable editing these resources in the Grafana UI, add the **`X-Disable-Provenance: true`** header to the following API requests:
- `POST /api/v1/provisioning/alert-rules`
-- `PUT /api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}` (calling this endpoint will change provenance for all alert rules within the alert group)
+- `PUT /api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}` _(This endpoint changes provenance for all alert rules in the alert group)_
+
- `POST /api/v1/provisioning/contact-points`
- `POST /api/v1/provisioning/mute-timings`
-- `PUT /api/v1/provisioning/policies`
- `PUT /api/v1/provisioning/templates/{name}`
+- `PUT /api/v1/provisioning/policies`
-To reset the notification policy tree to the default and unlock it for editing in the Grafana UI, use the `DELETE /api/v1/provisioning/policies` endpoint.
+To reset the notification policy tree to the default and unlock it for editing in the Grafana UI, use:
+
+- `DELETE /api/v1/provisioning/policies`
## Data source-managed resources
@@ -408,10 +418,10 @@ DELETE /api/v1/provisioning/alert-rules/:uid
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | ------ | -------- | --------- | :------: | ------- | --------------------------------------------------------- |
-| UID | `path` | string | `string` | | ✓ | | Alert rule UID |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | ------ | ------- | :------: | ------- | --------------------------------------------------------- |
+| `UID` | path | string | string | ✓ | | Alert rule UID |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
{{% /responsive-table %}}
@@ -437,9 +447,9 @@ DELETE /api/v1/provisioning/contact-points/:uid
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| ---- | ------ | ------ | -------- | --------- | :------: | ------- | ------------------------------------------ |
-| UID | `path` | string | `string` | | ✓ | | UID is the contact point unique identifier |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ----- | ------ | ------ | ------- | :------: | ------- | ------------------------------------------ |
+| `UID` | path | string | string | ✓ | | UID is the contact point unique identifier |
#### All responses
@@ -463,10 +473,10 @@ DELETE /api/v1/provisioning/mute-timings/:name
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| ------- | ------- | ------ | -------- | --------- | :------: | ------- | ------------------------------------------------------------------------------------------------------------- |
-| name | `path` | string | `string` | | ✓ | | Mute timing name |
-| version | `query` | string | `string` | | | | Current version of the resource. Used for optimistic concurrency validation. Keep empty to bypass validation. |
+| Name | Source | Type | Go type | Required | Default | Description |
+| --------- | ------ | ------ | ------- | :------: | ------- | ------------------------------------------------------------------------------------------------------------- |
+| `name` | path | string | string | ✓ | | Mute timing name |
+| `version` | query | string | string | | | Current version of the resource. Used for optimistic concurrency validation. Keep empty to bypass validation. |
#### All responses
@@ -499,10 +509,10 @@ DELETE /api/v1/provisioning/templates/:name
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| ------- | ------- | ------ | -------- | --------- | :------: | ------- | ------------------------------------------------------------------------------------------------------------- |
-| name | `path` | string | `string` | | ✓ | | Name of the template group |
-| version | `query` | string | `string` | | | | Current version of the resource. Used for optimistic concurrency validation. Keep empty to bypass validation. |
+| Name | Source | Type | Go type | Required | Default | Description |
+| --------- | ------ | ------ | ------- | :------: | ------- | ------------------------------------------------------------------------------------------------------------- |
+| `name` | path | string | string | ✓ | | Name of the template group |
+| `version` | query | string | string | | | Current version of the resource. Used for optimistic concurrency validation. Keep empty to bypass validation. |
#### All responses
@@ -535,9 +545,9 @@ GET /api/v1/provisioning/alert-rules/:uid
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| ---- | ------ | ------ | -------- | --------- | :------: | ------- | -------------- |
-| UID | `path` | string | `string` | | ✓ | | Alert rule UID |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ----- | ------ | ------ | ------- | :------: | ------- | -------------- |
+| `UID` | path | string | string | ✓ | | Alert rule UID |
#### All responses
@@ -568,21 +578,15 @@ Status: Not Found
GET /api/v1/provisioning/alert-rules/:uid/export
```
-#### Produces
-
-- application/json
-- application/yaml
-- application/terraform+hcl
-- text/yaml
-- text/hcl
+{{< docs/shared lookup="alerts/alerting-provisioning-export-produces.md" source="grafana" version="" >}}
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| UID | `path` | string | `string` | | ✓ | | Alert rule UID |
-| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. |
-| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------- | ------ | ------- | ------- | :------: | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `UID` | path | string | string | ✓ | | Alert rule UID |
+| `download` | query | boolean | `bool` | | | Whether to initiate a download of the file or not. |
+| `format` | query | string | string | | `yaml` | Format of the downloaded file, either `yaml`, `json` or `hcl`. Accept header can also be used, but the query parameter will take precedence. |
#### All responses
@@ -615,10 +619,10 @@ GET /api/v1/provisioning/folder/:folderUid/rule-groups/:group
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| --------- | ------ | ------ | -------- | --------- | :------: | ------- | ----------- |
-| FolderUID | `path` | string | `string` | | ✓ | | |
-| Group | `path` | string | `string` | | ✓ | | |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ----------- | ------ | ------ | ------- | :------: | ------- | ----------- |
+| `FolderUID` | path | string | string | ✓ | | |
+| `Group` | path | string | string | ✓ | | |
#### All responses
@@ -649,22 +653,16 @@ Status: Not Found
GET /api/v1/provisioning/folder/:folderUid/rule-groups/:group/export
```
-#### Produces
-
-- application/json
-- application/yaml
-- application/terraform+hcl
-- text/yaml
-- text/hcl
+{{< docs/shared lookup="alerts/alerting-provisioning-export-produces.md" source="grafana" version="" >}}
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| --------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| FolderUID | `path` | string | `string` | | ✓ | | |
-| Group | `path` | string | `string` | | ✓ | | |
-| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. |
-| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ----------- | ------ | ------- | ------- | :------: | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `FolderUID` | path | string | string | ✓ | | |
+| `Group` | path | string | string | ✓ | | |
+| `download` | query | boolean | `bool` | | | Whether to initiate a download of the file or not. |
+| `format` | query | string | string | | `yaml` | Format of the downloaded file, either `yaml`, `json` or `hcl`. Accept header can also be used, but the query parameter will take precedence. |
#### All responses
@@ -717,20 +715,14 @@ Status: OK
GET /api/v1/provisioning/alert-rules/export
```
-#### Produces
-
-- application/json
-- application/yaml
-- application/terraform+hcl
-- text/yaml
-- text/hcl
+{{< docs/shared lookup="alerts/alerting-provisioning-export-produces.md" source="grafana" version="" >}}
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. |
-| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------- | ------ | ------- | ------- | :------: | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `download` | query | boolean | `bool` | | | Whether to initiate a download of the file or not. |
+| `format` | query | string | string | | `yaml` | Format of the downloaded file, either `yaml`, `json` or `hcl`. Accept header can also be used, but the query parameter will take precedence. |
#### All responses
@@ -763,9 +755,9 @@ GET /api/v1/provisioning/contact-points
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| ---- | ------- | ------ | -------- | --------- | :------: | ------- | -------------- |
-| name | `query` | string | `string` | | | | Filter by name |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ------ | ------ | ------ | ------- | :------: | ------- | -------------- |
+| `name` | query | string | string | | | Filter by name |
#### All responses
@@ -789,22 +781,16 @@ Status: OK
GET /api/v1/provisioning/contact-points/export
```
-#### Produces
-
-- application/json
-- application/yaml
-- application/terraform+hcl
-- text/yaml
-- text/hcl
+{{< docs/shared lookup="alerts/alerting-provisioning-export-produces.md" source="grafana" version="" >}}
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------- | ------- | ------- | -------- | --------- | :------: | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| decrypt | `query` | boolean | `bool` | | | | Whether any contained secure settings should be decrypted or left redacted. Redacted settings will contain RedactedValue instead. Currently, only org admin can view decrypted secure settings. |
-| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. |
-| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. |
-| name | `query` | string | `string` | | | | Filter by name |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------- | ------ | ------- | ------- | :------: | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `decrypt` | query | boolean | `bool` | | | Whether any contained secure settings should be decrypted or left redacted. Redacted settings will contain RedactedValue instead. Currently, only org admin can view decrypted secure settings. |
+| `download` | query | boolean | `bool` | | | Whether to initiate a download of the file or not. |
+| `format` | query | string | string | | `yaml` | Format of the downloaded file, either `yaml`, `json` or `hcl`. Accept header can also be used, but the query parameter will take precedence. |
+| `name` | query | string | string | | | Filter by name |
#### All responses
@@ -839,9 +825,9 @@ GET /api/v1/provisioning/mute-timings/:name
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| ---- | ------ | ------ | -------- | --------- | :------: | ------- | ---------------- |
-| name | `path` | string | `string` | | ✓ | | Mute timing name |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ------ | ------ | ------ | ------- | :------: | ------- | ---------------- |
+| `name` | path | string | string | ✓ | | Mute timing name |
#### All responses
@@ -894,20 +880,14 @@ Status: OK
GET /api/v1/provisioning/mute-timings/export
```
-#### Produces
-
-- application/json
-- application/yaml
-- application/terraform+hcl
-- text/yaml
-- text/hcl
+{{< docs/shared lookup="alerts/alerting-provisioning-export-produces.md" source="grafana" version="" >}}
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. |
-| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------- | ------ | ------- | ------- | :------: | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `download` | query | boolean | `bool` | | | Whether to initiate a download of the file or not. |
+| `format` | query | string | string | | `yaml` | Format of the downloaded file, either `yaml`, `json` or `hcl`. Accept header can also be used, but the query parameter will take precedence. |
#### All responses
@@ -940,21 +920,15 @@ Status: Forbidden
GET /api/v1/provisioning/mute-timings/:name/export
```
-#### Produces
-
-- application/json
-- application/yaml
-- application/terraform+hcl
-- text/yaml
-- text/hcl
+{{< docs/shared lookup="alerts/alerting-provisioning-export-produces.md" source="grafana" version="" >}}
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| name | `path` | string | `string` | | ✓ | | Mute timing name. |
-| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. |
-| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------- | ------ | ------- | ------- | :------: | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `name` | path | string | string | ✓ | | Mute timing name. |
+| `download` | query | boolean | `bool` | | | Whether to initiate a download of the file or not. |
+| `format` | query | string | string | | `yaml` | Format of the downloaded file, either `yaml`, `json` or `hcl`. Accept header can also be used, but the query parameter will take precedence. |
#### All responses
@@ -1009,20 +983,14 @@ Status: OK
GET /api/v1/provisioning/policies/export
```
-#### Produces
-
-- application/json
-- application/yaml
-- application/terraform+hcl
-- text/yaml
-- text/hcl
+{{< docs/shared lookup="alerts/alerting-provisioning-export-produces.md" source="grafana" version="" >}}
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. |
-| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------- | ------ | ------- | ------- | :------: | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| `download` | query | boolean | `bool` | | | Whether to initiate a download of the file or not. |
+| `format` | query | string | string | | `yaml` | Format of the downloaded file, either `yaml`, `json` or `hcl`. Accept header can also be used, but the query parameter will take precedence. |
#### All responses
@@ -1057,9 +1025,9 @@ GET /api/v1/provisioning/templates/:name
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| ---- | ------ | ------ | -------- | --------- | :------: | ------- | -------------------------- |
-| name | `path` | string | `string` | | ✓ | | Name of the template group |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ------ | ------ | ------ | ------- | :------: | ------- | -------------------------- |
+| `name` | path | string | string | ✓ | | Name of the template group |
#### All responses
@@ -1116,10 +1084,10 @@ POST /api/v1/provisioning/alert-rules
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | ----------------------------------------------- | ----------------------------- | --------- | :------: | ------- | --------------------------------------------------------- |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [ProvisionedAlertRule](#provisioned-alert-rule) | `models.ProvisionedAlertRule` | | | | |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | ----------------------------------------------- | ----------------------------- | :------: | ------- | --------------------------------------------------------- |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [ProvisionedAlertRule](#provisioned-alert-rule) | `models.ProvisionedAlertRule` | | | |
{{% /responsive-table %}}
@@ -1160,10 +1128,10 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | ----------------------------------------------- | ----------------------------- | --------- | :------: | ------- | --------------------------------------------------------- |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [EmbeddedContactPoint](#embedded-contact-point) | `models.EmbeddedContactPoint` | | | | |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | ----------------------------------------------- | ----------------------------- | :------: | ------- | --------------------------------------------------------- |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [EmbeddedContactPoint](#embedded-contact-point) | `models.EmbeddedContactPoint` | | | |
{{% /responsive-table %}}
@@ -1202,10 +1170,10 @@ POST /api/v1/provisioning/mute-timings
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | --------------------------------------- | ------------------------- | --------- | :------: | ------- | --------------------------------------------------------- |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [MuteTimeInterval](#mute-time-interval) | `models.MuteTimeInterval` | | | | |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | --------------------------------------- | ------------------------- | :------: | ------- | --------------------------------------------------------- |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [MuteTimeInterval](#mute-time-interval) | `models.MuteTimeInterval` | | | |
{{% /responsive-table %}}
@@ -1244,11 +1212,11 @@ PUT /api/v1/provisioning/alert-rules/:uid
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | ----------------------------------------------- | ----------------------------- | --------- | :------: | ------- | --------------------------------------------------------- |
-| UID | `path` | string | `string` | | ✓ | | Alert rule UID |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [ProvisionedAlertRule](#provisioned-alert-rule) | `models.ProvisionedAlertRule` | | | | |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | ----------------------------------------------- | ----------------------------- | :------: | ------- | --------------------------------------------------------- | --- |
+| `UID` | path | string | string | ✓ | | Alert rule UID |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [ProvisionedAlertRule](#provisioned-alert-rule) | `models.ProvisionedAlertRule` | | | | |
{{% /responsive-table %}}
@@ -1287,12 +1255,12 @@ PUT /api/v1/provisioning/folder/:folderUid/rule-groups/:group
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | ----------------------------------- | ----------------------- | --------- | :------: | ------- | ------------------------------------------------------------------------------------------------------- |
-| FolderUID | `path` | string | `string` | | ✓ | | |
-| Group | `path` | string | `string` | | ✓ | | |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [AlertRuleGroup](#alert-rule-group) | `models.AlertRuleGroup` | | | | This action is idempotent and rules included in this body will overwrite configured rules for the group |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | ----------------------------------- | ----------------------- | :------: | ------- | ------------------------------------------------------------------------------------------------------- |
+| `FolderUID` | path | string | string | ✓ | | |
+| `Group` | path | string | string | ✓ | | |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [AlertRuleGroup](#alert-rule-group) | `models.AlertRuleGroup` | | | This action is idempotent and rules included in this body will overwrite configured rules for the group |
{{% /responsive-table %}}
@@ -1331,11 +1299,11 @@ PUT /api/v1/provisioning/contact-points/:uid
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | ----------------------------------------------- | ----------------------------- | --------- | :------: | ------- | --------------------------------------------------------- |
-| UID | `path` | string | `string` | | ✓ | | UID is the contact point unique identifier |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [EmbeddedContactPoint](#embedded-contact-point) | `models.EmbeddedContactPoint` | | | | |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | ----------------------------------------------- | ----------------------------- | :------: | ------- | --------------------------------------------------------- |
+| `UID` | path | string | string | ✓ | | UID is the contact point unique identifier |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [EmbeddedContactPoint](#embedded-contact-point) | `models.EmbeddedContactPoint` | | | |
{{% /responsive-table %}}
@@ -1374,11 +1342,11 @@ PUT /api/v1/provisioning/mute-timings/:name
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | --------------------------------------- | ------------------------- | --------- | :------: | ------- | --------------------------------------------------------- |
-| name | `path` | string | `string` | | ✓ | | Mute timing name |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [MuteTimeInterval](#mute-time-interval) | `models.MuteTimeInterval` | | | | |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | --------------------------------------- | ------------------------- | -------- | :-----: | --------------------------------------------------------- |
+| `name` | path | string | string | ✓ | | Mute timing name |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [MuteTimeInterval](#mute-time-interval) | `models.MuteTimeInterval` | | | |
{{% /responsive-table %}}
@@ -1418,6 +1386,8 @@ Status: Conflict
### Sets the notification policy tree. (_RoutePutPolicyTree_)
+{{< docs/shared lookup="alerts/warning-provisioning-tree.md" source="grafana" version="" >}}
+
```
PUT /api/v1/provisioning/policies
```
@@ -1426,10 +1396,10 @@ PUT /api/v1/provisioning/policies
{{% responsive-table %}}
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | --------------- | -------------- | --------- | :------: | ------- | --------------------------------------------------------- |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [Route](#route) | `models.Route` | | | | The new notification routing tree to use |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | --------------- | -------------- | :------: | ------- | --------------------------------------------------------- |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [Route](#route) | `models.Route` | | | The new notification routing tree to use |
{{% /responsive-table %}}
@@ -1468,11 +1438,11 @@ PUT /api/v1/provisioning/templates/:name
#### Parameters
-| Name | Source | Type | Go type | Separator | Required | Default | Description |
-| -------------------------- | -------- | ------------------------------------------------------------- | ------------------------------------ | --------- | :------: | ------- | --------------------------------------------------------- |
-| name | `path` | string | `string` | | ✓ | | Name of the template group |
-| X-Disable-Provenance: true | `header` | string | `string` | | | | Allows editing of provisioned resources in the Grafana UI |
-| Body | `body` | [NotificationTemplateContent](#notification-template-content) | `models.NotificationTemplateContent` | | | | |
+| Name | Source | Type | Go type | Required | Default | Description |
+| ---------------------------- | ------ | ------------------------------------------------------------- | ------------------------------------ | -------- | :-----: | --------------------------------------------------------- | --- |
+| `name` | path | string | string | ✓ | | Name of the template group |
+| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI |
+| `Body` | body | [NotificationTemplateContent](#notification-template-content) | `models.NotificationTemplateContent` | | | | |
{{% /responsive-table %}}
@@ -1544,14 +1514,13 @@ Status: Accepted
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| --------------------------------------------------------- | ----------------------------------------- | ------------------- | :------: | ------- | ------------------------------------------------------------------------------------------------------ | ------- |
-| datasourceUid | string | `string` | | | Grafana data source unique identifier; it should be '**expr**' for a Server Side Expression operation. | |
-| model | [interface{}](#interface) | `interface{}` | | | JSON is the raw JSON query and includes the above properties as well as custom properties. | |
-| queryType | string | `string` | | | QueryType is an optional identifier for the type of query. |
-| It can be used to distinguish different types of queries. | |
-| refId | string | `string` | | | RefID is the unique identifier of the query, set by the frontend call. | |
-| relativeTimeRange | [RelativeTimeRange](#relative-time-range) | `RelativeTimeRange` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ------------------- | ----------------------------------------- | ------------------- | :------: | ------- | -------------------------------------------------------------------------------------------------------------------- | ------- |
+| `datasourceUid` | string | string | | | Grafana data source unique identifier; it should be '**expr**' for a Server Side Expression operation. | |
+| `model` | [interface{}](#interface) | `interface{}` | | | JSON is the raw JSON query and includes the above properties as well as custom properties. | |
+| `queryType` | string | string | | | QueryType is an optional identifier for the type of query. It can be used to distinguish different types of queries. | |
+| `refId` | string | string | | | RefID is the unique identifier of the query, set by the frontend call. | |
+| `relativeTimeRange` | [RelativeTimeRange](#relative-time-range) | `RelativeTimeRange` | | | | |
{{% /responsive-table %}}
@@ -1561,13 +1530,13 @@ Status: Accepted
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ----------------- | ----------------------------------------- | ------------------- | :------: | ------- | ----------- | ------- |
-| datasourceUid | string | `string` | | | | |
-| model | [interface{}](#interface) | `interface{}` | | | | |
-| queryType | string | `string` | | | | |
-| refId | string | `string` | | | | |
-| relativeTimeRange | [RelativeTimeRange](#relative-time-range) | `RelativeTimeRange` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ------------------- | ----------------------------------------- | ------------------- | :------: | ------- | ----------- | ------- |
+| `datasourceUid` | string | string | | | | |
+| `model` | [interface{}](#interface) | `interface{}` | | | | |
+| `queryType` | string | string | | | | |
+| `refId` | string | string | | | | |
+| `relativeTimeRange` | [RelativeTimeRange](#relative-time-range) | `RelativeTimeRange` | | | | |
{{% /responsive-table %}}
@@ -1577,20 +1546,20 @@ Status: Accepted
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ------------ | ----------------------------------------- | --------------------- | :------: | ------- | ----------- | ------- |
-| annotations | map of string | `map[string]string` | | | | |
-| condition | string | `string` | | | | |
-| dashboardUid | string | `string` | | | | |
-| data | [][AlertQueryExport](#alert-query-export) | `[]*AlertQueryExport` | | | | |
-| execErrState | string | `string` | | | | |
-| for | [Duration](#duration) | `Duration` | | | | |
-| isPaused | boolean | `bool` | | | | |
-| labels | map of string | `map[string]string` | | | | |
-| noDataState | string | `string` | | | | |
-| panelId | int64 (formatted integer) | `int64` | | | | |
-| title | string | `string` | | | | |
-| uid | string | `string` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| -------------- | ----------------------------------------- | --------------------- | :------: | ------- | ----------- | ------- |
+| `annotations` | map of string | `map[string]string` | | | | |
+| `condition` | string | string | | | | |
+| `dashboardUid` | string | string | | | | |
+| `data` | [][AlertQueryExport](#alert-query-export) | `[]*AlertQueryExport` | | | | |
+| `execErrState` | string | string | | | | |
+| `for` | [Duration](#duration) | Duration | | | | |
+| `isPaused` | boolean | `bool` | | | | |
+| `labels` | map of string | `map[string]string` | | | | |
+| `noDataState` | string | string | | | | |
+| `panelId` | int64 (formatted integer) | int64 | | | | |
+| `title` | string | string | | | | |
+| `uid` | string | string | | | | |
{{% /responsive-table %}}
@@ -1600,12 +1569,12 @@ Status: Accepted
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| --------- | ------------------------------------------------- | ------------------------- | :------: | ------- | ----------- | ------- |
-| folderUid | string | `string` | | | | |
-| interval | int64 (formatted integer) | `int64` | | | | |
-| rules | [][ProvisionedAlertRule](#provisioned-alert-rule) | `[]*ProvisionedAlertRule` | | | | |
-| title | string | `string` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ----------- | ------------------------------------------------- | ------------------------- | :------: | ------- | ----------- | ------- |
+| `folderUid` | string | string | | | | |
+| `interval` | int64 (formatted integer) | int64 | | | | |
+| `rules` | [][ProvisionedAlertRule](#provisioned-alert-rule) | `[]*ProvisionedAlertRule` | | | | |
+| `title` | string | string | | | | |
{{% /responsive-table %}}
@@ -1615,13 +1584,13 @@ Status: Accepted
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| -------- | --------------------------------------- | -------------------- | :------: | ------- | ----------- | ------- |
-| folder | string | `string` | | | | |
-| interval | [Duration](#duration) | `Duration` | | | | |
-| name | string | `string` | | | | |
-| orgId | int64 (formatted integer) | `int64` | | | | |
-| rules | [][AlertRuleExport](#alert-rule-export) | `[]*AlertRuleExport` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ---------- | --------------------------------------- | -------------------- | :------: | ------- | ----------- | ------- |
+| `folder` | string | string | | | | |
+| `interval` | [Duration](#duration) | Duration | | | | |
+| `name` | string | string | | | | |
+| `orgId` | int64 (formatted integer) | int64 | | | | |
+| `rules` | [][AlertRuleExport](#alert-rule-export) | `[]*AlertRuleExport` | | | | |
{{% /responsive-table %}}
@@ -1631,12 +1600,12 @@ Status: Accepted
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ------------- | --------------------------------------------------------- | ----------------------------- | :------: | ------- | ----------- | ------- |
-| apiVersion | int64 (formatted integer) | `int64` | | | | |
-| contactPoints | [][ContactPointExport](#contact-point-export) | `[]*ContactPointExport` | | | | |
-| groups | [][AlertRuleGroupExport](#alert-rule-group-export) | `[]*AlertRuleGroupExport` | | | | |
-| policies | [][NotificationPolicyExport](#notification-policy-export) | `[]*NotificationPolicyExport` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| --------------- | --------------------------------------------------------- | ----------------------------- | :------: | ------- | ----------- | ------- |
+| `apiVersion` | int64 (formatted integer) | int64 | | | | |
+| `contactPoints` | [][ContactPointExport](#contact-point-export) | `[]*ContactPointExport` | | | | |
+| `groups` | [][AlertRuleGroupExport](#alert-rule-group-export) | `[]*AlertRuleGroupExport` | | | | |
+| `policies` | [][NotificationPolicyExport](#notification-policy-export) | `[]*NotificationPolicyExport` | | | | |
{{% /responsive-table %}}
@@ -1644,11 +1613,11 @@ Status: Accepted
**Properties**
-| Name | Type | Go type | Required | Default | Description | Example |
-| --------- | ------------------------------------ | ------------------- | :------: | ------- | ----------- | ------- |
-| name | string | `string` | | | | |
-| orgId | int64 (formatted integer) | `int64` | | | | |
-| receivers | [][ReceiverExport](#receiver-export) | `[]*ReceiverExport` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ----------- | ------------------------------------ | ------------------- | :------: | ------- | ----------- | ------- |
+| `name` | string | string | | | | |
+| `orgId` | int64 (formatted integer) | int64 | | | | |
+| `receivers` | [][ReceiverExport](#receiver-export) | `[]*ReceiverExport` | | | | |
### ContactPoints
@@ -1656,9 +1625,9 @@ Status: Accepted
### Duration
-| Name | Type | Go type | Default | Description | Example |
-| -------- | ------ | ------- | ------- | ----------- | ------- |
-| Duration | string | int64 | | | |
+| Name | Type | Go type | Default | Description | Example |
+| ---------- | ------ | ------- | ------- | ----------- | ------- |
+| `Duration` | string | int64 | | | |
### EmbeddedContactPoint
@@ -1670,14 +1639,14 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| --------------------- | ------------- | -------- | :------: | ------- | ---------------------------------------------------------------------------------- | ----------------------- |
-| disableResolveMessage | boolean | `bool` | | | | `false` |
-| name | string | `string` | | | `name` groups multiple contact points with the same name in the UI. | `webhook_1` |
-| provenance | string | `string` | | | | |
-| settings | [JSON](#json) | `JSON` | ✓ | | | |
-| type | string | `string` | ✓ | | | `webhook` |
-| uid | string | `string` | | | UID is the unique identifier of the contact point. The UID can be set by the user. | `my_external_reference` |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ----------------------- | ------------- | ------- | :------: | ------- | ---------------------------------------------------------------------------------- | ----------------------- |
+| `disableResolveMessage` | boolean | `bool` | | | | false |
+| `name` | string | string | | | `name` groups multiple contact points with the same name in the UI. | `webhook_1` |
+| `provenance` | string | string | | | | |
+| `settings` | [JSON](#json) | JSON | ✓ | | | |
+| `type` | string | string | ✓ | | | `webhook` |
+| `uid` | string | string | | | UID is the unique identifier of the contact point. The UID can be set by the user. | `my_external_reference` |
{{% /responsive-table %}}
@@ -1691,9 +1660,9 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
### MatchType
-| Name | Type | Go type | Default | Description | Example |
-| --------- | ------------------------- | ------- | ------- | ----------- | ------- |
-| MatchType | int64 (formatted integer) | int64 | | | |
+| Name | Type | Go type | Default | Description | Example |
+| ----------- | ------------------------- | ------- | ------- | ----------- | ------- |
+| `MatchType` | int64 (formatted integer) | int64 | | | |
### Matcher
@@ -1701,11 +1670,11 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ----- | ------------------------ | ----------- | :------: | ------- | ----------- | ------- |
-| Name | string | `string` | | | | |
-| Type | [MatchType](#match-type) | `MatchType` | | | | |
-| Value | string | `string` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ------- | ------------------------ | --------- | :------: | ------- | ----------- | ------- |
+| `Name` | string | string | | | | |
+| `Type` | [MatchType](#match-type) | MatchType | | | | |
+| `Value` | string | string | | | | |
{{% /responsive-table %}}
@@ -1723,11 +1692,11 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| -------------- | -------------------------------- | ----------------- | :------: | ------- | ------------------- | ------- |
-| name | string | `string` | | | | |
-| time_intervals | [][TimeInterval](#time-interval) | `[]*TimeInterval` | | | | |
-| version | string | `string` | | | Version of resource | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ---------------- | -------------------------------- | ----------------- | :------: | ------- | ------------------- | ------- |
+| `name` | string | string | | | | |
+| `time_intervals` | [][TimeInterval](#time-interval) | `[]*TimeInterval` | | | | |
+| `version` | string | string | | | Version of resource | |
{{% /responsive-table %}}
@@ -1751,10 +1720,10 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
**Properties**
-| Name | Type | Go type | Required | Default | Description | Example |
-| ------ | ---------------------------- | ------------- | :------: | ------- | ----------- | ------- |
-| Policy | [RouteExport](#route-export) | `RouteExport` | | | inline | |
-| orgId | int64 (formatted integer) | `int64` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| -------- | ---------------------------- | ---------------------------- | :------: | ------- | ----------- | ------- |
+| `Policy` | [RouteExport](#route-export) | [RouteExport](#route-export) | | | inline | |
+| `orgId` | int64 (formatted integer) | int64 | | | | |
### NotificationTemplate
@@ -1762,12 +1731,12 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ---------- | ------------------------- | ------------ | :------: | ------- | ------------------- | ------- |
-| name | string | `string` | | | | |
-| provenance | [Provenance](#provenance) | `Provenance` | | | | |
-| template | string | `string` | | | | |
-| version | string | `string` | | | Version of resource | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ------------ | ------------------------- | ------------------------- | :------: | ------- | ------------------- | ------- |
+| `name` | string | string | | | | |
+| `provenance` | [Provenance](#provenance) | [Provenance](#provenance) | | | | |
+| `template` | string | string | | | | |
+| `version` | string | string | | | Version of resource | |
{{% /responsive-table %}}
@@ -1777,10 +1746,10 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| -------- | ------ | -------- | :------: | ------- | ------------------------------------------------------- | ------- |
-| template | string | `string` | | | | |
-| version | string | `string` | | | Version of resource. Should be empty for new templates. | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ---------- | ------ | ------- | :------: | ------- | ------------------------------------------------------- | ------- |
+| `template` | string | string | | | | |
+| `version` | string | string | | | Version of resource. Should be empty for new templates. | |
{{% /responsive-table %}}
@@ -1800,9 +1769,9 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
### Provenance
-| Name | Type | Go type | Default | Description | Example |
-| ---------- | ------ | ------- | ------- | ----------- | ------- |
-| Provenance | string | string | | | |
+| Name | Type | Go type | Default | Description | Example |
+| ------------ | ------ | ------- | ------- | ----------- | ------- |
+| `Provenance` | string | string | | | |
### ProvisionedAlertRule
@@ -1810,24 +1779,24 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ------------ | ---------------------------- | ------------------- | :------: | ------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| annotations | map of string | `map[string]string` | | | Optional key-value pairs. `dashboardUId` and `panelId` must be set together; one cannot be set without the other. | `{"runbook_url":"https://supercoolrunbook.com/page/13"}` |
-| condition | string | `string` | ✓ | | | `A` |
-| data | [][AlertQuery](#alert-query) | `[]*AlertQuery` | ✓ | | | `[{"datasourceUid":"__expr__","model":{"conditions":[{"evaluator":{"params":[0,0],"type":"gt"},"operator":{"type":"and"},"query":{"params":[]},"reducer":{"params":[],"type":"avg"},"type":"query"}],"datasource":{"type":"__expr__","uid":"__expr__"},"expression":"1 == 1","hide":false,"intervalMs":1000,"maxDataPoints":43200,"refId":"A","type":"math"},"queryType":"","refId":"A","relativeTimeRange":{"from":0,"to":0}}]` |
-| execErrState | string | `string` | ✓ | | | |
-| folderUID | string | `string` | ✓ | | | `project_x` |
-| for | [Duration](#duration) | `Duration` | ✓ | | | |
-| id | int64 (formatted integer) | `int64` | | | | |
-| isPaused | boolean | `bool` | | | | `false` |
-| labels | map of string | `map[string]string` | | | | `{"team":"sre-team-1"}` |
-| noDataState | string | `string` | ✓ | | | |
-| orgID | int64 (formatted integer) | `int64` | ✓ | | | |
-| provenance | [Provenance](#provenance) | `Provenance` | | | | |
-| ruleGroup | string | `string` | ✓ | | | `eval_group_1` |
-| title | string | `string` | ✓ | | | `Always firing` |
-| uid | string | `string` | | | | |
-| updated | date-time (formatted string) | `strfmt.DateTime` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ------------- | ---------------------------- | ------------------------- | :------: | ------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `annotations` | map of string | `map[string]string` | | | Optional key-value pairs. `dashboardUId` and `panelId` must be set together; one cannot be set without the other. | `{"runbook_url":"https://supercoolrunbook.com/page/13"}` |
+| `condition` | string | string | ✓ | | | `A` |
+| `data` | [][AlertQuery](#alert-query) | `[]*AlertQuery` | ✓ | | | `[{"datasourceUid":"__expr__","model":{"conditions":[{"evaluator":{"params":[0,0],"type":"gt"},"operator":{"type":"and"},"query":{"params":[]},"reducer":{"params":[],"type":"avg"},"type":"query"}],"datasource":{"type":"__expr__","uid":"__expr__"},"expression":"1 == 1","hide":false,"intervalMs":1000,"maxDataPoints":43200,"refId":"A","type":"math"},"queryType":"","refId":"A","relativeTimeRange":{"from":0,"to":0}}]` |
+| execErrState | string | string | ✓ | | | |
+| `folderUID` | string | string | ✓ | | | `project_x` |
+| `for` | [Duration](#duration) | [Duration](#duration) | ✓ | | | |
+| `id` | int64 (formatted integer) | int64 | | | | |
+| `isPaused` | boolean | `bool` | | | | `false` |
+| `labels` | map of string | `map[string]string` | | | | `{"team":"sre-team-1"}` |
+| `noDataState` | string | string | ✓ | | | |
+| `orgID` | int64 (formatted integer) | `int64 | ✓ | | | |
+| `provenance` | [Provenance](#provenance) | [Provenance](#provenance) | | | | |
+| `ruleGroup` | string | string | ✓ | | | `eval_group_1` |
+| `title` | string | string | ✓ | | | `Always firing` |
+| `uid` | string | string | | | | |
+| `updated` | date-time (formatted string) | `strfmt.DateTime` | | | | |
{{% /responsive-table %}}
@@ -1843,12 +1812,12 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
**Properties**
-| Name | Type | Go type | Required | Default | Description | Example |
-| --------------------- | -------------------------- | ------------ | :------: | ------- | ----------- | ------- |
-| disableResolveMessage | boolean | `bool` | | | | |
-| settings | [RawMessage](#raw-message) | `RawMessage` | | | | |
-| type | string | `string` | | | | |
-| uid | string | `string` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ----------------------- | -------------------------- | ---------- | :------: | ------- | ----------- | ------- |
+| `disableResolveMessage` | boolean | `bool` | | | | |
+| `settings` | [RawMessage](#raw-message) | RawMessage | | | | |
+| `type` | string | string | | | | |
+| `uid` | string | string | | | | |
### Regexp
@@ -1866,10 +1835,10 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ---- | --------------------- | ---------- | :------: | ------- | ----------- | ------- |
-| from | [Duration](#duration) | `Duration` | | | | |
-| to | [Duration](#duration) | `Duration` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ------ | --------------------- | -------- | :------: | ------- | ----------- | ------- |
+| `from` | [Duration](#duration) | Duration | | | | |
+| `to` | [Duration](#duration) | Duration | | | | |
{{% /responsive-table %}}
@@ -1882,21 +1851,21 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ------------------- | ---------------------------------- | ------------------- | :------: | ------- | --------------------------------------- | ------- |
-| continue | boolean | `bool` | | | | |
-| group_by | []string | `[]string` | | | | |
-| group_interval | string | `string` | | | | |
-| group_wait | string | `string` | | | | |
-| match | map of string | `map[string]string` | | | Deprecated. Remove before v1.0 release. | |
-| match_re | [MatchRegexps](#match-regexps) | `MatchRegexps` | | | | |
-| matchers | [Matchers](#matchers) | `Matchers` | | | | |
-| mute_time_intervals | []string | `[]string` | | | | |
-| object_matchers | [ObjectMatchers](#object-matchers) | `ObjectMatchers` | | | | |
-| provenance | [Provenance](#provenance) | `Provenance` | | | | |
-| receiver | string | `string` | | | | |
-| repeat_interval | string | `string` | | | | |
-| routes | [][Route](#route) | `[]*Route` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| --------------------- | ---------------------------------- | ------------------- | :------: | ------- | --------------------------------------- | ------- |
+| `continue` | boolean | `bool` | | | | |
+| `group_by` | []string | `[]string` | | | | |
+| `group_interval` | string | string | | | | |
+| `group_wait` | string | string | | | | |
+| `match` | map of string | `map[string]string` | | | Deprecated. Remove before v1.0 release. | |
+| `match_re` | [MatchRegexps](#match-regexps) | `MatchRegexps` | | | | |
+| `matchers` | [Matchers](#matchers) | `Matchers` | | | | |
+| `mute_time_intervals` | []string | `[]string` | | | | |
+| `object_matchers` | [ObjectMatchers](#object-matchers) | `ObjectMatchers` | | | | |
+| `provenance` | [Provenance](#provenance) | Provenance | | | | |
+| `receiver` | string | string | | | | |
+| `repeat_interval` | string | string | | | | |
+| `routes` | [][Route](#route) | `[]*Route` | | | | |
{{% /responsive-table %}}
@@ -1907,20 +1876,20 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
**Properties**
-| Name | Type | Go type | Required | Default | Description | Example |
-| ------------------- | ---------------------------------- | ------------------- | :------: | ------- | --------------------------------------- | ------- |
-| continue | boolean | `bool` | | | | |
-| group_by | []string | `[]string` | | | | |
-| group_interval | string | `string` | | | | |
-| group_wait | string | `string` | | | | |
-| match | map of string | `map[string]string` | | | Deprecated. Remove before v1.0 release. | |
-| match_re | [MatchRegexps](#match-regexps) | `MatchRegexps` | | | | |
-| matchers | [Matchers](#matchers) | `Matchers` | | | | |
-| mute_time_intervals | []string | `[]string` | | | | |
-| object_matchers | [ObjectMatchers](#object-matchers) | `ObjectMatchers` | | | | |
-| receiver | string | `string` | | | | |
-| repeat_interval | string | `string` | | | | |
-| routes | [][RouteExport](#route-export) | `[]*RouteExport` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| --------------------- | ---------------------------------- | ------------------- | :------: | ------- | --------------------------------------- | ------- |
+| `continue` | boolean | `bool` | | | | |
+| `group_by` | []string | `[]string` | | | | |
+| `group_interval` | string | string | | | | |
+| `group_wait` | string | string | | | | |
+| `match` | map of string | `map[string]string` | | | Deprecated. Remove before v1.0 release. | |
+| `match_re` | [MatchRegexps](#match-regexps) | `MatchRegexps` | | | | |
+| `matchers` | [Matchers](#matchers) | `Matchers` | | | | |
+| `mute_time_intervals` | []string | `[]string` | | | | |
+| `object_matchers` | [ObjectMatchers](#object-matchers) | `ObjectMatchers` | | | | |
+| `receiver` | string | string | | | | |
+| `repeat_interval` | string | string | | | | |
+| `routes` | [][RouteExport](#route-export) | `[]*RouteExport` | | | | |
### TimeInterval
@@ -1931,14 +1900,14 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ------------- | -------------------------- | -------------- | :------: | ------- | ----------- | ------- |
-| days_of_month | []string | `[]string` | | | | |
-| location | string | `string` | | | | |
-| months | []string | `[]string` | | | | |
-| times | [][TimeRange](#time-range) | `[]*TimeRange` | | | | |
-| weekdays | []string | `[]string` | | | | |
-| years | []string | `[]string` | | | | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| --------------- | -------------------------- | -------------- | :------: | ------- | ----------- | ------- |
+| `days_of_month` | []string | []string | | | | |
+| `location` | string | string | | | | |
+| `months` | []string | []string | | | | |
+| `times` | [][TimeRange](#time-range) | `[]*TimeRange` | | | | |
+| `weekdays` | []string | []string | | | | |
+| `years` | []string | []string | | | | |
{{% /responsive-table %}}
@@ -1950,10 +1919,10 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ---------- | ------ | -------- | :------: | ------- | ----------- | ----------------------- |
-| end_time | string | `string` | | | | `"end_time": "24:00"` |
-| start_time | string | `string` | | | | `"start_time": "18:00"` |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ------------ | ------ | ------- | :------: | ------- | ----------- | ----------------------- |
+| `end_time` | string | string | | | | `"end_time": "24:00"` |
+| `start_time` | string | string | | | | `"start_time": "18:00"` |
{{% /responsive-table %}}
@@ -1963,9 +1932,9 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ---- | ------ | -------- | :------: | ------- | ----------- | --------------- |
-| msg | string | `string` | | | | `error message` |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ----- | ------ | ------- | :------: | ------- | ----------- | --------------- |
+| `msg` | string | string | | | | `error message` |
{{% /responsive-table %}}
@@ -1975,11 +1944,11 @@ When creating a contact point, the `EmbeddedContactPoint.name` property determin
{{% responsive-table %}}
-| Name | Type | Go type | Required | Default | Description | Example |
-| ---------- | ---------- | ---------------- | :------: | ------- | ------------------------------------------------------------------------ | ------- |
-| statusCode | string | `string` | ✓ | | HTTP Status Code | |
-| messageId | string | `string` | ✓ | | Unique code of the error | |
-| message | string | `string` | | | Error message | |
-| extra | map of any | `map[string]any` | | | Extra information about the error. Format is specific to the error code. | |
+| Name | Type | Go type | Required | Default | Description | Example |
+| ------------ | ---------- | ---------------- | :------: | ------- | ------------------------------------------------------------------------ | ------- |
+| `statusCode` | string | string | ✓ | | HTTP Status Code | |
+| `messageId` | string | string | ✓ | | Unique code of the error | |
+| `message` | string | string | | | Error message | |
+| `extra` | map of any | `map[string]any` | | | Extra information about the error. Format is specific to the error code. | |
{{% /responsive-table %}}
diff --git a/docs/sources/shared/alerts/first-step.md b/docs/sources/shared/alerts/first-step.md
index 8aa44edf357..afd760ef52e 100644
--- a/docs/sources/shared/alerts/first-step.md
+++ b/docs/sources/shared/alerts/first-step.md
@@ -8,7 +8,7 @@ title: TBD
## TBD
-Use the instructions in [Getting started with Grafana]({{< relref "../../getting-started/getting-started/" >}}) to:
+Use the instructions in [Getting started with Grafana](/docs/grafana//getting-started/getting-started/) to:
- Install Grafana.
- Log in to Grafana.
diff --git a/docs/sources/shared/alerts/grafana-managed-alerts.md b/docs/sources/shared/alerts/grafana-managed-alerts.md
index 3207be93214..77dbbf221cf 100644
--- a/docs/sources/shared/alerts/grafana-managed-alerts.md
+++ b/docs/sources/shared/alerts/grafana-managed-alerts.md
@@ -22,7 +22,7 @@ Alerting rules can only query backend data sources with alerting enabled:
## Metrics from the alerting engine
-The alerting engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics]({{< relref "../../setup-grafana/set-up-grafana-monitoring/" >}}). See also, [View alert rules and their current state]({{< relref "../../alerting/fundamentals/state-and-health/" >}}).
+The alerting engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics](/docs/grafana//setup-grafana/set-up-grafana-monitoring/). See also, [View alert rules and their current state](/docs/grafana//alerting/fundamentals/state-and-health/).
| Metric Name | Type | Description |
| --------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------- |
diff --git a/docs/sources/shared/alerts/note-dynamic-labels.md b/docs/sources/shared/alerts/note-dynamic-labels.md
new file mode 100644
index 00000000000..d657c4249a6
--- /dev/null
+++ b/docs/sources/shared/alerts/note-dynamic-labels.md
@@ -0,0 +1,14 @@
+---
+labels:
+ products:
+ - oss
+title: 'Note Dynamic labels'
+---
+
+{{% admonition type="note" %}}
+
+An alert instance is uniquely identified by its set of labels.
+
+- Avoid displaying query values in labels, as this can create numerous alert instances—one for each distinct label set. Instead, use annotations for query values.
+- If a templated label's value changes, it maps to a different alert instance, and the previous instance transitions to the `No data` state when its label value is no longer present.
+ {{% /admonition %}}
diff --git a/docs/sources/shared/alerts/table-configure-no-data-and-error.md b/docs/sources/shared/alerts/table-configure-no-data-and-error.md
index 5c303f4b4ae..c906a8dc736 100644
--- a/docs/sources/shared/alerts/table-configure-no-data-and-error.md
+++ b/docs/sources/shared/alerts/table-configure-no-data-and-error.md
@@ -5,10 +5,10 @@ labels:
title: 'Table configure no data and error'
---
-| Configure | Set alert state | Description |
-| ---------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| No Data | No Data | The default option for **No Data** events.
Sets alert instance state to `No Data`.
The alert rule also creates a new alert instance `DatasourceNoData` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. |
-| Error | Error | The default option for **Error** events.
Sets alert instance state to `Error`.
The alert rule also creates a new alert instance `DatasourceError` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. |
-| No Data or Error | Alerting | Sets the alert instance state to `Pending` and then transitions to `Alerting` once the pending period ends. If you sent the pending period to 0, the alert instance state is immediately set to `Alerting`. |
-| No Data or Error | Normal | Sets alert instance state to `Normal`. |
-| No Data or Error | Keep Last State | Maintains the alert instance in its last state. Useful for mitigating temporary issues. |
+| Configure | Set alert state | Description |
+| ---------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| No Data | No Data | The default option for **No Data** events.
Sets alert instance state to `No Data`.
The alert rule immediately creates a new `DatasourceNoData` alert instance after evaluation, with the alert rule's name, UID, and the data source UID as labels. |
+| Error | Error | The default option for **Error** events.
Sets alert instance state to `Error`.
The alert rule immediately creates a new `DatasourceError` alert instance after evaluation, with the alert rule's name, UID, and the data source UID as labels. |
+| No Data or Error | Alerting | Sets the alert instance state to `Pending` and then transitions to `Alerting` once the pending period ends. If you sent the pending period to 0, the alert instance state is immediately set to `Alerting`. |
+| No Data or Error | Normal | Sets alert instance state to `Normal`. |
+| No Data or Error | Keep Last State | Maintains the alert instance in its last state. Useful for mitigating temporary issues. |
diff --git a/docs/sources/shared/alerts/warning-provisioning-tree.md b/docs/sources/shared/alerts/warning-provisioning-tree.md
new file mode 100644
index 00000000000..36ecf9b0fa6
--- /dev/null
+++ b/docs/sources/shared/alerts/warning-provisioning-tree.md
@@ -0,0 +1,9 @@
+---
+title: 'Warning Provisioning Tree'
+---
+
+{{% admonition type="warning" %}}
+
+Since the policy tree is a single resource, provisioning it will overwrite all policies in the notification policy tree. However, it does not affect internal policies created when alert rules directly select a contact point.
+
+{{< /admonition >}}
diff --git a/docs/sources/shared/auth/intro.md b/docs/sources/shared/auth/intro.md
index 92c1e0da425..06f702afc87 100644
--- a/docs/sources/shared/auth/intro.md
+++ b/docs/sources/shared/auth/intro.md
@@ -10,4 +10,4 @@ There are numerous authentication methods available in Grafana to verify user id
You can also configure Grafana to automatically update users' roles and team memberships in Grafana based on the information returned by the auth provider integration.
When deciding on an authentication method, it's important to take into account your current identity and access management system as well as the specific authentication and authorization features you require.
-For a complete list of the available authentication options and the features they support, refer to [Configure authentication]({{< relref "/docs/grafana/latest/setup-grafana/configure-security/configure-authentication" >}}).
+For a complete list of the available authentication options and the features they support, refer to [Configure authentication](/docs/grafana//setup-grafana/configure-security/configure-authentication).
diff --git a/docs/sources/shared/developers/authentication.md b/docs/sources/shared/developers/authentication.md
index 6e5158dc46f..7c5d400303e 100644
--- a/docs/sources/shared/developers/authentication.md
+++ b/docs/sources/shared/developers/authentication.md
@@ -21,7 +21,7 @@ curl http://admin:admin@localhost:3000/api/org
### Service account token
To create a service account token, click on **Administration** in the left-side menu, click **Users and access**, then **Service Accounts**.
-For more information on how to use service account tokens, refer to the [Service Accounts]({{< relref "../../administration/service-accounts/" >}}) documentation.
+For more information on how to use service account tokens, refer to the [Service Accounts](/docs/grafana//administration/service-accounts/) documentation.
You use the token in all requests in the `Authorization` header, like this:
diff --git a/docs/sources/shared/plugins/rename-note.md b/docs/sources/shared/plugins/rename-note.md
index 5eaa9a1adf4..4fec1abb499 100644
--- a/docs/sources/shared/plugins/rename-note.md
+++ b/docs/sources/shared/plugins/rename-note.md
@@ -15,5 +15,5 @@ labels:
{{< admonition type="note" >}}
The Grafana Explore apps have changed to Grafana Drilldown apps.
For example, Explore Logs is now Logs Drilldown.
-To learn more, read [Grafana Drilldown apps: the improved queryless experience known as the Explore apps](https://grafana.com/blog/2025/02/20/grafana-drilldown-apps-the-improved-queryless-experience-formerly-known-as-the-explore-apps/).
+To learn more, read [Grafana Drilldown apps: the improved queryless experience formerly known as the Explore apps](https://grafana.com/blog/2025/02/20/grafana-drilldown-apps-the-improved-queryless-experience-formerly-known-as-the-explore-apps/).
{{< /admonition >}}
diff --git a/docs/sources/shared/preferences/some-tasks-require-permissions.md b/docs/sources/shared/preferences/some-tasks-require-permissions.md
index aee8a2c4072..e805648f8f7 100644
--- a/docs/sources/shared/preferences/some-tasks-require-permissions.md
+++ b/docs/sources/shared/preferences/some-tasks-require-permissions.md
@@ -6,4 +6,4 @@ labels:
title: Some tasks require permissions
---
-Some tasks require certain permissions. For more information about roles, refer to [About users and permission]({{< relref "../../administration/manage-users-and-permissions/about-users-and-permissions/" >}}).
+Some tasks require certain permissions. For more information about roles, refer to [About users and permission](/docs/grafana//administration/manage-users-and-permissions/about-users-and-permissions/).
diff --git a/docs/sources/shared/visualizations/change-axis-link.md b/docs/sources/shared/visualizations/change-axis-link.md
index 22023736e4d..00256bc6967 100644
--- a/docs/sources/shared/visualizations/change-axis-link.md
+++ b/docs/sources/shared/visualizations/change-axis-link.md
@@ -4,4 +4,4 @@ title: Stack series link
## Axis
-For full instructions, refer to [Change axis display]({{< relref "../../visualizations/time-series/change-axis-display/" >}}).
+For full instructions, refer to [Change axis display](/docs/grafana//visualizations/time-series/change-axis-display/).
diff --git a/docs/sources/shared/visualizations/stack-series-link.md b/docs/sources/shared/visualizations/stack-series-link.md
index 328f3293109..c8c92e11fe0 100644
--- a/docs/sources/shared/visualizations/stack-series-link.md
+++ b/docs/sources/shared/visualizations/stack-series-link.md
@@ -4,4 +4,4 @@ title: Stack series link
### Stack series
-For full instructions, refer to [Graph stacked time series]({{< relref "../../visualizations/time-series/graph-time-series-stacking/" >}}).
+For full instructions, refer to [Graph stacked time series](/docs/grafana//visualizations/time-series/graph-time-series-stacking/).
diff --git a/docs/sources/troubleshooting/_index.md b/docs/sources/troubleshooting/_index.md
index 77582c18678..0ba9820f64e 100644
--- a/docs/sources/troubleshooting/_index.md
+++ b/docs/sources/troubleshooting/_index.md
@@ -26,23 +26,23 @@ If you encounter an error or problem, then you can check the Grafana server log.
You can enable more logging by changing log level in the Grafana configuration file.
-For more information, refer to [Enable debug logging in Grafana CLI]({{< relref "../cli/#enable-debug-logging" >}}) and the [log section in Configuration]({{< relref "../setup-grafana/configure-grafana/#log" >}}).
+For more information, refer to [Enable debug logging in Grafana CLI](../cli/#enable-debug-logging) and the [log section in Configuration](../setup-grafana/configure-grafana/#log).
## Troubleshoot with Dashboards Panels
-If you have an issue with your Dashboard panel, you can send us debug information. For more information, refer to [Send a panel to Grafana Labs support]({{< relref "./send-panel-to-grafana-support/" >}}).
+If you have an issue with your Dashboard panel, you can send us debug information. For more information, refer to [Send a panel to Grafana Labs support](send-panel-to-grafana-support/).
## Troubleshoot with support bundles
If you have an issue with your Grafana instance, you can generate an archive containing information concerning the state and the configuration of the instance.
-To send us a bundle for advanced support, refer to [Send a support bundle to Grafana Labs support]({{< relref "./support-bundles/" >}}).
+To send us a bundle for advanced support, refer to [Send a support bundle to Grafana Labs support](support-bundles/).
## Troubleshoot transformations
Order of transformations matters. If the final data output from multiple transformations looks wrong, try changing the transformation order. Each transformation transforms data returned by the previous transformation, not the original raw data.
-For more information, refer to [Debug a transformation]({{< relref "../panels-visualizations/query-transform-data/transform-data/#debug-a-transformation" >}}).
+For more information, refer to [Debug a transformation](../panels-visualizations/query-transform-data/transform-data/#debug-a-transformation).
## Text missing with server-side image rendering (RPM-based Linux)
@@ -58,7 +58,7 @@ sudo yum install urw-fonts
## Troubleshoot backend performance
-If you're experiencing backend performance problems, such as high memory or CPU usage, please refer to [Configure profiling and tracing to troubleshoot Grafana]({{< relref "../setup-grafana/configure-grafana/configure-tracing/index.md" >}}).
+If you're experiencing backend performance problems, such as high memory or CPU usage, please refer to [Configure profiling and tracing to troubleshoot Grafana](../setup-grafana/configure-grafana/configure-tracing/).
## More help
diff --git a/docs/sources/tutorials/iis/index.md b/docs/sources/tutorials/iis/index.md
index 20c52aaee37..18a25341c1d 100644
--- a/docs/sources/tutorials/iis/index.md
+++ b/docs/sources/tutorials/iis/index.md
@@ -47,7 +47,7 @@ You will also need the Application Request Routing (ARR) module for IIS for prox
## Grafana Config
-The Grafana config can be set by creating a file named/editing the existing file named `custom.ini` in the `conf` subdirectory of your Grafana installation. See the [installation instructions](http://docs.grafana.org/installation/windows/#configure) for more details.
+The Grafana config can be set by creating a file named/editing the existing file named `custom.ini` in the `conf` subdirectory of your Grafana installation. See the [installation instructions](/docs/grafana//installation/windows/#configure) for more details.
Using the example from above, if the subpath is `grafana` (you can set this to whatever is required) and the parent site is `yourdomain.com:8080`, then you would add this to the `custom.ini` config file:
diff --git a/docs/sources/upgrade-guide/_index.md b/docs/sources/upgrade-guide/_index.md
index 874374740f4..28614991494 100644
--- a/docs/sources/upgrade-guide/_index.md
+++ b/docs/sources/upgrade-guide/_index.md
@@ -22,7 +22,7 @@ We recommend that you upgrade Grafana often to stay current with the latest fixe
Because Grafana upgrades are backward compatible, the upgrade process is straightforward, and dashboards and graphs will not change.
-To learn what's available in a Grafana release, refer to [What's New]({{< relref "../whatsnew" >}}).
+To learn what's available in a Grafana release, refer to [What's New](../whatsnew/).
Refer to any of the following upgrade guides:
diff --git a/docs/sources/upgrade-guide/upgrade-v8.0/index.md b/docs/sources/upgrade-guide/upgrade-v8.0/index.md
index f51f6f4c4ac..720c71960c2 100644
--- a/docs/sources/upgrade-guide/upgrade-v8.0/index.md
+++ b/docs/sources/upgrade-guide/upgrade-v8.0/index.md
@@ -28,7 +28,7 @@ This section describes technical changes associated with this release of Grafana
### Plugins
-Grafana now requires all plugins to be signed. If a plugin is not signed Grafana will not load/start it. This is an additional security measure to make sure plugin files and binaries haven't been tampered with. All Grafana Labs authored plugins, including Enterprise plugins, are now signed. It's possible to allow unsigned plugins using a configuration setting, but is something we strongly advise against doing. For more information about this setting, refer to [allow loading unsigned plugins]({{< relref "../../setup-grafana/configure-grafana#allow_loading_unsigned_plugins" >}}).
+Grafana now requires all plugins to be signed. If a plugin is not signed Grafana will not load/start it. This is an additional security measure to make sure plugin files and binaries haven't been tampered with. All Grafana Labs authored plugins, including Enterprise plugins, are now signed. It's possible to allow unsigned plugins using a configuration setting, but is something we strongly advise against doing. For more information about this setting, refer to [allow loading unsigned plugins](../../setup-grafana/configure-grafana/#allow_loading_unsigned_plugins).
### Grafana Live
@@ -38,7 +38,7 @@ When WebSocket connection is established, Grafana checks the request Origin head
To handle many concurrent WebSocket connections you may need to tune your OS settings or infrastructure. Grafana Live is enabled by default and supports 100 concurrent WebSocket connections max to avoid possible problems with the file descriptor OS limit. As soon as your setup meets the requirements to scale the number of persistent connections this limit can be increased. You also have an option to disable Grafana Live.
-Refer to [Grafana Live configuration]({{< relref "../../setup-grafana/set-up-grafana-live" >}}) documentation for more information.
+Refer to [Grafana Live configuration](../../setup-grafana/set-up-grafana-live/) documentation for more information.
### Postgres, MySQL, Microsoft SQL Server data sources
@@ -65,6 +65,6 @@ ORDER BY time
There are two possible workarounds to resolve this problem:
1. In Grafana v8.0.3, use an alias of the string column selected as `metric`. for example, `hostname as metric`.
-2. Use the [Standard field definitions' display name]({{< relref "../../panels-visualizations/configure-standard-options#display-name" >}}) to format the alias. For the preceding example query, you would use `${__field.labels.hostname}` option.
+2. Use the [Standard field definitions' display name](../../panels-visualizations/configure-standard-options/#display-name) to format the alias. For the preceding example query, you would use `${__field.labels.hostname}` option.
-For more information, refer to the our relational databases documentation of [Postgres]({{< relref "../../datasources/postgres#time-series-queries" >}}), [MySQL]({{< relref "../../datasources/mysql#time-series-queries" >}}), [Microsoft SQL Server]({{< relref "../../datasources/mssql/query-editor#time-series-query-examples" >}}).
+For more information, refer to the our relational databases documentation of [Postgres](../../datasources/postgres/#time-series-queries), [MySQL](../../datasources/mysql/#time-series-queries), [Microsoft SQL Server](../../datasources/mssql/query-editor/#time-series-query-examples).
diff --git a/docs/sources/upgrade-guide/upgrade-v8.1/index.md b/docs/sources/upgrade-guide/upgrade-v8.1/index.md
index 7ca4bf2b280..1e96e22f8a0 100644
--- a/docs/sources/upgrade-guide/upgrade-v8.1/index.md
+++ b/docs/sources/upgrade-guide/upgrade-v8.1/index.md
@@ -34,4 +34,4 @@ As of Grafana v8.1, we no longer support unencrypted storage of passwords and ba
Since Grafana v6.2, new or updated data sources store passwords and basic auth passwords encrypted. However, unencrypted passwords and basic auth passwords were also allowed.
{{% /admonition %}}
-To migrate to encrypted storage, use a `grafana-cli` command to migrate all of your data sources to use encrypted storage of secrets. See [migrate data and encrypt passwords]({{< relref "../../cli#migrate-data-and-encrypt-passwords" >}}) for further instructions.
+To migrate to encrypted storage, use a `grafana-cli` command to migrate all of your data sources to use encrypted storage of secrets. See [migrate data and encrypt passwords](../../cli/#migrate-data-and-encrypt-passwords) for further instructions.
diff --git a/docs/sources/upgrade-guide/upgrade-v9.0/index.md b/docs/sources/upgrade-guide/upgrade-v9.0/index.md
index 70f5a0c7974..9c75c1b4710 100644
--- a/docs/sources/upgrade-guide/upgrade-v9.0/index.md
+++ b/docs/sources/upgrade-guide/upgrade-v9.0/index.md
@@ -59,7 +59,7 @@ In the Prometheus data source, when grafana receives numeric data from Prometheu
+In the InfluxDB data source, browser access mode was deprecated in grafana 8.0.0 and we are removing this feature in 9.0.0. If you are using this mode, you need to [switch to server access mode](../../datasources/influxdb/##influxql-classic-influxdb-query) on the data source configuration page or you can do this via provisioning. -->
### Transformations: Allow more complex regex expressions in rename by regex
@@ -90,7 +90,7 @@ The recommendation here is to enable `envelopeEncryption` for older versions, or
before upgrading to v9.0. However, the latter is probably going to be removed in one of the next releases, so we hugely
encourage to move on with envelope encryption.
-Find [here]({{< relref "../../setup-grafana/configure-security/configure-database-encryption" >}}) more details and some
+Find [here](../../setup-grafana/configure-security/configure-database-encryption/) more details and some
possible workarounds in case you end up in an undesired situation.
### A note on Grafana Enterprise licensing
diff --git a/docs/sources/upgrade-guide/upgrade-v9.2/index.md b/docs/sources/upgrade-guide/upgrade-v9.2/index.md
index 0215b888fa1..3a5272d3111 100644
--- a/docs/sources/upgrade-guide/upgrade-v9.2/index.md
+++ b/docs/sources/upgrade-guide/upgrade-v9.2/index.md
@@ -24,4 +24,4 @@ weight: 2100
## Technical notes
-Beginning in v9.2, Grafana has a [supported database versions policy]({{< relref "../../setup-grafana/installation#supported-databases" >}}). As of this release, MySQL versions from 5.7, postgres versions from v10, and SQLite 3 are supported databases.
+Beginning in v9.2, Grafana has a [supported database versions policy](../../setup-grafana/installation/#supported-databases). As of this release, MySQL versions from 5.7, postgres versions from v10, and SQLite 3 are supported databases.
diff --git a/docs/sources/upgrade-guide/upgrade-v9.5/index.md b/docs/sources/upgrade-guide/upgrade-v9.5/index.md
index d177ca70693..26dc25a4f9e 100644
--- a/docs/sources/upgrade-guide/upgrade-v9.5/index.md
+++ b/docs/sources/upgrade-guide/upgrade-v9.5/index.md
@@ -28,7 +28,7 @@ weight: 1800
Beginning in v9.5, the InfluxDB data source deprecates the `database` field in provisioning files.
The `dbName` field under `jsonData` must be used to store the database information.
-For more information and examples, please refer to [InfluxDB Provisioning]({{< relref "../../datasources/influxdb#provision-the-data-source" >}}).
+For more information and examples, please refer to [InfluxDB Provisioning](../../datasources/influxdb/#provision-the-data-source).
### Dashboard previews deprecation notice
@@ -36,4 +36,4 @@ We are deprecating the dashboard previews feature and will remove it in Grafana
### Migrate your API keys to service accounts
-We are upgrading Grafana [API keys](/docs/grafana//administration/service-accounts/migrate-api-keys/) to service accounts. Service accounts are a superset of API keys that include token rotation and compatibility with [Role-based access control]({{< relref "../../administration/roles-and-permissions/access-control" >}}). In a future release, we'll automatically migrate all existing API keys to service accounts. All of your existing tokens will continue to work; they will simply be migrated to service accounts. You can preempt this change by migrating your existing API keys to service accounts using Grafana's UI or API. Learn how to do this in the [API keys documentation](/docs/grafana//administration/service-accounts/migrate-api-keys/).
+We are upgrading Grafana [API keys](/docs/grafana//administration/service-accounts/migrate-api-keys/) to service accounts. Service accounts are a superset of API keys that include token rotation and compatibility with [Role-based access control](../../administration/roles-and-permissions/access-control/). In a future release, we'll automatically migrate all existing API keys to service accounts. All of your existing tokens will continue to work; they will simply be migrated to service accounts. You can preempt this change by migrating your existing API keys to service accounts using Grafana's UI or API. Learn how to do this in the [API keys documentation](/docs/grafana//administration/service-accounts/migrate-api-keys/).
diff --git a/docs/sources/whatsnew/_index.md b/docs/sources/whatsnew/_index.md
index db397d8a537..dfe2b307d4d 100644
--- a/docs/sources/whatsnew/_index.md
+++ b/docs/sources/whatsnew/_index.md
@@ -69,7 +69,7 @@ weight: 1
For release highlights, deprecations, and breaking changes in Grafana releases, refer to these "What's new" pages for each version.
{{% admonition type="note" %}}
-For Grafana versions prior to v9.2, additional information might also be available in the archive of [release notes]({{< relref "../release-notes/" >}}).
+For Grafana versions prior to v9.2, additional information might also be available in the archive of [release notes](../release-notes/).
{{% /admonition %}}
For a complete list of every change, with links to pull requests and related issues when available, see the [Changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md).
@@ -88,23 +88,23 @@ For a complete list of every change, with links to pull requests and related iss
- [What's new in 10.4](https://grafana.com/docs/grafana//whatsnew/whats-new-in-v10-4/)
- [What's new in 10.3](https://grafana.com/docs/grafana//whatsnew/whats-new-in-v10-3/)
- [What's new in 10.2](https://grafana.com/docs/grafana//whatsnew/whats-new-in-v10-2/)
-- [What's new in 10.1]({{< relref "whats-new-in-v10-1/" >}})
-- [What's new in 10.0]({{< relref "whats-new-in-v10-0/" >}})
+- [What's new in 10.1](whats-new-in-v10-1/)
+- [What's new in 10.0](whats-new-in-v10-0/)
## Grafana 9
-- [What's new in 9.5]({{< relref "./whats-new-in-v9-5" >}})
-- [What's new in 9.4]({{< relref "./whats-new-in-v9-4" >}})
-- [What's new in 9.3]({{< relref "./whats-new-in-v9-3" >}})
-- [What's new in 9.2]({{< relref "./whats-new-in-v9-2" >}})
-- [What's new in 9.1]({{< relref "./whats-new-in-v9-1" >}})
-- [What's new in 9.0]({{< relref "./whats-new-in-v9-0" >}})
+- [What's new in 9.5](whats-new-in-v9-5/)
+- [What's new in 9.4](whats-new-in-v9-4/)
+- [What's new in 9.3](whats-new-in-v9-3/)
+- [What's new in 9.2](whats-new-in-v9-2/)
+- [What's new in 9.1](whats-new-in-v9-1/)
+- [What's new in 9.0](whats-new-in-v9-0/)
## Grafana 8
-- [What's new in 8.5]({{< relref "./whats-new-in-v8-5" >}})
-- [What's new in 8.4]({{< relref "./whats-new-in-v8-4" >}})
-- [What's new in 8.3]({{< relref "./whats-new-in-v8-3" >}})
-- [What's new in 8.2]({{< relref "./whats-new-in-v8-2" >}})
-- [What's new in 8.1]({{< relref "./whats-new-in-v8-1" >}})
-- [What's new in 8.0]({{< relref "./whats-new-in-v8-0" >}})
+- [What's new in 8.5](whats-new-in-v8-5/)
+- [What's new in 8.4](whats-new-in-v8-4/)
+- [What's new in 8.3](whats-new-in-v8-3/)
+- [What's new in 8.2](whats-new-in-v8-2/)
+- [What's new in 8.1](whats-new-in-v8-1/)
+- [What's new in 8.0](whats-new-in-v8-0/)
diff --git a/docs/sources/whatsnew/whats-new-in-v10-0.md b/docs/sources/whatsnew/whats-new-in-v10-0.md
index 9d5b08c7c44..6ac989f0346 100644
--- a/docs/sources/whatsnew/whats-new-in-v10-0.md
+++ b/docs/sources/whatsnew/whats-new-in-v10-0.md
@@ -19,7 +19,7 @@ weight: -37
Welcome to Grafana 10.0! Read on to learn about changes to search and navigation, dashboards and visualizations, and security and authentication.
-For even more detail about all the changes in this release, refer to the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md). For the specific steps we recommend when you upgrade to v10.0, check out our [Upgrade Guide]({{< relref "../upgrade-guide/upgrade-v10.0/index.md" >}}).
+For even more detail about all the changes in this release, refer to the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md). For the specific steps we recommend when you upgrade to v10.0, check out our [Upgrade Guide](../../upgrade-guide/upgrade-v10.0/).
-We're promoting the canvas panel out of public preview and into general availability. Over the past several months we've introduced multiple enhancements to the panel such as the ability to draw connections between elements, the ability to set the color and size of connections based on data, and the ability to add data links. We're excited to include Canvas as a first class citizen in Grafana’s core panel library. To learn more about the panel, refer to our [Canvas documentation]({{< relref "../panels-visualizations/visualizations/canvas" >}}). Also, check out our [latest blog post about canvas](https://grafana.com/blog/2023/05/11/use-canvas-panels-to-customize-visualizations-in-grafana/).
+We're promoting the canvas panel out of public preview and into general availability. Over the past several months we've introduced multiple enhancements to the panel such as the ability to draw connections between elements, the ability to set the color and size of connections based on data, and the ability to add data links. We're excited to include Canvas as a first class citizen in Grafana’s core panel library. To learn more about the panel, refer to our [Canvas documentation](../../panels-visualizations/visualizations/canvas/). Also, check out our [latest blog post about canvas](https://grafana.com/blog/2023/05/11/use-canvas-panels-to-customize-visualizations-in-grafana/).
{{< figure src="/media/docs/grafana/screenshot-grafana-10-0-canvas-service-graph.png" max-width="750px" caption="Canvas service graph" >}}
@@ -97,7 +97,7 @@ We're promoting the canvas panel out of public preview and into general availabi
_Experimental in all editions of Grafana_
-The Trends panel allows you to display trends where the x-axis is numeric and not time. This experimental panel addresses gaps that were not solved by either the Time series or XY Chart panels. For example, you can plot function graphs, rpm/torque curves, supply/demand relationships, and more. To learn more about the Trend panel, refer to the [Trend documentation]({{< relref "../panels-visualizations/visualizations/trend" >}}).
+The Trends panel allows you to display trends where the x-axis is numeric and not time. This experimental panel addresses gaps that were not solved by either the Time series or XY Chart panels. For example, you can plot function graphs, rpm/torque curves, supply/demand relationships, and more. To learn more about the Trend panel, refer to the [Trend documentation](../../panels-visualizations/visualizations/trend/).
{{< figure src="/media/docs/grafana/screenshot-grafana-10-0-trend-panel-new-colors.png" max-width="750px" caption="Trend engine power and torque curves" >}}
@@ -120,7 +120,7 @@ Currently, the Datagrid Panel supports the following features in Grafana version
- Draggable columns and rows
- Series selection when pulling data from a data source
-To learn more, refer to the [Datagrid documentation]({{< relref "../panels-visualizations/visualizations/datagrid/" >}}).
+To learn more, refer to the [Datagrid documentation](../../panels-visualizations/visualizations/datagrid/).
In subsequent releases, we’ll continue adding features to the Datagrid panel to further improve the user experience.
@@ -163,7 +163,7 @@ _Generally available in all editions of Grafana._
We've implemented support for adding time regions to the Time series panel. Time regions provide a more contextualized experience, enabling you to highlight certain days of the week, such as Monday to Friday to display work weeks, right alongside your data. Time regions are also a useful way to highlight specific parts of a day like night, work hours, or whatever you want to define for each day. They allow you to quickly orient yourself in parts of the day or ignore highlighted parts of the time series.
-To learn more, refer to our [time region documentation]({{< relref "../dashboards/build-dashboards/annotate-visualizations/#add-time-regions" >}}).
+To learn more, refer to our [time region documentation](../../dashboards/build-dashboards/annotate-visualizations/#add-time-regions).
{{< figure src="/media/docs/grafana/screenshot-grafana-10-0-time-regions.png" max-width="750px" caption="Time regions" >}}
@@ -175,7 +175,7 @@ _Generally available in all editions of Grafana._
You can now filter dashboard annotations to apply annotations to all panels or selected panels, or use them to exclude selected panels.
-To learn more, refer to our [documentation about adding annotation queries]({{< relref "../dashboards/build-dashboards/annotate-visualizations/#add-new-annotation-queries" >}}).
+To learn more, refer to our [documentation about adding annotation queries](../../dashboards/build-dashboards/annotate-visualizations/#add-new-annotation-queries).
{{< figure src="/media/docs/grafana/screenshot-grafana-10-0-annotation-filtering.png" max-width="750px" caption="Annotation filtering" >}}
@@ -266,11 +266,11 @@ To learn more, refer to our [public dashboards documentation](https://grafana.co
_Generally available in Grafana Enterprise, Cloud Pro, and Cloud Advanced._
You can now configure SAML using our new user interface, making the process easier and more convenient than ever before.
-With the new user interface (UI), you can now configure SAML without needing to restart Grafana and you can control access to the configuration UI by using [role-based access control (RBAC)]({{< relref "../administration/roles-and-permissions/access-control/" >}}), which makes the process much faster and more efficient.
+With the new user interface (UI), you can now configure SAML without needing to restart Grafana and you can control access to the configuration UI by using [role-based access control (RBAC)](../../administration/roles-and-permissions/access-control/), which makes the process much faster and more efficient.
The SAML UI is available in Grafana Enterprise, Cloud Pro, and Advanced. It's user-friendly, with clear instructions and helpful prompts to guide you through the process.
-For more information on how to set up SAML using the Grafana UI, refer to [Configure SAML authentication using the Grafana user interface]({{< relref "../setup-grafana/configure-security/configure-authentication/saml-ui/" >}}).
+For more information on how to set up SAML using the Grafana UI, refer to [Configure SAML authentication using the Grafana user interface](../../setup-grafana/configure-security/configure-authentication/saml-ui/).
### Case-insensitive usernames and email addresses
diff --git a/docs/sources/whatsnew/whats-new-in-v10-1.md b/docs/sources/whatsnew/whats-new-in-v10-1.md
index 5e007c52506..145a5f4d09f 100644
--- a/docs/sources/whatsnew/whats-new-in-v10-1.md
+++ b/docs/sources/whatsnew/whats-new-in-v10-1.md
@@ -19,7 +19,7 @@ weight: -38
Welcome to Grafana 10.1! Read on to learn about changes to dashboards and visualizations, data sources, security and authentication and more. We're particularly excited about a set of improvements to visualizing logs from [Loki](https://grafana.com/products/cloud/logs/) and other logging data sources in Explore mode, and our Flame graph panel, used to visualize profiling data from [Pyroscope](https://grafana.com/blog/2023/03/15/pyroscope-grafana-phlare-join-for-oss-continuous-profiling/?pg=oss-phlare&plcmt=top-promo-banner) and other continuous profiling data sources.
-For even more detail about all the changes in this release, refer to the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md). For the specific steps we recommend when you upgrade to v10.1, check out our [Upgrade Guide]({{< relref "../upgrade-guide/upgrade-v10.1/index.md" >}}).
+For even more detail about all the changes in this release, refer to the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md). For the specific steps we recommend when you upgrade to v10.1, check out our [Upgrade Guide](../../upgrade-guide/upgrade-v10.1/).
-You can now choose whether to set a threshold above which values in the data should be disconnected. This can be useful in cases where you have sensors that report a value at a set interval, but you want to disconnect the values when the sensor does not respond. This feature complements the existing [connect null values functionality]({{< relref "../panels-visualizations/visualizations/time-series/#connect-null-values" >}}).
+You can now choose whether to set a threshold above which values in the data should be disconnected. This can be useful in cases where you have sensors that report a value at a set interval, but you want to disconnect the values when the sensor does not respond. This feature complements the existing [connect null values functionality](../../panels-visualizations/visualizations/time-series/#connect-null-values).
-To learn more, refer to our [disconnect values documentation]({{< relref "../panels-visualizations/visualizations/time-series/#disconnect-values" >}}).
+To learn more, refer to our [disconnect values documentation](../../panels-visualizations/visualizations/time-series/#disconnect-values).
{{< figure src="/media/docs/grafana/screenshot-grafana-10-1-disconnect-values-examples.png" max-width="750px" caption="Disconnect values in Time series, Trend, and State timeline visualizations" >}}
@@ -114,9 +114,9 @@ _Available in public preview in all editions of Grafana_
-You can now display network data in the Geomap visualization by using the new beta Network layer. This layer supports the same data format as the [Node graph visualization]({{< relref "../panels-visualizations/visualizations/node-graph/#data-api" >}}).
+You can now display network data in the Geomap visualization by using the new beta Network layer. This layer supports the same data format as the [Node graph visualization](../../panels-visualizations/visualizations/node-graph/#data-api).
-To learn more, refer to our [Geomap network layer documentation]({{< relref "../panels-visualizations/visualizations/geomap/#network-layer-beta" >}}).
+To learn more, refer to our [Geomap network layer documentation](../../panels-visualizations/visualizations/geomap/#network-layer-beta).
{{< figure src="/media/docs/grafana/screenshot-grafana-10-1-geomap-network-layer-v2.png" max-width="750px" caption="Geomap Network layer" >}}
@@ -128,7 +128,7 @@ _Generally available in all editions of Grafana_
You can now add data links to Heatmap visualizations. This allows you to add links to other dashboards, panels, or external URLs that are relevant to the data in your heatmap. We're pleased to highlight that this feature was a community contribution.
-To learn more, refer to both our [Heatmap documentation]({{< relref "../panels-visualizations/visualizations/heatmap/" >}}) and our [Configure data links documentation]({{< relref "../panels-visualizations/configure-data-links/" >}}).
+To learn more, refer to both our [Heatmap documentation](../../panels-visualizations/visualizations/heatmap/) and our [Configure data links documentation](../../panels-visualizations/configure-data-links/).
{{< figure src="/media/docs/grafana/screenshot-grafana-10-1-heatmap-datalinks.png" max-width="750px" caption="Heatmap datalink support" >}}
@@ -140,7 +140,7 @@ _Generally available in Grafana Enterprise, Cloud Free, Cloud Pro, and Cloud Adv
You can now use the resume and pause report functionality to activate draft reports that have all the required fields filled in.
-To learn more, refer to our [Create and manage reports documentation]({{< relref "../dashboards/create-reports" >}}).
+To learn more, refer to our [Create and manage reports documentation](../../dashboards/create-reports/).
## Data sources
@@ -162,7 +162,7 @@ By default, the `step` parameter is set to the value of the `$__interval` variab
_Generally available in all editions of Grafana_
-New functionality for linking of Loki log lines in Explore allows you to quickly navigate to specific log entries for precise analysis. By clicking the **Copy shortlink** button for a log line, you can generate and copy a [short URL]({{< relref "../developers/http_api/short_url/" >}}) that provides direct access to the exact log entry within an absolute time range. When you open the link, Grafana automatically scrolls to the corresponding log line and highlights it, making it easy to identify and focus on the relevant information.
+New functionality for linking of Loki log lines in Explore allows you to quickly navigate to specific log entries for precise analysis. By clicking the **Copy shortlink** button for a log line, you can generate and copy a [short URL](../../developers/http_api/short_url/) that provides direct access to the exact log entry within an absolute time range. When you open the link, Grafana automatically scrolls to the corresponding log line and highlights it, making it easy to identify and focus on the relevant information.
{{< figure src="/media/docs/grafana/data-sources/loki-shortlink.png" max-width="750px" caption="New Loki log line linking" >}}
@@ -211,7 +211,7 @@ Currently, you can add one or more of the following filters:
To only show the spans you've matched, you can enable the **Show matches only** toggle.
-Learn more about span filtering in our [Tempo data source documentation]({{< relref "../datasources/tempo/#span-filters" >}}).
+Learn more about span filtering in our [Tempo data source documentation](../../datasources/tempo/#span-filters).
{{< figure src="/media/docs/tempo/screenshot-grafana-tempo-span-filters-v10-1.png" max-width="750px" caption="Traces span filtering" >}}
@@ -322,7 +322,7 @@ Data source plugin developers can now use any plugin to visualize data in Explor
_All Alerting features are generally available in all editions of Grafana_
-We’ve made a number of improvements to simplify the alert rule creation process as well as improvements to contact points and alert management. For all the details, refer to our [Alerting documentation]({{< relref "../alerting" >}}).
+We’ve made a number of improvements to simplify the alert rule creation process as well as improvements to contact points and alert management. For all the details, refer to our [Alerting documentation](../../alerting/).
### Alert rules
@@ -426,7 +426,7 @@ We've removed the `onlyExternalOrgRoleSync` feature toggle, and have defaulted t
If you prefer to manage your users' organization roles manually, enable the `skip_org_role_sync` option in the Grafana configuration for your authentication provider.
-For context on the previous work done leading up to this change, refer to the [Grafana v9.5 What's new]({{< relref "../whatsnew/whats-new-in-v9-5/#auth-lock-organization-roles-synced-from-auth-providers" >}}).
+For context on the previous work done leading up to this change, refer to the [Grafana v9.5 What's new](../whats-new-in-v9-5/#auth-lock-organization-roles-synced-from-auth-providers).
### GitLab OIDC support
@@ -439,7 +439,7 @@ Grafana now supports GitLab OIDC through the `GitLab` OAuth provider in addition
This change also allows Grafana to reduce the access scope to only the required scopes for authentication and authorization, instead
of full read API access.
-To learn how to migrate your GitLab OAuth2 setup to OIDC, refer to our [GitLab authentication documentation]({{< relref "../setup-grafana/configure-security/configure-authentication/gitlab/" >}}).
+To learn how to migrate your GitLab OAuth2 setup to OIDC, refer to our [GitLab authentication documentation](../../setup-grafana/configure-security/configure-authentication/gitlab/).
### Google OIDC and Team Sync support
@@ -451,7 +451,7 @@ Grafana now supports Google OIDC through the `Google` OAuth provider in addition
This release also adds support for Google OIDC in Team Sync. You can now easily add users to teams by using their Google groups.
-To learn how to migrate your Google OAuth2 setup to OIDC and how to set up Team Sync, refer to our [Google authentication documentation]({{< relref "../setup-grafana/configure-security/configure-authentication/google/" >}}).
+To learn how to migrate your Google OAuth2 setup to OIDC and how to set up Team Sync, refer to our [Google authentication documentation](../../setup-grafana/configure-security/configure-authentication/google/).
## Plugins
@@ -461,7 +461,7 @@ To learn how to migrate your Google OAuth2 setup to OIDC and how to set up Team
_Generally available in all editions of Grafana_
-We've made the following updates to increase awareness of the [Angular deprecation]({{< relref "../developers/angular_deprecation/" >}}) and its consequences in future releases of Grafana:
+We've made the following updates to increase awareness of the [Angular deprecation](../../developers/angular_deprecation/) and its consequences in future releases of Grafana:
#### UI changes
@@ -471,9 +471,9 @@ We've made the following updates to increase awareness of the [Angular deprecati
#### Other changes
-- Angular Plugins will not be loaded if [angular_support_enabled]({{< relref "../setup-grafana/configure-grafana/#angular_support_enabled" >}}) is set to `false`.
+- Angular Plugins will not be loaded if [angular_support_enabled](../../setup-grafana/configure-grafana/#angular_support_enabled) is set to `false`.
-Learn more in our [Angular support deprecation documentation]({{< relref "../developers/angular_deprecation/" >}}).
+Learn more in our [Angular support deprecation documentation](../../developers/angular_deprecation/).
### Deprecated provisioning of data sources with invalid UIDs
diff --git a/docs/sources/whatsnew/whats-new-in-v7-0.md b/docs/sources/whatsnew/whats-new-in-v7-0.md
index c1b8ce1e957..50d5ddbe753 100644
--- a/docs/sources/whatsnew/whats-new-in-v7-0.md
+++ b/docs/sources/whatsnew/whats-new-in-v7-0.md
@@ -31,17 +31,17 @@ The Grafana 7.0 stable release is scheduled for the 18th of May. In the meantime
The main highlights are:
-- [**New Panel Editor** Redesign based on community feedback.]({{< relref "#new-panel-editor-and-unified-data-model" >}})
-- [**Explore** New tracing UI and support for visualizing Jaeger and Zipkin traces.]({{< relref "#new-tracing-ui" >}})
-- [**Enterprise** Usage insights, Presence indicator, and Auth improvements.]({{< relref "#grafana-enterprise" >}})
-- [**Transformations** Transformations and simple Math operations for all data sources.]({{< relref "#transformations" >}})
-- [**Field overrides** Automatically configure panels with data from queries.]({{< relref "#field-options-and-overrides" >}})
-- [**Table** New Table panel.]({{< relref "#table-panel" >}})
-- [**Plugins** New plugins platform.]({{< relref "#plugins-platform" >}})
-- [**Tutorials** New tutorials section.]({{< relref "#new-tutorials" >}})
-- [**Cloudwatch** Support for Cloudwatch Logs in Explore and the Logs panel.]({{< relref "#cloudwatch-logs" >}})
-- [**Breaking change** PhantomJS removed.]({{< relref "#breaking-change---phantomjs-removed" >}})
-- [**Time zones** Time zone support]({{< relref "#time-zone-support" >}})
+- [**New Panel Editor** Redesign based on community feedback.](#new-panel-editor-and-unified-data-model)
+- [**Explore** New tracing UI and support for visualizing Jaeger and Zipkin traces.](#new-tracing-ui)
+- [**Enterprise** Usage insights, Presence indicator, and Auth improvements.](#grafana-enterprise)
+- [**Transformations** Transformations and simple Math operations for all data sources.](#transformations)
+- [**Field overrides** Automatically configure panels with data from queries.](#field-options-and-overrides)
+- [**Table** New Table panel.](#table-panel)
+- [**Plugins** New plugins platform.](#plugins-platform)
+- [**Tutorials** New tutorials section.](#new-tutorials)
+- [**Cloudwatch** Support for Cloudwatch Logs in Explore and the Logs panel.](#cloudwatch-logs)
+- [**Breaking change** PhantomJS removed.](#breaking-change---phantomjs-removed)
+- [**Time zones** Time zone support](#time-zone-support)
## New panel editor and unified data model
@@ -53,7 +53,7 @@ In previous versions of Grafana, each visualization had slightly different ways
We have yet to migrate all core panels to this new architecture so in 7.0 there will be some inconsistencies in the UI between panels. This will be fixed soon in future releases as we update all the core panels and help the community update the community panel plugins.
-Learn more about this feature in [Panel editor]({{< relref "../panels-visualizations/panel-editor-overview" >}}).
+Learn more about this feature in [Panel editor](../../panels-visualizations/panel-editor-overview/).
## New tracing UI
@@ -69,9 +69,9 @@ In the future we will add more workflows and integrations so that correlating be
The data you want to visualize can come from many different places and it is usually not in exactly the right form. Users can now transform non-time series data into tables (e.g., JSON files or even simple lookup tables) in seconds without any customization or additional overhead. They can then combine non-time series data with any other data in Grafana; data from an external database or a panel that already exists in one of their current dashboards.
-By chaining a simple set of point and click [transformations]({{< relref "../panels-visualizations/query-transform-data/transform-data#transformation-functions" >}}), users will be able join, pivot, filter, re-name and do calculations to get the results they need. Perfect for operations across queries or data sources missing essential data transformations.
+By chaining a simple set of point and click [transformations](../../panels-visualizations/query-transform-data/transform-data/#transformation-functions), users will be able join, pivot, filter, re-name and do calculations to get the results they need. Perfect for operations across queries or data sources missing essential data transformations.
-[Transformations]({{< relref "../panels-visualizations/query-transform-data/transform-data" >}}) also adds the ability to do math across queries. Lots of data sources do not support this natively, so being able to do it in Grafana is a powerful feature.
+[Transformations](../../panels-visualizations/query-transform-data/transform-data/) also adds the ability to do math across queries. Lots of data sources do not support this natively, so being able to do it in Grafana is a powerful feature.
For users with large dashboards or with heavy queries, being able to reuse the query result from one panel in another panel can be a huge performance gain for slow queries (e.g log or sql queries). From the data source menu in the query editor, you can choose the `--dashboard--` option and then choose the query result from another panel on the same dashboard.
@@ -89,7 +89,7 @@ We are also introducing a new shared data model for both time series and table d
- **Outer join:** Joins many time series/tables by a field. This can be used to outer join multiple time series on the _time_ field to show many time series in one table.
- **Add field from calculation:** This is a powerful transformation that allows you perform many different types of math operations and add the result as a new field. Can be used to calculate the difference between two series or fields and add the result to a new field. Or multiply one field with another and add the result to a new field.
-Learn more about this feature in [Transformations]({{< relref "../panels-visualizations/query-transform-data/transform-data#transformation-functions" >}}).
+Learn more about this feature in [Transformations](../../panels-visualizations/query-transform-data/transform-data/#transformation-functions).
## Field options and overrides
@@ -99,7 +99,7 @@ Up until now the overrides were available only for Graph and Table panel(via Col
This feature enables even more powerful visualizations and fine grained control over how the data is displayed.
-Learn more about this feature in [Field overrides]({{< relref "../panels-visualizations/configure-overrides" >}}).
+Learn more about this feature in [Field overrides](../../panels-visualizations/configure-overrides/).
## Inspect panels and export data to CSV
@@ -107,7 +107,7 @@ Learn more about this feature in [Field overrides]({{< relref "../panels-visuali
Another new feature of Grafana 7.0 is the panel inspector. Inspect allows you to view the raw data for any Grafana panel as well as export that data to a CSV file. With Panel inspect you will also be able to perform simple raw data transformations like join, view query stats or detailed execution data.
-Learn more about this feature in [Panel Inspector]({{< relref "../panels-visualizations/panel-inspector#inspect-query-request-and-response-data" >}}).
+Learn more about this feature in [Panel Inspector](../../panels-visualizations/panel-inspector/#inspect-query-request-and-response-data).
@@ -153,7 +153,7 @@ Plugins can be monitored with the new metrics and health check capabilities. The
With this release, we are deprecating the unofficial first version of backend plugins which will be removed in a future release.
-To learn more, start with the [overview](https://grafana.com/developers/plugin-tools/key-concepts/backend-plugins/). Next, in this [tutorial](https://grafana.com/developers/plugin-tools/tutorials/build-a-data-source-backend-plugin) you'll learn how to build a backend for a data source plugin and enable it for use with [Grafana Alerting]({{< relref "../alerting" >}}). Make sure to keep an eye out for additional documentation and tutorials that will be published after the Grafana v7.0 release.
+To learn more, start with the [overview](https://grafana.com/developers/plugin-tools/key-concepts/backend-plugins/). Next, in this [tutorial](https://grafana.com/developers/plugin-tools/tutorials/build-a-data-source-backend-plugin) you'll learn how to build a backend for a data source plugin and enable it for use with [Grafana Alerting](../../alerting/). Make sure to keep an eye out for additional documentation and tutorials that will be published after the Grafana v7.0 release.
## New tutorials
@@ -180,27 +180,27 @@ Since then we have been working towards removing PhantomJS. In October 2019, whe
As a replacement for PhantomJS we’ve developed the [Grafana Image Renderer plugin](/grafana/plugins/grafana-image-renderer) which is a plugin that runs on the backend and handles rendering panels and dashboards as PNG images using headless Chromium/Chrome. The [Grafana Image Renderer plugin](/grafana/plugins/grafana-image-renderer) can either be installed as a Grafana plugin running in its own process side-by-side with Grafana. or runs as an external HTTP service, hosted using Docker or as a standalone application.
-Read more about [Image Rendering]({{< relref "../setup-grafana/image-rendering" >}}) in the documentation for further instructions.
+Read more about [Image Rendering](../../setup-grafana/image-rendering/) in the documentation for further instructions.
## Query history in Explore out of beta
The Query history feature lets you view and interact with the queries that you have previously run in Explore. You can add queries to the Explore query editor, write comments, create and share URL links, star your favorite queries, and much more. Starred queries are displayed in the Starred tab, so it is easier to reuse queries that you run often without typing them from scratch.
-It was released as a beta feature in Grafana 6.7. The feedback has been really positive and it is now out of beta for the 7.0 release. Learn more about query history in [Explore]({{< relref "../explore" >}}).
+It was released as a beta feature in Grafana 6.7. The feedback has been really positive and it is now out of beta for the 7.0 release. Learn more about query history in [Explore](../../explore/).
## Stackdriver data source supports Service Monitoring
-[Service monitoring](https://cloud.google.com/service-monitoring) in Google Cloud Platform (GCP) enables you to monitor based on Service Level Objectives (SLOs) for your GCP services. The new SLO query builder in the Stackdriver data source allows you to display SLO data in Grafana. Read more about it in the [Stackdriver data source documentation]({{< relref "../datasources/google-cloud-monitoring#slo-service-level-objective-queries" >}}).
+[Service monitoring](https://cloud.google.com/service-monitoring) in Google Cloud Platform (GCP) enables you to monitor based on Service Level Objectives (SLOs) for your GCP services. The new SLO query builder in the Stackdriver data source allows you to display SLO data in Grafana. Read more about it in the [Stackdriver data source documentation](../../datasources/google-cloud-monitoring/#slo-service-level-objective-queries).
## Time zone support
-You can now override the [time zone]({{< relref "../dashboards/manage-dashboards#dashboard-time-settings" >}}) used to display date and time values in a dashboard. One benefit of this is that you can specify the local time zone of the service or system that you are monitoring which can be helpful when monitoring a system or service that operates across several time zones.
+You can now override the [time zone](../../dashboards/manage-dashboards/#dashboard-time-settings) used to display date and time values in a dashboard. One benefit of this is that you can specify the local time zone of the service or system that you are monitoring which can be helpful when monitoring a system or service that operates across several time zones.
## Alerting and deep linking for Azure Log Analytics
The Azure Monitor data source supports multiple Azure services. Log Analytics queries in the data source now have alerting support too (Azure Monitor and Application Insights already had alerting support).
-A new feature is [deep linking from the graph panel to the Log Analytics query editor in the Azure Portal]({{< relref "../datasources/azure-monitor#deep-link-from-grafana-panels-to-the-log-analytics-query-editor-in-azure-portal" >}}). Click on a time series in the panel to see a context menu with a link to View in Azure Portal. Clicking that link opens the Azure Log Analytics query editor in the Azure Portal and runs the query from the Grafana panel.
+A new feature is [deep linking from the graph panel to the Log Analytics query editor in the Azure Portal](../../datasources/azure-monitor/#deep-link-from-grafana-panels-to-the-log-analytics-query-editor-in-azure-portal). Click on a time series in the panel to see a context menu with a link to View in Azure Portal. Clicking that link opens the Azure Log Analytics query editor in the Azure Portal and runs the query from the Grafana panel.
## Grafana Enterprise
@@ -219,17 +219,17 @@ This includes problems like:
### Usage insights and Presence indicator
-This release includes a series of features that build on our new usage analytics engine. This “Grafana about Grafana” feature will help our large customers get better insight into the behavior and utilization of their users, dashboards, and data sources. The improved [dashboard search]({{< relref "../dashboards/assess-dashboard-usage#sort-dashboards-by-using-insights-data" >}}) allows you to sort dashboards by usage and errors. When a user opens a dashboard, they will see a [presence indicator]({{< relref "../dashboards/assess-dashboard-usage#presence-indicator" >}}) of who else is viewing the same dashboard. And finally [Dashboard insights]({{< relref "../dashboards/assess-dashboard-usage#dashboard-insights" >}}) allows you to view recent dashboard usage.
+This release includes a series of features that build on our new usage analytics engine. This “Grafana about Grafana” feature will help our large customers get better insight into the behavior and utilization of their users, dashboards, and data sources. The improved [dashboard search](../../dashboards/assess-dashboard-usage/#sort-dashboards-by-using-insights-data) allows you to sort dashboards by usage and errors. When a user opens a dashboard, they will see a [presence indicator](../../dashboards/assess-dashboard-usage/#presence-indicator) of who else is viewing the same dashboard. And finally [Dashboard insights](../../dashboards/assess-dashboard-usage/#dashboard-insights) allows you to view recent dashboard usage.
{{< figure src="/static/img/docs/v70/presence_indicator.jpg" max-width="1024px" caption="Grafana Enterprise - Presence indicator" >}}
### SAML Role and Team Sync
-SAML support in Grafana Enterprise is improved by adding Role and Team Sync. Read more about how to use these features in the [SAML team sync documentation]({{< relref "../setup-grafana/configure-security/configure-authentication/saml#configure-team-sync" >}}).
+SAML support in Grafana Enterprise is improved by adding Role and Team Sync. Read more about how to use these features in the [SAML team sync documentation](../../setup-grafana/configure-security/configure-authentication/saml/#configure-team-sync).
### Okta OAuth Team Sync
-Okta gets its own provider which adds support for Team Sync. Read more about it in the [Okta documentation]({{< relref "../setup-grafana/configure-security/configure-authentication/okta" >}}).
+Okta gets its own provider which adds support for Team Sync. Read more about it in the [Okta documentation](../../setup-grafana/configure-security/configure-authentication/okta/).
## Changelog
diff --git a/docs/sources/whatsnew/whats-new-in-v7-1.md b/docs/sources/whatsnew/whats-new-in-v7-1.md
index 65e9b5f8544..f6ecb1537c7 100644
--- a/docs/sources/whatsnew/whats-new-in-v7-1.md
+++ b/docs/sources/whatsnew/whats-new-in-v7-1.md
@@ -25,19 +25,19 @@ This topic includes the release notes for the Grafana v7.1. For all details, rea
The main highlights are:
-- [**Flux and InfluxDB 2.x support in the Influx Datasource**]({{< relref "#influx-data-source" >}})
-- [**Query history search**]({{< relref "#query-history-search" >}})
-- [**Unification of Explore modes**]({{< relref "#explore-modes-unified" >}})
-- [**Elasticsearch- link to another data source from Explore**]({{< relref "#internal-links-for-elasticsearch" >}})
-- [**Merge on time transform for the new table panel**]({{< relref "#transformations" >}})
-- [**Stat panel text mode**]({{< relref "#stat-panel-text-mode" >}})
-- [**Time range picker update**]({{< relref "#time-range-picker-update" >}})
-- [**Provisioning of apps**]({{< relref "#provisioning-of-apps" >}})
-- [**Azure Monitor Datasource**]({{< relref "#azure-monitor-data-source" >}})
-- [**Deep linking for Google Cloud Monitoring (formerly named Google Stackdriver) datasource**]({{< relref "#deep-linking-for-google-cloud-monitoring-formerly-named-google-stackdriver-data-source" >}})
-- [**Grafana Enterprise features**]({{< relref "#grafana-enterprise-features" >}})
- - [**Secret management with HashiCorp Vault**]({{< relref "#support-for-hashicorp-vault" >}})
- - [**Monthly schedules in reports**]({{< relref "#support-for-monthly-schedules-in-reports" >}})
+- [**Flux and InfluxDB 2.x support in the Influx Datasource**](#influx-data-source)
+- [**Query history search**](#query-history-search)
+- [**Unification of Explore modes**](#explore-modes-unified)
+- [**Elasticsearch- link to another data source from Explore**](#internal-links-for-elasticsearch)
+- [**Merge on time transform for the new table panel**](#transformations)
+- [**Stat panel text mode**](#stat-panel-text-mode)
+- [**Time range picker update**](#time-range-picker-update)
+- [**Provisioning of apps**](#provisioning-of-apps)
+- [**Azure Monitor Datasource**](#azure-monitor-data-source)
+- [**Deep linking for Google Cloud Monitoring (formerly named Google Stackdriver) datasource**](#deep-linking-for-google-cloud-monitoring-formerly-named-google-stackdriver-data-source)
+- [**Grafana Enterprise features**](#grafana-enterprise-features)
+ - [**Secret management with HashiCorp Vault**](#support-for-hashicorp-vault)
+ - [**Monthly schedules in reports**](#support-for-monthly-schedules-in-reports)
## Influx data source
@@ -45,7 +45,7 @@ Support for Flux and Influx v2 has been added. The InfluxData blog post, [How to
## Query history search
-In Grafana v 7.1 we are introducing search functionality in Query history. You can search across queries and your comments. It is especially useful in combination with a time filter and data source filter. Read more about [Query history here]({{< relref "../explore#query-history" >}}).
+In Grafana v 7.1 we are introducing search functionality in Query history. You can search across queries and your comments. It is especially useful in combination with a time filter and data source filter. Read more about [Query history here](../../explore/#query-history).
{{< figure src="/static/img/docs/v71/query_history_search.gif" max-width="800px" caption="Query history search" >}}
@@ -67,11 +67,11 @@ The new table panel introduced in 7.0 was missing a few features that the old ta
## Ad hoc filtering in the new table panel
-[Ad hoc filtering]({{< relref "../dashboards/variables/add-template-variables#add-ad-hoc-filters" >}}), a way to automatically add filters to queries without having to define template variables is now supported in the new Table panel.
+[Ad hoc filtering](../../dashboards/variables/add-template-variables/#add-ad-hoc-filters), a way to automatically add filters to queries without having to define template variables is now supported in the new Table panel.
## Stat panel text mode
-The [stat panel]({{< relref "../panels-visualizations/visualizations/stat#text-mode" >}}) has a new **Text mode** option to control what text to show.
+The [stat panel](../../panels-visualizations/visualizations/stat/#text-mode) has a new **Text mode** option to control what text to show.
By default, the Stat panel displays:
@@ -84,7 +84,7 @@ You can use the Text mode option to control what text the panel renders. If the
## Provisioning of apps
-Grafana v7.1 adds support for provisioning of app plugins. This allows app plugins to be configured and enabled/disabled using configuration files. For more information about provisioning of app, refer to [provisioning plugin]({{< relref "../administration/provisioning#plugins" >}}).
+Grafana v7.1 adds support for provisioning of app plugins. This allows app plugins to be configured and enabled/disabled using configuration files. For more information about provisioning of app, refer to [provisioning plugin](../../administration/provisioning/#plugins).
## Azure Monitor data source
@@ -94,7 +94,7 @@ Additionally, the Raw Edit mode for Application Insights Analytics has been repl
## Deep linking for Google Cloud Monitoring (formerly named Google Stackdriver) data source
-A new feature in Grafana 7.1 is [deep linking from Grafana panels to the Metrics Explorer in Google Cloud Console]({{< relref "../datasources/google-cloud-monitoring#deep-linking-from-grafana-panels-to-the-metrics-explorer-in-google-cloud-console" >}}). Click on a time series in the panel to see a context menu with a link to View in Metrics explorer in Google Cloud Console. Clicking that link opens the Metrics explorer in the Monitoring Google Cloud Console and runs the query from the Grafana panel there.
+A new feature in Grafana 7.1 is [deep linking from Grafana panels to the Metrics Explorer in Google Cloud Console](../../datasources/google-cloud-monitoring/#deep-linking-from-grafana-panels-to-the-metrics-explorer-in-google-cloud-console). Click on a time series in the panel to see a context menu with a link to View in Metrics explorer in Google Cloud Console. Clicking that link opens the Metrics explorer in the Monitoring Google Cloud Console and runs the query from the Grafana panel there.
## Time range picker update
@@ -108,11 +108,11 @@ General features are included in the Grafana Enterprise edition software.
### Support for HashiCorp Vault
-You can now use HashiCorp Vault to get secrets for configuration and provisioning of Grafana Enterprise. For more information about HashiCorp Vault, refer to [vault]({{< relref "../setup-grafana/configure-security/configure-database-encryption/integrate-with-hashicorp-vault" >}}).
+You can now use HashiCorp Vault to get secrets for configuration and provisioning of Grafana Enterprise. For more information about HashiCorp Vault, refer to [vault](../../setup-grafana/configure-security/configure-database-encryption/integrate-with-hashicorp-vault/).
### Support for monthly schedules in reports
-With Grafana Enterprise 7.1, you can generate reports on a [monthly schedule]({{< relref "../dashboards/share-dashboards-panels#scheduling" >}}).
+With Grafana Enterprise 7.1, you can generate reports on a [monthly schedule](../../dashboards/share-dashboards-panels/#scheduling).
## Changelog
diff --git a/docs/sources/whatsnew/whats-new-in-v7-2.md b/docs/sources/whatsnew/whats-new-in-v7-2.md
index 0020f4c71e1..b6b08749e53 100644
--- a/docs/sources/whatsnew/whats-new-in-v7-2.md
+++ b/docs/sources/whatsnew/whats-new-in-v7-2.md
@@ -25,23 +25,23 @@ This topic includes the release notes for the Grafana v7.2. For all details, rea
The main highlights are:
-- [**New date formatting options added**]({{< relref "#new=date-formatting-options-added" >}})
-- [**Field options are out of beta!**]({{< relref "#field-options-are-out-of-beta" >}})
- - [**Added table column filters**]({{< relref "#added-table-column-filters" >}})
- - [**New field override selection options**]({{< relref "#new-field-override-selection-options" >}})
-- [**New transformations and enhancements**]({{< relref "#new-transformations-and-enhancements" >}})
-- [**Drag to reorder queries**]({{< relref "#drag-to-reorder-queries" >}})
-- [**Inspect queries in Explore**]({{< relref "#inspect-queries-in-explore" >}})
-- [**$__rate_interval for Prometheus**]({{< relref "#__rate_interval-for-prometheus" >}})
-- [**Toggle parsed log fields**]({{< relref "#toggle-parsed-log-fields" >}})
-- [**Sensitive alert channel settings are now encrypted**]({{< relref "#sensitive-alert-channel-settings-are-now-encrypted" >}})
-- [**Grafana Enterprise features**]({{< relref "#grafana-enterprise-features" >}})
- - [**Report time range**]({{< relref "#report-time-range" >}})
- - [**Organization-wide report settings**]({{< relref "#organization-wide-report-settings" >}})
- - [**Report grid layout**]({{< relref "#report-grid-layout" >}})
-- [**What's new in other parts of the Grafana ecosystem**]({{< relref "#whats-new-in-other-parts-of-the-grafana-ecosystem" >}})
- - [**ADX (Azure Data Explorer) plugin**]({{< relref "#adx-azure-data-explorer-plugin" >}})
- - [**X-Ray data source plugin**]({{< relref "#x-ray-data-source-plugin" >}})
+- [**New date formatting options added**](#new=date-formatting-options-added)
+- [**Field options are out of beta!**](#field-options-are-out-of-beta)
+ - [**Added table column filters**](#added-table-column-filters)
+ - [**New field override selection options**](#new-field-override-selection-options)
+- [**New transformations and enhancements**](#new-transformations-and-enhancements)
+- [**Drag to reorder queries**](#drag-to-reorder-queries)
+- [**Inspect queries in Explore**](#inspect-queries-in-explore)
+- [**$\_\_rate_interval for Prometheus**](#__rate_interval-for-prometheus)
+- [**Toggle parsed log fields**](#toggle-parsed-log-fields)
+- [**Sensitive alert channel settings are now encrypted**](#sensitive-alert-channel-settings-are-now-encrypted)
+- [**Grafana Enterprise features**](#grafana-enterprise-features)
+ - [**Report time range**](#report-time-range)
+ - [**Organization-wide report settings**](#organization-wide-report-settings)
+ - [**Report grid layout**](#report-grid-layout)
+- [**What's new in other parts of the Grafana ecosystem**](#whats-new-in-other-parts-of-the-grafana-ecosystem)
+ - [**ADX (Azure Data Explorer) plugin**](#adx-azure-data-explorer-plugin)
+ - [**X-Ray data source plugin**](#x-ray-data-source-plugin)
## New date formatting options added
@@ -51,7 +51,7 @@ This screenshot shows both a custom full date format with a 12 hour clock and am
{{< figure src="/static/img/docs/v72/date_formats.png" max-width="800px" caption="Custom date time formats" >}}
-Date formats are set for a Grafana instance by adjusting [server-wide settings]({{< relref "../setup-grafana/configure-grafana#date_formats" >}}) in the Grafana configuration file. We hope to add org- and user-level settings in the future.
+Date formats are set for a Grafana instance by adjusting [server-wide settings](../../setup-grafana/configure-grafana/#date_formats) in the Grafana configuration file. We hope to add org- and user-level settings in the future.
```
[date_formats]
@@ -66,7 +66,7 @@ interval_year = YYYY
There is also experimental support to use the browser location and language to dynamically change the current date format for each user. This feature is disabled by default.
-The [Configuration]({{< relref "../setup-grafana/configure-grafana#date_formats" >}}) topic has been updated as a result of this change.
+The [Configuration](../../setup-grafana/configure-grafana/#date_formats) topic has been updated as a result of this change.
## Field options are out of beta!
@@ -78,7 +78,7 @@ You can now dynamically apply value filters to any table column. This option can
{{< figure src="/static/img/docs/v72/table_column_filters.png" max-width="800px" caption="Table column filters" >}}
-[Filter table columns]({{< relref "../panels-visualizations/visualizations/table#filter-table-columns" >}}) has been added as a result of this feature.
+[Filter table columns](../../panels-visualizations/visualizations/table/#filter-table-columns) has been added as a result of this feature.
### New field override selection options
@@ -88,8 +88,8 @@ You can now add override rules that use a regex matcher to choose which fields t
Grafana 7.2 includes the following transformation enhancements:
-- A new [Group By]({{< relref "../panels-visualizations/query-transform-data/transform-data#group-by" >}}) transformation that allows you to group by multiple fields and add any number of aggregations for other fields.
-- The [Labels to fields]({{< relref "../panels-visualizations/query-transform-data/transform-data#labels-to-fields" >}}) transformation now allows you to pick one label and use that as the name of the value field.
+- A new [Group By](../../panels-visualizations/query-transform-data/transform-data/#group-by) transformation that allows you to group by multiple fields and add any number of aggregations for other fields.
+- The [Labels to fields](../../panels-visualizations/query-transform-data/transform-data/#labels-to-fields) transformation now allows you to pick one label and use that as the name of the value field.
- You can drag transformations to reorder them. Remember that transformations are processed in the order they are listed in the UI, so think before you move something!
{{< figure src="/static/img/docs/v72/transformations.gif" max-width="800px" caption="Group by and reordering of transformations" >}}
@@ -100,15 +100,15 @@ The up and down arrows, which were previously the only way to change query order
{{< figure src="/static/img/docs/v72/drag-queries.gif" max-width="800px" caption="Drag to reorder queries" >}}
-The [Queries]({{< relref "../panels-visualizations#add-a-query" >}}) topic has been updated as a result of this change.
+The [Queries](../../panels-visualizations/#add-a-query) topic has been updated as a result of this change.
## Inspect queries in Explore
-You can enjoy all the details query inspector gave you in dashboards now in Explore as well. You can open query inspector tab with the button next to query history. See [Query inspector in Explore]({{< relref "../explore#query-inspector" >}}) for more details.
+You can enjoy all the details query inspector gave you in dashboards now in Explore as well. You can open query inspector tab with the button next to query history. See [Query inspector in Explore](../../explore/#query-inspector) for more details.
## \$\_\_rate_interval for Prometheus
-You can now use the new variable `$__rate_interval` in Prometheus for rate functions mainly. `$__rate_interval` in general is one scrape interval larger than `$__interval` but is never smaller than four times the scrape interval (which is 15s by default). See the [Prometheus data source]({{< relref "../datasources/prometheus#using-__rate_interval-variable" >}}) for more details.
+You can now use the new variable `$__rate_interval` in Prometheus for rate functions mainly. `$__rate_interval` in general is one scrape interval larger than `$__interval` but is never smaller than four times the scrape interval (which is 15s by default). See the [Prometheus data source](../../datasources/prometheus/#using-__rate_interval-variable) for more details.
## Toggle parsed log fields
@@ -116,7 +116,7 @@ With this awesome contribution from one of our community members, you can now to
{{< figure src="/static/img/docs/v72/explore-toggle-parsed-fields.gif" max-width="800px" caption="Toggling parsed fields in Explore" >}}
-The [Toggle parsed fields]({{< relref "../explore#toggle-detected-fields" >}}) section has been added to [Explore]({{< relref "../explore" >}}) as a result of this feature.
+The [Toggle parsed fields](../../explore/#toggle-detected-fields) section has been added to [Explore](../../explore/) as a result of this feature.
## Sensitive alert channel settings are now encrypted
@@ -128,9 +128,9 @@ These features are included in the Grafana Enterprise edition software.
### Report and export dashboards in grid layout
-A new layout option is available when rendering reports: the grid layout. With this option, your report uses the panel layout from your dashboard, so that what you see is what you get. Learn more about the [grid layout]({{< relref "../dashboards/share-dashboards-panels#layout-and-orientation" >}}) in the documentation.
+A new layout option is available when rendering reports: the grid layout. With this option, your report uses the panel layout from your dashboard, so that what you see is what you get. Learn more about the [grid layout](../../dashboards/share-dashboards-panels/#layout-and-orientation) in the documentation.
-The grid layout is also available for the [Export dashboard as PDF]({{< relref "../dashboards/share-dashboards-panels#export-dashboard-as-pdf" >}}) feature.
+The grid layout is also available for the [Export dashboard as PDF](../../dashboards/share-dashboards-panels/#export-dashboard-as-pdf) feature.
{{< figure src="/static/img/docs/enterprise/reports_grid_landscape_preview.png" max-width="500px" class="docs-image--no-shadow" alt="Report in grid layout" >}}
@@ -138,7 +138,7 @@ The grid layout is also available for the [Export dashboard as PDF]({{< relref "
You can now generate a report with a different time range from the dashboard it is based on. This means that you no longer have to apply workarounds, such as copying dashboards or carefully aligning report generation with the end of the month, to generate reports that cover the period you want.
-For more information, refer to [Reports time range]({{< relref "../dashboards/share-dashboards-panels#report-time-range" >}}).
+For more information, refer to [Reports time range](../../dashboards/share-dashboards-panels/#report-time-range).
### Organization-wide report settings
@@ -146,7 +146,7 @@ You can now configure organization-wide report settings, such as report branding
{{< figure src="/static/img/docs/enterprise/reports_settings.png" max-width="500px" class="docs-image--no-shadow" caption="Reports settings" >}}
-For more information, refer to [Report settings]({{< relref "../dashboards/share-dashboards-panels#report-settings" >}}).
+For more information, refer to [Report settings](../../dashboards/share-dashboards-panels/#report-settings).
## Changelog
diff --git a/docs/sources/whatsnew/whats-new-in-v7-3.md b/docs/sources/whatsnew/whats-new-in-v7-3.md
index ca2c0d75c66..9f2f5882475 100644
--- a/docs/sources/whatsnew/whats-new-in-v7-3.md
+++ b/docs/sources/whatsnew/whats-new-in-v7-3.md
@@ -25,12 +25,12 @@ This topic includes the release notes for Grafana v7.3. For all details, read th
The main highlights are:
-- [**Google Cloud Monitoring:** Out of the box dashboards]({{< relref "#cloud-monitoring-out-of-the-box-dashboards" >}})
-- [**Shorten URL for dashboards and Explore**]({{< relref "#shorten-url-for-dashboards-and-explore" >}})
-- [**Table improvements and new image cell mode**]({{< relref "#table-improvements-and-new-image-cell-mode" >}})
-- [**New color scheme option**]({{< relref "#new-color-scheme-option" >}})
-- [**SigV4 Authentication for Amazon Elasticsearch Service**]({{< relref "#sigv4-authentication-for-aws-users" >}})
-- [**CSV exports for Excel**]({{< relref "#csv-exports-for-excel" >}})
+- [**Google Cloud Monitoring:** Out of the box dashboards](#cloud-monitoring-out-of-the-box-dashboards)
+- [**Shorten URL for dashboards and Explore**](#shorten-url-for-dashboards-and-explore)
+- [**Table improvements and new image cell mode**](#table-improvements-and-new-image-cell-mode)
+- [**New color scheme option**](#new-color-scheme-option)
+- [**SigV4 Authentication for Amazon Elasticsearch Service**](#sigv4-authentication-for-aws-users)
+- [**CSV exports for Excel**](#csv-exports-for-excel)
## Table improvements and new image cell mode
@@ -45,7 +45,7 @@ Another new feature that can be seen in the image above is the new image cell di
{{< figure src="/static/img/docs/v73/color_scheme_dropdown.png" max-width="450px" caption="Color scheme" class="pull-right" >}}
-A new standard field color scheme option has been added. This new option will provide a unified way for all new panels to specify how colors should be assigned. For more information, refer to [Apply color to series and fields]({{< relref "../panels-visualizations/configure-standard-options#color-scheme" >}}).
+A new standard field color scheme option has been added. This new option will provide a unified way for all new panels to specify how colors should be assigned. For more information, refer to [Apply color to series and fields](../../panels-visualizations/configure-standard-options/#color-scheme).
- **Single color**: Specifies a single color. Useful in an override rule.
- **From thresholds**: Informs Grafana to take color from the matching threshold.
@@ -64,7 +64,7 @@ Another thing to highlight is that all these new color schemes are theme aware a
{{< figure src="/static/img/docs/v73/table_color_scheme_mono_light.png" max-width="900px" caption="table color monochrome scheme" >}}
-As this new option is a standard field option it works in every panel. Here is another example from the [Bar Gauge]({{< relref "../panels-visualizations/visualizations/bar-gauge" >}}) panel.
+As this new option is a standard field option it works in every panel. Here is another example from the [Bar Gauge](../../panels-visualizations/visualizations/bar-gauge/) panel.
{{< figure src="/static/img/docs/v73/bar_gauge_gradient_color_scheme.png" max-width="900px" caption="bar gauge color scheme" >}}
@@ -72,7 +72,7 @@ As this new option is a standard field option it works in every panel. Here is a
In v7.0, we introduced a new table panel and inspect mode with Download CSV enabled. However, CSV export to Excel was removed. Due to a large number of inquiries and requests, this [community contribution from tomdaly](https://github.com/grafana/grafana/pull/27284) brought the feature back.
-For more information, refer to [Download raw query results]({{< relref "../panels-visualizations/panel-inspector#download-raw-query-results" >}}).
+For more information, refer to [Download raw query results](../../panels-visualizations/panel-inspector/#download-raw-query-results).
## Google Cloud monitoring out-of-the-box dashboards
@@ -86,7 +86,7 @@ The updated Google Cloud monitoring data source is shipped with pre-configured d
To import the pre-configured dashboards, go to the configuration page of your Google Cloud Monitoring data source and click on the `Dashboards` tab. Click `Import` for the dashboard you would like to use. To customize the dashboard, we recommend to save the dashboard under a different name, because otherwise the dashboard will be overwritten when a new version of the dashboard is released.
-For more details, see the [Google Cloud Monitoring docs]({{< relref "../datasources/google-cloud-monitoring#out-of-the-box-dashboards" >}})
+For more details, see the [Google Cloud Monitoring docs](../../datasources/google-cloud-monitoring/#out-of-the-box-dashboards)
## Shorten URL for dashboards and Explore
@@ -96,7 +96,7 @@ This is an amazing new feature that was created in cooperation with one of our c
You can now configure your Elasticsearch data source to access your Amazon Elasticsearch Service domain directly from Grafana.
-For more details, refer to the [Elasticsearch docs]({{< relref "../datasources/elasticsearch#aws-signature-version-4-authentication" >}}).
+For more details, refer to the [Elasticsearch docs](../../datasources/elasticsearch/#aws-signature-version-4-authentication).
## Chaining pipeline aggregation in Elasticsearch
@@ -132,7 +132,7 @@ Example of a login event:
}
```
-For more details, see the [Auditing docs]({{< relref "../setup-grafana/configure-security/audit-grafana" >}}).
+For more details, see the [Auditing docs](../../setup-grafana/configure-security/audit-grafana/).
### Data source usage insights
@@ -146,11 +146,11 @@ Insights:
### SAML single logout
-SAML’s single logout (SLO) capability allows users to log out from all applications associated with the current identity provider (IdP) session established via SAML SSO. For more information, refer to the [docs]({{< relref "../setup-grafana/configure-security/configure-authentication/saml#single-logout" >}}).
+SAML’s single logout (SLO) capability allows users to log out from all applications associated with the current identity provider (IdP) session established via SAML SSO. For more information, refer to the [docs](../../setup-grafana/configure-security/configure-authentication/saml/#single-logout).
### SAML IdP-initiated single sign on
-IdP-initiated single sign on (SSO) allows the user to log in directly from the SAML identity provider (IdP). It is disabled by default for security reasons. For more information, refer to the [docs]({{< relref "../setup-grafana/configure-security/configure-authentication/saml#idp-initiated-single-sign-on-sso" >}}).
+IdP-initiated single sign on (SSO) allows the user to log in directly from the SAML identity provider (IdP). It is disabled by default for security reasons. For more information, refer to the [docs](../../setup-grafana/configure-security/configure-authentication/saml/#idp-initiated-single-sign-on-sso).
## Changelog
@@ -158,11 +158,11 @@ Check out [CHANGELOG.md](https://github.com/grafana/grafana/blob/main/CHANGELOG.
## Patch release notes
-- [Grafana 7.3.0 release notes]({{< relref "../release-notes/release-notes-7-3-0" >}})
-- [Grafana 7.3.1 release notes]({{< relref "../release-notes/release-notes-7-3-1" >}})
-- [Grafana 7.3.2 release notes]({{< relref "../release-notes/release-notes-7-3-2" >}})
-- [Grafana 7.3.3 release notes]({{< relref "../release-notes/release-notes-7-3-3" >}})
-- [Grafana 7.3.4 release notes]({{< relref "../release-notes/release-notes-7-3-4" >}})
-- [Grafana 7.3.5 release notes]({{< relref "../release-notes/release-notes-7-3-5" >}})
-- [Grafana 7.3.6 release notes]({{< relref "../release-notes/release-notes-7-3-6" >}})
-- [Grafana 7.3.7 release notes]({{< relref "../release-notes/release-notes-7-3-7" >}})
+- [Grafana 7.3.0 release notes](../../release-notes/release-notes-7-3-0/)
+- [Grafana 7.3.1 release notes](../../release-notes/release-notes-7-3-1/)
+- [Grafana 7.3.2 release notes](../../release-notes/release-notes-7-3-2/)
+- [Grafana 7.3.3 release notes](../../release-notes/release-notes-7-3-3/)
+- [Grafana 7.3.4 release notes](../../release-notes/release-notes-7-3-4/)
+- [Grafana 7.3.5 release notes](../../release-notes/release-notes-7-3-5/)
+- [Grafana 7.3.6 release notes](../../release-notes/release-notes-7-3-6/)
+- [Grafana 7.3.7 release notes](../../release-notes/release-notes-7-3-7/)
diff --git a/docs/sources/whatsnew/whats-new-in-v7-4.md b/docs/sources/whatsnew/whats-new-in-v7-4.md
index d7143caee18..0d0b9cc4806 100644
--- a/docs/sources/whatsnew/whats-new-in-v7-4.md
+++ b/docs/sources/whatsnew/whats-new-in-v7-4.md
@@ -41,11 +41,11 @@ Apart from major performance improvements, the new Time series panel implements
The following documentation topics were added for this feature:
-- [Time series panel]({{< relref "../panels-visualizations/visualizations/time-series" >}})
-- [Graph time series as lines]({{< relref "../panels-visualizations/visualizations/time-series#line-style" >}})
-- [Graph time series as bars]({{< relref "../panels-visualizations/visualizations/time-series#bar-alignment" >}})
-- [Graph time series as points]({{< relref "../panels-visualizations/visualizations/time-series#show-points" >}})
-- [Change axis display]({{< relref "../panels-visualizations/visualizations/time-series#axis-options" >}})
+- [Time series panel](../../panels-visualizations/visualizations/time-series/)
+- [Graph time series as lines](../../panels-visualizations/visualizations/time-series/#line-style)
+- [Graph time series as bars](../../panels-visualizations/visualizations/time-series/#bar-alignment)
+- [Graph time series as points](../../panels-visualizations/visualizations/time-series/#show-points)
+- [Change axis display](../../panels-visualizations/visualizations/time-series/#axis-options)
### Node graph panel visualization (Beta)
@@ -55,7 +55,7 @@ All the information and stats shown in the Node graph beta are driven by the dat
For more details about how to use the X-Ray service map feature, see the [X-Ray plugin documentation](/grafana/plugins/grafana-x-ray-datasource).
-For more information, refer to [Node graph panel]({{< relref "../panels-visualizations/visualizations/node-graph" >}}).
+For more information, refer to [Node graph panel](../../panels-visualizations/visualizations/node-graph/).
### New transformations
@@ -65,7 +65,7 @@ The following transformations were added in Grafana 7.4.
The _Sort by_ transformation allows you to sort data before sending it to the visualization.
-For more information, refer to [Sort by]({{< relref "../panels-visualizations/query-transform-data/transform-data#sort-by" >}}).
+For more information, refer to [Sort by](../../panels-visualizations/query-transform-data/transform-data/#sort-by).
#### Filter data by value transform
@@ -73,13 +73,13 @@ The new _Filter data by value_ transformation allows you to filter your data dir
This transformation is very useful if your data source does not natively filter by values. You might also use this to narrow values to display if you are using a shared query.
-For more information, refer to [Filter data by value]({{< relref "../panels-visualizations/query-transform-data/transform-data#filter-data-by-value" >}}).
+For more information, refer to [Filter data by value](../../panels-visualizations/query-transform-data/transform-data/#filter-data-by-value).
### New override option
On the Overrides tab, you can now set properties for fields returned by a specific query.
-For more information, refer to [About field overrides]({{< relref "../panels-visualizations/configure-overrides" >}}).
+For more information, refer to [About field overrides](../../panels-visualizations/configure-overrides/).
### Exemplar support
@@ -89,7 +89,7 @@ Grafana graphs now support Prometheus _exemplars_. They are displayed as diamond
{{< figure src="/static/img/docs/v74/exemplars.png" max-width="900px" caption="Exemplar example" >}}
-For more information, refer to [Exemplars]({{< relref "../fundamentals/exemplars" >}}).
+For more information, refer to [Exemplars](../../fundamentals/exemplars/).
### Trace to logs
@@ -97,20 +97,20 @@ You can now navigate from a span in a trace view directly to logs relevant for t
The following topics were updated as a result of this feature:
-- [Explore]({{< relref "../explore/trace-integration" >}})
-- [Jaeger]({{< relref "../datasources/jaeger#configure-trace-to-logs" >}})
-- [Tempo]({{< relref "../datasources/tempo#configure-trace-to-logs" >}})
-- [Zipkin]({{< relref "../datasources/zipkin#configure-trace-to-logs" >}})
+- [Explore](../../explore/trace-integration/)
+- [Jaeger](../../datasources/jaeger/#configure-trace-to-logs)
+- [Tempo](../../datasources/tempo/#configure-trace-to-logs)
+- [Zipkin](../../datasources/zipkin/#configure-trace-to-logs)
### Server-side expressions
_Server-side expressions_ is an experimental feature that allows you to manipulate data returned from backend data source queries. Expressions allow you to manipulate data with math and other operations when the data source is a backend data source or a **--Mixed--** data source.
-The main use case is for [multi-dimensional]({{< relref "../fundamentals/timeseries-dimensions" >}}) data sources used with the upcoming next generation alerting, but expressions can be used with backend data sources and visualization as well.
+The main use case is for [multi-dimensional](../../fundamentals/timeseries-dimensions/) data sources used with the upcoming next generation alerting, but expressions can be used with backend data sources and visualization as well.
> **Note:** Queries built with this feature might break with minor version upgrades until Grafana 8 is released. This feature does not work with the current Grafana Alerting.
-For more information, refer to [Write expression queries]({{< relref "../panels-visualizations/query-transform-data/expression-queries" >}}). [About queries]({{< relref "../panels-visualizations/query-transform-data#about-queries" >}}) was also updated as a result of this feature.
+For more information, refer to [Write expression queries](../../panels-visualizations/query-transform-data/expression-queries/). [About queries](../../panels-visualizations/query-transform-data/#about-queries) was also updated as a result of this feature.
### Alert notification query label interpolation
@@ -126,13 +126,13 @@ CSP support is disabled by default, to enable it you must set `content_security_
You can lock down what can be done in the frontend code. Lock down what can be loaded, what JavaScript is executed. Not compatible with some plugins.
-[content_security_policy]({{< relref "../setup-grafana/configure-grafana#content_security_policy" >}}) and [content_security_policy_template]({{< relref "../setup-grafana/configure-grafana#content_security_policy_template" >}}) were added to [Configuration]({{< relref "../setup-grafana/configure-grafana" >}}) as a result of this change.
+[content_security_policy](../../setup-grafana/configure-grafana/#content_security_policy) and [content_security_policy_template](../../setup-grafana/configure-grafana/#content_security_policy_template) were added to [Configuration](../../setup-grafana/configure-grafana/) as a result of this change.
### Hide users in UI
You can now use the `hidden_users` configuration setting to hide specific users in the UI. For example, this feature can be used to hide users that are used for automation purposes.
-[Configuration]({{< relref "../setup-grafana/configure-grafana#hidden_users" >}}) has been updated for this feature.
+[Configuration](../../setup-grafana/configure-grafana/#hidden_users) has been updated for this feature.
### Elasticsearch data source updates
@@ -145,13 +145,13 @@ Grafana 7.4 includes the following enhancements
> **Note:** We have deprecated browser access mode. It will be removed in a future release.
-For more information, refer to the [Elasticsearch docs]({{< relref "../datasources/elasticsearch" >}}).
+For more information, refer to the [Elasticsearch docs](../../datasources/elasticsearch/).
### Azure Monitor updates
The Azure Monitor query type was renamed to Metrics and Azure Logs Analytics was renamed to Logs to match the service names in Azure and align the concepts with the rest of Grafana.
-[Azure Monitor]({{< relref "../datasources/azure-monitor" >}}) was updated to reflect this change.
+[Azure Monitor](../../datasources/azure-monitor/) was updated to reflect this change.
### MQL support added for Google Cloud Monitoring
@@ -161,7 +161,7 @@ Unlike the visual query builder, MQL allows you to control the time range and pe
MQL uses a set of operations and functions. Operations are linked together using the common pipe mechanism, where the output of one operation becomes the input to the next. Linking operations makes it possible to build up complex queries incrementally.
-Once query type Metrics is selected in the Cloud Monitoring query editor, you can toggle between the editor modes for visual query builder and MQL. For more information, refer to the [Google Cloud Monitoring docs]({{< relref "../datasources/google-cloud-monitoring#import-pre-configured-dashboards" >}}).
+Once query type Metrics is selected in the Cloud Monitoring query editor, you can toggle between the editor modes for visual query builder and MQL. For more information, refer to the [Google Cloud Monitoring docs](../../datasources/google-cloud-monitoring/#import-pre-configured-dashboards).
Many thanks to [mtanda](https://github.com/mtanda) this contribution!
@@ -173,13 +173,13 @@ Google Cloud Monitoring data source ships with pre-configured dashboards for som
If you want to customize a dashboard, we recommend that you save it under a different name. Otherwise the dashboard will be overwritten when a new version of the dashboard is released.
-For more information, refer to the [Google Cloud Monitoring docs]({{< relref "../datasources/google-cloud-monitoring#import-pre-configured-dashboards" >}}).
+For more information, refer to the [Google Cloud Monitoring docs](../../datasources/google-cloud-monitoring/#import-pre-configured-dashboards).
### Query Editor Help
The feature previously referred to as DataSource Start Pages or Cheat Sheets has been renamed to Query Editor Help, and is now supported in panel query editors (depending on the data source), as well as in Explore.
-[Queries]({{< relref "../panels-visualizations/query-transform-data#manage-queries" >}}) was updated as a result of this feature.
+[Queries](../../panels-visualizations/query-transform-data/#manage-queries) was updated as a result of this feature.
For more information on adding a query editor help component to your plugin, refer to [Add a query editor help component](https://grafana.com/developers/plugin-tools/how-to-guides/data-source-plugins/add-query-editor-help).
@@ -187,7 +187,7 @@ For more information on adding a query editor help component to your plugin, ref
The variables list has an additional column indicating whether variables are referenced in queries and panel names or not. The dependencies graph provides an easy way to check variable dependencies. You can click on a variable name within the graph to make updates to the variable as needed.
-For more information, refer to [Inspect variables and their dependencies]({{< relref "../dashboards/variables/inspect-variable" >}}).
+For more information, refer to [Inspect variables and their dependencies](../../dashboards/variables/inspect-variable/).
## Grafana Enterprise features
@@ -195,39 +195,39 @@ These features are included in the Grafana Enterprise edition.
### Licensing changes
-When determining a user’s role for billing purposes, a user who has the ability to edit and save dashboards is considered an Editor. This includes any user who is an Editor or Admin at the Org level, and who has granted Admin or Edit permissions via [Dashboard permissions]({{< relref "../administration/user-management/manage-dashboard-permissions" >}}).
+When determining a user’s role for billing purposes, a user who has the ability to edit and save dashboards is considered an Editor. This includes any user who is an Editor or Admin at the Org level, and who has granted Admin or Edit permissions via [Dashboard permissions](../../administration/user-management/manage-dashboard-permissions/).
After the number of Viewers or Editors has reached its license limit, only Admins will see a banner in Grafana indicating that the license limit has been reached. Previously, all users saw the banner.
Grafana Enterprise license tokens update automatically on a daily basis, which means you no longer need to manually update your license, and the process for adding additional users to a license is smoother than it was before.
-Refer to [Licensing restrictions]({{< relref "../administration/enterprise-licensing#license-restrictions" >}}) for more information.
+Refer to [Licensing restrictions](../../administration/enterprise-licensing/#license-restrictions) for more information.
### Export usage insights to Loki
You can now export usage insights logs to Loki and query them from Grafana. Usage insights logs include dashboard visits, data source views, queries and errors, and more.
-For more information, refer to [Export logs of usage insights]({{< relref "../setup-grafana/configure-security/export-logs" >}}).
+For more information, refer to [Export logs of usage insights](../../setup-grafana/configure-security/export-logs/).
### New audit log events
-New log out events are logged based on when a token expires or is revoked, as well as [SAML Single Logout]({{< relref "../setup-grafana/configure-security/configure-authentication/saml#single-logout" >}}). A `tokenId` field was added to all audit logs to help understand which session was logged out of.
+New log out events are logged based on when a token expires or is revoked, as well as [SAML Single Logout](../../setup-grafana/configure-security/configure-authentication/saml/#single-logout). A `tokenId` field was added to all audit logs to help understand which session was logged out of.
Also, a counter for audit log writing actions with status (success / failure) and logger (loki / file / console) labels was added.
-[Auditing]({{< relref "../setup-grafana/configure-security/audit-grafana" >}}) was updated to reflect these changes.
+[Auditing](../../setup-grafana/configure-security/audit-grafana/) was updated to reflect these changes.
### Reports support Unicode
You can now select a font, other than the default, for Unicode-based scripts. As a result, an automatically generated PDF of a dashboard, which contains for example Chinese or Cyrillic text, can display them. Because the size of a report increases as additional fonts are added, this feature is not on by default.
-[Reporting]({{< relref "../dashboards/share-dashboards-panels#rendering-configuration" >}}) was updated as a result of this change.
+[Reporting](../../dashboards/share-dashboards-panels/#rendering-configuration) was updated as a result of this change.
### Request security
Request security introduces ways to limit requests from the Grafana server, and it targets requests that are generated by users.
-For more information, refer to [Request security]({{< relref "../setup-grafana/configure-security/configure-request-security" >}}).
+For more information, refer to [Request security](../../setup-grafana/configure-security/configure-request-security/).
## Breaking changes
diff --git a/docs/sources/whatsnew/whats-new-in-v7-5.md b/docs/sources/whatsnew/whats-new-in-v7-5.md
index 6f842b4baf6..daf27ad217e 100644
--- a/docs/sources/whatsnew/whats-new-in-v7-5.md
+++ b/docs/sources/whatsnew/whats-new-in-v7-5.md
@@ -33,7 +33,7 @@ Grafana 7.5 adds a beta version of the next-generation pie chart panel.

-For more information, refer to [Pie chart panel]({{< relref "../panels-visualizations/visualizations/pie-chart" >}}).
+For more information, refer to [Pie chart panel](../../panels-visualizations/visualizations/pie-chart/).
### Alerting for Loki
@@ -41,7 +41,7 @@ Grafana 7.5 comes with alerting support for Loki. With LogQL you can wrap a log
With alerting support for Loki, you can now create alerts on Loki metrics queries.
-[Alerting]({{< relref "../alerting" >}}) was updated as a result of this change.
+[Alerting](../../alerting/) was updated as a result of this change.

@@ -55,7 +55,7 @@ For new Prometheus data sources, we have changed the default HTTP method to POST
> **Note:** This is not going to affect provisioned data sources or already created data sources.
-[Prometheus data source]({{< relref "../datasources/prometheus" >}}) was updated as a result of this change.
+[Prometheus data source](../../datasources/prometheus/) was updated as a result of this change.
### Word highlighting for Elasticsearch
@@ -67,7 +67,7 @@ When searching for text in Elasticsearch logs, matching words in the log line re
In Grafana 7.5, we changed how data for the trace view is sent from the data source. The required data frame has a clear format, which is more aligned with how data is generally represented in Grafana. This makes it easier for third-party developers to implement data sources leveraging the trace view.
-For more information, refer to [trace data API docs]({{< relref "../explore/trace-integration#data-api" >}}).
+For more information, refer to [trace data API docs](../../explore/trace-integration/#data-api).
### Paste in SSL certs for Postgres data source
@@ -77,7 +77,7 @@ Instead of the file path, users can now paste the SSL certification content in t
> **Note:** It remains as limitation for the Grafana Cloud, as users may not have access to the server configuration.
-[Postgres data source]({{< relref "../datasources/postgres" >}}) and [Provisioning]({{< relref "../administration/provisioning" >}}) were updated as a result of this change.
+[Postgres data source](../../datasources/postgres/) and [Provisioning](../../administration/provisioning/) were updated as a result of this change.
### Deprecation notice for some Azure Monitor queries
@@ -85,16 +85,16 @@ In the upcoming Grafana 8.0 release, Application Insights and Insights Analytics
Grafana 7.5 includes a deprecation notice for these queries, and some documentation to help users prepare for the upcoming changes.
-For more information, refer to [Deprecating Application Insights and Insights Analytics]({{< relref "../datasources/azure-monitor#application-insights-and-insights-analytics--removed-" >}}).
+For more information, refer to [Deprecating Application Insights and Insights Analytics](../../datasources/azure-monitor/#application-insights-and-insights-analytics--removed-).
### Cloudwatch data source enhancements
- Support for region eu-south-1 has been added to the CloudWatch data source. New metrics have also been added to the namespaces AWS/Timestream, AWS/RDS (RDS Proxy metrics), AWS/NetworkFirewall, AWS/GroundStation, and AWS/DDoSProtection. Many thanks to [relvira](https://github.com/relvira), [ilyastoli](https://github.com/ilyastoli), and [rubycut](https://github.com/rubycut) for contributing!
-- Added a page limit to the List Metrics API call to improve speed and reduce memory consumption. You can change this limit by entering a higher value in [list_metrics_page_limit]({{< relref "../setup-grafana/configure-grafana#list-metrics-page-limit" >}}) in the Grafana configuration file.
-- You can now enable or disable authentication providers and assume a role other than default by changing the [allowed_auth_providers]({{< relref "../setup-grafana/configure-grafana#allowed_auth_providers" >}}) and [assume_role_enabled]({{< relref "../setup-grafana/configure-grafana#assume_role_enabled" >}}) options in the Grafana configuration file. By default, the allowed authentication providers are _AWS SDK Default_, _Access and secret key_, and _Credentials File_, and role is _Assume role (ARN)_.
+- Added a page limit to the List Metrics API call to improve speed and reduce memory consumption. You can change this limit by entering a higher value in [list_metrics_page_limit](../../setup-grafana/configure-grafana/#list-metrics-page-limit) in the Grafana configuration file.
+- You can now enable or disable authentication providers and assume a role other than default by changing the [allowed_auth_providers](../../setup-grafana/configure-grafana/#allowed_auth_providers) and [assume_role_enabled](../../setup-grafana/configure-grafana/#assume_role_enabled) options in the Grafana configuration file. By default, the allowed authentication providers are _AWS SDK Default_, _Access and secret key_, and _Credentials File_, and role is _Assume role (ARN)_.
- You can now specify a custom endpoint in the CloudWatch data source configuration page. This field is optional, and if it is left empty, then the default endpoint for CloudWatch is used. By specifying a regional endpoint, you can reduce request latency.
- [AWS Cloudwatch data source]({{< relref "../datasources/aws-cloudwatch" >}}) was updated as a result of this change.
+ [AWS Cloudwatch data source](../../datasources/aws-cloudwatch/) was updated as a result of this change.
### Increased API limit for CloudMonitoring Services
@@ -109,7 +109,7 @@ server:
http_listen_port: 3101
```
-[Azure Monitor data source]({{< relref "../datasources/azure-monitor" >}}) was updated as a result of this change.
+[Azure Monitor data source](../../datasources/azure-monitor/) was updated as a result of this change.
## Enterprise features
@@ -127,7 +127,7 @@ Query caching advantages:
Caching currently works for all backend data sources. You can enable the cache globally or per data source, and you can configure the cache duration per data source. The cache is currently in-memory.
-For more information, refer to [Query caching]({{< relref "../administration/data-source-management#query-and-resource-caching" >}}).
+For more information, refer to [Query caching](../../administration/data-source-management/#query-and-resource-caching).
### Use template variable in reports
@@ -135,7 +135,7 @@ If you have created dashboards with template variables, then you can choose whic
Enable this feature in configuration settings using the `templateVariables` flag.
-For more information, refer to [Reporting]({{< relref "../dashboards/share-dashboards-panels#choose-template-variables" >}}).
+For more information, refer to [Reporting](../../dashboards/share-dashboards-panels/#choose-template-variables).
### Active user limits
@@ -157,7 +157,7 @@ Each Grafana Enterprise user will be limited to three concurrent user sessions.
A new session is created when you sign in to Grafana from a different device or a different browser. Multiple windows and tabs in the same browser are all part of the same session, so having many Grafana tabs open will not cause any issues.
-For more information on Grafana Enterprise licensing and restrictions, refer to [License restrictions]({{< relref "../administration/enterprise-licensing#license-restrictions" >}}).
+For more information on Grafana Enterprise licensing and restrictions, refer to [License restrictions](../../administration/enterprise-licensing/#license-restrictions).
## Breaking changes
diff --git a/docs/sources/whatsnew/whats-new-in-v8-0.md b/docs/sources/whatsnew/whats-new-in-v8-0.md
index c63d3f40f6f..0d41ace7f4c 100644
--- a/docs/sources/whatsnew/whats-new-in-v8-0.md
+++ b/docs/sources/whatsnew/whats-new-in-v8-0.md
@@ -29,9 +29,9 @@ These features are included in the Grafana open source edition.
### Grafana v8.0 alerts
-The new alerts in Grafana 8.0 are an opt-in feature that centralizes alerting information for Grafana managed alerts and alerts from Prometheus-compatible data sources in one UI and API. You can create and edit alerting rules for Grafana managed alerts, Mimir alerts, and Loki alerts as well as see alerting information from prometheus-compatible data sources in a single, searchable view. For more information, on how to create and edit alerts and notifications, refer to [Grafana Alerting]({{< relref "../alerting" >}}).
+The new alerts in Grafana 8.0 are an opt-in feature that centralizes alerting information for Grafana managed alerts and alerts from Prometheus-compatible data sources in one UI and API. You can create and edit alerting rules for Grafana managed alerts, Mimir alerts, and Loki alerts as well as see alerting information from prometheus-compatible data sources in a single, searchable view. For more information, on how to create and edit alerts and notifications, refer to [Grafana Alerting](../../alerting/).
-As part of the new alert changes, we have introduced a new data source, Alertmanager, which includes built-in support for Prometheus Alertmanager. It is presently in alpha and it not accessible unless alpha plugins are enabled in Grafana settings. For more information, refer to [Alertmanager data source]({{< relref "../datasources/alertmanager" >}}).
+As part of the new alert changes, we have introduced a new data source, Alertmanager, which includes built-in support for Prometheus Alertmanager. It is presently in alpha and it not accessible unless alpha plugins are enabled in Grafana settings. For more information, refer to [Alertmanager data source](../../datasources/alertmanager/).
> **Note:** Out of the box, Grafana still supports old Grafana alerts. They are legacy alerts at this time, and will be deprecated in a future release.
@@ -39,7 +39,7 @@ To learn more about the differences between new alerts and the legacy alerts, re
### Library panels
-Library panels allow users to build panels that can be used in multiple dashboards. Any updates made to that shared panel will then automatically be applied to all the dashboards that have that panel. For instructions on how to create, add, unlink and manage library panels, refer to [Library panels]({{< relref "../dashboards/build-dashboards/manage-library-panels" >}}).
+Library panels allow users to build panels that can be used in multiple dashboards. Any updates made to that shared panel will then automatically be applied to all the dashboards that have that panel. For instructions on how to create, add, unlink and manage library panels, refer to [Library panels](../../dashboards/build-dashboards/manage-library-panels/).
### Real-time streaming
@@ -49,11 +49,11 @@ In addition to data source integration, events can be sent to dashboards by post
These metrics will be broadcast to all dashboards connected to that stream endpoint.
-For more information about real-time streaming, refer to [Grafana Live documentation]({{< relref "../setup-grafana/set-up-grafana-live" >}}).
+For more information about real-time streaming, refer to [Grafana Live documentation](../../setup-grafana/set-up-grafana-live/).
### Prometheus metrics browser
-The Prometheus metrics browser allows you to quickly find metrics and select relevant labels to build basic queries. If supported by your Prometheus instance, each metric will show its HELP and TYPE as a tooltip. For more information, refer to [Metrics browser documentation]({{< relref "../datasources/prometheus#metrics-browser" >}}).
+The Prometheus metrics browser allows you to quickly find metrics and select relevant labels to build basic queries. If supported by your Prometheus instance, each metric will show its HELP and TYPE as a tooltip. For more information, refer to [Metrics browser documentation](../../datasources/prometheus/#metrics-browser).
### Bar chart visualization (beta)
@@ -63,7 +63,7 @@ The Bar chart panel is a new visualization that supports categorical data. It on
To use it with time series you first have to add a **Reduce** transform.
-For more information, refer to [Bar chart visualization]({{< relref "../panels-visualizations/visualizations/bar-chart" >}}).
+For more information, refer to [Bar chart visualization](../../panels-visualizations/visualizations/bar-chart/).
### State timeline visualization (beta)
@@ -77,11 +77,11 @@ Example with string values:
With time series data and thresholds:
{{< figure src="/static/img/docs/v8/state_timeline_time_series.png" max-width="800px" caption="state timeline with time series" >}}
-For more information, refer to [State timeline visualization]({{< relref "../panels-visualizations/visualizations/state-timeline" >}}).
+For more information, refer to [State timeline visualization](../../panels-visualizations/visualizations/state-timeline/).
### Status history visualization (beta)
-A sister panel to the state timeline is the new Status history panel visualization. It can display periodic states in a grid view. It supports both numerical, string, or boolean states. You can assign colors using value mappings, thresholds, or gradient color. For more information, refer to [Status history]({{< relref "../panels-visualizations/visualizations/status-history" >}}).
+A sister panel to the state timeline is the new Status history panel visualization. It can display periodic states in a grid view. It supports both numerical, string, or boolean states. You can assign colors using value mappings, thresholds, or gradient color. For more information, refer to [Status history](../../panels-visualizations/visualizations/status-history/).
schemes.

@@ -92,20 +92,20 @@ This hidden feature of the old Graph panel is now a standalone visualization. It
{{< figure src="/static/img/docs/histogram/histogram-8-0.png" max-width="1025px" caption="Histogram example" >}}
-For more information, refer to [Histogram]({{< relref "../panels-visualizations/visualizations/histogram" >}})
+For more information, refer to [Histogram](../../panels-visualizations/visualizations/histogram/)
### Time series visualization updates
The Time series is out of beta! We are removing the `Beta` tag and graduating the Time series visualization to a stable state.
- **Time series** is now the default visualization option, replacing the **Graph (old)**.
-- The Time series panel now supports stacking. For more information, refer to [Graph stacked time series]({{< relref "../panels-visualizations/visualizations/time-series#stack-series" >}}).
+- The Time series panel now supports stacking. For more information, refer to [Graph stacked time series](../../panels-visualizations/visualizations/time-series/#stack-series).
- You can now add alerts in the Time series panel, just like the old Graph panel.
-- Updated [connect null values]({{< relref "../panels-visualizations/visualizations/time-series#connect-null-values" >}}) options.
+- Updated [connect null values](../../panels-visualizations/visualizations/time-series/#connect-null-values) options.
- We added support for a shared crosshair and a tooltip that’s now smarter when it comes to data display in the tooltip.
- Various performance improvements.
-[Time series panel]({{< relref "../panels-visualizations/visualizations/time-series" >}}) topics have been updated as a result of these changes.
+[Time series panel](../../panels-visualizations/visualizations/time-series/) topics have been updated as a result of these changes.
### Node graph visualization updates
@@ -113,7 +113,7 @@ You can now expand the node graph for the displayed trace when using the Trace t
We also added a grid view and the ability to explore hidden nodes.
-[Tracing in Explore]({{< relref "../explore/trace-integration" >}}) and [Node graph]({{< relref "../panels-visualizations/visualizations/node-graph" >}}) were updated as a result of these changes.
+[Tracing in Explore](../../explore/trace-integration/) and [Node graph](../../panels-visualizations/visualizations/node-graph/) were updated as a result of these changes.
### Pie chart visualization updates
@@ -125,10 +125,10 @@ Lots of panel editor improvements, heavily informed by user research and communi
- All options are now shown in a single pane.
- You can now search panel options.
-- The Value mappings feature has been completely redesigned. For more information, refer to [Configure value mappings]({{< relref "../panels-visualizations/configure-value-mappings" >}}).
+- The Value mappings feature has been completely redesigned. For more information, refer to [Configure value mappings](../../panels-visualizations/configure-value-mappings/).
- New **Table view** option is always available.
-The [Panels]({{< relref "../panels-visualizations" >}}) section has been updated to reflect these changes.
+The [Panels](../../panels-visualizations/) section has been updated to reflect these changes.
### Look and feel update
@@ -140,19 +140,19 @@ Under the hood, the new theme architecture enables us to bring more sophisticate
When you inspect a panel, you can now download log results as a text (.txt) file.
-[Download log results]({{< relref "../panels-visualizations/panel-inspector" >}}) was added as a result of this feature.
+[Download log results](../../panels-visualizations/panel-inspector/) was added as a result of this feature.
### Inspector in Explore
The new Explore inspector helps you understand and troubleshoot your queries. You can inspect the raw data, export that data to a comma-separated values (CSV) file, export log results in text format, and view query requests.
-[Inspector in Explore]({{< relref "../explore/explore-inspector" >}}) was added as a result of this feature.
+[Inspector in Explore](../../explore/explore-inspector/) was added as a result of this feature.
### Explore log improvements
Log navigation in Explore has been significantly improved. We added pagination to logs, so you can click through older or newer logs as needed.
-[Logs in Explore]({{< relref "../explore/logs-integration" >}}) was updated as a result of these changes.
+[Logs in Explore](../../explore/logs-integration/) was updated as a result of these changes.

@@ -160,7 +160,7 @@ Log navigation in Explore has been significantly improved. We added pagination t
You can now use the Plugin catalog app to easily manage your plugins from within Grafana. Install, update, and uninstall plugins without requiring a server restart.
-[Plugin catalog]({{< relref "../administration/plugin-management#plugin-catalog" >}}) was added as a result of this feature.
+[Plugin catalog](../../administration/plugin-management/#plugin-catalog) was added as a result of this feature.
### Performance improvements
@@ -191,13 +191,13 @@ The Azure Monitor data source now supports Managed Identity for users hosting Gr
Also, in addition to querying Log Analytics Workspaces, you can now query the logs for any individual [supported resource](https://docs.microsoft.com/en-us/azure/azure-monitor/essentials/metrics-supported), or for all resources in a subscription or resource group.
-> **Note:** In Grafana 7.5 we started the deprecation for separate Application Insights queries, in favor of querying Application Insights resources through Metrics and Logs. In Grafana 8.0 new Application Insights and Insights Analytics queries cannot be made, and existing queries have been made read-only. For more details, refer to the [Deprecating Application Insights]({{< relref "../datasources/azure-monitor#application-insights-and-insights-analytics--removed-" >}}).
+> **Note:** In Grafana 7.5 we started the deprecation for separate Application Insights queries, in favor of querying Application Insights resources through Metrics and Logs. In Grafana 8.0 new Application Insights and Insights Analytics queries cannot be made, and existing queries have been made read-only. For more details, refer to the [Deprecating Application Insights](../../datasources/azure-monitor/#application-insights-and-insights-analytics--removed-).
-[Azure Monitor data source]({{< relref "../datasources/azure-monitor" >}}) was updated as a result of these changes.
+[Azure Monitor data source](../../datasources/azure-monitor/) was updated as a result of these changes.
#### Elasticsearch data source
-[Elasticsearch data source]({{< relref "../datasources/elasticsearch" >}}) and [Provisioning]({{< relref "../administration/provisioning" >}}) were updated as a result of these changes.
+[Elasticsearch data source](../../datasources/elasticsearch/) and [Provisioning](../../administration/provisioning/) were updated as a result of these changes.
##### Use semver strings to identify Elasticsearch version
@@ -233,11 +233,11 @@ In a prior release, Cloud Monitoring added _preprocessing_ support in their quer
Whenever a metric is selected in the query editor, a suitable preprocessing option is automatically selected for you. To avoid breaking changes, preprocessing is not enabled by default on existing queries. If you want to use preprocessing for existing queries, you have to manually select one in the query editor.
-[Google Cloud Monitoring data source]({{< relref "../datasources/google-cloud-monitoring#pre-processing" >}}) was updated as a result of this change.
+[Google Cloud Monitoring data source](../../datasources/google-cloud-monitoring/#pre-processing) was updated as a result of this change.
#### Graphite data source
-[Graphite data source]({{< relref "../datasources/graphite" >}}) was updated as a result of these changes.
+[Graphite data source](../../datasources/graphite/) was updated as a result of these changes.
##### Variable metric names expand
@@ -253,7 +253,7 @@ Graphite queries are now automatically transformed to Loki queries according to
You can now use more parameters to find traces.
-[Jaeger data source]({{< relref "../datasources/jaeger" >}}) was updated as a result of this change.
+[Jaeger data source](../../datasources/jaeger/) was updated as a result of this change.
### Authentication updates
@@ -267,11 +267,11 @@ JWT is a new authentication option in Grafana.
You can now configure Grafana to accept a JWT token provided in the HTTP header.
-[JWT authentication]({{< relref "../setup-grafana/configure-security/configure-authentication/jwt" >}}) was added and [Configuration]({{< relref "../setup-grafana/configure-grafana#authjwt" >}}) was updated as a result of this feature.
+[JWT authentication](../../setup-grafana/configure-security/configure-authentication/jwt/) was added and [Configuration](../../setup-grafana/configure-grafana/#authjwt) was updated as a result of this feature.
#### OAuth
-[Generic OAuth authentication]({{< relref "../setup-grafana/configure-security/configure-authentication/generic-oauth" >}}) has been updated as a result of these changes.
+[Generic OAuth authentication](../../setup-grafana/configure-security/configure-authentication/generic-oauth/) has been updated as a result of these changes.
##### Added OAuth support for empty scopes
@@ -298,7 +298,7 @@ These features are included in the Grafana Enterprise edition.
You can now add or remove detailed permissions from Viewer, Editor, and Admin org roles, to grant users just the right amount of access within Grafana. Available permissions include the ability to view and manage Users, Reports, and the Access Control API itself. Grafana will support more and more permissions over the coming months.
-[Role-based access control docs]({{< relref "../administration/roles-and-permissions/access-control" >}}) were added as a result of this feature.
+[Role-based access control docs](../../administration/roles-and-permissions/access-control/) were added as a result of this feature.
### Data source query caching
@@ -308,7 +308,7 @@ This results in faster average load times for dashboards and fewer duplicate que
You can enable caching per data source, and time-to-live (TTL) can be configured globally and per data source. Query caching can be set up with Redis, Memcached, or a simple in-memory cache.
-For more information, refer to the [Data source query caching docs]({{< relref "../administration/data-source-management#query-and-resource-caching" >}}).
+For more information, refer to the [Data source query caching docs](../../administration/data-source-management/#query-and-resource-caching).
### Reporting updates
@@ -316,13 +316,13 @@ When creating a report, you can now choose to export Table panels as .csv files
You can also link back to the dashboard directly from the email, for users who want to see the data live in Grafana. This release also includes some improvements to the Reports list view.
-For more information, refer to [Reporting docs]({{< relref "../dashboards/share-dashboards-panels#reporting" >}}).
+For more information, refer to [Reporting docs](../../dashboards/share-dashboards-panels/#reporting).
### License restrictions clarification in the docs
The Grafana Enterprise documentation has been updated to describe more specifically how licensed roles are counted, how they can be updated, and where you can see details about dashboard and folder permissions that affect users' licensed roles.
-For more information, refer to [License restrictions docs]({{< relref "../administration/enterprise-licensing#license-restrictions" >}}).
+For more information, refer to [License restrictions docs](../../administration/enterprise-licensing/#license-restrictions).
## Breaking changes
diff --git a/docs/sources/whatsnew/whats-new-in-v8-1.md b/docs/sources/whatsnew/whats-new-in-v8-1.md
index d42b7b0b366..ca2a4dfe46f 100644
--- a/docs/sources/whatsnew/whats-new-in-v8-1.md
+++ b/docs/sources/whatsnew/whats-new-in-v8-1.md
@@ -35,7 +35,7 @@ These features are included in the Grafana open source edition.
Grafana 8.1 introduces the foundation for our new map panel. This new panel leverages [OpenLayers](https://openlayers.org/) and gives us a flexible solution for extending the way we use the new Geomap panel moving forward. The new Geomap panel includes multiple base layer styles (map layer options), as well as a more open data layer. The data layer can use coordinates and geo-hashed data in addition to a lookup table.
-The Geomap panel is also able to share views across multiple Geomap panels on the same dashboard, making it straightforward to visualize and explore multiple types of geospatial data using the same map zoom and focus settings. For more information, refer to [Geomap panel]({{< relref "../panels-visualizations/visualizations/geomap" >}}).
+The Geomap panel is also able to share views across multiple Geomap panels on the same dashboard, making it straightforward to visualize and explore multiple types of geospatial data using the same map zoom and focus settings. For more information, refer to [Geomap panel](../../panels-visualizations/visualizations/geomap/).
{{< figure src="/static/img/docs/geomap-panel/geomap_with_heatmap.png" max-width="850px" caption="Geomap panel: Heatmap" >}}
## Annotation panel
@@ -54,9 +54,9 @@ Color scheme **From thresholds**:
Color scheme: **Green-Yellow-Red (by value)**
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_line.png" max-width="1200px" caption="Color scheme: Green-Yellow-Red" >}}
-For more on how to configure Graphs with by value color schemes read [Graph and color schemes]({{< relref "../panels-visualizations/visualizations/time-series" >}}).
+For more on how to configure Graphs with by value color schemes read [Graph and color schemes](../../panels-visualizations/visualizations/time-series/).
-You can also create annotations in the new Time series panel bringing it closer to parity with the legacy Graph panel. To learn more, refer to the [time series panel]({{< relref "../panels-visualizations/visualizations/time-series" >}}).
+You can also create annotations in the new Time series panel bringing it closer to parity with the legacy Graph panel. To learn more, refer to the [time series panel](../../panels-visualizations/visualizations/time-series/).
### Transformations improvements
@@ -64,7 +64,7 @@ Grafana 8.1 includes some significant enhancements to transformations, including
#### Config from query (Beta)
-This transformation enables panel config (Threshold, Min, Max, etc.) to be derived from query results. For more information, refer to [Config from query results]({{< relref "../panels-visualizations/query-transform-data/transform-data#config-from-query-results" >}}).
+This transformation enables panel config (Threshold, Min, Max, etc.) to be derived from query results. For more information, refer to [Config from query results](../../panels-visualizations/query-transform-data/transform-data/#config-from-query-results).
#### Rows to fields (Beta)
@@ -86,7 +86,7 @@ Output:
As you can see each row in the source data becomes a separate field. Each field now also has a max config option set. Options like **Min**, **Max**, **Unit** and **Thresholds** are all part of field configuration and if set like this will be used by the visualization instead of any options manually configured in the panel editor options pane.
-For more on how to use this transformation, refer to [Rows to fields transform]({{< relref "../panels-visualizations/query-transform-data/transform-data#rows-to-fields" >}}).
+For more on how to use this transformation, refer to [Rows to fields transform](../../panels-visualizations/query-transform-data/transform-data/#rows-to-fields).
#### Contextual & Inline Help
@@ -102,7 +102,7 @@ We have added timezone support. As a result, you can now specify the time zone u
### Trace to logs improvements
-We changed the default behavior from creating a 1-hour span Loki query to the only query at the exact time the trace span started for the duration of it. For more fine grained control over this, you can shift this time in the tracing data source settings. Also, it is now possible to shift the start time and end time of the Loki query by the set amount. For more information, refer to [Trace to logs]({{< relref "../datasources/tempo#trace-to-logs" >}}).
+We changed the default behavior from creating a 1-hour span Loki query to the only query at the exact time the trace span started for the duration of it. For more fine grained control over this, you can shift this time in the tracing data source settings. Also, it is now possible to shift the start time and end time of the Loki query by the set amount. For more information, refer to [Trace to logs](../../datasources/tempo/#trace-to-logs).
### Prettify JSON for Logs in Explore
@@ -114,7 +114,7 @@ And here is the prettified JSON log.
{{< figure src="/static/img/docs/panels/pretty-json/prettified-json.png" max-width="1200px" caption="Prettified JSON" >}}
-For more on how to prettify JSON logs, refer to [Visualization]({{< relref "../panels-visualizations/visualizations" >}}) and [Display]({{< relref "../panels-visualizations/visualizations/logs" >}}) options.
+For more on how to prettify JSON logs, refer to [Visualization](../../panels-visualizations/visualizations/) and [Display](../../panels-visualizations/visualizations/logs/) options.
### Plugin catalog - Updated UX and extended features
@@ -122,7 +122,7 @@ We’ve made some changes to the plugins UI to help make it easier to discover a
#### Documentation updates
-New panel summaries and preview on the top level [Visualizations]({{< relref "../panels-visualizations/visualizations" >}}) page to help users pick or learn about specific visualizations more easily.
+New panel summaries and preview on the top level [Visualizations](../../panels-visualizations/visualizations/) page to help users pick or learn about specific visualizations more easily.
### Upcoming changes to the Select component
@@ -140,7 +140,7 @@ We’d love as much feedback as possible about this change, because we are consi
### High availability setup support for Grafana Live
-We have added an experimental HA setup support for Grafana Live with Redis. This resolves the limitation when clients were connected to different Grafana instances and those instances had no shared state. For additional information, refer to [Configure Grafana Live HA setup]({{< relref "../setup-grafana/set-up-grafana-live#configure-grafana-live-ha-setup" >}}).
+We have added an experimental HA setup support for Grafana Live with Redis. This resolves the limitation when clients were connected to different Grafana instances and those instances had no shared state. For additional information, refer to [Configure Grafana Live HA setup](../../setup-grafana/set-up-grafana-live/#configure-grafana-live-ha-setup).
## Enterprise features
@@ -150,15 +150,15 @@ These features are included in the Grafana Enterprise edition.
Role-based access control remains in beta. You can now grant or revoke permissions for Viewers, Editors, or Admins to use Explore mode, configure LDAP or SAML settings, or view the admin/stats page. These new permissions enhance the existing permissions that can be customized, namely permissions to access Users, Orgs, LDAP settings, and Reports in Grafana.
-Fine grained access control allows you to customize roles and permissions in Grafana beyond the built-in Viewer, Editor, and Admin roles. As of 8.1, you can modify some of the permissions for any of these built-in roles. This is helpful if you’d like users to have more or fewer access permissions than a given role allows for by default. For an overview of role-based access control and a complete list of available permissions, refer to the [Fine grained access control]({{< relref "../administration/roles-and-permissions/access-control" >}}) documentation.
+Fine grained access control allows you to customize roles and permissions in Grafana beyond the built-in Viewer, Editor, and Admin roles. As of 8.1, you can modify some of the permissions for any of these built-in roles. This is helpful if you’d like users to have more or fewer access permissions than a given role allows for by default. For an overview of role-based access control and a complete list of available permissions, refer to the [Fine grained access control](../../administration/roles-and-permissions/access-control/) documentation.
### New and improved reporting scheduler
-We’ve enhanced the scheduler for Reports to be more flexible, so you can send reports at just the right time. When scheduling a report, you can now choose to send a report at custom intervals such as every 4 hours or every 2 weeks. You can also send a report for a limited time period by providing a start and end date, or send a report only on weekdays or on the last day of each month. This change accompanies some other recent improvements to Reporting, like the ability to choose template variables for reports and an improved UX for authoring reports. To learn more, refer to the [reporting]({{< relref "../dashboards/share-dashboards-panels#reporting" >}}) documentation.
+We’ve enhanced the scheduler for Reports to be more flexible, so you can send reports at just the right time. When scheduling a report, you can now choose to send a report at custom intervals such as every 4 hours or every 2 weeks. You can also send a report for a limited time period by providing a start and end date, or send a report only on weekdays or on the last day of each month. This change accompanies some other recent improvements to Reporting, like the ability to choose template variables for reports and an improved UX for authoring reports. To learn more, refer to the [reporting](../../dashboards/share-dashboards-panels/#reporting) documentation.
### Encrypt data in the query cache
-Query caching was released in Grafana 8.0 and allows you to temporarily store the results of data source queries in a cache, so that Grafana reads repeated queries from there instead of from the data source itself. This reduces load on data sources, improves dashboard load times, and can save money for data sources that charge per query. To learn more about query caching see its [overview]({{< relref "../administration/data-source-management#query-and-resource-caching" >}}) page. To find out how to turn on encryption, refer to the [caching configuration]({{< relref "../setup-grafana/configure-grafana/enterprise-configuration#caching" >}}) documentation.
+Query caching was released in Grafana 8.0 and allows you to temporarily store the results of data source queries in a cache, so that Grafana reads repeated queries from there instead of from the data source itself. This reduces load on data sources, improves dashboard load times, and can save money for data sources that charge per query. To learn more about query caching see its [overview](../../administration/data-source-management/#query-and-resource-caching) page. To find out how to turn on encryption, refer to the [caching configuration](../../setup-grafana/configure-grafana/enterprise-configuration/#caching) documentation.
You can now encrypt the query data cached by Grafana. This improves the security of query data, especially when your cache (like Redis) is shared with other services.
@@ -166,7 +166,7 @@ You can now encrypt the query data cached by Grafana. This improves the security
You can now customize Grafana’s loading logo, which displays while Grafana is loading in a user’s browser. White labeling in Grafana Enterprise allows you to customize the look and feel of Grafana to match your product’s or company’s brand. This makes Grafana a more integrated part of your observability stack and keep Grafana consistent with other visualizations displayed in public.
-To find out how you can configure it along with other Grafana UI elements, like the corner logo and application footer, refer to the [White labeling]({{< relref "../setup-grafana/configure-grafana/configure-custom-branding" >}}) topic of the Grafana Enterprise docs.
+To find out how you can configure it along with other Grafana UI elements, like the corner logo and application footer, refer to the [White labeling](../../setup-grafana/configure-grafana/configure-custom-branding/) topic of the Grafana Enterprise docs.
### Oauth2 - Team Sync to Group Mapping
diff --git a/docs/sources/whatsnew/whats-new-in-v8-4.md b/docs/sources/whatsnew/whats-new-in-v8-4.md
index 0827828511f..343599564cb 100644
--- a/docs/sources/whatsnew/whats-new-in-v8-4.md
+++ b/docs/sources/whatsnew/whats-new-in-v8-4.md
@@ -130,13 +130,13 @@ Enable role-based access control by adding the term `accesscontrol` to the list
#### Assign SAML users different roles in different Organizations
-You can use Grafana's SAML integration to map organizations in your SAML service to [Organizations]({{< relref "../setup-grafana/configure-security/configure-authentication/saml#configure-organization-mapping" >}}) in Grafana so that users who authenticate using SAML have the right permissions. Previously, you could only choose a single role (Viewer, Editor, or Admin) for users, which would apply to all of their Organizations. Now, you can map a given SAML user or org to different roles in different Organizations, so that, for example, they can be a Viewer in one Organization and an Admin in another.
+You can use Grafana's SAML integration to map organizations in your SAML service to [Organizations](../../setup-grafana/configure-security/configure-authentication/saml/#configure-organization-mapping) in Grafana so that users who authenticate using SAML have the right permissions. Previously, you could only choose a single role (Viewer, Editor, or Admin) for users, which would apply to all of their Organizations. Now, you can map a given SAML user or org to different roles in different Organizations, so that, for example, they can be a Viewer in one Organization and an Admin in another.
Additionally, you can now grant multiple SAML organizations access to Grafana, using the `allowed_organizations` attribute. Previously, you could only map one.
{{< figure src="/static/img/docs/enterprise/8-4-SAML-auth.png" max-width="1200px" caption="Assign SAML users role" >}}
-Learn more in our [SAML docs]({{< relref "../setup-grafana/configure-security/configure-authentication/saml" >}}).
+Learn more in our [SAML docs](../../setup-grafana/configure-security/configure-authentication/saml/).
### Performance improvements
diff --git a/docs/sources/whatsnew/whats-new-in-v9-0.md b/docs/sources/whatsnew/whats-new-in-v9-0.md
index 9d9cc1818da..3391f04dcb9 100644
--- a/docs/sources/whatsnew/whats-new-in-v9-0.md
+++ b/docs/sources/whatsnew/whats-new-in-v9-0.md
@@ -102,7 +102,7 @@ Grafana Alerting now provides the ability to capture an image for Grafana manage
## Envelope encryption is generally available and enabled by default
-Grafana now uses envelope encryption to encrypt secrets in the database. Envelope encryption adds a layer of indirection to the encryption process. Instead of encrypting all secrets in the database with a single key, Grafana uses a set of keys called data encryption keys (DEKs) to encrypt them. These data encryption keys are themselves encrypted with a single key encryption key (KEK). This allows you to rotate your KEK and quickly re-encrypt your DEKs in case a key is compromised. In Grafana Enterprise, you can also store your KEK in an external key management service (KMS) like AWS KMS or Azure Key Vault, for extra security. Learn more about envelope encryption in the [database encryption documentation]({{< relref "../setup-grafana/configure-security/configure-database-encryption#envelope-encryption" >}}).
+Grafana now uses envelope encryption to encrypt secrets in the database. Envelope encryption adds a layer of indirection to the encryption process. Instead of encrypting all secrets in the database with a single key, Grafana uses a set of keys called data encryption keys (DEKs) to encrypt them. These data encryption keys are themselves encrypted with a single key encryption key (KEK). This allows you to rotate your KEK and quickly re-encrypt your DEKs in case a key is compromised. In Grafana Enterprise, you can also store your KEK in an external key management service (KMS) like AWS KMS or Azure Key Vault, for extra security. Learn more about envelope encryption in the [database encryption documentation](../../setup-grafana/configure-security/configure-database-encryption/#envelope-encryption).
{{< figure src="/static/img/docs/enterprise/dashboards/envelope-encryption.png" max-width="750px" caption="Envelope encryption" >}}
@@ -177,7 +177,7 @@ Reporting is all about convenience - getting info to eyeballs as quickly as poss
## Breaking changes
-This is a partial list of notable breaking changes. For the complete list, see our [Release Notes]({{< relref "../release-notes/release-notes-9-0-0" >}}).
+This is a partial list of notable breaking changes. For the complete list, see our [Release Notes](../../release-notes/release-notes-9-0-0/).
### Role-based access control: changes for general release
@@ -212,7 +212,7 @@ In the Prometheus data source, when grafana receives numeric data from Prometheu
+In the InfluxDB data source, browser access mode was deprecated in grafana 8.0.0 and we are removing this feature in 9.0.0. If you are using this mode, you need to [switch to server access mode](../../datasources/influxdb/##influxql-classic-influxdb-query) on the data source configuration page or you can do this via provisioning. -->
### Transformations: Allow more complex regex expressions in rename by regex
@@ -251,7 +251,7 @@ Therefore, any secret created or updated in Grafana v9.0 won't be decryptable by
We strongly recommend that you enable `envelopeEncryption` for older versions to deploy envelope encryption. You can alternatively configure the `disableEnvelopeEncryption` feature toggle before upgrading to v9.0; however, this feature toggle might be removed in a future Grafana release.
-For more details, and workarounds for potential issues, refer to the [documentation]({{< relref "../setup-grafana/configure-security/configure-database-encryption" >}}).
+For more details, and workarounds for potential issues, refer to the [documentation](../../setup-grafana/configure-security/configure-database-encryption/).
## A note on Grafana Enterprise licensing
diff --git a/docs/sources/whatsnew/whats-new-in-v9-1.md b/docs/sources/whatsnew/whats-new-in-v9-1.md
index 7a6aeb9f44a..839d36623a3 100644
--- a/docs/sources/whatsnew/whats-new-in-v9-1.md
+++ b/docs/sources/whatsnew/whats-new-in-v9-1.md
@@ -36,11 +36,11 @@ Service accounts are an evolution in machine access within Grafana.
You can create multiple API tokens per service account with independent expiration dates, and temporarily disable a service account without deleting it.
These benefits make service accounts a more flexible way for Terraform and other apps to authenticate with Grafana.
-Service accounts also work with [role-based access control]({{< relref "../administration/roles-and-permissions/access-control" >}}) in [Grafana Enterprise]({{< relref "../introduction/grafana-enterprise" >}}).
+Service accounts also work with [role-based access control](../../administration/roles-and-permissions/access-control/) in [Grafana Enterprise](../../introduction/grafana-enterprise/).
You can improve security by granting service accounts specific roles to limit the functions they can perform.
Service accounts have been in beta since Grafana v8.5.
During that time, we've improved the UI and migration path from API keys, made it possible to add service accounts to teams, and inherit team permissions.
-To learn more about service accounts, see the [documentation]({{< relref "../administration/service-accounts" >}}).
+To learn more about service accounts, see the [documentation](../../administration/service-accounts/).
{{< figure src="/static/img/docs/service-accounts/add-service-account-token-9-1.png" max-width="750px" caption="Adding a service account token" >}}
@@ -56,9 +56,9 @@ To see JWT URL embedding in action, see the [sample project](https://github.com/
#### Organization role mapping for GitHub OAuth2 authentication
-You can now use GitHub OAuth2 to map users or teams to specific [Grafana organization roles]({{< relref "../administration/roles-and-permissions#organization-roles" >}}) by using `role_attribute_path` configuration option.
+You can now use GitHub OAuth2 to map users or teams to specific [Grafana organization roles](../../administration/roles-and-permissions/#organization-roles) by using `role_attribute_path` configuration option.
Grafana will use [JMESPath](https://jmespath.org/examples.html) for path lookup and role mapping.
-For more information, see the [documentation]({{< relref "../setup-grafana/configure-security/configure-authentication/github#map-roles" >}}).
+For more information, see the [documentation](../../setup-grafana/configure-security/configure-authentication/github/#map-roles).
Grafana Cloud users can access this feature by [opening a support ticket in the Cloud Portal](/profile/org#support).
@@ -75,13 +75,13 @@ This feature will be rolled out to Grafana Cloud users over the course of severa
Panel title search uses our updated dashboard search approach.
Previously, Grafana used SQL database queries to find dashboards by title.
With the feature toggle enabled, Grafana can build an in-memory index of all dashboards.
-To learn more about search in Grafana, see the [documentation]({{< relref "../dashboards/use-dashboards#dashboard-search" >}}).
+To learn more about search in Grafana, see the [documentation](../../dashboards/use-dashboards/#dashboard-search).
{{< figure src="/static/img/docs/dashboards/panel-title-search-9-1.png" max-width="750px" caption="Searching for a panel title" >}}
#### Starred dashboards in the navigation bar
-As part of the upcoming improvements to Grafana's navigation, you can now directly access your [starred dashboards]({{< relref "../dashboards/use-dashboards" >}}) from the navigation bar.
+As part of the upcoming improvements to Grafana's navigation, you can now directly access your [starred dashboards](../../dashboards/use-dashboards/) from the navigation bar.
{{< figure src="/static/img/docs/dashboards/starred-dashboards-9-1.png" max-width="750px" caption="Accessing your starred dashboards" >}}
@@ -90,15 +90,15 @@ As part of the upcoming improvements to Grafana's navigation, you can now direct
#### Heatmap improvements
The beta heatmap announced in version 9.0 is now used throughout Grafana.
-Its performance is improved, and it now supports [exemplars]({{< relref "../fundamentals/exemplars" >}}).
-To learn more about the heatmap panel, see the [documentation]({{< relref "../panels-visualizations/visualizations/heatmap" >}}).
+Its performance is improved, and it now supports [exemplars](../../fundamentals/exemplars/).
+To learn more about the heatmap panel, see the [documentation](../../panels-visualizations/visualizations/heatmap/).
{{< figure src="/static/img/docs/panels/heatmap-panel-9-1.png" max-width="750px" caption="A heatmap panel" >}}
#### Geomap
-You can now measure both distances and areas on Geomap visualizations by using the panel's new [measure tools]({{< relref "../panels-visualizations/visualizations/geomap#show-measure-tools" >}}).
-To learn more about the Geomap panel, see the [documentation]({{< relref "../panels-visualizations/visualizations/geomap" >}}).
+You can now measure both distances and areas on Geomap visualizations by using the panel's new [measure tools](../../panels-visualizations/visualizations/geomap/#show-measure-tools).
+To learn more about the Geomap panel, see the [documentation](../../panels-visualizations/visualizations/geomap/).
{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-measure-area-9-1-0.png" max-width="750px" caption="Geomap panel measuring tool - area" >}}
@@ -135,7 +135,7 @@ We also embedded several links directly into the table.
These links direct you to a Prometheus query to further investigate the data.
We also provide a link from the table directly to Tempo search, making it easier for you to investigate your APM metrics.
-To learn more about the APM table, see the [documentation]({{< relref "../datasources/tempo#apm-table" >}}).
+To learn more about the APM table, see the [documentation](../../datasources/tempo/#apm-table).
{{< figure src="/static/img/docs/panels/apm-table-9-1.png" max-width="750px" caption="An APM table in the Explore view" >}}
@@ -172,7 +172,7 @@ Provisioning for Grafana Alerting currently supports these resources:
- Text templates
For more information, see the
-[provisioning documentation]({{< relref "../administration/provisioning" >}}).
+[provisioning documentation](../../administration/provisioning/).
## Grafana Enterprise
@@ -188,7 +188,7 @@ Reporting is better in a few specific ways in Grafana version 9.1:
For example, you can share last month's numbers as compared to the numbers for this month.
The dashboard uses the same template variables if you attach the dashboard to a report twice.
-To learn more about reporting, see the [documentation]({{< relref "../dashboards/share-dashboards-panels#reporting" >}}).
+To learn more about reporting, see the [documentation](../../dashboards/share-dashboards-panels/#reporting).
{{< figure src="/static/img/docs/enterprise/reporting-draft-9-1.png" max-width="750px" caption="Saving a report as a draft" >}}
@@ -215,17 +215,17 @@ In v9.1, you can determine which users, teams, and roles can access app plugins
> This definition is planned for a future release.
You can also control who can view, edit, or administer dashboard and data source usage insights, as well as data source query caching configuration.
-For more details, see the [RBAC documentation]({{< relref "../administration/roles-and-permissions/access-control" >}}).
+For more details, see the [RBAC documentation](../../administration/roles-and-permissions/access-control/).
{{< figure src="/static/img/docs/enterprise/rbac-app-plugins-9-1.png" max-width="750px" caption="Configuring role-based-access to app plugins" >}}
#### Rotate your database encryption keys using Grafana's API
-In Grafana version 9.0, we [revamped]({{< relref "./whats-new-in-v9-0#envelope-encryption-is-generally-available-and-enabled-by-default" >}}) the method Grafana uses to encrypt secrets, like data source credentials, so that you can rotate encryption keys and integrate with a key management system like Hashicorp Vault, AWS Key Management Service, or Azure Key Vault.
+In Grafana version 9.0, we [revamped](../whats-new-in-v9-0/#envelope-encryption-is-generally-available-and-enabled-by-default) the method Grafana uses to encrypt secrets, like data source credentials, so that you can rotate encryption keys and integrate with a key management system like Hashicorp Vault, AWS Key Management Service, or Azure Key Vault.
Now, you can rotate keys and re-encrypt secrets via API.
This makes it easier to configure Grafana to be secure while deploying it.
-To learn more, see our guide to [configuring database encryption]({{< relref "../setup-grafana/configure-security/configure-database-encryption#configure-database-encryption" >}}).
+To learn more, see our guide to [configuring database encryption](../../setup-grafana/configure-security/configure-database-encryption/#configure-database-encryption).
#### Audit all actions in Grafana using verbose logging
@@ -233,7 +233,7 @@ Auditing logs helps you manage and mitigate activity and meet compliance require
By default, Grafana emits an audit log with every action that changes something (like a user creating or updating a dashboard or updating another user's permissions).
If you want to record all actions on the Grafana server, including GETs and page views, you can now turn on `verbose mode`.
This results in more logs, but it can be useful to debug specific issues or make sure you catch everything happening in Grafana for security or compliance reasons.
-To learn more, see the [configuration documentation]({{< relref "../setup-grafana/configure-grafana/enterprise-configuration#verbose" >}}).
+To learn more, see the [configuration documentation](../../setup-grafana/configure-grafana/enterprise-configuration/#verbose).
{{< figure src="/static/img/docs/enterprise/verbose-audit-logs-9-1.png" max-width="750px" caption="Verbose audit logging output" >}}
@@ -242,7 +242,7 @@ To learn more, see the [configuration documentation]({{< relref "../setup-grafan
When you synchronize users from a SAML, LDAP, or OAuth provider, some user settings, such as name and email address, are synchronized from your identity provider.
Previously, you could edit those settings in the Grafana UI, but they would revert back.
To make user management clearer, you can now see which settings are synchronized from your identity provider, but you cannot edit those settings.
-To learn more about authentication, see the [documentation]({{< relref "../setup-grafana/configure-security/configure-authentication" >}}).
+To learn more about authentication, see the [documentation](../../setup-grafana/configure-security/configure-authentication/).
{{< figure src="/static/img/docs/enterprise/oauth-synced-user-9-1.png" max-width="750px" caption="Non-interactive view of a user synced via OAuth" >}}
diff --git a/docs/sources/whatsnew/whats-new-in-v9-2.md b/docs/sources/whatsnew/whats-new-in-v9-2.md
index deb8c3f836d..ae19c749c10 100644
--- a/docs/sources/whatsnew/whats-new-in-v9-2.md
+++ b/docs/sources/whatsnew/whats-new-in-v9-2.md
@@ -45,7 +45,7 @@ Canvas visualizations are extensible form-built panels that allow you to explici
For example, you can place image layers and then overlay text that's updated by Grafana data sources, and display icons that can change color conditionally based on data.
-We've planned additional features and design elements for future releases to make Canvas panels even more powerful tools for creating custom, interactive, data-driven visualizations. To learn more about the Canvas panel, see the [documentation]({{< relref "../panels-visualizations/visualizations/canvas" >}}).
+We've planned additional features and design elements for future releases to make Canvas panels even more powerful tools for creating custom, interactive, data-driven visualizations. To learn more about the Canvas panel, see the [documentation](../../panels-visualizations/visualizations/canvas/).
{{< video-embed src="/static/img/docs/canvas-panel/canvas-beta-overview-9-2-0.mp4" max-width="750px" caption="Canvas panel beta overview" >}}
@@ -145,8 +145,8 @@ For details on using this functionality, see [GitHub pull request #55313](https:
## Transformations: INNER JOINs
-[Transformations]({{< relref "../panels-visualizations/query-transform-data/transform-data" >}}) allow you to shape raw data from data sources, like metrics series or GitHub issues, into a format that's appropriate for the chosen visualization.
-We have extended the [Join transformation]({{< relref "../panels-visualizations/query-transform-data/transform-data#join-by-field" >}}) to support INNER JOINs in addition to OUTER JOINs. These work similarly to SQL JOINs.
+[Transformations](../../panels-visualizations/query-transform-data/transform-data/) allow you to shape raw data from data sources, like metrics series or GitHub issues, into a format that's appropriate for the chosen visualization.
+We have extended the [Join transformation](../../panels-visualizations/query-transform-data/transform-data/#join-by-field) to support INNER JOINs in addition to OUTER JOINs. These work similarly to SQL JOINs.
{{< figure src="/static/img/docs/transformations/transform-outer-join-9-2.png" max-width="750px" caption="Query builder groupings for Google Cloud monitoring" >}}
@@ -225,14 +225,14 @@ For more information, see the [authentication configuration documentation](/docs
## Match parameter support in prometheus labels API
-Prometheus users running Prometheus v2.24 and higher can use the [labels endpoint](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) instead of the [series endpoint](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers) for the [`label_values` function]({{< relref "../datasources/prometheus#query-variable" >}}).
+Prometheus users running Prometheus v2.24 and higher can use the [labels endpoint](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) instead of the [series endpoint](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers) for the [`label_values` function](../../datasources/prometheus/#query-variable).
This decreases load times for templated high-cardinality Prometheus instances.
-If you want to benefit from this endpoint you must first configure the Prometheus type and version in any Prometheus data sources' [configuration]({{< relref "../datasources/prometheus" >}}).
+If you want to benefit from this endpoint you must first configure the Prometheus type and version in any Prometheus data sources' [configuration](../../datasources/prometheus/).
## New Prometheus streaming parser
-In Grafana v9.2, you can enable the `prometheusStreamingJSONParser` [feature toggle]({{< relref "../setup-grafana/configure-grafana#feature_toggles" >}}) to use a better-performing, memory-efficient streaming JSON client for Prometheus.
+In Grafana v9.2, you can enable the `prometheusStreamingJSONParser` [feature toggle](../../setup-grafana/configure-grafana/#feature_toggles) to use a better-performing, memory-efficient streaming JSON client for Prometheus.
We'll make this client the default in Grafana v9.3.
When Prometheus returns `NaN` values, this new client doesn't change them, neither to the value `null` nor to `0` as in recent Grafana versions.
diff --git a/docs/sources/whatsnew/whats-new-in-v9-3.md b/docs/sources/whatsnew/whats-new-in-v9-3.md
index 929381d679b..91981f5cf41 100644
--- a/docs/sources/whatsnew/whats-new-in-v9-3.md
+++ b/docs/sources/whatsnew/whats-new-in-v9-3.md
@@ -45,7 +45,7 @@ We have added four new languages to Grafana: Spanish, French, German, and Simpli
With millions of users across the globe, Grafana has a global footprint. In order to make it accessible to a wider audience, we have taken the first steps in localizing key workflows. You can now set Grafana’s language for the navigation, viewing dashboards, and some settings. This will cover the main activities a Viewer performs within Grafana.
-Read more about configuring the [default language for your organization]({{< relref "../administration/organization-preferences" >}}) and [updating your profile]({{< relref "../administration/user-management/user-preferences" >}}) in our documentation.
+Read more about configuring the [default language for your organization](../../administration/organization-preferences/) and [updating your profile](../../administration/user-management/user-preferences/) in our documentation.
{{< figure src="/static/img/docs/internationalization/internationalization-9-3.png" max-width="750px" caption="Grafana available in Spanish, French, German, and Simplified Chinese" >}}
@@ -53,7 +53,7 @@ Read more about configuring the [default language for your organization]({{< rel
Generally available in all editions of Grafana
-We have added a new alpha layer type in Geomap called photo layer. This layer enables you to render a photo at each data point. To learn more about the photo layer and the geomap panel, refer to [Photos layer]({{< relref "../panels-visualizations/visualizations/geomap#photos-layer-alpha" >}}).
+We have added a new alpha layer type in Geomap called photo layer. This layer enables you to render a photo at each data point. To learn more about the photo layer and the geomap panel, refer to [Photos layer](../../panels-visualizations/visualizations/geomap/#photos-layer-alpha).
{{< figure src="/static/img/docs/geomap-panel/geomap-photos-9-3-0.png" max-width="750px" caption="Geomap panel photos layer" >}}
@@ -63,7 +63,7 @@ Available in **beta** in all editions of Grafana
Canvas is a new panel that combines the power of Grafana with the flexibility of custom elements. Canvas visualizations are extensible form-built panels that allow you to explicitly place elements within static and dynamic layouts. This empowers you to design custom visualizations and overlay data in ways that aren’t possible with standard Grafana panels, all within Grafana’s UI. If you’ve used popular UI and web design tools, then designing Canvas panels will feel very familiar.
-In Grafana v9.3, we have added icon value mapping support to the Canvas panel. This enables you to dynamically set which icon to display based on your data. To learn more about the Canvas panel, refer to [Canvas]({{< relref "../panels-visualizations/visualizations/canvas" >}}).
+In Grafana v9.3, we have added icon value mapping support to the Canvas panel. This enables you to dynamically set which icon to display based on your data. To learn more about the Canvas panel, refer to [Canvas](../../panels-visualizations/visualizations/canvas/).
{{< video-embed src="/static/img/docs/canvas-panel/canvas-icon-value-mapping-support-9-3-0.mp4" max-width="750px" caption="Canvas panel icon value mapping support" >}}
@@ -85,7 +85,7 @@ Available in **experimental** in Grafana Open Source, Enterprise, and Cloud Adva
Annotations are now supported in public dashboards, with the exception of query annotations. They are turned off by default, but can be turned on in your public dashboard settings.
-Note that because Public Dashboards is an experimental feature, you need to enable it in Grafana using the `publicDashboards` [feature toggle]({{< relref "../setup-grafana/configure-grafana#feature_toggles" >}}), or open a support ticket requesting public dashboards if you are a Cloud Advanced customer.
+Note that because Public Dashboards is an experimental feature, you need to enable it in Grafana using the `publicDashboards` [feature toggle](../../setup-grafana/configure-grafana/#feature_toggles), or open a support ticket requesting public dashboards if you are a Cloud Advanced customer.
To learn more about public dashboards, refer to [Public dashboards](https://grafana.com/docs/grafana//dashboards/share-dashboards-panels/shared-dashboards/).
@@ -135,7 +135,7 @@ Generally available in Grafana Enterprise, Cloud Pro, and Cloud Advanced.
Because dashboards appear on a screen and reports are PDFs, it can be challenging to render data just the way you want to. Sometimes the report doesn't show enough columns in a table, or the titles appear too small. Now you can adjust the scale of your report to zoom in and make each text field and panel larger or zoom out to show more data.
-The zoom feature is located in the **Format Report** section of your reporting configuration. To learn more about reporting, refer to [Create and manage reports]({{< relref "../dashboards/create-reports" >}}).
+The zoom feature is located in the **Format Report** section of your reporting configuration. To learn more about reporting, refer to [Create and manage reports](../../dashboards/create-reports/).
{{< figure src="/static/img/docs/enterprise/reports/report-zoom.png" max-width="750px" caption="Report zoom feature with PDF documents at three different zoom levels" >}}
@@ -151,7 +151,7 @@ As part of our efforts to improve the security of Grafana, we are introducing a
Because this feature introduces a breaking change, it is behind the `accessTokenExpirationCheck` feature toggle and is disabled by default. Enabling this functionality without configuring refresh tokens for the specific OAuth provider will sign users out after their access token has expired, and they would need to sign in again every time.
-Complete documentation on how to configure obtaining a refresh token can be found on the [authentication configuration page]({{< relref "../setup-grafana/configure-security/configure-authentication" >}}), in the instructions for your Oauth identity provider.
+Complete documentation on how to configure obtaining a refresh token can be found on the [authentication configuration page](../../setup-grafana/configure-security/configure-authentication/), in the instructions for your Oauth identity provider.
### Resolve user conflicts in Grafana's CLI
@@ -181,8 +181,7 @@ If you use an LDAP directory to authenticate to Grafana but prefer to assign org
or via API, you can now skip user organization role synchronization with your LDAP
directory.
-Use the `skip_org_role_sync` [LDAP authentication configuration option]({{< relref
-"../setup-grafana/configure-security/configure-authentication/ldap#disable-org-role-synchronization" >}})
+Use the `skip_org_role_sync` [LDAP authentication configuration option](../../setup-grafana/configure-security/configure-authentication/ldap/#disable-org-role-synchronization)
when configuring LDAP authentication to prevent the synchronization between your LDAP groups and organization roles
and make user roles editable manually.
@@ -193,8 +192,7 @@ Generally available in all editions of Grafana
If you use Azure AD OAuth2 authentication and use `SecurityEnabled` groups that you don't want Azure to embed in the
authentication token, you can configure Grafana to use Microsoft's Graph API instead.
-Use the [`force_use_graph_api` configuration option]({{< relref
-"../setup-grafana/configure-security/configure-authentication/azuread#force-fetching-groups-from-microsoft-graph-api" >}})
+Use the [`force_use_graph_api` configuration option](../../setup-grafana/configure-security/configure-authentication/azuread/#force-fetching-groups-from-microsoft-graph-api)
when configuring Azure AD authentication to force Grafana to fetch groups using Graph API.
### RBAC: List token's permissions
@@ -202,23 +200,22 @@ when configuring Azure AD authentication to force Grafana to fetch groups using
Generally available in Grafana Enterprise and Cloud Advanced
We added a new endpoint to help users diagnose permissions-related issues with user and token authorization.
-[This endpoint]({{< relref "../developers/http_api/access_control#list-your-permissions" >}}) allows users to get the
+[This endpoint](../../developers/http_api/access_control/#list-your-permissions) allows users to get the
full list of RBAC permissions associated with their token.
-For more details, refer to [Debug the permissions of a service account token]({{< relref
-"../administration/service-accounts#debug-the-permissions-of-a-service-account-token" >}}).
+For more details, refer to [Debug the permissions of a service account token](../../administration/service-accounts/#debug-the-permissions-of-a-service-account-token).
### RBAC with Terraform: Extended support for provisioning permissions
Generally available in Grafana Enterprise and Cloud Advanced
-All Grafana users can now use the latest release of [Terraform's Grafana provider](https://registry.terraform.io/providers/grafana/grafana/latest/docs) (version 1.31.1+) to provision [user and team access to service accounts]({{< relref "../administration/service-accounts#manage-users-and-teams-permissions-for-a-service-account-in-grafana" >}}).
+All Grafana users can now use the latest release of [Terraform's Grafana provider](https://registry.terraform.io/providers/grafana/grafana/latest/docs) (version 1.31.1+) to provision [user and team access to service accounts](../../administration/service-accounts/#manage-users-and-teams-permissions-for-a-service-account-in-grafana).
This allows full management of service accounts through Terraform - from creating a service account and allowing users to access it to assigning roles to the service account and generating service account tokens.
-Grafana Enterprise and Cloud Pro and Advanced users can now provision [access to data sources]({{< relref "../administration/data-source-management#data-source-permissions" >}}) for Grafana's `Viewer`, `Editor`, and `Admin` basic roles, as well as assign `Edit` permission.
+Grafana Enterprise and Cloud Pro and Advanced users can now provision [access to data sources](../../administration/data-source-management/#data-source-permissions) for Grafana's `Viewer`, `Editor`, and `Admin` basic roles, as well as assign `Edit` permission.
-We have also added [documentation on provisioning RBAC roles and role assignments]({{< relref "../administration/roles-and-permissions/access-control/rbac-terraform-provisioning" >}}) to guide our Grafana Enterprise and Cloud Pro and Advanced users through this process.
+We have also added [documentation on provisioning RBAC roles and role assignments](../../administration/roles-and-permissions/access-control/rbac-terraform-provisioning/) to guide our Grafana Enterprise and Cloud Pro and Advanced users through this process.
Finally, we have fixed several access control related bugs to ensure a smoother provisioning experience.
diff --git a/docs/sources/whatsnew/whats-new-in-v9-4.md b/docs/sources/whatsnew/whats-new-in-v9-4.md
index 4f6e9fb5e59..62717c01fd2 100644
--- a/docs/sources/whatsnew/whats-new-in-v9-4.md
+++ b/docs/sources/whatsnew/whats-new-in-v9-4.md
@@ -31,17 +31,17 @@ The command palette has been updated to provide a more efficient way to navigate
To launch the command palette, use the keyboard shortcut `cmd + K` on Mac or `ctrl + K` on Linux/Windows.
-To learn more about the command palette, refer to [Search]({{< relref "../search" >}}).
+To learn more about the command palette, refer to [Search](../../search/).
{{< figure src="/media/docs/grafana/screenshot-grafana-94-command-palette.png" max-width="750px" caption="Grafana command palette" >}}
### New navigation
-_Generally available on Grafana Cloud, and available to preview using the `topnav` [feature toggle]({{< relref "../setup-grafana/configure-grafana#feature_toggles" >}}) in all editions of Grafana._
+_Generally available on Grafana Cloud, and available to preview using the `topnav` [feature toggle](../../setup-grafana/configure-grafana/#feature_toggles) in all editions of Grafana._
The navigation in Grafana has been updated with a new design and an improved structure to make it easier for you to access the data you need. With this update, you'll be able to quickly navigate between features, giving you full visibility into the health of your systems.
-The new navigation is gradually rolling out to all users on Grafana Cloud. If you’re using Grafana Open Source and Enterprise, you can enable this feature using the `topnav` [feature toggle]({{< relref "../setup-grafana/configure-grafana#feature_toggles" >}}).
+The new navigation is gradually rolling out to all users on Grafana Cloud. If you’re using Grafana Open Source and Enterprise, you can enable this feature using the `topnav` [feature toggle](../../setup-grafana/configure-grafana/#feature_toggles).
> **Note:** The Grafana documentation has not yet been updated to reflect changes to the navigation.
@@ -51,11 +51,11 @@ The new navigation is gradually rolling out to all users on Grafana Cloud. If yo
## Dashboards and visualizations
-We've made the following changes to dashboards and visualizations. Learn more about dashboards in our [dashboards documentation]({{< relref "../dashboards" >}}).
+We've made the following changes to dashboards and visualizations. Learn more about dashboards in our [dashboards documentation](../../dashboards/).
### Dashboard panel redesign
-_Available to preview using the `newPanelChromeUI` [feature toggle]({{< relref "../setup-grafana/configure-grafana#feature_toggles" >}}) in all editions of Grafana_.
+_Available to preview using the `newPanelChromeUI` [feature toggle](../../setup-grafana/configure-grafana/#feature_toggles) in all editions of Grafana_.
Dashboard panels contain a lot of information, some of which is difficult to discover or access from the dashboard. With our redesigned panels, we've improved accessibility and made it easier to understand the status of a panel by adding and moving key elements.
@@ -69,7 +69,7 @@ However, we have more planned: we’re going to make even more improvements to t
### New data source connection page in Dashboards and Explore
-_Available to preview using the `datasourceOnboarding` [feature toggle]({{< relref "../setup-grafana/configure-grafana#feature_toggles" >}})._
+_Available to preview using the `datasourceOnboarding` [feature toggle](../../setup-grafana/configure-grafana/#feature_toggles)._
When you start your journey to create a dashboard or explore your data, but you don't have a data source connected yet, you’ll be shown a page that guides you to set up a first connection.
@@ -85,7 +85,7 @@ We've updated the **Details** section of a log line. Previously some of the inte
{{< figure src="/static/img/logs/log-details-whats-new-9-4.png" max-width="750px" caption="Log details redesign with interactions" >}}
-Learn more about viewing logs in our [Logs panel documentation]({{< relref "../panels-visualizations/visualizations/logs" >}}).
+Learn more about viewing logs in our [Logs panel documentation](../../panels-visualizations/visualizations/logs/).
### Loki datasource query validation
@@ -95,7 +95,7 @@ We added support to validate queries and visually display errors as a query is b
{{< figure src="/media/docs/grafana/logs-loki-query-validation-whats-new-9-4.png" max-width="750px" caption="Loki query validation" >}}
-Learn more about viewing logs in our [Logs panel documentation]({{< relref "../panels-visualizations/visualizations/logs" >}}).
+Learn more about viewing logs in our [Logs panel documentation](../../panels-visualizations/visualizations/logs/).
### Loki logs sample in Explore
@@ -111,7 +111,7 @@ _Available in **beta** in all editions of Grafana_
Canvas is a new panel that combines the power of Grafana with the flexibility of custom elements. Canvas visualizations are extensible form-built panels that allow you to explicitly place elements within static and dynamic layouts. This empowers you to design custom visualizations and overlay data in ways that aren’t possible with standard Grafana panels, all within Grafana’s UI. If you’ve used popular UI and web design tools, then designing Canvas panels will feel very familiar.
-In Grafana v9.4, we have added the ability to create connections (arrows). Connections enable you to connect elements together to create more complex visualizations. We also added support for data links and a brand new server element. To learn more about the Canvas panel, refer to [Canvas]({{< relref "../panels-visualizations/visualizations/canvas" >}}).
+In Grafana v9.4, we have added the ability to create connections (arrows). Connections enable you to connect elements together to create more complex visualizations. We also added support for data links and a brand new server element. To learn more about the Canvas panel, refer to [Canvas](../../panels-visualizations/visualizations/canvas/).
{{< video-embed src="/media/docs/grafana/canvas-connections-9-4-0.mp4" max-width="750px" caption="Canvas panel connections" >}}
@@ -127,7 +127,7 @@ We have added a configuration option that enables you to require an expiration d
This change will not affect existing tokens. However, newly created tokens will require an expiration date that doesn't exceed the configuration option `token_expiration_day_limit`. This option is disabled by default.
-Learn more about service accounts in our [Service account documentation]({{< relref "../administration/service-accounts" >}}).
+Learn more about service accounts in our [Service account documentation](../../administration/service-accounts/).
### OAuth providers setting for skip org role sync
@@ -135,7 +135,7 @@ While Grafana integrates with many different auth providers, we have received re
This option enables you to skip synchronization from your configured OAuth provider specifically in the auth provider section under `skip_org_role_sync`. Previously users could only do this for certain providers using the `oauth_skip_org_role_sync_update` option, but this would include all of the configured providers.
-Learn more about Oauth in our [Oauth configuration guide]({{< relref "../setup-grafana/configure-security/configure-authentication/generic-oauth" >}}).
+Learn more about Oauth in our [Oauth configuration guide](../../setup-grafana/configure-security/configure-authentication/generic-oauth/).
### RBAC support for Grafana OnCall plugin
@@ -146,7 +146,7 @@ Before RBAC support in Grafana OnCall, it was only possible to allow your organi
For example, you can assign a Viewer basic role to a user in your organization (users must still have a basic role assigned) and also assign them the new Grafana OnCall RBAC role of **Schedules Editor**. This assignment enables the user to view everything in Grafana OnCall, and edit OnCall schedules.
-Learn more about role-based access control in our [RBAC docs]({{< relref "../administration/roles-and-permissions/access-control" >}}).
+Learn more about role-based access control in our [RBAC docs](../../administration/roles-and-permissions/access-control/).
### SAML auto login
@@ -154,13 +154,13 @@ We've added auto-login support for SAML authentication, which you can turn on wi
have a unified configuration style among all authentication providers. Instead of using
`oauth_auto_login`, use the new `auto_login` option to enable automatic login for specific OAuth providers.
-Learn more about SAML setup in our [SAML configuration guide]({{< relref "../setup-grafana/configure-security/configure-authentication/saml" >}}).
+Learn more about SAML setup in our [SAML configuration guide](../../setup-grafana/configure-security/configure-authentication/saml/).
## Auditing and Usage Insights: Support for Loki multi-tenancy
_This feature is available for Enterprise customers_
-This feature adds support to push analytics events and auditing logs to Loki with multi-tenancy mode, by specifying a tenant id. Learn more about [auditing]({{< relref "../setup-grafana/configure-security/audit-grafana" >}}) and [usage insights]({{< relref "../setup-grafana/configure-security/export-logs" >}}) in our docs.
+This feature adds support to push analytics events and auditing logs to Loki with multi-tenancy mode, by specifying a tenant id. Learn more about [auditing](../../setup-grafana/configure-security/audit-grafana/) and [usage insights](../../setup-grafana/configure-security/export-logs/) in our docs.
## Reporting: Zoom in and out on your dashboard in a report PDF
@@ -173,11 +173,11 @@ You can modify the scale factor for each report in the report editor when you sh
{{< figure src="/media/docs/grafana/FormatReportShare9.4.png" max-width="750px" caption="Scale factor feature in Share functionality" >}}
-Learn more about reporting in our [documentation]({{< relref "../dashboards/create-reports" >}})
+Learn more about reporting in our [documentation](../../dashboards/create-reports/)
## Alerting
-We've made major improvements to Grafana Alerts, from new contact points and search options to improved workflows between Alerting and OnCall. For all the details, refer to our [Alerting documentation]({{< relref "../alerting" >}}).
+We've made major improvements to Grafana Alerts, from new contact points and search options to improved workflows between Alerting and OnCall. For all the details, refer to our [Alerting documentation](../../alerting/).
### Alerting: alert rules
@@ -271,7 +271,7 @@ Grafana Alerting is now compatible with AWS Aurora, but does not provide technic
## Enterprise Datasources
-We've made improvements to all [Enterprise Datasources]({{< relref "../introduction/grafana-enterprise#enterprise-data-sources" >}}), fixing small bugs, and updating libraries. We've also added many new features and support for additional APIs. Refer to each datasource's documentation and the change log for additional information.
+We've made improvements to all [Enterprise Datasources](../../introduction/grafana-enterprise/#enterprise-data-sources), fixing small bugs, and updating libraries. We've also added many new features and support for additional APIs. Refer to each datasource's documentation and the change log for additional information.
### DataDog Datasource
diff --git a/docs/sources/whatsnew/whats-new-in-v9-5.md b/docs/sources/whatsnew/whats-new-in-v9-5.md
index 36751d91b5a..c2c2ff159ae 100644
--- a/docs/sources/whatsnew/whats-new-in-v9-5.md
+++ b/docs/sources/whatsnew/whats-new-in-v9-5.md
@@ -19,7 +19,7 @@ weight: -36
Welcome to Grafana 9.5! We're excited to share some major updates to Grafana's navigation, tons of usability improvements to Alerting, and some promising experiments to help you query your Prometheus metrics. Also, read on to learn about our continued migration from API keys to service accounts, as well as deprecation of plugins that use Angular and a field in the InfluxDB data source.
-For more detail about all the changes in this release, refer to the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md). For the specific steps we recommend when you upgrade to v9.5, check out our [Upgrade Guide]({{< relref "../upgrade-guide/upgrade-v9.5/index.md" >}}).
+For more detail about all the changes in this release, refer to the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md). For the specific steps we recommend when you upgrade to v9.5, check out our [Upgrade Guide](../../upgrade-guide/upgrade-v9.5/).