diff --git a/.betterer.results b/.betterer.results
index b09b00781de..fd31bfb5837 100644
--- a/.betterer.results
+++ b/.betterer.results
@@ -1538,7 +1538,7 @@ 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/Table/utils.test.ts:5381": [
+ "packages/grafana-ui/src/components/Table/utils.test.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
@@ -1548,19 +1548,9 @@ exports[`better eslint`] = {
[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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "10"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "11"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "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.", "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.", "9"]
],
- "packages/grafana-ui/src/components/Table/utils.ts:5381": [
+ "packages/grafana-ui/src/components/Table/utils.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
@@ -3995,12 +3985,6 @@ exports[`better eslint`] = {
"public/app/features/folders/state/actions.test.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
- "public/app/features/geo/editor/GazetteerPathEditor.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [0, 0, 0, "Do not use any type assertions.", "2"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "3"]
- ],
"public/app/features/geo/format/geohash.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@@ -4554,6 +4538,9 @@ exports[`better eslint`] = {
"public/app/features/sandbox/TestStuffPage.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
+ "public/app/features/scenes/components/VizPanel/VizPanelRenderer.tsx:5381": [
+ [0, 0, 0, "Do not use any type assertions.", "0"]
+ ],
"public/app/features/scenes/components/layout/SceneFlexLayout.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@@ -4651,8 +4638,7 @@ exports[`better eslint`] = {
"public/app/features/search/state/SearchStateManager.ts:5381": [
[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.", "2"]
],
"public/app/features/search/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@@ -6349,8 +6335,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/plugins/datasource/prometheus/components/PromQueryEditor.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Do not use any type assertions.", "1"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/plugins/datasource/prometheus/components/PromQueryEditorByApp.test.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@@ -6649,16 +6634,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/plugins/datasource/prometheus/querybuilder/shared/OperationEditor.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
- ],
- "public/app/plugins/datasource/prometheus/querybuilder/shared/OperationHeader.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
- "public/app/plugins/datasource/prometheus/querybuilder/shared/OperationList.test.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
- ],
"public/app/plugins/datasource/prometheus/querybuilder/shared/OperationParamEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
@@ -6670,22 +6647,13 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/plugins/datasource/prometheus/querybuilder/shared/parsingUtils.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "2"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/plugins/datasource/prometheus/querybuilder/shared/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
- "public/app/plugins/datasource/prometheus/querybuilder/state.test.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/datasource/prometheus/querybuilder/state.ts:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"]
- ],
"public/app/plugins/datasource/prometheus/result_transformer.test.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@@ -6721,8 +6689,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "31"]
],
"public/app/plugins/datasource/prometheus/result_transformer.ts:5381": [
- [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.", "0"]
],
"public/app/plugins/datasource/prometheus/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@@ -6732,8 +6699,7 @@ exports[`better eslint`] = {
],
"public/app/plugins/datasource/tempo/QueryEditor/QueryField.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
- [0, 0, 0, "Do not use any type assertions.", "1"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "2"]
+ [0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/plugins/datasource/tempo/QueryEditor/ServiceGraphSection.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -6767,16 +6733,15 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
[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, "Do not use any type assertions.", "8"],
[0, 0, 0, "Do not use any type assertions.", "9"],
[0, 0, 0, "Do not use any type assertions.", "10"],
[0, 0, 0, "Do not use any type assertions.", "11"],
[0, 0, 0, "Do not use any type assertions.", "12"],
- [0, 0, 0, "Do not use any type assertions.", "13"],
+ [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.", "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.", "16"]
],
"public/app/plugins/datasource/tempo/language_provider.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@@ -6810,33 +6775,7 @@ exports[`better eslint`] = {
],
"public/app/plugins/datasource/tempo/traceql/autocomplete.test.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "10"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "11"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "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.", "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.", "20"]
- ],
- "public/app/plugins/datasource/tempo/traceql/autocomplete.ts:5381": [
- [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, "Unexpected any. Specify a different type.", "1"]
],
"public/app/plugins/datasource/testdata/ConfigEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@@ -6850,13 +6789,10 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "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.", "5"],
+ [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.", "7"],
- [0, 0, 0, "Do not use any type assertions.", "8"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "9"],
- [0, 0, 0, "Do not use any type assertions.", "10"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "11"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "8"]
],
"public/app/plugins/datasource/testdata/components/PredictablePulseEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -6876,13 +6812,11 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "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, "Unexpected any. Specify a different type.", "4"]
],
"public/app/plugins/datasource/testdata/components/SimulationSchemaForm.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [0, 0, 0, "Do not use any type assertions.", "2"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/plugins/datasource/testdata/components/StreamingClientEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -6998,18 +6932,14 @@ 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/plugins/panel/barchart/TickSpacingEditor.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
- ],
"public/app/plugins/panel/barchart/bars.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "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, "Do not use any type assertions.", "5"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "6"],
- [0, 0, 0, "Do not use any type assertions.", "7"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "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.", "6"]
],
"public/app/plugins/panel/barchart/module.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -7018,29 +6948,10 @@ exports[`better eslint`] = {
"public/app/plugins/panel/barchart/quadtree.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
- "public/app/plugins/panel/barchart/suggestions.ts:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
- ],
- "public/app/plugins/panel/barchart/utils.test.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "6"]
- ],
"public/app/plugins/panel/barchart/utils.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/bargauge/BarGaugeMigrations.test.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
- ],
- "public/app/plugins/panel/bargauge/BarGaugePanel.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
- ],
"public/app/plugins/panel/candlestick/CandlestickPanel.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
@@ -7067,9 +6978,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "10"],
[0, 0, 0, "Do not use any type assertions.", "11"]
],
- "public/app/plugins/panel/canvas/CanvasContextMenu.tsx:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"]
- ],
"public/app/plugins/panel/canvas/CanvasPanel.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
@@ -7113,8 +7021,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "5"]
],
"public/app/plugins/panel/canvas/utils.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "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/dashlist/module.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@@ -7131,12 +7038,6 @@ exports[`better eslint`] = {
"public/app/plugins/panel/debug/RenderInfoViewer.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
- "public/app/plugins/panel/flamegraph/components/FlameGraphHeader.tsx:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"]
- ],
- "public/app/plugins/panel/gauge/GaugeMigrations.test.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
- ],
"public/app/plugins/panel/gauge/GaugeMigrations.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@@ -7154,16 +7055,12 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"]
],
- "public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"],
- [0, 0, 0, "Do not use any type assertions.", "1"]
- ],
"public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/plugins/panel/geomap/editor/StyleEditor.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "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"],
@@ -7174,8 +7071,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "8"],
[0, 0, 0, "Do not use any type assertions.", "9"],
[0, 0, 0, "Do not use any type assertions.", "10"],
- [0, 0, 0, "Do not use any type assertions.", "11"],
- [0, 0, 0, "Do not use any type assertions.", "12"]
+ [0, 0, 0, "Do not use any type assertions.", "11"]
],
"public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@@ -7201,9 +7097,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
],
- "public/app/plugins/panel/geomap/style/utils.test.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
- ],
"public/app/plugins/panel/geomap/utils/layers.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
@@ -7215,14 +7108,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/plugins/panel/geomap/view.ts:5381": [
- [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"]
- ],
- "public/app/plugins/panel/gettingstarted/GettingStarted.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
- ],
"public/app/plugins/panel/gettingstarted/components/Step.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@@ -7568,191 +7453,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
- "public/app/plugins/panel/graph/utils.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
- ],
- "public/app/plugins/panel/heatmap-old/axes_editor.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "6"]
- ],
- "public/app/plugins/panel/heatmap-old/color_legend.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Do not use any type assertions.", "5"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "6"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "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, "Unexpected any. Specify a different type.", "11"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "12"],
- [0, 0, 0, "Do not use any type assertions.", "13"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "14"],
- [0, 0, 0, "Do not use any type assertions.", "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, "Do not use any type assertions.", "19"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "20"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "21"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "22"]
- ],
- "public/app/plugins/panel/heatmap-old/color_scale.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"]
- ],
- "public/app/plugins/panel/heatmap-old/display_editor.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "2"]
- ],
- "public/app/plugins/panel/heatmap-old/heatmap_ctrl.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "10"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "11"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "12"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "13"]
- ],
- "public/app/plugins/panel/heatmap-old/heatmap_data_converter.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "10"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "11"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "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.", "15"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "16"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "17"]
- ],
- "public/app/plugins/panel/heatmap-old/heatmap_tooltip.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "10"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "11"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "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.", "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.", "20"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "21"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "22"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "23"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "24"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "25"],
- [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"]
- ],
- "public/app/plugins/panel/heatmap-old/rendering.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
- [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"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "10"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "11"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "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.", "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.", "20"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "21"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "22"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "23"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "24"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "25"],
- [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.", "31"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "32"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "33"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "34"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "35"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "36"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "37"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "38"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "39"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "40"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "41"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "42"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "43"],
- [0, 0, 0, "Do not use any type assertions.", "44"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "45"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "46"]
- ],
- "public/app/plugins/panel/heatmap-old/specs/heatmap_ctrl.test.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "2"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "3"]
- ],
- "public/app/plugins/panel/heatmap-old/specs/heatmap_data_converter.test.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "2"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "3"]
- ],
- "public/app/plugins/panel/heatmap-old/types.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [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"]
- ],
"public/app/plugins/panel/heatmap/HeatmapHoverView.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@@ -7847,31 +7547,19 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/plugins/panel/nodeGraph/Edge.tsx:5381": [
- [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.", "0"]
],
"public/app/plugins/panel/nodeGraph/EdgeLabel.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
- "public/app/plugins/panel/nodeGraph/Legend.test.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "2"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "3"]
- ],
"public/app/plugins/panel/nodeGraph/Legend.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
- "public/app/plugins/panel/nodeGraph/Node.tsx:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"]
- ],
"public/app/plugins/panel/nodeGraph/NodeGraph.tsx:5381": [
[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/nodeGraph/ViewControls.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@@ -8185,9 +7873,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "15"],
[0, 0, 0, "Unexpected any. Specify a different type.", "16"]
],
- "public/app/plugins/panel/timeseries/plugins/ContextMenuPlugin.tsx:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"]
- ],
"public/app/plugins/panel/timeseries/plugins/annotations/AnnotationEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
diff --git a/.bra.toml b/.bra.toml
index 005306880a0..22f56050c52 100644
--- a/.bra.toml
+++ b/.bra.toml
@@ -2,9 +2,8 @@
init_cmds = [
["make", "gen-go"],
["make", "gen-jsonnet"],
- ["GO_BUILD_DEV=1", "make", "build-cli"],
- ["GO_BUILD_DEV=1", "make", "build-server"],
- ["./bin/grafana-server", "-packaging=dev", "cfg:app_mode=development"]
+ ["GO_BUILD_DEV=1", "make", "build-go"],
+ ["./bin/grafana", "server", "-packaging=dev", "cfg:app_mode=development"]
]
watch_all = true
follow_symlinks = true
@@ -20,6 +19,6 @@ build_delay = 1500
cmds = [
["make", "gen-go"],
["make", "gen-jsonnet"],
- ["GO_BUILD_DEV=1", "make", "build-server"],
- ["./bin/grafana-server", "-packaging=dev", "cfg:app_mode=development"]
+ ["GO_BUILD_DEV=1", "make", "build-go"],
+ ["./bin/grafana", "server", "-packaging=dev", "cfg:app_mode=development"]
]
diff --git a/.drone.star b/.drone.star
index 9d2a65ebc63..2504f1a394c 100644
--- a/.drone.star
+++ b/.drone.star
@@ -7,7 +7,7 @@
load('scripts/drone/events/pr.star', 'pr_pipelines')
load('scripts/drone/events/main.star', 'main_pipelines')
load('scripts/drone/pipelines/docs.star', 'docs_pipelines')
-load('scripts/drone/events/release.star', 'release_pipelines', 'publish_artifacts_pipelines', 'publish_npm_pipelines', 'publish_packages_pipeline', 'artifacts_page_pipeline')
+load('scripts/drone/events/release.star', 'oss_pipelines', 'enterprise_pipelines', 'enterprise2_pipelines', 'publish_artifacts_pipelines', 'publish_npm_pipelines', 'publish_packages_pipeline', 'artifacts_page_pipeline')
load('scripts/drone/pipelines/publish_images.star', 'publish_image_pipelines_public', 'publish_image_pipelines_security')
load('scripts/drone/version.star', 'version_branch_pipelines')
load('scripts/drone/events/cron.star', 'cronjobs')
@@ -15,7 +15,8 @@ load('scripts/drone/vault.star', 'secrets')
def main(ctx):
edition = 'oss'
- return pr_pipelines(edition=edition) + main_pipelines(edition=edition) + release_pipelines() + \
+ return pr_pipelines(edition=edition) + main_pipelines(edition=edition) + oss_pipelines() + enterprise_pipelines() + enterprise2_pipelines() + \
+ enterprise2_pipelines(prefix='custom-', trigger = {'event': ['custom']},) + \
publish_image_pipelines_public() + publish_image_pipelines_security() + \
publish_artifacts_pipelines('security') + publish_artifacts_pipelines('public') + \
publish_npm_pipelines('public') + publish_packages_pipeline() + artifacts_page_pipeline() + \
diff --git a/.drone.yml b/.drone.yml
index 103256ecf2f..afa440e9753 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -2,6 +2,8 @@
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -56,6 +58,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -117,6 +121,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -253,6 +259,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -313,6 +321,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -627,6 +637,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -760,6 +772,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -830,6 +844,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -873,6 +889,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -944,6 +962,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -1002,6 +1022,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -1128,6 +1150,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -1188,6 +1212,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -1509,7 +1535,7 @@ steps:
GCP_KEY:
from_secret: gcp_key
image: google/cloud-sdk
- name: publish-images-grafana/grafana
+ name: publish-images-grafana
volumes:
- name: docker
path: /var/run/docker.sock
@@ -1529,7 +1555,7 @@ steps:
GCP_KEY:
from_secret: gcp_key
image: google/cloud-sdk
- name: publish-images-grafana/grafana-oss
+ name: publish-images-grafana-oss
volumes:
- name: docker
path: /var/run/docker.sock
@@ -1552,7 +1578,7 @@ steps:
repo:
- grafana/grafana
- commands:
- - ./bin/grabpl upload-packages --edition oss
+ - ./bin/build upload-packages --edition oss
depends_on:
- end-to-end-tests-dashboards-suite
- end-to-end-tests-panels-suite
@@ -1569,7 +1595,7 @@ steps:
repo:
- grafana/grafana
- commands:
- - ./bin/grabpl upload-cdn --edition oss
+ - ./bin/build upload-cdn --edition oss
depends_on:
- grafana-server
environment:
@@ -1600,6 +1626,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -1731,6 +1759,8 @@ depends_on:
- main-test-backend
- main-build-e2e-publish
- main-integration-tests
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -1828,6 +1858,8 @@ clone:
depends_on:
- main-build-e2e-publish
- main-integration-tests
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -2135,7 +2167,7 @@ steps:
event:
- tag
- commands:
- - ./bin/grabpl upload-cdn --edition oss
+ - ./bin/build upload-cdn --edition oss
depends_on:
- grafana-server
environment:
@@ -2146,7 +2178,7 @@ steps:
image: grafana/grafana-ci-deploy:1.3.3
name: upload-cdn-assets
- commands:
- - ./bin/grabpl upload-packages --edition oss
+ - ./bin/build upload-packages --edition oss
depends_on:
- end-to-end-tests-dashboards-suite
- end-to-end-tests-panels-suite
@@ -2210,6 +2242,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -2658,7 +2692,6 @@ steps:
- build-backend
- build-frontend
- build-frontend-packages
- - build-backend-enterprise2
environment:
GPG_KEY_PASSWORD:
from_secret: gpg_key_password
@@ -2785,7 +2818,7 @@ steps:
- success
- failure
- commands:
- - ./bin/grabpl upload-cdn --edition enterprise
+ - ./bin/build upload-cdn --edition enterprise
depends_on:
- package
environment:
@@ -2796,7 +2829,7 @@ steps:
image: grafana/grafana-ci-deploy:1.3.3
name: upload-cdn-assets
- commands:
- - ./bin/grabpl upload-packages --edition enterprise
+ - ./bin/build upload-packages --edition enterprise
depends_on:
- package
environment:
@@ -2810,10 +2843,9 @@ steps:
- ./bin/build package --jobs 8 --edition enterprise2 --sign ${DRONE_TAG}
depends_on:
- build-plugins
- - build-backend
+ - build-backend-enterprise2
- build-frontend
- build-frontend-packages
- - build-backend-enterprise2
environment:
GPG_KEY_PASSWORD:
from_secret: gpg_key_password
@@ -2826,7 +2858,7 @@ steps:
image: grafana/build-container:1.6.4
name: package-enterprise2
- commands:
- - ./bin/grabpl upload-cdn --edition enterprise2
+ - ./bin/build upload-cdn --edition enterprise2
depends_on:
- package-enterprise2
environment:
@@ -2837,18 +2869,7 @@ steps:
image: grafana/grafana-ci-deploy:1.3.3
name: upload-cdn-assets-enterprise2
- commands:
- - ./bin/grabpl artifacts npm store --tag ${DRONE_TAG}
- depends_on:
- - build-frontend-packages
- environment:
- GCP_KEY:
- from_secret: gcp_key
- PRERELEASE_BUCKET:
- from_secret: prerelease_bucket
- image: grafana/build-container:1.6.4
- name: store-npm-packages
-- commands:
- - ./bin/grabpl upload-packages --edition enterprise2
+ - ./bin/build upload-packages --edition enterprise2
depends_on:
- package-enterprise2
environment:
@@ -2879,6 +2900,8 @@ volumes:
clone:
disable: true
depends_on: []
+environment:
+ EDITION: enterprise
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3321,9 +3344,508 @@ volumes:
path: /var/run/docker.sock
name: docker
---
+clone:
+ disable: true
+depends_on: []
+environment:
+ EDITION: enterprise2
+image_pull_secrets:
+- dockerconfigjson
+kind: pipeline
+name: release-enterprise2-build-e2e-publish
+node:
+ type: no-parallel
+platform:
+ arch: amd64
+ os: linux
+services: []
+steps:
+- commands:
+ - mkdir -p bin
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.17/grabpl
+ - chmod +x bin/grabpl
+ image: byrnedo/alpine-curl:0.1.8
+ name: grabpl
+- commands:
+ - echo $DRONE_RUNNER_NAME
+ image: alpine:3.15.6
+ name: identify-runner
+- commands:
+ - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git"
+ - cd grafana-enterprise
+ - git checkout ${DRONE_TAG}
+ environment:
+ GITHUB_TOKEN:
+ from_secret: github_token
+ image: grafana/build-container:1.6.4
+ name: clone-enterprise
+- commands:
+ - mv bin/grabpl /tmp/
+ - rmdir bin
+ - mv grafana-enterprise /tmp/
+ - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise
+ ${DRONE_TAG}
+ - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json
+ - mkdir bin
+ - mv /tmp/grabpl bin/
+ depends_on:
+ - clone-enterprise
+ environment:
+ GITHUB_TOKEN:
+ from_secret: github_token
+ image: grafana/build-container:1.6.4
+ name: init-enterprise
+- commands:
+ - go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
+ depends_on:
+ - init-enterprise
+ environment:
+ CGO_ENABLED: 0
+ image: golang:1.19.3
+ name: compile-build-cmd
+- commands:
+ - make gen-go
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: wire-install
+- commands:
+ - yarn install --immutable
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: yarn-install
+- commands:
+ - '# It is required that code generated from Thema/CUE be committed and in sync
+ with its inputs.'
+ - '# The following command will fail if running code generators produces any diff
+ in output.'
+ - CODEGEN_VERIFY=1 make gen-cue
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: verify-gen-cue
+- commands:
+ - ./bin/build build-frontend --jobs 8 --edition enterprise ${DRONE_TAG}
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ NODE_OPTIONS: --max_old_space_size=8192
+ image: grafana/build-container:1.6.4
+ name: build-frontend
+- commands:
+ - ./bin/build build-frontend-packages --jobs 8 --edition enterprise ${DRONE_TAG}
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ NODE_OPTIONS: --max_old_space_size=8192
+ image: grafana/build-container:1.6.4
+ name: build-frontend-packages
+- commands:
+ - ./bin/build build-plugins --jobs 8 --edition enterprise
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ GRAFANA_API_KEY:
+ from_secret: grafana_api_key
+ image: grafana/build-container:1.6.4
+ name: build-plugins
+- commands:
+ - ./bin/build build-backend --jobs 8 --edition enterprise2 ${DRONE_TAG}
+ depends_on:
+ - wire-install
+ - compile-build-cmd
+ image: grafana/build-container:1.6.4
+ name: build-backend-enterprise2
+- commands:
+ - ./bin/build package --jobs 8 --edition enterprise2 --sign ${DRONE_TAG}
+ depends_on:
+ - build-plugins
+ - build-backend-enterprise2
+ - build-frontend
+ - build-frontend-packages
+ environment:
+ GPG_KEY_PASSWORD:
+ from_secret: gpg_key_password
+ GPG_PRIV_KEY:
+ from_secret: gpg_priv_key
+ GPG_PUB_KEY:
+ from_secret: gpg_pub_key
+ GRAFANA_API_KEY:
+ from_secret: grafana_api_key
+ image: grafana/build-container:1.6.4
+ name: package-enterprise2
+- commands:
+ - ./bin/build upload-cdn --edition enterprise2
+ depends_on:
+ - package-enterprise2
+ environment:
+ ENTERPRISE2_CDN_PATH:
+ from_secret: enterprise2-cdn-path
+ GCP_KEY:
+ from_secret: gcp_key
+ PRERELEASE_BUCKET:
+ from_secret: prerelease_bucket
+ image: grafana/grafana-ci-deploy:1.3.3
+ name: upload-cdn-assets-enterprise2
+- commands:
+ - ls dist/*.tar.gz*
+ - cp dist/*.tar.gz* packaging/docker/
+ depends_on:
+ - package-enterprise2
+ image: grafana/build-container:1.6.4
+ name: copy-packages-for-docker
+- commands:
+ - ./bin/build build-docker --edition enterprise2 --shouldSave
+ depends_on:
+ - copy-packages-for-docker
+ - compile-build-cmd
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: build-docker-images
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build build-docker --edition enterprise2 --shouldSave --ubuntu
+ depends_on:
+ - copy-packages-for-docker
+ - compile-build-cmd
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: build-docker-images-ubuntu
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build artifacts docker fetch --edition enterprise2
+ depends_on:
+ - build-docker-images
+ - build-docker-images-ubuntu
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ DOCKER_PASSWORD:
+ from_secret: docker_password
+ DOCKER_USER:
+ from_secret: docker_username
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: fetch-images-enterprise2
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build artifacts docker publish-enterprise2 --dockerhub-repo $${DOCKER_ENTERPRISE2_REPO}
+ depends_on:
+ - fetch-images-enterprise2
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ DOCKER_PASSWORD:
+ from_secret: docker_password
+ DOCKER_USER:
+ from_secret: docker_username
+ GCP_KEY:
+ from_secret: gcp_key_hg
+ image: google/cloud-sdk
+ name: publish-images-enterprise2
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build upload-packages --edition enterprise2
+ depends_on:
+ - package-enterprise2
+ environment:
+ GCP_KEY:
+ from_secret: gcp_key
+ PRERELEASE_BUCKET:
+ from_secret: prerelease_bucket
+ image: grafana/grafana-ci-deploy:1.3.3
+ name: upload-packages-enterprise2
+trigger:
+ event:
+ exclude:
+ - promote
+ ref:
+ - refs/tags/v*
+type: docker
+volumes:
+- host:
+ path: /var/run/docker.sock
+ name: docker
+- name: postgres
+ temp:
+ medium: memory
+- name: mysql
+ temp:
+ medium: memory
+---
+clone:
+ disable: true
+depends_on: []
+environment:
+ EDITION: enterprise2
+image_pull_secrets:
+- dockerconfigjson
+kind: pipeline
+name: custom-release-enterprise2-build-e2e-publish
+node:
+ type: no-parallel
+platform:
+ arch: amd64
+ os: linux
+services: []
+steps:
+- commands:
+ - mkdir -p bin
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.17/grabpl
+ - chmod +x bin/grabpl
+ image: byrnedo/alpine-curl:0.1.8
+ name: grabpl
+- commands:
+ - echo $DRONE_RUNNER_NAME
+ image: alpine:3.15.6
+ name: identify-runner
+- commands:
+ - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git"
+ - cd grafana-enterprise
+ - git checkout ${DRONE_TAG}
+ environment:
+ GITHUB_TOKEN:
+ from_secret: github_token
+ image: grafana/build-container:1.6.4
+ name: clone-enterprise
+- commands:
+ - mv bin/grabpl /tmp/
+ - rmdir bin
+ - mv grafana-enterprise /tmp/
+ - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise
+ ${DRONE_TAG}
+ - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json
+ - mkdir bin
+ - mv /tmp/grabpl bin/
+ depends_on:
+ - clone-enterprise
+ environment:
+ GITHUB_TOKEN:
+ from_secret: github_token
+ image: grafana/build-container:1.6.4
+ name: init-enterprise
+- commands:
+ - go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
+ depends_on:
+ - init-enterprise
+ environment:
+ CGO_ENABLED: 0
+ image: golang:1.19.3
+ name: compile-build-cmd
+- commands:
+ - make gen-go
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: wire-install
+- commands:
+ - yarn install --immutable
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: yarn-install
+- commands:
+ - '# It is required that code generated from Thema/CUE be committed and in sync
+ with its inputs.'
+ - '# The following command will fail if running code generators produces any diff
+ in output.'
+ - CODEGEN_VERIFY=1 make gen-cue
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: verify-gen-cue
+- commands:
+ - ./bin/build build-frontend --jobs 8 --edition enterprise ${DRONE_TAG}
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ NODE_OPTIONS: --max_old_space_size=8192
+ image: grafana/build-container:1.6.4
+ name: build-frontend
+- commands:
+ - ./bin/build build-frontend-packages --jobs 8 --edition enterprise ${DRONE_TAG}
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ NODE_OPTIONS: --max_old_space_size=8192
+ image: grafana/build-container:1.6.4
+ name: build-frontend-packages
+- commands:
+ - ./bin/build build-plugins --jobs 8 --edition enterprise
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ GRAFANA_API_KEY:
+ from_secret: grafana_api_key
+ image: grafana/build-container:1.6.4
+ name: build-plugins
+- commands:
+ - ./bin/build build-backend --jobs 8 --edition enterprise2 ${DRONE_TAG}
+ depends_on:
+ - wire-install
+ - compile-build-cmd
+ image: grafana/build-container:1.6.4
+ name: build-backend-enterprise2
+- commands:
+ - ./bin/build package --jobs 8 --edition enterprise2 --sign ${DRONE_TAG}
+ depends_on:
+ - build-plugins
+ - build-backend-enterprise2
+ - build-frontend
+ - build-frontend-packages
+ environment:
+ GPG_KEY_PASSWORD:
+ from_secret: gpg_key_password
+ GPG_PRIV_KEY:
+ from_secret: gpg_priv_key
+ GPG_PUB_KEY:
+ from_secret: gpg_pub_key
+ GRAFANA_API_KEY:
+ from_secret: grafana_api_key
+ image: grafana/build-container:1.6.4
+ name: package-enterprise2
+- commands:
+ - ./bin/build upload-cdn --edition enterprise2
+ depends_on:
+ - package-enterprise2
+ environment:
+ ENTERPRISE2_CDN_PATH:
+ from_secret: enterprise2-cdn-path
+ GCP_KEY:
+ from_secret: gcp_key
+ PRERELEASE_BUCKET:
+ from_secret: prerelease_bucket
+ image: grafana/grafana-ci-deploy:1.3.3
+ name: upload-cdn-assets-enterprise2
+- commands:
+ - ls dist/*.tar.gz*
+ - cp dist/*.tar.gz* packaging/docker/
+ depends_on:
+ - package-enterprise2
+ image: grafana/build-container:1.6.4
+ name: copy-packages-for-docker
+- commands:
+ - ./bin/build build-docker --edition enterprise2 --shouldSave
+ depends_on:
+ - copy-packages-for-docker
+ - compile-build-cmd
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: build-docker-images
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build build-docker --edition enterprise2 --shouldSave --ubuntu
+ depends_on:
+ - copy-packages-for-docker
+ - compile-build-cmd
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: build-docker-images-ubuntu
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build artifacts docker fetch --edition enterprise2
+ depends_on:
+ - build-docker-images
+ - build-docker-images-ubuntu
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ DOCKER_PASSWORD:
+ from_secret: docker_password
+ DOCKER_USER:
+ from_secret: docker_username
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: fetch-images-enterprise2
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build artifacts docker publish-enterprise2 --dockerhub-repo $${DOCKER_ENTERPRISE2_REPO}
+ depends_on:
+ - fetch-images-enterprise2
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ DOCKER_PASSWORD:
+ from_secret: docker_password
+ DOCKER_USER:
+ from_secret: docker_username
+ GCP_KEY:
+ from_secret: gcp_key_hg
+ image: google/cloud-sdk
+ name: publish-images-enterprise2
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build upload-packages --edition enterprise2
+ depends_on:
+ - package-enterprise2
+ environment:
+ GCP_KEY:
+ from_secret: gcp_key
+ PRERELEASE_BUCKET:
+ from_secret: prerelease_bucket
+ image: grafana/grafana-ci-deploy:1.3.3
+ name: upload-packages-enterprise2
+trigger:
+ event:
+ - custom
+type: docker
+volumes:
+- host:
+ path: /var/run/docker.sock
+ name: docker
+- name: postgres
+ temp:
+ medium: memory
+- name: mysql
+ temp:
+ medium: memory
+---
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3353,6 +3875,8 @@ steps:
depends_on:
- compile-build-cmd
environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
DOCKER_PASSWORD:
from_secret: docker_password
DOCKER_USER:
@@ -3377,13 +3901,13 @@ steps:
GCP_KEY:
from_secret: gcp_key
image: google/cloud-sdk
- name: publish-images-grafana/grafana
+ name: publish-images-grafana
volumes:
- name: docker
path: /var/run/docker.sock
- commands:
- - ./bin/grabpl artifacts docker publish --dockerhub-repo grafana/grafana-oss --version-tag
- ${DRONE_TAG}
+ - ./bin/grabpl artifacts docker publish --dockerhub-repo grafana/grafana/grafana-oss
+ --version-tag ${DRONE_TAG}
depends_on:
- fetch-images-oss
environment:
@@ -3412,6 +3936,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: enterprise
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3441,6 +3967,8 @@ steps:
depends_on:
- compile-build-cmd
environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
DOCKER_PASSWORD:
from_secret: docker_password
DOCKER_USER:
@@ -3465,7 +3993,7 @@ steps:
GCP_KEY:
from_secret: gcp_key
image: google/cloud-sdk
- name: publish-images-grafana/grafana-enterprise
+ name: publish-images-grafana-enterprise
volumes:
- name: docker
path: /var/run/docker.sock
@@ -3483,6 +4011,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: enterprise
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3512,6 +4042,8 @@ steps:
depends_on:
- compile-build-cmd
environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
DOCKER_PASSWORD:
from_secret: docker_password
DOCKER_USER:
@@ -3536,7 +4068,7 @@ steps:
GCP_KEY:
from_secret: gcp_key
image: google/cloud-sdk
- name: publish-images-grafana/grafana-enterprise
+ name: publish-images-grafana-enterprise
volumes:
- name: docker
path: /var/run/docker.sock
@@ -3554,6 +4086,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: all
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3596,6 +4130,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: all
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3638,6 +4174,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: all
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3699,6 +4237,8 @@ depends_on:
- publish-artifacts-public
- publish-docker-oss-public
- publish-docker-enterprise-public
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3794,6 +4334,8 @@ depends_on:
- publish-artifacts-public
- publish-docker-oss-public
- publish-docker-enterprise-public
+environment:
+ EDITION: enterprise
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -3886,6 +4428,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: all
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -4156,7 +4700,7 @@ steps:
include:
- packages/grafana-ui/**
- commands:
- - ./bin/grabpl upload-cdn --edition oss
+ - ./bin/build upload-cdn --edition oss
depends_on:
- grafana-server
environment:
@@ -4170,7 +4714,7 @@ steps:
repo:
- grafana/grafana
- commands:
- - ./bin/grabpl upload-packages --edition oss
+ - ./bin/build upload-packages --edition oss
depends_on:
- end-to-end-tests-dashboards-suite
- end-to-end-tests-panels-suite
@@ -4204,6 +4748,8 @@ volumes:
clone:
retries: 3
depends_on: []
+environment:
+ EDITION: oss
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -4637,7 +5183,6 @@ steps:
- build-backend
- build-frontend
- build-frontend-packages
- - build-backend-enterprise2
environment:
GPG_KEY_PASSWORD:
from_secret: gpg_key_password
@@ -4764,7 +5309,7 @@ steps:
- success
- failure
- commands:
- - ./bin/grabpl upload-cdn --edition enterprise
+ - ./bin/build upload-cdn --edition enterprise
depends_on:
- package
environment:
@@ -4778,7 +5323,7 @@ steps:
repo:
- grafana/grafana
- commands:
- - ./bin/grabpl upload-packages --edition enterprise
+ - ./bin/build upload-packages --edition enterprise
depends_on:
- package
environment:
@@ -4796,10 +5341,9 @@ steps:
--variants linux-amd64 --sign
depends_on:
- build-plugins
- - build-backend
+ - build-backend-enterprise2
- build-frontend
- build-frontend-packages
- - build-backend-enterprise2
environment:
GPG_KEY_PASSWORD:
from_secret: gpg_key_password
@@ -4812,7 +5356,7 @@ steps:
image: grafana/build-container:1.6.4
name: package-enterprise2
- commands:
- - ./bin/grabpl upload-cdn --edition enterprise2
+ - ./bin/build upload-cdn --edition enterprise2
depends_on:
- package-enterprise2
environment:
@@ -4823,7 +5367,7 @@ steps:
image: grafana/grafana-ci-deploy:1.3.3
name: upload-cdn-assets-enterprise2
- commands:
- - ./bin/grabpl upload-packages --edition enterprise2
+ - ./bin/build upload-packages --edition enterprise2
depends_on:
- package-enterprise2
environment:
@@ -4851,6 +5395,8 @@ volumes:
clone:
disable: true
depends_on: []
+environment:
+ EDITION: enterprise
image_pull_secrets:
- dockerconfigjson
kind: pipeline
@@ -5274,6 +5820,254 @@ volumes:
path: /var/run/docker.sock
name: docker
---
+clone:
+ disable: true
+depends_on: []
+environment:
+ EDITION: enterprise2
+image_pull_secrets:
+- dockerconfigjson
+kind: pipeline
+name: release-branch-enterprise2-build-e2e-publish
+node:
+ type: no-parallel
+platform:
+ arch: amd64
+ os: linux
+services: []
+steps:
+- commands:
+ - mkdir -p bin
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.17/grabpl
+ - chmod +x bin/grabpl
+ image: byrnedo/alpine-curl:0.1.8
+ name: grabpl
+- commands:
+ - echo $DRONE_RUNNER_NAME
+ image: alpine:3.15.6
+ name: identify-runner
+- commands:
+ - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git"
+ - cd grafana-enterprise
+ - git checkout ${DRONE_BRANCH}
+ environment:
+ GITHUB_TOKEN:
+ from_secret: github_token
+ image: grafana/build-container:1.6.4
+ name: clone-enterprise
+- commands:
+ - mv bin/grabpl /tmp/
+ - rmdir bin
+ - mv grafana-enterprise /tmp/
+ - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise
+ - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json
+ - mkdir bin
+ - mv /tmp/grabpl bin/
+ depends_on:
+ - clone-enterprise
+ environment:
+ GITHUB_TOKEN:
+ from_secret: github_token
+ image: grafana/build-container:1.6.4
+ name: init-enterprise
+- commands:
+ - go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
+ depends_on:
+ - init-enterprise
+ environment:
+ CGO_ENABLED: 0
+ image: golang:1.19.3
+ name: compile-build-cmd
+- commands:
+ - make gen-go
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: wire-install
+- commands:
+ - yarn install --immutable
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: yarn-install
+- commands:
+ - '# It is required that code generated from Thema/CUE be committed and in sync
+ with its inputs.'
+ - '# The following command will fail if running code generators produces any diff
+ in output.'
+ - CODEGEN_VERIFY=1 make gen-cue
+ depends_on:
+ - init-enterprise
+ image: grafana/build-container:1.6.4
+ name: verify-gen-cue
+- commands:
+ - ./bin/build build-frontend --jobs 8 --edition enterprise --build-id ${DRONE_BUILD_NUMBER}
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ NODE_OPTIONS: --max_old_space_size=8192
+ image: grafana/build-container:1.6.4
+ name: build-frontend
+- commands:
+ - ./bin/build build-frontend-packages --jobs 8 --edition enterprise --build-id ${DRONE_BUILD_NUMBER}
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ NODE_OPTIONS: --max_old_space_size=8192
+ image: grafana/build-container:1.6.4
+ name: build-frontend-packages
+- commands:
+ - ./bin/build build-plugins --jobs 8 --edition enterprise
+ depends_on:
+ - compile-build-cmd
+ - yarn-install
+ environment:
+ GRAFANA_API_KEY:
+ from_secret: grafana_api_key
+ image: grafana/build-container:1.6.4
+ name: build-plugins
+- commands:
+ - ./bin/build build-backend --jobs 8 --edition enterprise2 --build-id ${DRONE_BUILD_NUMBER}
+ --variants linux-amd64
+ depends_on:
+ - wire-install
+ - compile-build-cmd
+ image: grafana/build-container:1.6.4
+ name: build-backend-enterprise2
+- commands:
+ - ./bin/build package --jobs 8 --edition enterprise2 --build-id ${DRONE_BUILD_NUMBER}
+ --variants linux-amd64 --sign
+ depends_on:
+ - build-plugins
+ - build-backend-enterprise2
+ - build-frontend
+ - build-frontend-packages
+ environment:
+ GPG_KEY_PASSWORD:
+ from_secret: gpg_key_password
+ GPG_PRIV_KEY:
+ from_secret: gpg_priv_key
+ GPG_PUB_KEY:
+ from_secret: gpg_pub_key
+ GRAFANA_API_KEY:
+ from_secret: grafana_api_key
+ image: grafana/build-container:1.6.4
+ name: package-enterprise2
+- commands:
+ - ./bin/build upload-cdn --edition enterprise2
+ depends_on:
+ - package-enterprise2
+ environment:
+ ENTERPRISE2_CDN_PATH:
+ from_secret: enterprise2-cdn-path
+ GCP_KEY:
+ from_secret: gcp_key
+ PRERELEASE_BUCKET:
+ from_secret: prerelease_bucket
+ image: grafana/grafana-ci-deploy:1.3.3
+ name: upload-cdn-assets-enterprise2
+- commands:
+ - ls dist/*.tar.gz*
+ - cp dist/*.tar.gz* packaging/docker/
+ depends_on:
+ - package-enterprise2
+ image: grafana/build-container:1.6.4
+ name: copy-packages-for-docker
+- commands:
+ - ./bin/build build-docker --edition enterprise2 --shouldSave
+ depends_on:
+ - copy-packages-for-docker
+ - compile-build-cmd
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: build-docker-images
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build build-docker --edition enterprise2 --shouldSave --ubuntu
+ depends_on:
+ - copy-packages-for-docker
+ - compile-build-cmd
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: build-docker-images-ubuntu
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build artifacts docker fetch --edition enterprise2
+ depends_on:
+ - build-docker-images
+ - build-docker-images-ubuntu
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ DOCKER_PASSWORD:
+ from_secret: docker_password
+ DOCKER_USER:
+ from_secret: docker_username
+ GCP_KEY:
+ from_secret: gcp_key
+ image: google/cloud-sdk
+ name: fetch-images-enterprise2
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build artifacts docker publish-enterprise2 --dockerhub-repo $${DOCKER_ENTERPRISE2_REPO}
+ depends_on:
+ - fetch-images-enterprise2
+ environment:
+ DOCKER_ENTERPRISE2_REPO:
+ from_secret: docker_enterprise2_repo
+ DOCKER_PASSWORD:
+ from_secret: docker_password
+ DOCKER_USER:
+ from_secret: docker_username
+ GCP_KEY:
+ from_secret: gcp_key_hg
+ image: google/cloud-sdk
+ name: publish-images-enterprise2
+ volumes:
+ - name: docker
+ path: /var/run/docker.sock
+- commands:
+ - ./bin/build upload-packages --edition enterprise2
+ depends_on:
+ - package-enterprise2
+ environment:
+ GCP_KEY:
+ from_secret: gcp_key
+ PRERELEASE_BUCKET:
+ from_secret: prerelease_bucket
+ image: grafana/grafana-ci-deploy:1.3.3
+ name: upload-packages-enterprise2
+trigger:
+ ref:
+ - refs/heads/v[0-9]*
+type: docker
+volumes:
+- host:
+ path: /var/run/docker.sock
+ name: docker
+- name: postgres
+ temp:
+ medium: memory
+- name: mysql
+ temp:
+ medium: memory
+---
clone:
retries: 3
kind: pipeline
@@ -5512,6 +6306,6 @@ kind: secret
name: packages_secret_access_key
---
kind: signature
-hmac: 77ae647c9addfcd9966d462ca9967b85a87e18adfe0e9e0a2c6b1cf5d7f42493
+hmac: e7746a4b35fba9e1a7cb3096b947a874786b082f41e4252448ac6acde7ee3ccf
...
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 92dfa9ee7c5..b7b617c6eac 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -114,6 +114,8 @@ go.sum @grafana/backend-platform
/contribute/architecture/backend @grafana/backend-platform
/contribute/engineering/backend @grafana/backend-platform
+package.json @grafana/frontend-ops
+tsconfig.json @grafana/frontend-ops
/crowdin.yml @grafana/user-essentials
/public/locales @grafana/user-essentials
/public/app/core/internationalization @grafana/user-essentials
@@ -167,8 +169,6 @@ go.sum @grafana/backend-platform
/scripts/grunt @grafana/frontend-ops
/scripts/webpack @grafana/frontend-ops
/scripts/generate-a11y-report.sh @grafana/user-essentials
-package.json @grafana/frontend-ops
-tsconfig.json @grafana/frontend-ops
lerna.json @grafana/frontend-ops
.babelrc @grafana/frontend-ops
.prettierrc.js @grafana/frontend-ops
@@ -205,6 +205,7 @@ lerna.json @grafana/frontend-ops
/grafana-mixin/ @grafana/hosted-grafana-team
# Grafana authentication and authorization
+/pkg/login @grafana/grafana-authnz-team
/pkg/services/accesscontrol @grafana/grafana-authnz-team
/pkg/services/auth @grafana/grafana-authnz-team
/pkg/services/dashboards/accesscontrol.go @grafana/grafana-authnz-team
@@ -217,6 +218,7 @@ lerna.json @grafana/frontend-ops
/pkg/services/oauthtoken @grafana/grafana-authnz-team
/pkg/services/teamguardian @grafana/grafana-authnz-team
/pkg/services/serviceaccounts @grafana/grafana-authnz-team
+/pkg/services/loginattempt @grafana/grafana-authnz-team
# Grafana Partnerships Team
/pkg/infra/httpclient/httpclientprovider/sigv4_middleware.go @grafana/grafana-partnerships-team
diff --git a/.gitignore b/.gitignore
index c7f6ce8ec9e..a4c02bfa4ca 100644
--- a/.gitignore
+++ b/.gitignore
@@ -105,6 +105,7 @@ debug.test
/packaging/**/*.tar.gz
/packaging/**/*.tar.gz.sha256
pkg/cmd/grafana-server/__debug_bin
+pkg/services/quota/quotaimpl/storage/storage.json
# Ignore OSX indexing
.DS_Store
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 22f7c49d9a9..a6b91b2f521 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -6,10 +6,10 @@
"type": "go",
"request": "launch",
"mode": "auto",
- "program": "${workspaceFolder}/pkg/cmd/grafana-server/",
+ "program": "${workspaceFolder}/pkg/cmd/grafana/",
"env": {},
"cwd": "${workspaceFolder}",
- "args": ["--homepath", "${workspaceFolder}", "--packaging", "dev"]
+ "args": ["server", "--homepath", "${workspaceFolder}", "--packaging", "dev"]
},
{
"name": "Attach to Chrome",
diff --git a/.yarn/cache/rst2html-https-e87da7ea2f-63d5ff3068.zip b/.yarn/cache/rst2html-https-e87da7ea2f-63d5ff3068.zip
new file mode 100644
index 00000000000..245557fb351
Binary files /dev/null and b/.yarn/cache/rst2html-https-e87da7ea2f-63d5ff3068.zip differ
diff --git a/.yarn/cache/tether-drop-https-3382d2649f-a10a7337d5.zip b/.yarn/cache/tether-drop-https-3382d2649f-a10a7337d5.zip
new file mode 100644
index 00000000000..1602b2e6742
Binary files /dev/null and b/.yarn/cache/tether-drop-https-3382d2649f-a10a7337d5.zip differ
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c1efe236831..f8ed5a9e9dd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -167,6 +167,24 @@ The following functions and classes related to logs are deprecated in the `grafa
- **Toolkit:** Deprecate `component:create` command. [#56086](https://github.com/grafana/grafana/pull/56086), [@academo](https://github.com/academo)
- **Toolkit:** Remove changelog command. [#56073](https://github.com/grafana/grafana/pull/56073), [@gitstart](https://github.com/gitstart)
+
+
+# 9.2.6 (2022-11-22)
+
+### Features and enhancements
+
+- **Alerting:** Support Prometheus durations in Provisioning API. [#58293](https://github.com/grafana/grafana/pull/58293), [@bartpeeters](https://github.com/bartpeeters)
+- **SSE:** Keep value name from numeric table. [#58831](https://github.com/grafana/grafana/pull/58831), [@kylebrandt](https://github.com/kylebrandt)
+- **Transformations:** Make Card Descriptions Clickable. [#58717](https://github.com/grafana/grafana/pull/58717), [@zuchka](https://github.com/zuchka)
+
+### Bug fixes
+
+- **MS/My/PostgresSQL:** Migrate annotation query. [#58847](https://github.com/grafana/grafana/pull/58847), [@zoltanbedi](https://github.com/zoltanbedi)
+- **Search:** Fixes issue with Recent/Starred section always displaying "General" folder. [#58746](https://github.com/grafana/grafana/pull/58746), [@JoaoSilvaGrafana](https://github.com/JoaoSilvaGrafana)
+- **Server:** Write internal server error on missing write. [#57813](https://github.com/grafana/grafana/pull/57813), [@sakjur](https://github.com/sakjur)
+
+
+
# 9.2.5 (2022-11-16)
diff --git a/Dockerfile b/Dockerfile
index 1032ba60ae7..966aebfa347 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -82,7 +82,7 @@ RUN export GF_GID_NAME=$(getent group $GF_GID | cut -d':' -f1) && \
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-builder /grafana/bin/*/grafana-server /grafana/bin/*/grafana-cli ./bin/
+COPY --from=go-builder /grafana/bin/*/grafana-server /grafana/bin/*/grafana-cli /grafana/bin/*/grafana ./bin/
COPY --from=js-builder /grafana/public ./public
COPY --from=js-builder /grafana/tools ./tools
diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu
index 077d97a0c99..a6b62ea1e25 100644
--- a/Dockerfile.ubuntu
+++ b/Dockerfile.ubuntu
@@ -77,7 +77,7 @@ RUN mkdir -p "$GF_PATHS_HOME/.aws" && \
chown -R grafana:grafana "$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-builder /src/grafana/bin/*/grafana-server /src/grafana/bin/*/grafana-cli bin/
+COPY --from=go-builder /src/grafana/bin/*/grafana-server /src/grafana/bin/*/grafana-cli /grafana/bin/*/grafana bin/
COPY --from=js-builder /usr/src/app/public public
COPY --from=js-builder /usr/src/app/tools tools
diff --git a/Makefile b/Makefile
index 03a2c40b48b..18c873b8ad2 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ WIRE_TAGS = "oss"
-include local/Makefile
include .bingo/Variables.mk
-.PHONY: all deps-go deps-js deps build-go build-server build-cli build-js build build-docker-full build-docker-full-ubuntu lint-go golangci-lint test-go test-js gen-ts test run run-frontend clean devenv devenv-down protobuf drone help gen-go gen-cue
+.PHONY: all deps-go deps-js deps build-go build-backend build-server build-cli build-js build build-docker-full build-docker-full-ubuntu lint-go golangci-lint test-go test-js gen-ts test run run-frontend clean devenv devenv-down protobuf drone help gen-go gen-cue
GO = go
GO_FILES ?= ./pkg/...
@@ -82,6 +82,10 @@ build-go: $(MERGED_SPEC_TARGET) gen-go ## Build all Go binaries.
@echo "build go files"
$(GO) run build.go $(GO_BUILD_FLAGS) build
+build-backend: ## Build Grafana backend.
+ @echo "build backend"
+ $(GO) run build.go $(GO_BUILD_FLAGS) build-backend
+
build-server: ## Build Grafana server.
@echo "build server"
$(GO) run build.go $(GO_BUILD_FLAGS) build-server
diff --git a/SECURITY.md b/SECURITY.md
index b8697c164d6..e5672d2316c 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -14,7 +14,6 @@ Grafana Labs will send you a response indicating the next steps in handling your
## Security announcements
-We maintain a category on the community site called [Security Announcements](https://community.grafana.com/c/support/security-announcements),
-where we will post a summary, remediation, and mitigation details for any patch containing security fixes.
+We will post a summary, remediation, and mitigation details for any patch containing security fixes on the Grafana blog. The security announcement blog posts will be tagged with the [security tag](https://grafana.com/tags/security/).
-You can also subscribe to email updates to this category if you have a grafana.com account and sign on to the community site or track updates via an [RSS feed](https://community.grafana.com/c/support/security-announcements.rss).
+You can also track security announcements via the [RSS feed](https://grafana.com/tags/security/index.xml).
diff --git a/conf/defaults.ini b/conf/defaults.ini
index 023d23a53cb..49c4582a280 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -412,8 +412,8 @@ password_hint = password
# Default UI theme ("dark" or "light")
default_theme = dark
-# Default locale (supported IETF language tag, such as en-US)
-default_locale = en-US
+# Default UI language (supported IETF language tag, such as en-US)
+default_language = en-US
# Path to a custom home page. Users are only redirected to this if the default home dashboard is used. It should match a frontend route and contain a leading slash.
home_page =
@@ -435,6 +435,10 @@ user_invite_max_lifetime_duration = 24h
# Enter a comma-separated list of usernames to hide them in the Grafana UI. These users are shown to Grafana admins and to themselves.
hidden_users =
+[service_accounts]
+# When set, Grafana will not allow the creation of tokens with expiry greater than this setting.
+token_expiration_day_limit =
+
[auth]
# Login cookie name
login_cookie_name = grafana_session
@@ -1268,6 +1272,8 @@ license_path =
# enable = feature1,feature2
enable =
+internationalization = true
+
# feature1 = true
# feature2 = false
diff --git a/conf/sample.ini b/conf/sample.ini
index aacf119127c..7c27b34819b 100644
--- a/conf/sample.ini
+++ b/conf/sample.ini
@@ -412,8 +412,8 @@
# Default UI theme ("dark" or "light")
;default_theme = dark
-# Default locale (supported IETF language tag, such as en-US)
-;default_locale = en-US
+# Default UI language (supported IETF language tag, such as en-US)
+;default_language = en-US
# Path to a custom home page. Users are only redirected to this if the default home dashboard is used. It should match a frontend route and contain a leading slash.
;home_page =
@@ -435,6 +435,11 @@
# Enter a comma-separated list of users login to hide them in the Grafana UI. These users are shown to Grafana admins and themselves.
; hidden_users =
+[service_accounts]
+# Service account maximum expiration date in days.
+# When set, Grafana will not allow the creation of tokens with expiry greater than this setting.
+; token_expiration_day_limit =
+
[auth]
# Login cookie name
;login_cookie_name = grafana_session
diff --git a/contribute/merge-pull-request.md b/contribute/merge-pull-request.md
index 365f77d3661..69e2781fd4b 100644
--- a/contribute/merge-pull-request.md
+++ b/contribute/merge-pull-request.md
@@ -135,6 +135,14 @@ Some examples when backport is not required:
- The change is supposed to be released in the next major/minor release, e.g. v8.0.0, but the release branch, e.g. v8.0.x, has not yet been created.
+#### Required labels
+
+To ensure that we don't backport pull requests that don't need to be backported, i.e. implement new features, and only backport pull requests that address bugs, have a product approval, or refer to docs changes, backport labels need to be followed by either:
+
+- `type/bug` label: Pull requests which address bugs,
+- `product-approved` label: Urgent fixes which need product approval, in order to get merged,
+- `type/docs` label: Docs changes`.
+
> **Note:** You can still backport a pull request after it's been merged.
## Doing the actual merge
diff --git a/devenv/README.md b/devenv/README.md
index 6d6a7065b87..b8cbc39c8e9 100644
--- a/devenv/README.md
+++ b/devenv/README.md
@@ -4,6 +4,7 @@ This folder contains useful scripts and configuration so you can:
- Configure data sources in Grafana for development.
- Configure dashboards for development and test scenarios.
+- Set up an SMTP Server + Web Interface for viewing and testing emails.
- Create docker-compose file with databases and fake data.
## Install Docker
@@ -58,6 +59,21 @@ Jaeger block runs both Jaeger and Loki container. Loki container sends traces to
| 1.0 | graphite1 | 8280 | 2203 | 2203 |
| 0.9 | graphite09 | 8380 | 2303 | 2303 |
+#### MailDev
+
+MailDev block runs an SMTP server and a web UI to test and view emails. This is useful for testing your email notifications locally.
+
+Make sure you configure your .ini file with the following settings:
+
+```ini
+[smtp]
+enabled = true
+skip_verify = true
+host = "localhost:1025"
+```
+
+You can access the web UI at http://localhost:12080/#/
+
## Debugging setup in VS Code
An example of launch.json is provided in `devenv/vscode/launch.json`. It basically does what Makefile and .bra.toml do. The 'program' field is set to the folder name so VS Code loads all *.go files in it instead of just main.go.
diff --git a/devenv/docker/blocks/loki/docker-compose.yaml b/devenv/docker/blocks/loki/docker-compose.yaml
index ce7aeb20abc..b4985f53085 100644
--- a/devenv/docker/blocks/loki/docker-compose.yaml
+++ b/devenv/docker/blocks/loki/docker-compose.yaml
@@ -1,5 +1,8 @@
loki:
image: grafana/loki:latest
+ command: -config.file=/etc/loki/loki-config.yaml
+ volumes:
+ - ./docker/blocks/loki/loki-config.yaml:/etc/loki/loki-config.yaml
ports:
- "3100:3100"
diff --git a/devenv/docker/blocks/loki/loki-config.yaml b/devenv/docker/blocks/loki/loki-config.yaml
new file mode 100644
index 00000000000..9feccdfe545
--- /dev/null
+++ b/devenv/docker/blocks/loki/loki-config.yaml
@@ -0,0 +1,44 @@
+auth_enabled: false
+
+server:
+ http_listen_port: 3100
+ grpc_listen_port: 9096
+
+common:
+ path_prefix: /tmp/loki
+ storage:
+ filesystem:
+ chunks_directory: /tmp/loki/chunks
+ rules_directory: /tmp/loki/rules
+ replication_factor: 1
+ ring:
+ instance_addr: 127.0.0.1
+ kvstore:
+ store: inmemory
+
+schema_config:
+ configs:
+ - from: 2020-10-24
+ store: boltdb-shipper
+ object_store: filesystem
+ schema: v11
+ index:
+ prefix: index_
+ period: 24h
+
+ruler:
+ alertmanager_url: http://localhost:9093
+
+
+# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
+# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/
+#
+# Statistics help us better understand how Loki is used, and they show us performance
+# levels for most users. This helps us prioritize features and documentation.
+# For more information on what's sent, look at
+# https://github.com/grafana/loki/blob/main/pkg/usagestats/stats.go
+# Refer to the buildReport method to see what goes into a report.
+#
+# If you would like to disable reporting, uncomment the following lines:
+#analytics:
+# reporting_enabled: false
diff --git a/docs/sources/administration/data-source-management/index.md b/docs/sources/administration/data-source-management/index.md
index 3f2b5d7521a..42d56c8fda3 100644
--- a/docs/sources/administration/data-source-management/index.md
+++ b/docs/sources/administration/data-source-management/index.md
@@ -27,9 +27,6 @@ Before you can create your first dashboard, you need to add your data source.
**To add a data source:**
1. Select the cog icon on the side menu to show the configuration options.
-
- {{< figure src="/static/img/docs/v75/sidemenu-datasource-7-5.png" max-width="150px" class="docs-image--no-shadow">}}
-
1. Select **Data sources**.
This opens the data sources page, which displays a list of previously configured data sources for the Grafana instance.
@@ -44,9 +41,7 @@ Before you can create your first dashboard, you need to add your data source.
1. Move the cursor over the data source you want to add.
- {{< figure src="/static/img/docs/v75/select-data-source-7-5.png" max-width="700px" class="docs-image--no-shadow">}}
-
-1. Select **Select**.
+1. Click **Select**.
This opens the data source configuration page.
@@ -63,8 +58,6 @@ Each data source's configuration includes a permissions page where you can enabl
### Enable data source permissions
-{{< figure src="/static/img/docs/enterprise/datasource_permissions_enable_still.png" class="docs-image--no-shadow docs-image--right" max-width= "600px" animated-gif="/static/img/docs/enterprise/datasource_permissions_enable.gif" >}}
-
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 they have access to.
@@ -82,8 +75,6 @@ When permissions are enabled for a data source in an organization, the user who
### Allow users and teams to query a data source
-{{< figure src="/static/img/docs/enterprise/datasource_permissions_add_still.png" class="docs-image--no-shadow docs-image--right" max-width= "600px" animated-gif="/static/img/docs/enterprise/datasource_permissions_add.gif" >}}
-
After you have enabled permissions for a data source you can assign query permissions to users and teams which will allow access to query the data source.
**Assign query permission to users and teams:**
@@ -98,8 +89,6 @@ After you have enabled permissions for a data source you can assign query permis
### Disable data source permissions
-{{< figure src="/static/img/docs/enterprise/datasource_permissions_disable_still.png" class="docs-image--no-shadow docs-image--right" max-width= "600px" animated-gif="/static/img/docs/enterprise/datasource_permissions_disable.gif" >}}
-
If you have enabled permissions for a data source and want to return data source permissions to the default, then you can disable permissions with a click of a button.
Note that _all_ existing permissions created for the data source will be deleted.
diff --git a/docs/sources/administration/organization-management/index.md b/docs/sources/administration/organization-management/index.md
index f8e8fa37cad..9e9724bb639 100644
--- a/docs/sources/administration/organization-management/index.md
+++ b/docs/sources/administration/organization-management/index.md
@@ -60,8 +60,6 @@ Complete this task when you want to view a list of existing organizations.
A list of organizations appears.
-
-
## Create an organization
Create an organization when you want to isolate dashboards and other resources from each other.
@@ -117,5 +115,3 @@ Edit an organization when you want to change its name.
1. Hover your cursor over the **Server Admin** (shield) icon until a menu appears, and click **Orgs**.
1. Click the organization you want to edit.
1. Update the organization name and click **Update**.
-
-
diff --git a/docs/sources/administration/plugin-management/index.md b/docs/sources/administration/plugin-management/index.md
index 5bd9ad9df65..f23ca023be1 100644
--- a/docs/sources/administration/plugin-management/index.md
+++ b/docs/sources/administration/plugin-management/index.md
@@ -88,8 +88,6 @@ To browse for available plugins:
1. Click the **All** filter to browse all available plugins.
1. Click the **Data sources**, **Panels**, or **Applications** buttons to filter by plugin type.
-
-
### Install a plugin
To install a plugin:
@@ -101,8 +99,6 @@ To install a plugin:
When the update is complete, you see a confirmation message that the installation was successful.
-
-
### Update a plugin
To update a plugin:
@@ -113,8 +109,6 @@ To update a plugin:
When the update is complete, you see a confirmation message that the update was successful.
-
-
### Uninstall a plugin
To uninstall a plugin:
@@ -125,8 +119,6 @@ To uninstall a plugin:
When the update is complete, you see a confirmation message that the uninstall was successful.
-
-
## Install Grafana plugins
Grafana supports data source, panel, and app plugins. Having panels as plugins makes it easy to create and add any kind of panel, to show your data, or improve your favorite dashboards. Apps enable the bundling of data sources, panels, dashboards, and Grafana pages into a cohesive experience.
diff --git a/docs/sources/administration/roles-and-permissions/access-control/assign-rbac-roles/index.md b/docs/sources/administration/roles-and-permissions/access-control/assign-rbac-roles/index.md
index b3c0120479a..a46b511a8b2 100644
--- a/docs/sources/administration/roles-and-permissions/access-control/assign-rbac-roles/index.md
+++ b/docs/sources/administration/roles-and-permissions/access-control/assign-rbac-roles/index.md
@@ -53,8 +53,6 @@ In both cases, the assignment applies only to the user, team or service account
4. In the **Role** column, select the fixed role that you want to assign to the user, team or service account.
5. Click **Update**.
-
-
**To assign a fixed role as a server administrator:**
1. Sign in to Grafana, hover your cursor over **Server Admin** (the shield icon) in the left navigation menu, and click **Users**.
@@ -62,8 +60,6 @@ In both cases, the assignment applies only to the user, team or service account
1. In the **Organizations** section, select a role within an organization that you want to assign to the user.
1. Click **Update**.
-
-
## Assign fixed or custom roles to a team using provisioning
Instead of using the Grafana role picker, you can use file-based provisioning to assign fixed roles to teams. If you have a large number of teams, provisioning can provide an easier approach to assigning and managing role assignments.
diff --git a/docs/sources/administration/roles-and-permissions/access-control/configure-rbac/index.md b/docs/sources/administration/roles-and-permissions/access-control/configure-rbac/index.md
index 99cbacf35a9..05f9e61cbce 100644
--- a/docs/sources/administration/roles-and-permissions/access-control/configure-rbac/index.md
+++ b/docs/sources/administration/roles-and-permissions/access-control/configure-rbac/index.md
@@ -14,9 +14,10 @@ weight: 30
The table below describes all RBAC configuration options. Like any other Grafana configuration, you can apply these options as [environment variables]({{< relref "../../../../setup-grafana/configure-grafana/#configure-with-environment-variables" >}}).
-| Setting | Required | Description | Default |
-| ------------------ | -------- | ---------------------------------------------------------------------------- | ------- |
-| `permission_cache` | No | Enable to use in memory cache for loading and evaluating users' permissions. | `true` |
+| Setting | Required | Description | Default |
+| ------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
+| `permission_cache` | No | Enable to use in memory cache for loading and evaluating users' permissions. | `true` |
+| `permission_validation_enabled` | No | Grafana enforces validation for permissions when a user creates or updates a role. The system checks the internal list of scopes and actions for each permission to determine they are valid. By default, if a scope or action is not recognized, Grafana logs a warning message. When set to `true`, Grafana returns an error. | `false` |
## Example RBAC configuration
diff --git a/docs/sources/administration/service-accounts/index.md b/docs/sources/administration/service-accounts/index.md
index 7ed85d7a5a1..26f9429f50f 100644
--- a/docs/sources/administration/service-accounts/index.md
+++ b/docs/sources/administration/service-accounts/index.md
@@ -89,6 +89,10 @@ You can create a service account token using the Grafana UI or via the API. For
- Ensure you have permission to create and edit service accounts. By default, the organization administrator role is required to create and edit service accounts. For more information about user permissions, refer to [About users and permissions]({{< relref "../roles-and-permissions/#" >}}).
+### Service account token expiration dates
+
+By default, service account tokens don't have an expiration date, meaning they won't expire at all. However, if `token_expiration_day_limit` is set to a value greater than 0, Grafana restricts the lifetime limit of new tokens to the configured value in days.
+
### To add a token to a service account
1. Sign in to Grafana, then hover your cursor over **Configuration** (the gear icon) in the sidebar.
diff --git a/docs/sources/administration/team-management/index.md b/docs/sources/administration/team-management/index.md
index 38c157e622e..3259eac267a 100644
--- a/docs/sources/administration/team-management/index.md
+++ b/docs/sources/administration/team-management/index.md
@@ -62,8 +62,6 @@ To add a team member:
1. Choose if you want to add the user as a team Member or an Admin.
1. Click **Add to team**.
-
-
## Grant team member permissions
Complete this task when you want to add or modify team member permissions.
@@ -76,8 +74,6 @@ To grant team member permissions:
1. In the team member list, find and click the user that you want to change. You can use the search field to filter the list if necessary.
1. Click the **Permission** list, and then click the new user permission level.
-
-
## Remove a team member
You can remove a team member when you no longer want to apply team permissions to the user
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 349cbbb8b2e..a0c2118393d 100644
--- a/docs/sources/administration/user-management/manage-org-users/index.md
+++ b/docs/sources/administration/user-management/manage-org-users/index.md
@@ -33,8 +33,6 @@ You can see a list of users with accounts in your Grafana organization. If neces
1. Sign in to Grafana as an organization administrator.
1. Hover your cursor over the **Configuration** (gear) icon in the side menu and click **Users**.
-
-
> **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.
## Change a user's organization permissions
@@ -96,8 +94,6 @@ When you invite users to join an organization, you assign the **Admin**, **Edito
If the invitee is not already a user, the system adds them.
-.
-
## Manage a pending invitation
Periodically review invitations you have sent so that you can see a list of users that have not yet accepted the invitation or cancel a pending invitation.
@@ -116,14 +112,10 @@ Periodically review invitations you have sent so that you can see a list of user
The **Pending Invites** button appears only when there are unaccepted invitations.
- 
-
To cancel an invitation, click the red **X** next to the invitation.
To copy an invitation link and send it directly to a user, click Copy Invite. You can then paste the invite link into a message.
-
-
## Remove a user from an organization
You can remove a user from an organization when they no longer require access to the dashboard or data sources owned by the organization. No longer requiring access to an organization might occur when the user has left your company or has internally moved to another organization.
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 c75da586f05..47fba204f1f 100644
--- a/docs/sources/administration/user-management/server-user-management/_index.md
+++ b/docs/sources/administration/user-management/server-user-management/_index.md
@@ -38,8 +38,6 @@ You can see a list of users with accounts on your Grafana server. This action mi
1. Sign in to Grafana as a server administrator.
1. Hover your cursor over the **Server Admin** (shield) icon until a menu appears, and click **Users**.
-
-
> **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" >}}).
## View user details
@@ -62,26 +60,18 @@ A user account contains the following sections.
This section contains basic user information, which users can update.
-
-
#### Permissions
This indicates whether the user account has the Grafana administrator flag applied. If the flag is set to **Yes**, then the user is a Grafana server administrator.
-
-
#### Organizations
This section lists the organizations the user belongs to and their assigned role.
-
-
#### Sessions
This section includes recent user sessions and information about the time the user logged in and they system they used. You can force logouts, if necessary.
-
-
## Edit a user account
Edit a user account when you want to modify user login credentials, or delete, disable, or enable a user.
diff --git a/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md b/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md
index 67d9736dc13..21bb21782d5 100644
--- a/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md
+++ b/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md
@@ -15,7 +15,7 @@ weight: 400
# Create a Grafana managed alerting rule
-Grafana allows you to create alerting rules that query one or more data sources, reduce or transform the results and compare them to each other or to fix thresholds. When these are executed, Grafana sends notifications to the contact point. For information on Grafana Alerting, see [About Grafana Alerting]({{< relref "../" >}}) which explains the various components of Grafana Alerting. We also recommend that you familiarize yourself with some of the [fundamental concepts]({{< relref "../fundamentals/" >}}) of Grafana Alerting.
+Grafana allows you to create alerting rules that query one or more data sources, reduce or transform the results and compare them to each other or to fixed thresholds. When these are executed, Grafana sends notifications to the contact point. For information on Grafana Alerting, see [About Grafana Alerting]({{< relref "../" >}}) which explains the various components of Grafana Alerting. We also recommend that you familiarize yourself with some of the [fundamental concepts]({{< relref "../fundamentals/" >}}) of Grafana Alerting.
Watch this video to learn more about creating alerts: {{< vimeo 720001934 >}}
@@ -23,26 +23,28 @@ Watch this video to learn more about creating alerts: {{< vimeo 720001934 >}}
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
1. Click **New alert rule**. The new alerting rule page opens where the Grafana managed alerts option is selected by default.
-1. In Step 1, add queries and expressions to evaluate, and then select the alert condition.
+1. In Step 1, add the rule name.
+ - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
+1. In Step 2, add queries and expressions to evaluate, and then select the alert condition.
- For queries, select a data source from the drop-down.
- Add one or more [queries]({{< relref "../../panels-visualizations/query-transform-data/#add-a-query/" >}}) or [expressions]({{< relref "../../panels-visualizations/query-transform-data/expression-queries/" >}}).
- For each expression, select either **Classic condition** to create a single alert rule, or choose from **Math**, **Reduce**, **Resample** options to generate separate alert for each series. For details on these options, see [Single and multi dimensional rule](#single-and-multi-dimensional-rule).
- Click **Run queries** to verify that the query is successful.
- Next, select the query or expression for your alert condition.
-1. In Step 2, specify the alert evaluation interval.
+1. In Step 3, specify the alert evaluation interval.
- From the **Condition** drop-down, select the query or expression to trigger the alert rule.
- For **Evaluate every**, specify the frequency of evaluation. Must be a multiple of 10 seconds. For examples, `1m`, `30s`.
- For **Evaluate for**, specify the duration for which the condition must be true before an alert fires.
> **Note:** Once a condition is breached, the alert goes into the Pending state. If the condition remains breached for the duration specified, the alert transitions to the `Firing` state, otherwise it reverts back to the `Normal` state.
- In **Configure no data and error handling**, configure alerting behavior in the absence of data. Use the guidelines in [No data and error handling](#no-data-and-error-handling).
- Click **Preview alerts** to check the result of running the query at this moment. Preview excludes no data and error handling.
-1. In Step 3, add the rule name, storage location, rule group, as well as additional metadata associated with the rule.
- - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
+1. In Step 4, add the storage location, rule group, as well as additional metadata associated with the rule.
- From the **Folder** drop-down, select the folder where you want to store the rule.
- For **Group**, specify a pre-defined group. Newly created rules are appended to the end of the group. Rules within a group are run sequentially at a regular interval, with the same evaluation time.
- Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "../fundamentals/annotation-label/" >}}).
- Add Runbook URL, panel, dashboard, and alert IDs.
- - Add custom labels.
+1. In Step 5, add custom labels.
+ - Add custom labels selecting existing key-value pairs from the drop down, or add new labels by entering the new key or value .
1. Click **Save** to save the rule or **Save and exit** to save the rule and go back to the Alerting page.
1. Next, create a for the rule.
diff --git a/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-recording-rule.md b/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-recording-rule.md
index 43a6fe19584..9e07626fc4c 100644
--- a/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-recording-rule.md
+++ b/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-recording-rule.md
@@ -37,11 +37,12 @@ To create a Grafana Mimir or Loki managed recording rule
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
1. Click **New alert rule**. The new alerting rule page opens where the **Grafana managed alert** option is selected by default.
-1. In Step 1, select **Mimir or Loki recording rule** option.
+1. In Step 1, add the rule name.
+ - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
+1. In Step 2, select **Mimir or Loki recording rule** option.
- Select your Loki or Prometheus data source, add the query to evaluate, and then select the alert condition.
- Enter a PromQL or LogQL expression. The rule fires if the evaluation result has at least one series with a value that is greater than 0. An alert is created for each series.
-1. In Step 2, add the rule name, namespace, rule group, as well as additional metadata associated with the rule.
- - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
+1. In Step 3, add the namespace, rule group, as well as additional metadata associated with the rule.
- From the **Namespace** drop-down, select an existing rule namespace. Otherwise, click Add new and enter a name to create a new one. Namespaces can contain one or more rule groups and only have an organizational purpose. For more information, see [Grafana Mimir or Loki rule groups and namespaces]({{< relref "edit-mimir-loki-namespace-group/" >}}).
- From the **Group** drop-down, select an existing group within the selected namespace. Otherwise, click **Add new** and enter a name to create a new one. Newly created rules are appended to the end of the group. Rules within a group are run sequentially at a regular interval, with the same evaluation time.
- Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "../fundamentals/annotation-label/" >}}).
@@ -52,18 +53,20 @@ To create a Grafana Mimir or Loki managed recording rule
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
1. Click **New alert rule**.
-1. In Step 1, add the rule name, type, and storage location.
+1. In Step 1, add the rule name.
- In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
+1. In Step 2, add the type, and storage location.
- From the **Rule type** drop-down, select **Mimir / Loki managed alert**.
- From the **Select data source** drop-down, select an external Prometheus, an external Loki, or a Grafana Cloud data source.
- From the **Namespace** drop-down, select an existing rule namespace. Otherwise, click **Add new** and enter a name to create a new one. Namespaces can contain one or more rule groups and only have an organizational purpose.
- From the **Group** drop-down, select an existing group within the selected namespace. Otherwise, click **Add new** and enter a name to create a new one. Newly created rules are appended to the end of the group. Rules within a group are run sequentially at a regular interval, with the same evaluation time.
{{< figure src="/static/img/docs/alerting/unified/rule-edit-mimir-alert-type-8-0.png" max-width="550px" caption="Alert details" >}}
-1. In Step 2, add the query to evaluate.
+1. In Step 3, add the query to evaluate.
- Enter a PromQL or LogQL expression. The rule fires if the evaluation result has at least one series with a value that is greater than 0. An alert is created for each series.
{{< figure src="/static/img/docs/alerting/unified/rule-edit-mimir-query-8-0.png" max-width="550px" caption="Alert details" >}}
-1. In Step 3, add additional metadata associated with the rule.
+1. In Step 4, add additional metadata associated with the rule.
- Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "../fundamentals/annotation-label/" >}}).
- Add Runbook URL, panel, dashboard, and alert IDs.
- - Add custom labels.
+1. In Step 5, add custom labels.
+ - Add custom labels selecting existing key-value pairs from the drop down, or add new labels by entering the new key or value .
1. Click **Save** to save the rule or **Save and exit** to save the rule and go back to the Alerting page.
diff --git a/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-rule.md b/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-rule.md
index 379c0df080d..89b7def3c5d 100644
--- a/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-rule.md
+++ b/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-rule.md
@@ -37,18 +37,20 @@ Watch this video to learn more about how to create a Mimir managed alert rule: {
1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts.
1. Click **New alert rule**. The new alerting rule page opens where the Grafana managed alerts option is selected by default.
-1. In Step 1, select **Mimir or Loki alert** option.
+1. In Step 1, add the rule name.
+ - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
+1. In Step 2, select **Mimir or Loki alert** option.
- Next, select your Loki or Prometheus data source and add the query to evaluate.
- Enter a PromQL or LogQL expression to query. The rule fires if the evaluation result has at least one series with a value that is greater than 0. An alert is created for each series.
-1. In Step 2, specify the alert evaluation interval.
+1. In Step 3, specify the alert evaluation interval.
- In the **For** text box, specify the duration for which the condition must be true before an alert fires. If you specify `5m`, the condition must be true for 5 minutes before the alert fires.
> **Note:** Once a condition is met, the alert goes into the `Pending` state. If the condition remains active for the duration specified, the alert transitions to the `Firing` state, else it reverts to the `Normal` state.
-1. In Step 3, add the rule name, namespace, rule group, as well as additional metadata associated with the rule.
- - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule.
+1. In Step 4, add the namespace, rule group, as well as additional metadata associated with the rule.
- From the **Namespace** drop-down, select an existing rule namespace. Otherwise, click **Add new** and enter a name to create a new one. Namespaces can contain one or more rule groups and only have an organizational purpose. For more information, see [Grafana Mimir or Loki rule groups and namespaces]({{< relref "edit-mimir-loki-namespace-group/" >}}).
- From the **Group** drop-down, select an existing group within the selected namespace. Otherwise, click **Add new** and enter a name to create a new one. Newly created rules are appended to the end of the group. Rules within a group are run sequentially at a regular interval, with the same evaluation time.
- Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "../fundamentals/annotation-label/" >}}).
- Add Runbook URL, panel, dashboard, and alert IDs.
- - Add custom labels.
+1. In Step 5, add custom labels.
+ - Add custom labels selecting existing key-value pairs from the drop down, or add new labels by entering the new key or value .
1. Click **Save** to save the rule or **Save and exit** to save the rule and go back to the Alerting page.
1. Next, create a notification for the rule.
diff --git a/docs/sources/alerting/manage-notifications/images-in-notifications.md b/docs/sources/alerting/manage-notifications/images-in-notifications.md
index e2dc58e7778..5db84b342fb 100644
--- a/docs/sources/alerting/manage-notifications/images-in-notifications.md
+++ b/docs/sources/alerting/manage-notifications/images-in-notifications.md
@@ -54,7 +54,7 @@ If Grafana has been set up to use an external image store, `upload_external_imag
# will be persisted to disk for up to temp_data_lifetime.
upload_external_image_storage = false
-Restart Grafana for the changes to take affect.
+Restart Grafana for the changes to take effect.
## Supported notifiers
@@ -88,8 +88,8 @@ Include images from URL refers to using the external image store.
Grafana provides the following metrics to observe the performance and failure rate of images in notifications.
For example, if a screenshot could not be taken within the expected time (10 seconds) then the counter `grafana_screenshot_failures_total` is updated.
-- `grafana_screenshot_cache_hits_total`
-- `grafana_screenshot_cache_misses_total`
+- `grafana_alerting_image_cache_hits_total`
+- `grafana_alerting_image_cache_misses_total`
- `grafana_screenshot_duration_seconds`
- `grafana_screenshot_failures_total`
- `grafana_screenshot_successes_total`
@@ -101,3 +101,14 @@ For example, if a screenshot could not be taken within the expected time (10 sec
- Images in notifications are not available for Grafana Mimir and Loki managed alert rules, or when Grafana is set up to send alert notifications to an external Alertmanager.
- When alerts generated by different alert rules are sent in a single notification, there may be screenshots for each alert rule. This happens if an alert group contains multiple alerting rules. The order the images are attached is random. If you need to guarantee the ordering of images, make sure that your alert groups contain a single alerting rule.
- Some contact points only handle a single image. In this case, the first image associated with an alert will be attached. Because the ordering is random, this may not always be an image for the same alert rule. If you need to guarantee you receive a screenshot for a particular rule, make sure that your alert groups contain a single alerting rule.
+
+## Troubleshooting
+
+If Grafana has been set up to send images in notifications, however notifications are still being received without images, then check the troubleshooting instructions below.
+
+1. Check that Grafana has been set up as per the instructions
+2. Check that the notifier supports images in notifications as per the table of supported notifiers
+3. Enable debug logging in Grafana and look for logs with the logger `ngalert.image`
+4. If the alert is not associated with a dashboard there will be logs for `Cannot take screenshot for alert rule as it is not associated with a dashboard`
+5. If the alert is associated with a dashboard, but no panel in the dashboard, there will be logs for `Cannot take screenshot for alert rule as it is not associated with a panel`
+6. If images cannot be taken because of mis-configuration or an issue with image rendering there will be logs for `Failed to take an image` including the Dashboard UID, Panel ID, and the error message
diff --git a/docs/sources/alerting/set-up/provision-alerting-resources/_index.md b/docs/sources/alerting/set-up/provision-alerting-resources/_index.md
index 151e93f4ef4..9da57092d03 100644
--- a/docs/sources/alerting/set-up/provision-alerting-resources/_index.md
+++ b/docs/sources/alerting/set-up/provision-alerting-resources/_index.md
@@ -21,15 +21,25 @@ There are three options to choose from:
1. Use file provisioning to provision your Grafana Alerting resources, such as alert rules and contact points, through files on disk.
-1. Provision your alerting resources using the Grafana HTTP API.
+1. Provision your alerting resources using the Alerting Provisioning HTTP API.
- For more information on the Grafana Alerting provisioning API, refer to [Alerting provisioning API](https://grafana.com/docs/grafana/latest/developers/http_api/alerting_provisioning/).
+ For more information on the Alerting Provisioning HTTP API, refer to [Alerting provisioning API](https://grafana.com/docs/grafana/latest/developers/http_api/alerting_provisioning/).
+
+ **Note:**
+
+ Typically, you cannot edit API-provisioned alert rules from the Grafana UI.
+
+ In order to enable editing, add the x-disable-provenance header to the following requests when creating or editing your alert rules in the API:
+
+ POST /api/v1/provisioning/alert-rules
+
+ PUT /api/v1/provisioning/alert-rules/{UID}
1. Provision your alerting resources using Terraform.
**Note:**
-Currently, provisioning for Grafana Alerting supports alert rules, contact points, mute timings, and templates. Provisioned alerting resources can only be edited in the source that created them and not from within Grafana or any other source. For example, if you provision your alerting resources using files from disk, you cannot edit the data in Terraform or from within Grafana.
+Currently, provisioning for Grafana Alerting supports alert rules, contact points, mute timings, and templates. Provisioned alerting resources using file provisioning or Terraform can only be edited in the source that created them and not from within Grafana or any other source. For example, if you provision your alerting resources using files from disk, you cannot edit the data in Terraform or from within Grafana.
**Useful Links:**
diff --git a/docs/sources/developers/http_api/annotations.md b/docs/sources/developers/http_api/annotations.md
index a7314df7905..08a1d432760 100644
--- a/docs/sources/developers/http_api/annotations.md
+++ b/docs/sources/developers/http_api/annotations.md
@@ -16,7 +16,7 @@ title: 'Annotations HTTP API'
# Annotations API
-This is the API documentation for the new Grafana Annotations feature released in Grafana 4.6. Annotations are saved in the Grafana database (sqlite, mysql or postgres). Annotations can be organization annotations that can be shown on any dashboard by configuring an annotation data source - they are filtered by tags. Or they can be tied to a panel on a dashboard and are then only shown on that panel.
+Annotations are saved in the Grafana database (sqlite, mysql or postgres). Annotations can be organization annotations that can be shown on any dashboard by configuring an annotation data source - they are filtered by tags. Or they can be tied to a panel on a dashboard and are then only shown on that panel.
> If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "../../administration/roles-and-permissions/access-control/custom-role-actions-scopes/" >}}) for more information.
diff --git a/docs/sources/introduction/grafana-enterprise.md b/docs/sources/introduction/grafana-enterprise.md
index a1ed663bb12..3b14918828d 100644
--- a/docs/sources/introduction/grafana-enterprise.md
+++ b/docs/sources/introduction/grafana-enterprise.md
@@ -61,7 +61,7 @@ Grafana Enterprise adds the following features:
- [Custom branding]({{< relref "../setup-grafana/configure-grafana/configure-custom-branding/" >}}) to customize Grafana from the brand and logo to the footer links.
- [Usage insights]({{< relref "../dashboards/assess-dashboard-usage/" >}}) to understand how your Grafana instance is used.
- [Recorded queries]({{< relref "../administration/recorded-queries" >}}) to see trends over time for your data sources.
-- [Vault integration]({{< relref "../setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/" >}}) to manage your configuration or provisioning secrets with Vault.
+- [Vault integration]({{< relref "../setup-grafana/configure-security/configure-database-encryption/#encrypting-your-database-with-a-key-from-a-key-management-service-kms" >}}) to manage your configuration or provisioning secrets with Vault.
- [Auditing]({{< relref "../setup-grafana/configure-security/audit-grafana/" >}}) tracks important changes to your Grafana instance to help you manage and mitigate suspicious activity and meet compliance requirements.
- [Request security]({{< relref "../setup-grafana/configure-security/configure-request-security/" >}}) makes it possible to restrict outgoing requests from the Grafana server.
- [Settings updates at runtime]({{< relref "../setup-grafana/configure-grafana/settings-updates-at-runtime" >}}) allows you to update Grafana settings at runtime without requiring a restart.
diff --git a/docs/sources/panels-visualizations/visualizations/canvas/index.md b/docs/sources/panels-visualizations/visualizations/canvas/index.md
index 7c8e34ac2f8..627586663f4 100644
--- a/docs/sources/panels-visualizations/visualizations/canvas/index.md
+++ b/docs/sources/panels-visualizations/visualizations/canvas/index.md
@@ -55,9 +55,13 @@ Canvas introduces a new editing experience. You can now edit your canvas panel i
Related to a fresh look at panel editing, the context menu enables you to perform common tasks quickly and efficiently. Supported functionality includes opening / closing the inline editor, duplicating an element, deleting an element, and more.
-The context menu is triggered by a right click action over the panel / over a given canvas element
+The context menu is triggered by a right click action over the panel / over a given canvas element. When right clicking the panel, you are able to set a background image and easily add elements to the canvas.
-{{< figure src="/static/img/docs/canvas-panel/canvas-context-menu-9-2-0.png" max-width="750px" caption="Canvas context menu" >}}
+{{< figure src="/static/img/docs/canvas-panel/canvas-panel-context-menu-9-3-0.png" max-width="750px" caption="Canvas panel context menu" >}}
+
+When right clicking an element, you are able to edit, delete, duplicate, and modify the element's layer positioning.
+
+{{< figure src="/static/img/docs/canvas-panel/canvas-context-menu-9-2-0.png" max-width="750px" caption="Canvas element context menu" >}}
## Canvas Options
diff --git a/docs/sources/panels-visualizations/visualizations/geomap/index.md b/docs/sources/panels-visualizations/visualizations/geomap/index.md
index 891311df08f..5118f1425e4 100644
--- a/docs/sources/panels-visualizations/visualizations/geomap/index.md
+++ b/docs/sources/panels-visualizations/visualizations/geomap/index.md
@@ -81,12 +81,13 @@ There are three map layer types to choose from in the Geomap visualization.
- [Heatmap]({{< relref "#heatmap-layer" >}}) visualizes a heatmap of the data.
- [GeoJSON]({{< relref "#geojson-layer" >}}) renders static data from a GeoJSON file.
-There are also four alpha layer types.
+There are also five alpha layer types.
- [Night / Day (alpha)]({{< relref "#night--day-layer-alpha" >}}) renders a night / day region.
- **Icon at last point (alpha)** renders an icon at the last data point.
- **Dynamic GeoJSON (alpha)** styles a GeoJSON file based on query results.
- **Route (alpha)** render data points as a route.
+- [Photos layer (Alpha)]({{< relref "#photos-layer-alpha" >}}) renders a photo at each data point.
> **Note:** [Basemap layer types]({{< relref "#types-1" >}}) can also be added as layers. You can specify an opacity.
@@ -351,6 +352,34 @@ The Night / Day layer displays night and day regions based on the current time r
- [**Extensions for OpenLayers - DayNight**](https://viglino.github.io/ol-ext/examples/layer/map.daynight.html)
+## Photos layer (Alpha)
+
+The Photos layer renders a photo at each data point.
+
+{{< figure src="/static/img/docs/geomap-panel/geomap-photos-9-3-0.png" max-width="1200px" caption="Geomap panel Photos" >}}
+
+### Options
+
+- **Image Source Field** select a string field containing image data in either of the following formats
+ - **Image URLs**
+ - **Base64 encoded** image binary ("data:image/png;base64,...")
+- **Kind** select the frame style around the images
+ - **Square**
+ - **Circle**
+ - **Anchored**
+ - **Folio**
+- **Crop** toggle if the images are cropped to fit
+- **Shadow** toggle a box shadow behind the images
+- **Border** set the border size around images
+- **Border color** set the border color around images
+- **Radius** set the overall size of images in pixels
+
+{{< figure src="/static/img/docs/geomap-panel/geomap-photos-options-9-3-0.png" max-width="1200px" caption="Geomap panel Photos options" >}}
+
+### More information
+
+- [**Extensions for OpenLayers - Image Photo Style**](http://viglino.github.io/ol-ext/examples/style/map.style.photo.html)
+
## Map Controls
The map controls section contains various options for map information and tool overlays.
diff --git a/e2e/dashboards-suite/dashboard-search.spec.ts b/e2e/dashboards-suite/dashboard-search.spec.ts
index 2ec8b6327f5..f2ec3136c6e 100644
--- a/e2e/dashboards-suite/dashboard-search.spec.ts
+++ b/e2e/dashboards-suite/dashboard-search.spec.ts
@@ -21,8 +21,5 @@ e2e.scenario({
e2e.components.Search.folderContent('General').should('be.visible');
e2e.components.Search.dashboardItem('E2E Test - Import Dashboard').should('be.visible');
-
- // verify the imported dashboard is the only dashboard present in the folder
- e2e().get('[data-testid^="data-testid Dashboard search item "]').should('have.length', 1);
},
});
diff --git a/e2e/various-suite/loki-query-builder.spec.ts b/e2e/various-suite/loki-query-builder.spec.ts
index 6557a993c4c..96bf1230a86 100644
--- a/e2e/various-suite/loki-query-builder.spec.ts
+++ b/e2e/various-suite/loki-query-builder.spec.ts
@@ -72,10 +72,6 @@ describe('Loki query builder', () => {
e2e().contains(MISSING_LABEL_FILTER_ERROR_MESSAGE).should('not.exist');
e2e().contains(finalQuery).should('be.visible');
- // Toggle raw query
- e2e().contains('label', 'Raw query').click();
- e2e().contains('Raw query').should('have.length', 1);
-
// Change to code editor
e2e().contains('label', 'Code').click();
// We need to test this manually because the final query is split into separate DOM elements using e2e().contains(finalQuery).should('be.visible'); does not detect the query.
diff --git a/e2e/verify-release b/e2e/verify-release
index 2bb9df037fa..304a68a6b53 100755
--- a/e2e/verify-release
+++ b/e2e/verify-release
@@ -2,4 +2,5 @@
. scripts/grafana-server/variables
-./e2e/run-suite verify/specs
+# The run-suite script requires a second argument to determine if videos should be recorded
+./e2e/run-suite verify/specs true
diff --git a/emails/Makefile b/emails/Makefile
new file mode 100644
index 00000000000..e44bd04b9a1
--- /dev/null
+++ b/emails/Makefile
@@ -0,0 +1,14 @@
+build: build-html build-txt
+
+build-html:
+ npx mjml \
+ --config.beautify true \
+ --config.minify false \
+ --config.validationLevel=strict \
+ --config.keepComments=false \
+ ./templates/*.mjml --output ../public/emails/
+
+build-txt:
+ npx grunt
+
+.PHONY: build build-html build-txt
diff --git a/emails/assets/css/ink.css b/emails/assets/css/ink.css
deleted file mode 100644
index f4c1a291cb3..00000000000
--- a/emails/assets/css/ink.css
+++ /dev/null
@@ -1,688 +0,0 @@
-/**********************************************
-* Ink v1.0.5 - Copyright 2013 ZURB Inc *
-**********************************************/
-
-/* Client-specific Styles & Reset */
-
-#outlook a {
- padding:0;
-}
-
-body{
- width:100% !important;
- min-width: 100%;
- -webkit-text-size-adjust:100%;
- -ms-text-size-adjust:100%;
- margin:0;
- padding:0;
-}
-
-
-
-.ExternalClass {
- width:100%;
-}
-
-.ExternalClass,
-.ExternalClass p,
-.ExternalClass span,
-.ExternalClass font,
-.ExternalClass td,
-.ExternalClass div {
- line-height: 100%;
-}
-
-#backgroundTable {
- margin:0;
- padding:0;
- width:100% !important;
- line-height: 100% !important;
-}
-
-img {
- outline:none;
- text-decoration:none;
- -ms-interpolation-mode: bicubic;
- width: auto;
- float: left;
- clear: both;
- display: block;
-}
-
-center {
- width: 100%;
- min-width: 580px;
-}
-
-a img {
- border: none;
-}
-
-p {
- margin: 0 0 0 10px;
-}
-
-table {
- border-spacing: 0;
- border-collapse: collapse;
-}
-
-td {
- word-break: break-word;
- -webkit-hyphens: auto;
- -moz-hyphens: auto;
- hyphens: auto;
- border-collapse: collapse !important;
-}
-
-table, tr, td {
- padding: 0;
- vertical-align: top;
- text-align: left;
-}
-
-hr {
- color: #d9d9d9;
- background-color: #d9d9d9;
- height: 1px;
- border: none;
-}
-
-/* Responsive Grid */
-
-table.body {
- height: 100%;
- width: 100%;
-}
-
-table.container {
- width: 580px;
- margin: 0 auto;
- text-align: inherit;
-}
-
-table.row {
- padding: 0px;
- width: 100%;
- position: relative;
-}
-
-table.container table.row {
- display: block;
-}
-
-td.wrapper {
- padding: 10px 20px 0px 0px;
- position: relative;
-}
-
-table.columns,
-table.column {
- margin: 0 auto;
-}
-
-table.columns td,
-table.column td {
- padding: 0px 0px 10px;
-}
-
-table.columns td.sub-columns,
-table.column td.sub-columns,
-table.columns td.sub-column,
-table.column td.sub-column {
- padding-right: 10px;
-}
-
-td.sub-column, td.sub-columns {
- min-width: 0px;
-}
-
-table.row td.last,
-table.container td.last {
- padding-right: 0px;
-}
-
-table.one { width: 30px; }
-table.two { width: 80px; }
-table.three { width: 130px; }
-table.four { width: 180px; }
-table.five { width: 230px; }
-table.six { width: 280px; }
-table.seven { width: 330px; }
-table.eight { width: 380px; }
-table.nine { width: 430px; }
-table.ten { width: 480px; }
-table.eleven { width: 530px; }
-table.twelve { width: 580px; }
-
-table.one center { min-width: 30px; }
-table.two center { min-width: 80px; }
-table.three center { min-width: 130px; }
-table.four center { min-width: 180px; }
-table.five center { min-width: 230px; }
-table.six center { min-width: 280px; }
-table.seven center { min-width: 330px; }
-table.eight center { min-width: 380px; }
-table.nine center { min-width: 430px; }
-table.ten center { min-width: 480px; }
-table.eleven center { min-width: 530px; }
-table.twelve center { min-width: 580px; }
-
-table.one .panel center { min-width: 10px; }
-table.two .panel center { min-width: 60px; }
-table.three .panel center { min-width: 110px; }
-table.four .panel center { min-width: 160px; }
-table.five .panel center { min-width: 210px; }
-table.six .panel center { min-width: 260px; }
-table.seven .panel center { min-width: 310px; }
-table.eight .panel center { min-width: 360px; }
-table.nine .panel center { min-width: 410px; }
-table.ten .panel center { min-width: 460px; }
-table.eleven .panel center { min-width: 510px; }
-table.twelve .panel center { min-width: 560px; }
-
-.body .columns td.one,
-.body .column td.one { width: 8.333333%; }
-.body .columns td.two,
-.body .column td.two { width: 16.666666%; }
-.body .columns td.three,
-.body .column td.three { width: 25%; }
-.body .columns td.four,
-.body .column td.four { width: 33.333333%; }
-.body .columns td.five,
-.body .column td.five { width: 41.666666%; }
-.body .columns td.six,
-.body .column td.six { width: 50%; }
-.body .columns td.seven,
-.body .column td.seven { width: 58.333333%; }
-.body .columns td.eight,
-.body .column td.eight { width: 66.666666%; }
-.body .columns td.nine,
-.body .column td.nine { width: 75%; }
-.body .columns td.ten,
-.body .column td.ten { width: 83.333333%; }
-.body .columns td.eleven,
-.body .column td.eleven { width: 91.666666%; }
-.body .columns td.twelve,
-.body .column td.twelve { width: 100%; }
-
-td.offset-by-one { padding-left: 50px; }
-td.offset-by-two { padding-left: 100px; }
-td.offset-by-three { padding-left: 150px; }
-td.offset-by-four { padding-left: 200px; }
-td.offset-by-five { padding-left: 250px; }
-td.offset-by-six { padding-left: 300px; }
-td.offset-by-seven { padding-left: 350px; }
-td.offset-by-eight { padding-left: 400px; }
-td.offset-by-nine { padding-left: 450px; }
-td.offset-by-ten { padding-left: 500px; }
-td.offset-by-eleven { padding-left: 550px; }
-
-td.expander {
- visibility: hidden;
- width: 0px;
- padding: 0 !important;
-}
-
-table.columns .text-pad,
-table.column .text-pad {
- padding-left: 10px;
- padding-right: 10px;
-}
-
-table.columns .left-text-pad,
-table.columns .text-pad-left,
-table.column .left-text-pad,
-table.column .text-pad-left {
- padding-left: 10px;
-}
-
-table.columns .right-text-pad,
-table.columns .text-pad-right,
-table.column .right-text-pad,
-table.column .text-pad-right {
- padding-right: 10px;
-}
-
-/* Block Grid */
-
-.block-grid {
- width: 100%;
- max-width: 580px;
-}
-
-.block-grid td {
- display: inline-block;
- padding:10px;
-}
-
-.two-up td {
- width:270px;
-}
-
-.three-up td {
- width:173px;
-}
-
-.four-up td {
- width:125px;
-}
-
-.five-up td {
- width:96px;
-}
-
-.six-up td {
- width:76px;
-}
-
-.seven-up td {
- width:62px;
-}
-
-.eight-up td {
- width:52px;
-}
-
-/* Alignment & Visibility Classes */
-
-table.center, td.center {
- text-align: center;
-}
-
-h1.center,
-h2.center,
-h3.center,
-h4.center,
-h5.center,
-h6.center {
- text-align: center;
-}
-
-span.center {
- display: block;
- width: 100%;
- text-align: center;
-}
-
-img.center {
- margin: 0 auto;
- float: none;
-}
-
-.show-for-small,
-.hide-for-desktop {
- display: none;
-}
-
-/* Typography */
-
-body, table.body, h1, h2, h3, h4, h5, h6, p, td {
- color: #222222;
- font-family: "Helvetica", "Arial", sans-serif;
- font-weight: normal;
- padding:0;
- margin: 0;
- text-align: left;
- line-height: 1.3;
-}
-
-h1, h2, h3, h4, h5, h6 {
- word-break: normal;
-}
-
-h1 {font-size: 40px;}
-h2 {font-size: 36px;}
-h3 {font-size: 32px;}
-h4 {font-size: 28px;}
-h5 {font-size: 24px;}
-h6 {font-size: 20px;}
-body, table.body, p, td {font-size: 14px;line-height:19px;}
-
-p.lead, p.lede, p.leed {
- font-size: 18px;
- line-height:21px;
-}
-
-p {
- margin-bottom: 10px;
-}
-
-small {
- font-size: 10px;
-}
-
-a {
- color: #2ba6cb;
- text-decoration: none;
-}
-
-a:hover {
- color: #2795b6 !important;
-}
-
-a:active {
- color: #2795b6 !important;
-}
-
-a:visited {
- color: #2ba6cb !important;
-}
-
-h1 a,
-h2 a,
-h3 a,
-h4 a,
-h5 a,
-h6 a {
- color: #2ba6cb;
-}
-
-h1 a:active,
-h2 a:active,
-h3 a:active,
-h4 a:active,
-h5 a:active,
-h6 a:active {
- color: #2ba6cb !important;
-}
-
-h1 a:visited,
-h2 a:visited,
-h3 a:visited,
-h4 a:visited,
-h5 a:visited,
-h6 a:visited {
- color: #2ba6cb !important;
-}
-
-/* Panels */
-
-.panel {
- background: #f2f2f2;
- border: 1px solid #d9d9d9;
- padding: 10px !important;
-}
-
-.sub-grid table {
- width: 100%;
-}
-
-.sub-grid td.sub-columns {
- padding-bottom: 0;
-}
-
-/* Buttons */
-
-table.button,
-table.tiny-button,
-table.small-button,
-table.medium-button,
-table.large-button {
- width: 100%;
- overflow: hidden;
-}
-
-table.button td,
-table.tiny-button td,
-table.small-button td,
-table.medium-button td,
-table.large-button td {
- display: block;
- width: auto !important;
- text-align: center;
- background: #2ba6cb;
- border: 1px solid #2284a1;
- color: #ffffff;
- padding: 8px 0;
-}
-
-table.tiny-button td {
- padding: 5px 0 4px;
-}
-
-table.small-button td {
- padding: 8px 0 7px;
-}
-
-table.medium-button td {
- padding: 12px 0 10px;
-}
-
-table.large-button td {
- padding: 21px 0 18px;
-}
-
-table.button td a,
-table.tiny-button td a,
-table.small-button td a,
-table.medium-button td a,
-table.large-button td a {
- font-weight: bold;
- text-decoration: none;
- font-family: Helvetica, Arial, sans-serif;
- color: #ffffff;
- font-size: 16px;
-}
-
-table.tiny-button td a {
- font-size: 12px;
- font-weight: normal;
-}
-
-table.small-button td a {
- font-size: 16px;
-}
-
-table.medium-button td a {
- font-size: 20px;
-}
-
-table.large-button td a {
- font-size: 24px;
-}
-
-table.button:hover td,
-table.button:visited td,
-table.button:active td {
- background: #2795b6 !important;
-}
-
-table.button:hover td a,
-table.button:visited td a,
-table.button:active td a {
- color: #fff !important;
-}
-
-table.button:hover td,
-table.tiny-button:hover td,
-table.small-button:hover td,
-table.medium-button:hover td,
-table.large-button:hover td {
- background: #2795b6 !important;
-}
-
-table.button:hover td a,
-table.button:active td a,
-table.button td a:visited,
-table.tiny-button:hover td a,
-table.tiny-button:active td a,
-table.tiny-button td a:visited,
-table.small-button:hover td a,
-table.small-button:active td a,
-table.small-button td a:visited,
-table.medium-button:hover td a,
-table.medium-button:active td a,
-table.medium-button td a:visited,
-table.large-button:hover td a,
-table.large-button:active td a,
-table.large-button td a:visited {
- color: #ffffff !important;
-}
-
-table.secondary td {
- background: #e9e9e9;
- border-color: #d0d0d0;
- color: #555;
-}
-
-table.secondary td a {
- color: #555;
-}
-
-table.secondary:hover td {
- background: #d0d0d0 !important;
- color: #555;
-}
-
-table.secondary:hover td a,
-table.secondary td a:visited,
-table.secondary:active td a {
- color: #555 !important;
-}
-
-table.success td {
- background: #5da423;
- border-color: #457a1a;
-}
-
-table.success:hover td {
- background: #457a1a !important;
-}
-
-table.alert td {
- background: #c60f13;
- border-color: #970b0e;
-}
-
-table.alert:hover td {
- background: #970b0e !important;
-}
-
-table.radius td {
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-table.round td {
- -webkit-border-radius: 500px;
- -moz-border-radius: 500px;
- border-radius: 500px;
-}
-
-/* Outlook First */
-
-body.outlook p {
- display: inline !important;
-}
-
-/* Media Queries */
-
-@media only screen and (max-width: 600px) {
-
- table[class="body"] img {
-
- }
-
- table[class="body"] center {
- min-width: 0 !important;
- }
-
- table[class="body"] .container {
- width: 95% !important;
- }
-
- table[class="body"] .row {
- width: 100% !important;
- display: block !important;
- }
-
- table[class="body"] .wrapper {
- display: block !important;
- padding-right: 0 !important;
- }
-
- table[class="body"] .columns,
- table[class="body"] .column {
- table-layout: fixed !important;
- float: none !important;
- width: 100% !important;
- padding-right: 0px !important;
- padding-left: 0px !important;
- display: block !important;
- }
-
- table[class="body"] .wrapper.first .columns,
- table[class="body"] .wrapper.first .column {
- display: table !important;
- }
-
- table[class="body"] table.columns td,
- table[class="body"] table.column td {
- width: 100% !important;
- }
-
- table[class="body"] .columns td.one,
- table[class="body"] .column td.one { width: 8.333333% !important; }
- table[class="body"] .columns td.two,
- table[class="body"] .column td.two { width: 16.666666% !important; }
- table[class="body"] .columns td.three,
- table[class="body"] .column td.three { width: 25% !important; }
- table[class="body"] .columns td.four,
- table[class="body"] .column td.four { width: 33.333333% !important; }
- table[class="body"] .columns td.five,
- table[class="body"] .column td.five { width: 41.666666% !important; }
- table[class="body"] .columns td.six,
- table[class="body"] .column td.six { width: 50% !important; }
- table[class="body"] .columns td.seven,
- table[class="body"] .column td.seven { width: 58.333333% !important; }
- table[class="body"] .columns td.eight,
- table[class="body"] .column td.eight { width: 66.666666% !important; }
- table[class="body"] .columns td.nine,
- table[class="body"] .column td.nine { width: 75% !important; }
- table[class="body"] .columns td.ten,
- table[class="body"] .column td.ten { width: 83.333333% !important; }
- table[class="body"] .columns td.eleven,
- table[class="body"] .column td.eleven { width: 91.666666% !important; }
- table[class="body"] .columns td.twelve,
- table[class="body"] .column td.twelve { width: 100% !important; }
-
- table[class="body"] td.offset-by-one,
- table[class="body"] td.offset-by-two,
- table[class="body"] td.offset-by-three,
- table[class="body"] td.offset-by-four,
- table[class="body"] td.offset-by-five,
- table[class="body"] td.offset-by-six,
- table[class="body"] td.offset-by-seven,
- table[class="body"] td.offset-by-eight,
- table[class="body"] td.offset-by-nine,
- table[class="body"] td.offset-by-ten,
- table[class="body"] td.offset-by-eleven {
- padding-left: 0 !important;
- }
-
- table[class="body"] table.columns td.expander {
- width: 1px !important;
- }
-
- table[class="body"] .right-text-pad,
- table[class="body"] .text-pad-right {
- padding-left: 10px !important;
- }
-
- table[class="body"] .left-text-pad,
- table[class="body"] .text-pad-left {
- padding-right: 10px !important;
- }
-
- table[class="body"] .hide-for-small,
- table[class="body"] .show-for-desktop {
- display: none !important;
- }
-
- table[class="body"] .show-for-small,
- table[class="body"] .hide-for-desktop {
- display: inherit !important;
- }
-}
diff --git a/emails/assets/css/style.css b/emails/assets/css/style.css
deleted file mode 100644
index 065421a173d..00000000000
--- a/emails/assets/css/style.css
+++ /dev/null
@@ -1,196 +0,0 @@
-
-body, table.body, h1, h2, h3, h4, h5, h6, p, td {
- font-family: 'Open Sans', 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;
- -webkit-font-smoothing: antialiased;
- -webkit-text-size-adjust: none;
-}
-
-h1 {font-size: 40px;}
-h2 {font-size: 36px;}
-h3 {
- font-size: 22px;
- margin-top: 10px;
- margin-bottom: 10px;
-}
-h4 {font-size: 20px;}
-h5 {font-size: 18px;}
-h6 {font-size: 16px;}
-
-.emphasis {
- font-weight: 600;
-}
-
-a {
- color: #E67612;
- text-decoration: none;
-}
-
-a:hover {
- color: #ff8f2b !important;
-}
-
-a:active {
- color: #F2821E !important;
-}
-
-a:visited {
- color: #E67612 !important;
-}
-
-table.facebook td {
- background: #3b5998;
- border-color: #2d4473;
-}
-
-table.facebook:hover td {
- background: #2d4473 !important;
-}
-
-table.twitter td {
- background: #00acee;
- border-color: #0087bb;
-}
-
-table.twitter:hover td {
- background: #0087bb !important;
-}
-
-table.google-plus td {
- background-color: #DB4A39;
- border-color: #CC0000;
-}
-
-table.google-plus:hover td {
- background: #CC0000 !important;
-}
-
-.template-label {
- color: #ffffff;
- font-weight: bold;
- font-size: 11px;
-}
-
-.callout .wrapper {
- padding-bottom: 20px;
-}
-
-.callout .panel {
- background: #ECF8FF;
- border-color: #b9e5ff;
-}
-
-.header {
-margin-top:25px;
-margin-bottom: 25px;
-}
-
-.data {
- font-size: 16px;
-}
-
-.footer {
- background-color: #2e2e2e;
- color: #999999;
- margin: 0 auto;
- width: 100%;
-}
-
-@media only screen and (max-width: 600px) {
- table[class="body"] .right-text-pad {
- padding-left: 10px !important;
- }
-
- table[class="body"] .left-text-pad {
- padding-right: 10px !important;
- }
-
- .logo {
- margin-left: 10px;
- }
-}
-
-table.better-button {
- margin-top: 10px;
- margin-bottom: 20px;
-}
-
-table.columns td.better-button {
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- padding-bottom: 0px;
-}
-
-.better-button a {
- text-decoration: none;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
-
- padding: 12px 25px;
- border: 1px solid #ff8f2b;
- display: inline-block;
- color: #FFF;
-}
-
-.better-button:hover a {
- color: #FFFFFF !important;
- background-color: #F2821E;
- border: 1px solid #F2821E;
-}
-
-.better-button:visited a {
- color: #FFFFFF !important;
-}
-
-.better-button:active a {
- color: #FFFFFF !important;
-}
-
-table.better-button-alt {
- margin-top: 10px;
- margin-bottom: 20px;
-}
-
-table.columns td.better-button-alt {
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- padding-bottom: 0px;
-}
-
-.better-button-alt a {
- text-decoration: none;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
-
- padding: 12px 25px;
- border: 1px solid #ff8f2b;
- background-color: #EFEFEF;
- display: inline-block;
- color: #ff8f2b;
-}
-
-.better-button-alt:hover a {
- color: #ff8f2b !important;
- background-color: #DDDDDD;
- border: 1px solid #F2821E;
-}
-
-.better-button-alt:visited a {
- color: #ff8f2b !important;
-}
-
-.better-button-alt:active a {
- color: #ff8f2b !important;
-}
-
-.verification-code {
- background-color: #EEEEEE;
- padding: 3px;
- margin: 8px;
- display: inline-block;
- font-weight: bold;
- font-size: 20px;
-}
diff --git a/emails/grunt/aliases.yaml b/emails/grunt/aliases.yaml
index 6a2e47777cd..550d7a5422a 100644
--- a/emails/grunt/aliases.yaml
+++ b/emails/grunt/aliases.yaml
@@ -1,8 +1,5 @@
-
default:
- - 'clean'
- - 'assemble'
- - 'replace'
- - 'uncss'
- - 'processhtml'
- - 'premailer'
+ - 'clean'
+ - 'assemble'
+ - 'replace'
+ - 'copy'
diff --git a/emails/grunt/assemble.js b/emails/grunt/assemble.js
index 6ef46860267..e0d1f103a42 100644
--- a/emails/grunt/assemble.js
+++ b/emails/grunt/assemble.js
@@ -2,21 +2,12 @@ module.exports = function () {
'use strict';
return {
options: {
- partials: ['templates/partials/*.hbs'],
- helpers: ['templates/helpers/**/*.js'],
data: [],
flatten: true,
},
- html: {
- options: {
- layout: 'templates/layouts/default.html',
- },
- src: ['templates/*.html'],
- dest: 'dist/',
- },
txt: {
options: {
- layout: 'templates/layouts/default.txt',
+ layout: 'templates/partials/layout/default.txt',
ext: '.txt',
},
src: ['templates/*.txt'],
diff --git a/emails/grunt/copy.js b/emails/grunt/copy.js
new file mode 100644
index 00000000000..4f794d85a3a
--- /dev/null
+++ b/emails/grunt/copy.js
@@ -0,0 +1,11 @@
+module.exports = function () {
+ 'use strict';
+ return {
+ txt: {
+ expand: true,
+ cwd: 'dist',
+ src: ['**.txt'],
+ dest: '../public/emails/',
+ },
+ };
+};
diff --git a/emails/grunt/premailer.js b/emails/grunt/premailer.js
deleted file mode 100644
index f587095c256..00000000000
--- a/emails/grunt/premailer.js
+++ /dev/null
@@ -1,31 +0,0 @@
-module.exports = {
- html: {
- options: {
- verbose: true,
- removeComments: true,
- },
- files: [
- {
- expand: true, // Enable dynamic expansion.
- cwd: 'dist', // Src matches are relative to this path.
- src: ['*.html'], // Actual pattern(s) to match.
- dest: '../public/emails/', // Destination path prefix.
- },
- ],
- },
- txt: {
- options: {
- verbose: true,
- mode: 'txt',
- lineLength: 90,
- },
- files: [
- {
- expand: true, // Enable dynamic expansion.
- cwd: 'dist', // Src matches are relative to this path.
- src: ['*.txt'], // Actual patterns to match.
- dest: '../public/emails/', // Destination path prefix.
- },
- ],
- },
-};
diff --git a/emails/grunt/processhtml.js b/emails/grunt/processhtml.js
deleted file mode 100644
index 777b2d27d73..00000000000
--- a/emails/grunt/processhtml.js
+++ /dev/null
@@ -1,12 +0,0 @@
-module.exports = {
- dist: {
- files: [
- {
- expand: true, // Enable dynamic expansion.
- cwd: 'dist', // Src matches are relative to this path.
- src: ['*.html'], // Actual pattern(s) to match.
- dest: 'dist/', // Destination path prefix.
- },
- ],
- },
-};
diff --git a/emails/grunt/replace.js b/emails/grunt/replace.js
index 0d8c030d2f3..be4f18e34d4 100644
--- a/emails/grunt/replace.js
+++ b/emails/grunt/replace.js
@@ -1,7 +1,7 @@
module.exports = {
dist: {
overwrite: true,
- src: ['dist/*.html', 'dist/*.txt'],
+ src: ['dist/*.txt'],
replacements: [
{
from: '[[',
diff --git a/emails/grunt/uncss.js b/emails/grunt/uncss.js
deleted file mode 100644
index c1ec535e1bb..00000000000
--- a/emails/grunt/uncss.js
+++ /dev/null
@@ -1,9 +0,0 @@
-module.exports = {
- dist: {
- src: ['dist/*.html'],
- dest: 'dist/css/tidy.css',
- options: {
- report: 'min', // optional: include to report savings
- },
- },
-};
diff --git a/emails/grunt/watch.js b/emails/grunt/watch.js
deleted file mode 100644
index b071320b3e6..00000000000
--- a/emails/grunt/watch.js
+++ /dev/null
@@ -1,16 +0,0 @@
-module.exports = {
- src: {
- files: [
- //what are the files that we want to watch
- 'assets/css/*.css',
- 'templates/**/*.html',
- 'templates/**/*.txt',
- 'grunt/*.js',
- ],
- tasks: ['default'],
- options: {
- nospawn: true,
- livereload: false,
- },
- },
-};
diff --git a/emails/package.json b/emails/package.json
index f4eb62d4eae..c8de033b507 100644
--- a/emails/package.json
+++ b/emails/package.json
@@ -1,26 +1,17 @@
{
- "name": "Grafana-Email-Campaign",
+ "name": "grafana-email-campaign",
"version": "1.0.0",
- "description": "Grafana Email templates based on Zurb Ink",
- "repository": "dnnsldr/",
- "author": {
- "name": "dnnsldr",
- "email": "delder@riester.com",
- "url": "https://github.com/dnnsldr"
- },
- "scripts": {
- "build": "grunt",
- "start": "grunt watch"
- },
+ "description": "Grafana Email templates based on MJML",
+ "author": "Grafana Labs",
"devDependencies": {
"grunt": "1.0.1",
- "grunt-premailer": "1.1.0",
- "grunt-processhtml": "^0.4.2",
- "grunt-uncss": "0.9.0",
- "load-grunt-config": "3.0.1",
+ "grunt-assemble": "0.6.3",
+ "grunt-cli": "^1.4.3",
+ "grunt-contrib-clean": "2.0.0",
+ "grunt-contrib-copy": "^1.0.0",
"grunt-contrib-watch": "1.1.0",
"grunt-text-replace": "0.4.0",
- "grunt-assemble": "0.6.3",
- "grunt-contrib-clean": "2.0.0"
+ "load-grunt-config": "3.0.1",
+ "mjml": "^4.13.0"
}
}
diff --git a/emails/templates/alert_notification.html b/emails/templates/alert_notification.html
deleted file mode 100644
index 98d2f7ff56c..00000000000
--- a/emails/templates/alert_notification.html
+++ /dev/null
@@ -1,134 +0,0 @@
-[[Subject .Subject "[[.Title]]"]]
-
-
-
-
-
-
-
-
[[.Title]]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
[[.Message]]
-
-
-
-
-
-
-
-[[if ne .Error "" ]]
-
-
-
-
-
-
-
-
Error message
-
-
-
-
-
[[.Error]]
-
-
-
-
-
-
-
-[[end]]
-
-[[if ne .State "ok" ]]
-
-
-
-
-
-
-
-
Metric name
-
-
-
Value
-
-
- [[range .EvalMatches]]
-
-
-
[[.Metric]]
-
-
-
[[.Value]]
-
-
- [[end]]
-
-
-
-
-
-[[end]]
-
-
-
-
-
-
-
- [[if ne .ImageLink "" ]]
-
- [[end]]
- [[if ne .EmbeddedImage "" ]]
-
- [[end]]
-
-
-
diff --git a/emails/templates/invited_to_org.mjml b/emails/templates/invited_to_org.mjml
new file mode 100644
index 00000000000..d85a011dbc5
--- /dev/null
+++ b/emails/templates/invited_to_org.mjml
@@ -0,0 +1,40 @@
+
+
+
+
+ {{ Subject .Subject "{{ .InvitedBy }} has added you to the {{ .OrgName }} organization" }}
+
+
+
+
+
+
+
+
+
+
+
You have been added to {{ .OrgName }}
+ {{ .InvitedBy }} has added you to the {{ .OrgName }} organization in Grafana.
+
+
+ Once logged in, {{ .OrgName }} will be available to switch to in the user interface.
+
+
+ Log in now by clicking the link below:
+
+
+ Login to Grafana
+
+
+ You can also copy and paste this link into your browser directly:
+
+
+ {{ .AppUrl }}
+
+
+
+
+
+
+
+
diff --git a/emails/templates/invited_to_org.txt b/emails/templates/invited_to_org.txt
index 322119aa942..b2ae9e8a1ac 100644
--- a/emails/templates/invited_to_org.txt
+++ b/emails/templates/invited_to_org.txt
@@ -6,4 +6,4 @@ You have been added to [[.OrgName]]
Once logged in, [[.OrgName]] will be available in the left side menu, in the dropdown below your username.
Log in now:
-[[.AppUrl]]
\ No newline at end of file
+[[.AppUrl]]
diff --git a/emails/templates/layouts/default.html b/emails/templates/layouts/default.html
deleted file mode 100644
index 7e580ac910f..00000000000
--- a/emails/templates/layouts/default.html
+++ /dev/null
@@ -1,161 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
You can also copy and paste this link into your browser directly: [[.LinkUrl]]
-
-
-
-
-
-
-
diff --git a/emails/templates/new_user_invite.mjml b/emails/templates/new_user_invite.mjml
new file mode 100644
index 00000000000..66c28de9454
--- /dev/null
+++ b/emails/templates/new_user_invite.mjml
@@ -0,0 +1,36 @@
+
+
+
+
+ {{ Subject .Subject "{{ .InvitedBy }} has invited you to join Grafana" }}
+
+
+
+
+
+
+
+
+
+
+
You're invited to join {{ .OrgName }}
+
+
+ You've been invited to join the {{ .OrgName }} organization by {{ .InvitedBy }}. To accept your invitation and join the team, please click the link below:
+
+
+ Accept Invitation
+
+
+ You can also copy and paste this link into your browser directly:
+
+
+ {{ .LinkUrl }}
+
+
+
+
+
+
+
+
diff --git a/emails/templates/ng_alert_notification.html b/emails/templates/ng_alert_notification.html
deleted file mode 100644
index 093c75cc21e..00000000000
--- a/emails/templates/ng_alert_notification.html
+++ /dev/null
@@ -1,271 +0,0 @@
-
-
-
-[[Subject .Subject "[[.Title]]"]]
-
-[[ define "__text_values_list" ]][[ $len := len .Values ]][[ if $len ]][[ $first := gt $len 1 ]][[ range $refID, $value := .Values -]]
-[[ $refID ]]=[[ $value ]][[ if $first ]], [[ end ]][[ $first = false ]][[ end -]]
-[[ else ]][no value][[ end ]][[ end ]]
-
-[[ define "alert" ]]
-
- [[ if ne .ImageURL "" ]]
-
+
+
+ Please click the following link to reset your password within {{ .EmailCodeValidHours }} hours.
+
+
+ Reset Password
+
+
+ You can also copy and paste this link into your browser directly:
+
+
+ {{ .AppUrl }}user/password/reset?code={{ .Code }}
+
+
+
+
+
+
+
+
diff --git a/emails/templates/signup_started.html b/emails/templates/signup_started.html
deleted file mode 100644
index 3e8b3e0b976..00000000000
--- a/emails/templates/signup_started.html
+++ /dev/null
@@ -1,46 +0,0 @@
-[[Subject .Subject "Welcome to Grafana, please complete your sign up!"]]
-
-
-
-
-
-
-
-
-
Complete the signup
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Copy and paste the email verification code:
- [[.Code]] in
- the sign up form or use the link below.
-
+
+
+ Copy and paste the email verification code in the sign up form or use the link below.
+
+
+ {{ .Code }}
+
+
+ Complete Sign Up
+
+
+ You can also copy and paste this link into your browser directly:
+
+
+ {{ .SignUpUrl }}
+
+
+
+
+
+
+
+
diff --git a/emails/templates/welcome_on_signup.html b/emails/templates/welcome_on_signup.html
deleted file mode 100644
index 7e2e004342a..00000000000
--- a/emails/templates/welcome_on_signup.html
+++ /dev/null
@@ -1,48 +0,0 @@
-[[Subject .Subject "Welcome to Grafana"]]
-
-
-
-
-
-
-
-
-
Hi [[.Name]],
-
-
-
-
-
- Welcome! Ready to start building some beautiful metric and analytic dashboards?
-