diff --git a/.betterer.results b/.betterer.results index 6dfe5f4e261..983e03cb8ac 100644 --- a/.betterer.results +++ b/.betterer.results @@ -5,12 +5,14 @@ // exports[`better eslint`] = { value: `{ + "e2e/scenes/utils/support/types.ts:5381": [ + [0, 0, 0, "Do not use any type assertions.", "0"] + ], "e2e/utils/support/types.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "packages/grafana-data/src/dataframe/ArrayDataFrame.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.", "0"] ], "packages/grafana-data/src/dataframe/CircularDataFrame.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -34,14 +36,10 @@ 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, "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, "Do not use any type assertions.", "12"], - [0, 0, 0, "Unexpected any. Specify a different type.", "13"], - [0, 0, 0, "Unexpected any. Specify a different type.", "14"], - [0, 0, 0, "Do not use any type assertions.", "15"] + [0, 0, 0, "Do not use any type assertions.", "11"] ], "packages/grafana-data/src/dataframe/StreamingDataFrame.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -134,6 +132,9 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"] ], + "packages/grafana-data/src/field/fieldState.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + ], "packages/grafana-data/src/field/overrides/processors.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -370,11 +371,6 @@ exports[`better eslint`] = { "packages/grafana-data/src/types/variables.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "packages/grafana-data/src/types/vector.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"] - ], "packages/grafana-data/src/utils/OptionsUIBuilders.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -449,25 +445,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "3"], [0, 0, 0, "Unexpected any. Specify a different type.", "4"] ], - "packages/grafana-data/src/vector/AppendedVectors.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.", "2"] - ], - "packages/grafana-data/src/vector/ArrayVector.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"] - ], "packages/grafana-data/src/vector/CircularVector.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "packages/grafana-data/src/vector/ConstantVector.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], - "packages/grafana-data/src/vector/FormattedVector.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "packages/grafana-data/src/vector/FunctionalVector.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -477,11 +457,7 @@ 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, "Unexpected any. Specify a different type.", "9"] - ], - "packages/grafana-data/src/vector/SortedVector.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + [0, 0, 0, "Unexpected any. Specify a different type.", "8"] ], "packages/grafana-data/test/__mocks__/pluginMocks.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -795,6 +771,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "11"], [0, 0, 0, "Unexpected any. Specify a different type.", "12"] ], + "packages/grafana-runtime/src/services/pluginExtensions/getPluginExtensions.ts:5381": [ + [0, 0, 0, "Do not use any type assertions.", "0"] + ], "packages/grafana-runtime/src/utils/DataSourceWithBackend.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -1163,9 +1142,6 @@ exports[`better eslint`] = { "packages/grafana-ui/src/utils/useAsyncDependency.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "plugins-bundled/internal/input-datasource/src/InputDatasource.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "public/app/core/TableModel.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -1189,11 +1165,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Do not use any type assertions.", "5"], [0, 0, 0, "Do not use any type assertions.", "6"], - [0, 0, 0, "Do not use any type assertions.", "7"], - [0, 0, 0, "Unexpected any. Specify a different type.", "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, "Unexpected any. Specify a different type.", "7"], + [0, 0, 0, "Do not use any type assertions.", "8"], + [0, 0, 0, "Do not use any type assertions.", "9"] ], "public/app/core/components/GraphNG/hooks.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -1455,83 +1429,18 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "1"], [0, 0, 0, "Styles should be written using objects.", "2"] ], - "public/app/features/alerting/AlertTab.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"] - ], - "public/app/features/alerting/AlertTabCtrl.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, "Do not use any type assertions.", "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"] - ], - "public/app/features/alerting/EditNotificationChannelPage.tsx:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], - "public/app/features/alerting/StateHistory.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, "Styles should be written using objects.", "2"] - ], - "public/app/features/alerting/TestRuleResult.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"] - ], - "public/app/features/alerting/components/NotificationChannelForm.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"] - ], - "public/app/features/alerting/components/NotificationChannelOptions.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] - ], - "public/app/features/alerting/components/OptionElement.tsx:5381": [ + "public/app/features/alerting/routes.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/features/alerting/state/ThresholdMapper.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/features/alerting/state/actions.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/features/alerting/state/alertDef.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, "Unexpected any. Specify a different type.", "3"] + [0, 0, 0, "Unexpected any. Specify a different type.", "3"], + [0, 0, 0, "Unexpected any. Specify a different type.", "4"] ], "public/app/features/alerting/state/query_part.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -1578,11 +1487,7 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "11"], [0, 0, 0, "Styles should be written using objects.", "12"], [0, 0, 0, "Styles should be written using objects.", "13"], - [0, 0, 0, "Styles should be written using objects.", "14"], - [0, 0, 0, "Styles should be written using objects.", "15"], - [0, 0, 0, "Styles should be written using objects.", "16"], - [0, 0, 0, "Styles should be written using objects.", "17"], - [0, 0, 0, "Styles should be written using objects.", "18"] + [0, 0, 0, "Styles should be written using objects.", "14"] ], "public/app/features/alerting/unified/NotificationPolicies.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] @@ -1663,13 +1568,6 @@ exports[`better eslint`] = { "public/app/features/alerting/unified/components/GrafanaAlertmanagerDeliveryWarning.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], - "public/app/features/alerting/unified/components/HoverCard.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"], - [0, 0, 0, "Styles should be written using objects.", "4"] - ], "public/app/features/alerting/unified/components/Label.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"], @@ -2154,32 +2052,10 @@ exports[`better eslint`] = { "public/app/features/alerting/unified/components/rule-editor/rule-types/RuleTypePicker.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], - "public/app/features/alerting/unified/components/rule-viewer/RuleViewer.v1.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"], - [0, 0, 0, "Styles should be written using objects.", "4"], - [0, 0, 0, "Styles should be written using objects.", "5"], - [0, 0, 0, "Styles should be written using objects.", "6"], - [0, 0, 0, "Styles should be written using objects.", "7"], - [0, 0, 0, "Styles should be written using objects.", "8"], - [0, 0, 0, "Styles should be written using objects.", "9"], - [0, 0, 0, "Styles should be written using objects.", "10"], - [0, 0, 0, "Styles should be written using objects.", "11"], - [0, 0, 0, "Styles should be written using objects.", "12"] - ], "public/app/features/alerting/unified/components/rule-viewer/RuleViewerLayout.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"] ], - "public/app/features/alerting/unified/components/rule-viewer/RuleViewerVisualization.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"], - [0, 0, 0, "Styles should be written using objects.", "4"] - ], "public/app/features/alerting/unified/components/rules/ActionButton.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], @@ -2356,23 +2232,6 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "3"], [0, 0, 0, "Styles should be written using objects.", "4"] ], - "public/app/features/alerting/unified/home/GettingStarted.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"], - [0, 0, 0, "Styles should be written using objects.", "4"], - [0, 0, 0, "Styles should be written using objects.", "5"], - [0, 0, 0, "Styles should be written using objects.", "6"], - [0, 0, 0, "Styles should be written using objects.", "7"], - [0, 0, 0, "Styles should be written using objects.", "8"], - [0, 0, 0, "Styles should be written using objects.", "9"], - [0, 0, 0, "Styles should be written using objects.", "10"], - [0, 0, 0, "Styles should be written using objects.", "11"], - [0, 0, 0, "Styles should be written using objects.", "12"], - [0, 0, 0, "Styles should be written using objects.", "13"], - [0, 0, 0, "Styles should be written using objects.", "14"] - ], "public/app/features/alerting/unified/hooks/useAlertmanagerConfig.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -2451,9 +2310,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"] ], - "public/app/features/annotations/components/StandardAnnotationQueryEditor.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"] - ], "public/app/features/annotations/events_processing.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -2481,19 +2337,13 @@ 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/features/canvas/elements/ellipse.tsx:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "public/app/features/canvas/runtime/element.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.", "2"], + [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.", "8"] + [0, 0, 0, "Do not use any type assertions.", "4"], + [0, 0, 0, "Do not use any type assertions.", "5"] ], "public/app/features/canvas/runtime/frame.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -2526,9 +2376,6 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "7"], [0, 0, 0, "Styles should be written using objects.", "8"] ], - "public/app/features/connections/tabs/ConnectData/NoResults/NoResults.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"] - ], "public/app/features/correlations/CorrelationsPage.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"], @@ -2561,22 +2408,23 @@ exports[`better eslint`] = { "public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataPane.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx:5381": [ - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"], - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"] - ], - "public/app/features/dashboard-scene/saving/getSaveDashboardChange.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"] + "public/app/features/dashboard-scene/saving/DetectChangesWorker.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"], + [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "public/app/features/dashboard-scene/saving/shared.tsx:5381": [ - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"] + "public/app/features/dashboard-scene/saving/getDashboardChanges.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.", "2"] ], "public/app/features/dashboard-scene/scene/PanelMenuBehavior.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"] ], + "public/app/features/dashboard-scene/serialization/angularMigration.test.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + ], "public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -2593,16 +2441,21 @@ 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.", "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"] ], "public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.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, "Unexpected any. Specify a different type.", "3"], [0, 0, 0, "Do not use any type assertions.", "4"], [0, 0, 0, "Do not use any type assertions.", "5"], - [0, 0, 0, "Do not use any type assertions.", "6"] + [0, 0, 0, "Do not use any type assertions.", "6"], + [0, 0, 0, "Do not use any type assertions.", "7"], + [0, 0, 0, "Do not use any type assertions.", "8"] ], "public/app/features/dashboard-scene/settings/variables/components/VariableSelectField.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -2902,7 +2755,8 @@ exports[`better eslint`] = { [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"], - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "4"] + [0, 0, 0, "Do not use any type assertions.", "4"], + [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "5"] ], "public/app/features/dashboard/containers/DashboardPageProxy.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -3037,6 +2891,9 @@ exports[`better eslint`] = { "public/app/features/dashboard/state/actions.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], + "public/app/features/dashboard/state/getPanelPluginToMigrateTo.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + ], "public/app/features/dashboard/state/initDashboard.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -3067,9 +2924,6 @@ exports[`better eslint`] = { "public/app/features/datasources/components/DataSourceTypeCardList.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], - "public/app/features/datasources/components/EditDataSource.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] - ], "public/app/features/datasources/components/picker/DataSourceCard.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"], @@ -3340,10 +3194,6 @@ exports[`better eslint`] = { "public/app/features/explore/TraceView/components/TracePageHeader/Actions/ActionButton.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], - "public/app/features/explore/TraceView/components/TracePageHeader/Actions/TracePageActions.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"] - ], "public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"], @@ -3403,11 +3253,7 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "5"], [0, 0, 0, "Styles should be written using objects.", "6"], [0, 0, 0, "Styles should be written using objects.", "7"], - [0, 0, 0, "Styles should be written using objects.", "8"], - [0, 0, 0, "Styles should be written using objects.", "9"], - [0, 0, 0, "Styles should be written using objects.", "10"], - [0, 0, 0, "Styles should be written using objects.", "11"], - [0, 0, 0, "Styles should be written using objects.", "12"] + [0, 0, 0, "Styles should be written using objects.", "8"] ], "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBarRow.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], @@ -3705,17 +3551,6 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "1"], [0, 0, 0, "Styles should be written using objects.", "2"] ], - "public/app/features/library-panels/components/LibraryPanelsSearch/LibraryPanelsSearch.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"], - [0, 0, 0, "Styles should be written using objects.", "4"], - [0, 0, 0, "Styles should be written using objects.", "5"], - [0, 0, 0, "Styles should be written using objects.", "6"], - [0, 0, 0, "Styles should be written using objects.", "7"], - [0, 0, 0, "Styles should be written using objects.", "8"] - ], "public/app/features/library-panels/components/LibraryPanelsView/actions.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -3920,9 +3755,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/features/playlist/EmptyQueryListBanner.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"] - ], "public/app/features/playlist/PlaylistForm.tsx:5381": [ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"], [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"] @@ -4036,9 +3868,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"] ], - "public/app/features/profile/ChangePasswordForm.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"] - ], "public/app/features/query/components/QueryEditorRow.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], @@ -4152,12 +3981,6 @@ exports[`better eslint`] = { "public/app/features/search/utils.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/serviceaccounts/components/CreateTokenModal.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"] - ], "public/app/features/serviceaccounts/components/ServiceAccountProfile.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], @@ -4236,7 +4059,10 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/features/templating/template_srv.mock.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "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"] ], "public/app/features/templating/template_srv.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -4253,6 +4079,12 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "11"], [0, 0, 0, "Do not use any type assertions.", "12"] ], + "public/app/features/trails/ActionTabs/utils.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + ], + "public/app/features/trails/MetricScene.tsx:5381": [ + [0, 0, 0, "Do not use any type assertions.", "0"] + ], "public/app/features/transformers/FilterByValueTransformer/ValueMatchers/BasicMatcherEditor.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -4589,10 +4421,6 @@ exports[`better eslint`] = { "public/app/plugins/datasource/azuremonitor/azure_monitor/azure_monitor_datasource.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/QueryField.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/datasource/azuremonitor/components/QueryEditor/QueryEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -4642,9 +4470,6 @@ exports[`better eslint`] = { "public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryEditor.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], - "public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryFieldOld.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] - ], "public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/DynamicLabelsField.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], @@ -4873,9 +4698,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "public/app/plugins/datasource/grafana-testdata-datasource/nodeGraphUtils.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "public/app/plugins/datasource/grafana-testdata-datasource/runStreams.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -4883,14 +4705,11 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/datasource/grafana/components/QueryEditor.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.", "2"], + [0, 0, 0, "Do not use any type assertions.", "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, "Do not use any type assertions.", "6"], - [0, 0, 0, "Styles should be written using objects.", "7"] + [0, 0, 0, "Styles should be written using objects.", "4"] ], "public/app/plugins/datasource/grafana/components/TimePickerInput.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], @@ -5185,6 +5004,12 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"] ], + "public/app/plugins/datasource/jaeger/_importedDependencies/model/transform-trace-data.tsx:5381": [ + [0, 0, 0, "Do not use any type assertions.", "0"] + ], + "public/app/plugins/datasource/jaeger/_importedDependencies/types/trace.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + ], "public/app/plugins/datasource/jaeger/configuration/ConfigEditor.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], @@ -5196,6 +5021,10 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], + "public/app/plugins/datasource/jaeger/helpers/createFetchResponse.ts:5381": [ + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"] + ], "public/app/plugins/datasource/jaeger/testResponse.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] @@ -5239,10 +5068,6 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "12"], [0, 0, 0, "Styles should be written using objects.", "13"] ], - "public/app/plugins/datasource/loki/components/LokiOptionFields.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"] - ], "public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"] @@ -5456,6 +5281,12 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "18"], [0, 0, 0, "Styles should be written using objects.", "19"] ], + "public/app/plugins/datasource/prometheus/configuration/ConfigEditorPackage.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/datasource/prometheus/configuration/ExemplarsSettings.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"] ], @@ -5621,38 +5452,12 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "public/app/plugins/datasource/tempo/LokiSearch.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/datasource/tempo/ServiceGraphSection.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterRenderer.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/plugins/datasource/tempo/_importedDependencies/datasources/loki/LanguageProvider.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/tempo/_importedDependencies/datasources/loki/monaco-query-field/MonacoQueryField.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"] - ], - "public/app/plugins/datasource/tempo/_importedDependencies/datasources/loki/monaco-query-field/monaco-completion-provider/CompletionDataProvider.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], - "public/app/plugins/datasource/tempo/_importedDependencies/datasources/loki/monaco-query-field/monaco-completion-provider/index.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] - ], - "public/app/plugins/datasource/tempo/_importedDependencies/datasources/loki/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"] - ], "public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/language_utils.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -5661,12 +5466,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "public/app/plugins/datasource/tempo/_importedDependencies/store.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, "Unexpected any. Specify a different type.", "3"] - ], "public/app/plugins/datasource/tempo/_importedDependencies/test/helpers/createFetchResponse.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] @@ -5675,12 +5474,11 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/plugins/datasource/tempo/datasource.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "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.", "0"], + [0, 0, 0, "Do not use any type assertions.", "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.", "4"] ], "public/app/plugins/datasource/tempo/language_provider.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -5713,38 +5511,10 @@ exports[`better eslint`] = { "public/app/plugins/datasource/zipkin/utils/transforms.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/plugins/panel/alertGroups/AlertGroup.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"], - [0, 0, 0, "Styles should be written using objects.", "4"], - [0, 0, 0, "Styles should be written using objects.", "5"], - [0, 0, 0, "Styles should be written using objects.", "6"] - ], "public/app/plugins/panel/alertlist/AlertInstances.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"] ], - "public/app/plugins/panel/alertlist/AlertList.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, "Styles should be written using objects.", "3"], - [0, 0, 0, "Styles should be written using objects.", "4"], - [0, 0, 0, "Styles should be written using objects.", "5"], - [0, 0, 0, "Styles should be written using objects.", "6"], - [0, 0, 0, "Styles should be written using objects.", "7"], - [0, 0, 0, "Styles should be written using objects.", "8"], - [0, 0, 0, "Styles should be written using objects.", "9"], - [0, 0, 0, "Styles should be written using objects.", "10"], - [0, 0, 0, "Styles should be written using objects.", "11"], - [0, 0, 0, "Styles should be written using objects.", "12"] - ], - "public/app/plugins/panel/alertlist/AlertListMigrationHandler.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/alertlist/UnifiedAlertList.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"], @@ -5904,12 +5674,6 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "3"], [0, 0, 0, "Styles should be written using objects.", "4"] ], - "public/app/plugins/panel/gettingstarted/components/Step.tsx:5381": [ - [0, 0, 0, "Styles should be written using objects.", "0"], - [0, 0, 0, "Styles should be written using objects.", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"] - ], "public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx:5381": [ [0, 0, 0, "Styles should be written using objects.", "0"], [0, 0, 0, "Styles should be written using objects.", "1"], @@ -5954,8 +5718,8 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "15"], [0, 0, 0, "Do not use any type assertions.", "16"] ], - "public/app/plugins/panel/histogram/Histogram.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] + "public/app/plugins/panel/histogram/migrations.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/plugins/panel/live/LiveChannelEditor.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], @@ -5971,9 +5735,6 @@ exports[`better eslint`] = { [0, 0, 0, "Styles should be written using objects.", "6"], [0, 0, 0, "Styles should be written using objects.", "7"] ], - "public/app/plugins/panel/live/types.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "public/app/plugins/panel/logs/LogsPanel.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -6184,6 +5945,32 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "9"], [0, 0, 0, "Do not use any type assertions.", "10"] ], + "public/app/plugins/panel/xychart/v2/SeriesEditor.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"] + ], + "public/app/plugins/panel/xychart/v2/migrations.ts: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/xychart/v2/scatter.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, "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"], + [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"] + ], + "public/app/plugins/panel/xychart/v2/utils.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + ], "public/app/store/configureStore.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -6359,6 +6146,9 @@ exports[`no undocumented stories`] = { exports[`no gf-form usage`] = { value: `{ + "e2e/scenes/utils/flows/addDataSource.ts:5381": [ + [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] + ], "e2e/utils/flows/addDataSource.ts:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], @@ -6518,9 +6308,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], - "plugins-bundled/internal/input-datasource/src/InputConfigEditor.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], "public/app/angular/components/code_editor/code_editor.ts:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], @@ -6628,85 +6415,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], - "public/app/features/alerting/AlertRuleList.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], - "public/app/features/alerting/partials/alert_tab.html:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], "public/app/features/annotations/partials/event_editor.html:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], @@ -6851,9 +6559,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], - "public/app/plugins/datasource/cloud-monitoring/components/AnnotationsHelp.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], "public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.tsx:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], @@ -6861,7 +6566,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], "public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryEditor.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], "public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryField.tsx:5381": [ @@ -6869,12 +6573,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], - "public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryFieldOld.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], "public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupNamesSelection.tsx:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] @@ -6903,13 +6601,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], "public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], "public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx:5381": [ @@ -6943,14 +6634,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], - "public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], - "public/app/plugins/datasource/loki/components/LokiOptionFields.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], "public/app/plugins/datasource/loki/components/LokiQueryField.tsx:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], @@ -7065,11 +6748,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], - "public/app/plugins/datasource/tempo/_importedDependencies/datasources/loki/LokiQueryField.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] - ], "public/app/plugins/datasource/zipkin/QueryField.tsx:5381": [ [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] diff --git a/.betterer.results.json b/.betterer.results.json index 4dd7405a36d..d5db475d6b1 100644 --- a/.betterer.results.json +++ b/.betterer.results.json @@ -1028,12 +1028,6 @@ "count": 5 } ], - "/packages/grafana-ui/src/components/Splitter/Splitter.tsx": [ - { - "message": "Do not use any type assertions.", - "count": 1 - } - ], "/packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx": [ { "message": "Unexpected any. Specify a different type.", @@ -1564,12 +1558,6 @@ "count": 1 } ], - "/public/app/core/specs/time_series.test.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 1 - } - ], "/public/app/core/time_series2.ts": [ { "message": "Unexpected any. Specify a different type.", @@ -1790,12 +1778,6 @@ "count": 1 } ], - "/public/app/features/alerting/unified/AlertsFolderView.test.tsx": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 1 - } - ], "/public/app/features/alerting/unified/AlertsFolderView.tsx": [ { "message": "Styles should be written using objects.", @@ -2930,12 +2912,6 @@ "count": 1 } ], - "/public/app/features/dashboard-scene/panel-edit/VizPanelManager.test.tsx": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 1 - } - ], "/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx": [ { "message": "Use data-testid for E2E selectors instead of aria-label", @@ -2954,12 +2930,6 @@ "count": 1 } ], - "/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 1 - } - ], "/public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx": [ { "message": "Unexpected any. Specify a different type.", @@ -2970,18 +2940,6 @@ "count": 1 } ], - "/public/app/features/dashboard-scene/scene/setDashboardPanelContext.test.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 1 - } - ], - "/public/app/features/dashboard-scene/serialization/angularMigration.test.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 2 - } - ], "/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts": [ { "message": "Unexpected any. Specify a different type.", @@ -3055,7 +3013,7 @@ "/public/app/features/dashboard/components/DashExportModal/DashboardExporter.test.ts": [ { "message": "Unexpected any. Specify a different type.", - "count": 21 + "count": 6 } ], "/public/app/features/dashboard/components/DashExportModal/DashboardExporter.ts": [ @@ -3441,7 +3399,7 @@ "/public/app/features/dashboard/state/DashboardMigrator.test.ts": [ { "message": "Unexpected any. Specify a different type.", - "count": 19 + "count": 12 } ], "/public/app/features/dashboard/state/DashboardMigrator.ts": [ @@ -3457,7 +3415,7 @@ "/public/app/features/dashboard/state/DashboardModel.repeat.test.ts": [ { "message": "Unexpected any. Specify a different type.", - "count": 7 + "count": 4 } ], "/public/app/features/dashboard/state/DashboardModel.test.ts": [ @@ -3507,7 +3465,7 @@ "/public/app/features/dashboard/state/initDashboard.test.ts": [ { "message": "Unexpected any. Specify a different type.", - "count": 2 + "count": 1 } ], "/public/app/features/dashboard/utils/getPanelMenu.test.ts": [ @@ -3880,12 +3838,6 @@ "count": 1 } ], - "/public/app/features/explore/TraceView/components/TracePageHeader/Actions/TracePageActions.tsx": [ - { - "message": "Styles should be written using objects.", - "count": 2 - } - ], "/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.tsx": [ { "message": "Styles should be written using objects.", @@ -3937,7 +3889,7 @@ "/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.tsx": [ { "message": "Styles should be written using objects.", - "count": 13 + "count": 9 } ], "/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBarRow.tsx": [ @@ -4643,7 +4595,7 @@ "/public/app/features/plugins/tests/datasource_srv.test.ts": [ { "message": "Unexpected any. Specify a different type.", - "count": 4 + "count": 3 } ], "/public/app/features/plugins/utils.ts": [ @@ -4743,7 +4695,7 @@ "/public/app/features/query/state/updateQueries.test.ts": [ { "message": "Unexpected any. Specify a different type.", - "count": 12 + "count": 11 } ], "/public/app/features/search/page/components/ActionRow.tsx": [ @@ -5103,7 +5055,7 @@ "/public/app/features/transformers/prepareTimeSeries/prepareTimeSeries.test.ts": [ { "message": "Unexpected any. Specify a different type.", - "count": 2 + "count": 1 } ], "/public/app/features/transformers/prepareTimeSeries/prepareTimeSeries.ts": [ @@ -5266,12 +5218,6 @@ "count": 1 } ], - "/public/app/features/variables/query/QueryVariableEditor.test.tsx": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 1 - } - ], "/public/app/features/variables/query/QueryVariableEditor.tsx": [ { "message": "Unexpected any. Specify a different type.", @@ -5309,7 +5255,7 @@ "/public/app/features/variables/query/queryRunners.test.ts": [ { "message": "Unexpected any. Specify a different type.", - "count": 7 + "count": 1 } ], "/public/app/features/variables/query/queryRunners.ts": [ @@ -7104,46 +7050,6 @@ "count": 2 } ], - "/public/app/plugins/panel/table-old/column_options.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 22 - } - ], - "/public/app/plugins/panel/table-old/editor.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 9 - } - ], - "/public/app/plugins/panel/table-old/module.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 12 - } - ], - "/public/app/plugins/panel/table-old/renderer.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 12 - }, - { - "message": "Do not use any type assertions.", - "count": 1 - } - ], - "/public/app/plugins/panel/table-old/transformers.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 9 - } - ], - "/public/app/plugins/panel/table-old/types.ts": [ - { - "message": "Unexpected any. Specify a different type.", - "count": 13 - } - ], "/public/app/plugins/panel/table/TablePanel.tsx": [ { "message": "Styles should be written using objects.", diff --git a/.bingo/Variables.mk b/.bingo/Variables.mk index 2c9eb124234..c6a5d32a428 100644 --- a/.bingo/Variables.mk +++ b/.bingo/Variables.mk @@ -2,12 +2,7 @@ # All tools are designed to be build inside $GOBIN. BINGO_DIR := $(dir $(lastword $(MAKEFILE_LIST))) GOPATH ?= $(shell go env GOPATH) -ifeq ($(OS),Windows_NT) - PATHSEP := $(if $(COMSPEC),;,:) - GOBIN ?= $(firstword $(subst $(PATHSEP), ,$(subst \,/,${GOPATH})))/bin -else - GOBIN ?= $(firstword $(subst :, ,${GOPATH}))/bin -endif +GOBIN ?= $(firstword $(subst :, ,${GOPATH}))/bin GO ?= $(shell which go) # Below generated variables ensure that every time a tool under each variable is invoked, the correct version @@ -40,11 +35,11 @@ $(DRONE): $(BINGO_DIR)/drone.mod @echo "(re)installing $(GOBIN)/drone-v1.5.0" @cd $(BINGO_DIR) && GOWORK=off CGO_ENABLED=0 $(GO) build -mod=mod -modfile=drone.mod -o=$(GOBIN)/drone-v1.5.0 "github.com/drone/drone-cli/drone" -GOLANGCI_LINT := $(GOBIN)/golangci-lint-v1.53.3 +GOLANGCI_LINT := $(GOBIN)/golangci-lint-v1.57.1 $(GOLANGCI_LINT): $(BINGO_DIR)/golangci-lint.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/golangci-lint-v1.53.3" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=golangci-lint.mod -o=$(GOBIN)/golangci-lint-v1.53.3 "github.com/golangci/golangci-lint/cmd/golangci-lint" + @echo "(re)installing $(GOBIN)/golangci-lint-v1.57.1" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=golangci-lint.mod -o=$(GOBIN)/golangci-lint-v1.57.1 "github.com/golangci/golangci-lint/cmd/golangci-lint" JB := $(GOBIN)/jb-v0.5.1 $(JB): $(BINGO_DIR)/jb.mod @@ -64,9 +59,3 @@ $(SWAGGER): $(BINGO_DIR)/swagger.mod @echo "(re)installing $(GOBIN)/swagger-v0.30.2" @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=swagger.mod -o=$(GOBIN)/swagger-v0.30.2 "github.com/go-swagger/go-swagger/cmd/swagger" -WIRE := $(GOBIN)/wire-v0.5.0 -$(WIRE): $(BINGO_DIR)/wire.mod - @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/wire-v0.5.0" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=wire.mod -o=$(GOBIN)/wire-v0.5.0 "github.com/google/wire/cmd/wire" - diff --git a/.bingo/golangci-lint.mod b/.bingo/golangci-lint.mod index 6275d68be95..3eb46ed1e4c 100644 --- a/.bingo/golangci-lint.mod +++ b/.bingo/golangci-lint.mod @@ -1,5 +1,7 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT -go 1.20 +go 1.21 -require github.com/golangci/golangci-lint v1.53.3 // cmd/golangci-lint +toolchain go1.21.6 + +require github.com/golangci/golangci-lint v1.57.1 // cmd/golangci-lint diff --git a/.bingo/golangci-lint.sum b/.bingo/golangci-lint.sum index dea162a792e..c41da6943cb 100644 --- a/.bingo/golangci-lint.sum +++ b/.bingo/golangci-lint.sum @@ -42,22 +42,32 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/4meepo/tagalign v1.2.2 h1:kQeUTkFTaBRtd/7jm8OKJl9iHk0gAO+TDFPHGSna0aw= github.com/4meepo/tagalign v1.2.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= +github.com/4meepo/tagalign v1.3.3 h1:ZsOxcwGD/jP4U/aw7qeWu58i7dwYemfy5Y+IF1ACoNw= +github.com/4meepo/tagalign v1.3.3/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= github.com/Abirdcfly/dupword v0.0.9 h1:MxprGjKq3yDBICXDgEEsyGirIXfMYXkLNT/agPsE1tk= github.com/Abirdcfly/dupword v0.0.9/go.mod h1:PzmHVLLZ27MvHSzV7eFmMXSFArWXZPZmfuuziuUrf2g= github.com/Abirdcfly/dupword v0.0.11 h1:z6v8rMETchZXUIuHxYNmlUAuKuB21PeaSymTed16wgU= github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= +github.com/Abirdcfly/dupword v0.0.14 h1:3U4ulkc8EUo+CaT105/GJ1BQwtgyj6+VaBVbAX11Ba8= +github.com/Abirdcfly/dupword v0.0.14/go.mod h1:VKDAbxdY8YbKUByLGg8EETzYSuC4crm9WwI6Y3S0cLI= github.com/Antonboom/errname v0.1.7 h1:mBBDKvEYwPl4WFFNwec1CZO096G6vzK9vvDQzAwkako= github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU= github.com/Antonboom/errname v0.1.9 h1:BZDX4r3l4TBZxZ2o2LNrlGxSHran4d1u4veZdoORTT4= github.com/Antonboom/errname v0.1.9/go.mod h1:nLTcJzevREuAsgTbG85UsuiWpMpAqbKD1HNZ29OzE58= github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= +github.com/Antonboom/errname v0.1.12 h1:oh9ak2zUtsLp5oaEd/erjB4GPu9w19NyoIskZClDcQY= +github.com/Antonboom/errname v0.1.12/go.mod h1:bK7todrzvlaZoQagP1orKzWXv59X/x0W0Io2XT1Ssro= github.com/Antonboom/nilnil v0.1.1 h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q= github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= github.com/Antonboom/nilnil v0.1.3 h1:6RTbx3d2mcEu3Zwq9TowQpQMVpP75zugwOtqY1RTtcE= github.com/Antonboom/nilnil v0.1.3/go.mod h1:iOov/7gRcXkeEU+EMGpBu2ORih3iyVEiWjeste1SJm8= github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= +github.com/Antonboom/nilnil v0.1.7 h1:ofgL+BA7vlA1K2wNQOsHzLJ2Pw5B5DpWRLdDAVvvTow= +github.com/Antonboom/nilnil v0.1.7/go.mod h1:TP+ScQWVEq0eSIxqU8CbdT5DFWoHp0MbP+KMUO1BKYQ= +github.com/Antonboom/testifylint v1.2.0 h1:015bxD8zc5iY8QwTp4+RG9I4kIbqwvGX9TrBbb7jGdM= +github.com/Antonboom/testifylint v1.2.0/go.mod h1:rkmEqjqVnHDRNsinyN6fPSLnoajzFwsCcguJgwADBkw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -68,12 +78,18 @@ github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rW github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0 h1:sATXp1x6/axKxz2Gjxv8MALP0bXaNRfQinEwyfMcx8c= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0/go.mod h1:Nl76DrGNJTA1KJ0LePKBw/vznBX1EHbAZX8mwjR82nI= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZdunyA= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= +github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSwwlWcT5a2FGK0c= +github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -81,6 +97,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= +github.com/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg= +github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= @@ -91,6 +109,8 @@ github.com/ashanbrown/forbidigo v1.5.1 h1:WXhzLjOlnuDYPYQo/eFlcFMi8X/kLfvWLYu6CS github.com/ashanbrown/forbidigo v1.5.1/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/forbidigo v1.5.3 h1:jfg+fkm/snMx+V9FBwsl1d340BV/99kZGv5jN9hBoXk= github.com/ashanbrown/forbidigo v1.5.3/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= +github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= +github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -105,20 +125,32 @@ github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= +github.com/bombsimon/wsl/v4 v4.2.1 h1:Cxg6u+XDWff75SIFFmNsqnIOgob+Q9hG6y/ioKbRFiM= +github.com/bombsimon/wsl/v4 v4.2.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo= github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI= github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= +github.com/breml/bidichk v0.2.7 h1:dAkKQPLl/Qrk7hnP6P+E0xOodrq8Us7+U0o4UBOAlQY= +github.com/breml/bidichk v0.2.7/go.mod h1:YodjipAGI9fGcYM7II6wFvGhdMYsC5pHDlGzqvEW3tQ= github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw= github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= +github.com/breml/errchkjson v0.3.6 h1:VLhVkqSBH96AvXEyclMR37rZslRrY2kcyq+31HCsVrA= +github.com/breml/errchkjson v0.3.6/go.mod h1:jhSDoFheAF2RSDOlCfhHO9KqhZgAYLyvHe7bRCX8f/U= github.com/butuzov/ireturn v0.1.1 h1:QvrO2QF2+/Cx1WA/vETCIYBKtRjc30vesdoPUNo1EbY= github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0= +github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA= github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= +github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc= +github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50= +github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= +github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -131,9 +163,13 @@ github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 h1:cy5GCEZLUCshCGC github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348/go.mod h1:f/miWtG3SSuTxKsNK3o58H1xl+XV6ZIfbC6p7lPPB8U= github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= +github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= +github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/ckaznocha/intrange v0.1.0 h1:ZiGBhvrdsKpoEfzh9CjBfDSZof6QB0ORY5tXasUtiew= +github.com/ckaznocha/intrange v0.1.0/go.mod h1:Vwa9Ekex2BrEQMg6zlrWwbs/FtYw7eS5838Q7UjK7TQ= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -145,11 +181,15 @@ github.com/daixiang0/gci v0.9.1 h1:jBrwBmBZTDsGsXiaCTLIe9diotp1X4X64zodFrh7l+c= github.com/daixiang0/gci v0.9.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= github.com/daixiang0/gci v0.10.1 h1:eheNA3ljF6SxnPD/vE4lCBusVHmV3Rs3dkKvFrJ7MR0= github.com/daixiang0/gci v0.10.1/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= +github.com/daixiang0/gci v0.12.3 h1:yOZI7VAxAGPQmkb1eqt5g/11SUlwoat1fSblGLmdiQc= +github.com/daixiang0/gci v0.12.3/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= +github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= +github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -160,10 +200,14 @@ github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStB github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= +github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= +github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= @@ -172,12 +216,16 @@ github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwV github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/ghostiam/protogetter v0.3.5 h1:+f7UiF8XNd4w3a//4DnusQ2SZjPkUjxkMEfjbxOK4Ug= +github.com/ghostiam/protogetter v0.3.5/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= github.com/go-critic/go-critic v0.6.7 h1:1evPrElnLQ2LZtJfmNDzlieDhjnq36SLgNzisx06oPM= github.com/go-critic/go-critic v0.6.7/go.mod h1:fYZUijFdcnxgx6wPjQA2QEjIRaNCT0gO8bhexy6/QmE= github.com/go-critic/go-critic v0.7.0 h1:tqbKzB8pqi0NsRZ+1pyU4aweAF7A7QN0Pi4Q02+rYnQ= github.com/go-critic/go-critic v0.7.0/go.mod h1:moYzd7GdVXE2C2hYTwd7h0CPcqlUeclsyBRwMa38v64= github.com/go-critic/go-critic v0.8.1 h1:16omCF1gN3gTzt4j4J6fKI/HnRojhEp+Eks6EuKw3vw= github.com/go-critic/go-critic v0.8.1/go.mod h1:kpzXl09SIJX1cr9TB/g/sAG+eFEl7ZS9f9cqvZtyNl0= +github.com/go-critic/go-critic v0.11.2 h1:81xH/2muBphEgPtcwH1p6QD+KzXl2tMSi3hXjBSxDnM= +github.com/go-critic/go-critic v0.11.2/go.mod h1:OePaicfjsf+KPy33yq4gzv6CO7TEQ9Rom6ns1KsJnl8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -198,6 +246,8 @@ github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/ github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= +github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= @@ -207,6 +257,8 @@ github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQi github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= @@ -242,6 +294,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= @@ -250,22 +304,34 @@ github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6 github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= +github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e h1:ULcKCDV1LOZPFxGZaA6TlQbiM3J2GCPnkx/bGF6sX/g= +github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e/go.mod h1:Pm5KhLPA8gSnQwrQ6ukebRcapGb/BG9iUkdaiCcGHJM= github.com/golangci/golangci-lint v1.51.2 h1:yIcsT1X9ZYHdSpeWXRT1ORC/FPGSqDHbHsu9uk4FK7M= github.com/golangci/golangci-lint v1.51.2/go.mod h1:KH9Q7/3glwpYSknxUgUyLlAv46A8fsSKo1hH2wDvkr8= github.com/golangci/golangci-lint v1.52.2 h1:FrPElUUI5rrHXg1mQ7KxI1MXPAw5lBVskiz7U7a8a1A= github.com/golangci/golangci-lint v1.52.2/go.mod h1:S5fhC5sHM5kE22/HcATKd1XLWQxX+y7mHj8B5H91Q/0= github.com/golangci/golangci-lint v1.53.3 h1:CUcRafczT4t1F+mvdkUm6KuOpxUZTl0yWN/rSU6sSMo= github.com/golangci/golangci-lint v1.53.3/go.mod h1:W4Gg3ONq6p3Jl+0s/h9Gr0j7yEgHJWWZO2bHl2tBUXM= +github.com/golangci/golangci-lint v1.57.1 h1:cqhpzkzjDwdN12rfMf1SUyyKyp88a1SltNqEYGS0nJw= +github.com/golangci/golangci-lint v1.57.1/go.mod h1:zLcHhz3NHc88T5zV2j75lyc0zH3LdOPOybblYa4p0oI= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+a0= github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= +github.com/golangci/misspell v0.4.1 h1:+y73iSicVy2PqyX7kmUefHusENlrP9YwuHZHPLGQj/g= +github.com/golangci/misspell v0.4.1/go.mod h1:9mAN1quEo3DlpbaIKKyEvRxK1pwqR9s/Sea1bJCtlNI= +github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= +github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= +github.com/golangci/revgrep v0.5.2 h1:EndcWoRhcnfj2NHQ+28hyuXpLMF+dQmCN+YaeeIl4FU= +github.com/golangci/revgrep v0.5.2/go.mod h1:bjAMA+Sh/QUfTDcHzxfyHxr4xKvllVr/0sCv2e7jJHA= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -282,6 +348,8 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -305,6 +373,8 @@ github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 h1:9alfqbr github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= +github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= @@ -339,10 +409,14 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jgautheron/goconst v1.7.0 h1:cEqH+YBKLsECnRSd4F4TK5ri8t/aXtt/qoL0Ft252B0= +github.com/jgautheron/goconst v1.7.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jjti/go-spancheck v0.5.3 h1:vfq4s2IB8T3HvbpiwDTYgVPj1Ze/ZSXrTtaZRTc7CuM= +github.com/jjti/go-spancheck v0.5.3/go.mod h1:eQdOX1k3T+nAKvZDyLC3Eby0La4dZ+I19iOl5NzSPFE= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -358,8 +432,12 @@ github.com/junk1tm/musttag v0.4.5 h1:d+mpJ1vn6WFEVKHwkgJiIedis1u/EawKOuUTygAUtCo github.com/junk1tm/musttag v0.4.5/go.mod h1:XkcL/9O6RmD88JBXb+I15nYRl9W4ExhgQeCBEhfMC8U= github.com/junk1tm/musttag v0.5.0 h1:bV1DTdi38Hi4pG4OVWa7Kap0hi0o7EczuK6wQt9zPOM= github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= +github.com/karamaru-alpha/copyloopvar v1.0.8 h1:gieLARwuByhEMxRwM3GRS/juJqFbLraftXIKDDNJ50Q= +github.com/karamaru-alpha/copyloopvar v1.0.8/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0= +github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.3 h1:l4pNvrb8JSwRd51ojtcOxOeHJzHek+MtOyXbaR0uvmw= @@ -379,6 +457,8 @@ github.com/kunwardeep/paralleltest v1.0.6 h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoa github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= github.com/kunwardeep/paralleltest v1.0.7 h1:2uCk94js0+nVNQoHZNLBkAR1DQJrVzw6T0RMzJn55dQ= github.com/kunwardeep/paralleltest v1.0.7/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs= +github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= @@ -391,6 +471,8 @@ github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= +github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= @@ -409,6 +491,8 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= @@ -421,6 +505,8 @@ github.com/mgechev/revive v1.3.1 h1:OlQkcH40IB2cGuprTPcjB0iIUddgVZgGmDX3IAMR8D4= github.com/mgechev/revive v1.3.1/go.mod h1:YlD6TTWl2B8A103R9KWJSPVI9DrEf+oqr15q21Ld+5I= github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= +github.com/mgechev/revive v1.3.7 h1:502QY0vQGe9KtYJ9FpxMz9rL+Fc/P13CI5POL4uHCcE= +github.com/mgechev/revive v1.3.7/go.mod h1:RJ16jUbF0OWC3co/+XTxmFNgEpUPwnnA0BRllX2aDNA= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -444,6 +530,8 @@ github.com/nishanths/exhaustive v0.9.5 h1:TzssWan6orBiLYVqewCG8faud9qlFntJE30ACp github.com/nishanths/exhaustive v0.9.5/go.mod h1:IbwrGdVMizvDcIxPYGVdQn5BqWJaOwpCvg4RGb8r/TA= github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= +github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= +github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.8.1 h1:/y4o/0hV+ruUHj4xXh89xlFjoaitnI4LnkpuYs02q1c= @@ -452,6 +540,8 @@ github.com/nunnatsa/ginkgolinter v0.9.0 h1:Sm0zX5QfjJzkeCjEp+t6d3Ha0jwvoDjleP9XC github.com/nunnatsa/ginkgolinter v0.9.0/go.mod h1:FHaMLURXP7qImeH6bvxWJUpyH+2tuqe5j4rW1gxJRmI= github.com/nunnatsa/ginkgolinter v0.12.1 h1:vwOqb5Nu05OikTXqhvLdHCGcx5uthIYIl0t79UVrERQ= github.com/nunnatsa/ginkgolinter v0.12.1/go.mod h1:AK8Ab1PypVrcGUusuKD8RDcl2KgsIwvNaaxAlyHSzso= +github.com/nunnatsa/ginkgolinter v0.16.1 h1:uDIPSxgVHZ7PgbJElRDGzymkXH+JaF7mjew+Thjnt6Q= +github.com/nunnatsa/ginkgolinter v0.16.1/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= @@ -463,6 +553,8 @@ github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3v github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= +github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -476,6 +568,8 @@ github.com/polyfloyd/go-errorlint v1.4.0 h1:b+sQ5HibPIAjEZwtuwU8Wz/u0dMZ7YL+bk+9 github.com/polyfloyd/go-errorlint v1.4.0/go.mod h1:qJCkPeBn+0EXkdKTrUCcuFStM2xrDKfxI3MGLXPexUs= github.com/polyfloyd/go-errorlint v1.4.2 h1:CU+O4181IxFDdPH6t/HT7IiDj1I7zxNi1RIUxYwn8d0= github.com/polyfloyd/go-errorlint v1.4.2/go.mod h1:k6fU/+fQe38ednoZS51T7gSIGQW1y94d6TkSr35OzH8= +github.com/polyfloyd/go-errorlint v1.4.8 h1:jiEjKDH33ouFktyez7sckv6pHWif9B7SuS8cutDXFHw= +github.com/polyfloyd/go-errorlint v1.4.8/go.mod h1:NNCxFcFjZcw3xNjVdCchERkEM6Oz7wta2XJVxRftwO4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -500,6 +594,8 @@ github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= +github.com/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs= +github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= @@ -512,18 +608,28 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= +github.com/ryancurrah/gomodguard v1.3.1 h1:fH+fUg+ngsQO0ruZXXHnA/2aNllWA1whly4a6UvyzGE= +github.com/ryancurrah/gomodguard v1.3.1/go.mod h1:DGFHzEhi6iJ0oIDfMuo3TgrS+L9gZvrEfmjjuelnRU0= github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= +github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= +github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= +github.com/sashamelentyev/usestdlibvars v1.25.0 h1:IK8SI2QyFzy/2OD2PYnhy84dpfNo9qADrRt6LH8vSzU= +github.com/sashamelentyev/usestdlibvars v1.25.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= github.com/securego/gosec/v2 v2.15.0 h1:v4Ym7FF58/jlykYmmhZ7mTm7FQvN/setNm++0fgIAtw= github.com/securego/gosec/v2 v2.15.0/go.mod h1:VOjTrZOkUtSDt2QLSJmQBMWnvwiQPEjg0l+5juIqGk8= github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= +github.com/securego/gosec/v2 v2.19.0 h1:gl5xMkOI0/E6Hxx0XCY2XujA3V7SNSefA8sC+3f1gnk= +github.com/securego/gosec/v2 v2.19.0/go.mod h1:hOkDcHz9J/XIgIlPDXalxjeVYsHxoWUc5zJSHxcB8YM= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= @@ -551,6 +657,8 @@ github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCp github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= @@ -572,6 +680,8 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -586,6 +696,8 @@ github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= @@ -598,6 +710,8 @@ github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/tetafro/godot v1.4.16 h1:4ChfhveiNLk4NveAZ9Pu2AN8QZ2nkUGFuadM9lrr5D0= +github.com/tetafro/godot v1.4.16/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e h1:MV6KaVu/hzByHP0UvJ4HcMGE/8a6A4Rggc/0wx2AvJo= github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= @@ -610,22 +724,34 @@ github.com/tomarrell/wrapcheck/v2 v2.8.0 h1:qDzbir0xmoE+aNxGCPrn+rUSxAX+nG6vREgb github.com/tomarrell/wrapcheck/v2 v2.8.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= +github.com/tomarrell/wrapcheck/v2 v2.8.3 h1:5ov+Cbhlgi7s/a42BprYoxsr73CbdMUTzE3bRDFASUs= +github.com/tomarrell/wrapcheck/v2 v2.8.3/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= +github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/ultraware/whitespace v0.1.0 h1:O1HKYoh0kIeqE8sFqZf1o0qbORXUCOQFrlaQyZsczZw= +github.com/ultraware/whitespace v0.1.0/go.mod h1:/se4r3beMFNmewJ4Xmz0nMQ941GJt+qmSHGP9emHYe0= github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= +github.com/uudashr/gocognit v1.1.2 h1:l6BAEKJqQH2UpKAPKdMfZf5kE4W/2xk8pfU1OVLvniI= +github.com/uudashr/gocognit v1.1.2/go.mod h1:aAVdLURqcanke8h3vg35BC++eseDm66Z7KmchI5et4k= github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= +github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= +github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= github.com/ykadowak/zerologlint v0.1.2 h1:Um4P5RMmelfjQqQJKtE8ZW+dLZrXrENeIzWWKw800U4= github.com/ykadowak/zerologlint v0.1.2/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= +github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= +github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -635,6 +761,12 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= +gitlab.com/bosi/decorder v0.4.1 h1:VdsdfxhstabyhZovHafFw+9eJ6eU0d2CkFNJcZz/NU4= +gitlab.com/bosi/decorder v0.4.1/go.mod h1:jecSqWUew6Yle1pCr2eLWTensJMmsxHsBwt+PVbkAqA= +go-simpler.org/musttag v0.9.0 h1:Dzt6/tyP9ONr5g9h9P3cnYWCxeBFRkd0uJL/w+1Mxos= +go-simpler.org/musttag v0.9.0/go.mod h1:gA9nThnalvNSKpEoyp3Ko4/vCX2xTpqKoUtNqXOnVR4= +go-simpler.org/sloglint v0.5.0 h1:2YCcd+YMuYpuqthCgubcF5lBSjb6berc5VMOYUHKrpY= +go-simpler.org/sloglint v0.5.0/go.mod h1:EUknX5s8iXqf18KQxKnaBHUPVriiPnOrPjjJcsaTcSQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -645,6 +777,8 @@ go.tmz.dev/musttag v0.7.0 h1:QfytzjTWGXZmChoX0L++7uQN+yRCPfyFm+whsM+lfGc= go.tmz.dev/musttag v0.7.0/go.mod h1:oTFPvgOkJmp5kYL02S8+jrH0eLrBIl57rzWeA26zDEM= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= @@ -675,11 +809,15 @@ golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfU golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9 h1:6WHiuFL9FNjg8RljAaT7FNUuKDbvMqS1i5cr2OE2sLQ= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8= +golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -715,6 +853,8 @@ golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -783,6 +923,8 @@ golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -847,6 +989,8 @@ golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -870,6 +1014,8 @@ golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -954,6 +1100,8 @@ golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1050,6 +1198,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1080,16 +1230,22 @@ honnef.co/go/tools v0.4.2 h1:6qXr+R5w+ktL5UkwEbPp+fEvfyoMPche6GkOpGHZcLc= honnef.co/go/tools v0.4.2/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= +honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs= +honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= +mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= +mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= +mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14 h1:zCr3iRRgdk5eIikZNDphGcM6KGVTx3Yu+/Uu9Es254w= +mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14/go.mod h1:ZzZjEpJDOmx8TdVU6umamY3Xy0UAQUI2DHbf05USVbI= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/.bingo/variables.env b/.bingo/variables.env index cf844231b92..c48e144db22 100644 --- a/.bingo/variables.env +++ b/.bingo/variables.env @@ -14,7 +14,7 @@ CUE="${GOBIN}/cue-v0.5.0" DRONE="${GOBIN}/drone-v1.5.0" -GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.53.3" +GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.57.1" JB="${GOBIN}/jb-v0.5.1" @@ -22,5 +22,3 @@ LEFTHOOK="${GOBIN}/lefthook-v1.4.8" SWAGGER="${GOBIN}/swagger-v0.30.2" -WIRE="${GOBIN}/wire-v0.5.0" - diff --git a/.bingo/wire.mod b/.bingo/wire.mod deleted file mode 100644 index fdfc21a466f..00000000000 --- a/.bingo/wire.mod +++ /dev/null @@ -1,5 +0,0 @@ -module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT - -go 1.16 - -require github.com/google/wire v0.6.0 // cmd/wire diff --git a/.bingo/wire.sum b/.bingo/wire.sum deleted file mode 100644 index be6e646d063..00000000000 --- a/.bingo/wire.sum +++ /dev/null @@ -1,66 +0,0 @@ -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8= -github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= -github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b h1:NVD8gBK33xpdqCaZVVtd6OFJp+3dxkXuz7+U7KaVN6s= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/.bra.toml b/.bra.toml index e76c9fd6209..b57cf283edc 100644 --- a/.bra.toml +++ b/.bra.toml @@ -1,6 +1,5 @@ [run] init_cmds = [ - ["GO_BUILD_DEV=1", "make", "gen-go"], ["GO_BUILD_DEV=1", "make", "build-go"], ["make", "gen-jsonnet"], ["./bin/grafana", "server", "-packaging=dev", "cfg:app_mode=development"] @@ -17,7 +16,6 @@ watch_exts = [".go", ".ini", ".toml", ".template.html"] ignore_files = [".*_gen.go"] build_delay = 1500 cmds = [ - ["GO_BUILD_DEV=1", "make", "gen-go"], ["GO_BUILD_DEV=1", "make", "build-go"], ["make", "gen-jsonnet"], ["./bin/grafana", "server", "-packaging=dev", "cfg:app_mode=development"] diff --git a/.changelog-archive/CHANGELOG.2.md b/.changelog-archive/CHANGELOG.2.md index 34491f2731f..7fc14a683dc 100644 --- a/.changelog-archive/CHANGELOG.2.md +++ b/.changelog-archive/CHANGELOG.2.md @@ -105,7 +105,7 @@ - Notice to makers/users of custom data sources, there is a minor breaking change in 2.2 that require an update to custom data sources for them to work in 2.2. [Read this doc](https://github.com/grafana/grafana/tree/master/docs/sources/datasources/plugin_api.md) for more on the data source api change. -- Data source api changes, [PLUGIN_CHANGES.md](https://github.com/grafana/grafana/blob/master/public/app/plugins/PLUGIN_CHANGES.md) +- Data source api changes, [PLUGIN_CHANGES.md](https://github.com/grafana/grafana/blob/main/public/app/plugins/PLUGIN_CHANGES.md) - The duplicate query function used in data source editors is changed, and moveMetricQuery function was renamed **Tech (Note for devs)** diff --git a/.changelog-archive/CHANGELOG.3.md b/.changelog-archive/CHANGELOG.3.md index 12f18c31287..258aa1ce2e4 100644 --- a/.changelog-archive/CHANGELOG.3.md +++ b/.changelog-archive/CHANGELOG.3.md @@ -198,7 +198,7 @@ slack channel (link to slack channel in readme). ### Breaking changes -- **Plugin API**: Both data source and panel plugin api (and plugin.json schema) have been updated, requiring an update to plugins. See [plugin api](https://github.com/grafana/grafana/blob/master/public/app/plugins/plugin_api.md) for more info. +- **Plugin API**: Both data source and panel plugin api (and plugin.json schema) have been updated, requiring an update to plugins. See [plugin api](https://github.com/grafana/grafana/blob/main/public/app/plugins/plugin_api.md) for more info. - **InfluxDB 0.8.x** The data source for the old version of influxdb (0.8.x) is no longer included in default builds, but can easily be installed via improved plugin system, closes [#3523](https://github.com/grafana/grafana/issues/3523) - **KairosDB** The data source is no longer included in default builds, but can easily be installed via improved plugin system, closes [#3524](https://github.com/grafana/grafana/issues/3524) - **Templating**: Templating value formats (glob/regex/pipe etc) are now handled automatically and not specified by the user, this makes variable values possible to reuse in many contexts. It can in some edge cases break existing dashboards that have template variables that do not reload on dashboard load. To fix any issue just go into template variable options and update the variable (so it's values are reloaded.). diff --git a/.changelog-archive/CHANGELOG.4.md b/.changelog-archive/CHANGELOG.4.md index bb93963a2b4..e919c0c51e3 100644 --- a/.changelog-archive/CHANGELOG.4.md +++ b/.changelog-archive/CHANGELOG.4.md @@ -100,7 +100,7 @@ See [security announcement](https://community.grafana.com/t/grafana-5-2-3-and-4- ## Tech - **Go**: Grafana is now built using golang 1.9 -- **Webpack**: Changed from systemjs to webpack (see readme or building from source guide for new build instructions). Systemjs is still used to load plugins but now plugins can only import a limited set of dependencies. See [PLUGIN_DEV.md](https://github.com/grafana/grafana/blob/master/PLUGIN_DEV.md) for more details on how this can effect some plugins. +- **Webpack**: Changed from systemjs to webpack (see readme or building from source guide for new build instructions). Systemjs is still used to load plugins but now plugins can only import a limited set of dependencies. See [PLUGIN_DEV.md](https://github.com/grafana/grafana/blob/main/PLUGIN_DEV.md) for more details on how this can effect some plugins. # 4.5.2 (2017-09-22) diff --git a/.changelog-archive/CHANGELOG.6.md b/.changelog-archive/CHANGELOG.6.md index 4cfbded16ca..6d4ddfe0086 100644 --- a/.changelog-archive/CHANGELOG.6.md +++ b/.changelog-archive/CHANGELOG.6.md @@ -1291,4 +1291,4 @@ repo on July 1st. Make sure you have switched to the new repo by then. The new r - **Text Panel**: The text panel does no longer by default allow unsanitized HTML. [#4117](https://github.com/grafana/grafana/issues/4117). This means that if you have text panels with scripts tags they will no longer work as before. To enable unsafe javascript execution in text panels enable the settings `disable_sanitize_html` under the section `[panels]` in your Grafana ini file, or set env variable `GF_PANELS_DISABLE_SANITIZE_HTML=true`. - **Dashboard**: Panel property `minSpan` replaced by `maxPerRow`. Dashboard migration will automatically migrate all dashboard panels using the `minSpan` property to the new `maxPerRow` property [#12991](https://github.com/grafana/grafana/pull/12991) -For older release notes, refer to the [CHANGELOG_ARCHIVE.md](https://github.com/grafana/grafana/blob/master/CHANGELOG_ARCHIVE.md) +For older release notes, refer to the [CHANGELOG_ARCHIVE.md](https://github.com/grafana/grafana/blob/main/CHANGELOG_ARCHIVE.md) diff --git a/.changelog-archive/CHANGELOG.7.md b/.changelog-archive/CHANGELOG.7.md index baa857fcdfc..504788b7481 100644 --- a/.changelog-archive/CHANGELOG.7.md +++ b/.changelog-archive/CHANGELOG.7.md @@ -544,7 +544,7 @@ Issue [#29407](https://github.com/grafana/grafana/issues/29407) We have upgraded AngularJS from version 1.6.6 to 1.8.2. Due to this upgrade some old angular plugins might stop working and will require a small update. This is due to the deprecation and removal of pre-assigned bindings. So if your custom angular controllers expect component bindings in the controller constructor you need to move this code to an `$onInit` function. For more details on how to migrate AngularJS code open the [migration guide](https://docs.angularjs.org/guide/migration) and search for **pre-assigning bindings**. -In order not to break all angular panel plugins and data sources we have some custom [angular inject behavior](https://github.com/grafana/grafana/blob/master/public/app/core/injectorMonkeyPatch.ts) that makes sure that bindings for these controllers are still set before constructor is called so many old angular panels and data source plugins will still work. Issue [#28736](https://github.com/grafana/grafana/issues/28736) +In order not to break all angular panel plugins and data sources we have some custom [angular inject behavior](https://github.com/grafana/grafana/blob/main/public/app/core/injectorMonkeyPatch.ts) that makes sure that bindings for these controllers are still set before constructor is called so many old angular panels and data source plugins will still work. Issue [#28736](https://github.com/grafana/grafana/issues/28736) ### Deprecations @@ -1288,8 +1288,8 @@ This option to group query variable values into groups by tags has been an exper - **Datasource/Loki**: Support for [deprecated Loki endpoints](https://github.com/grafana/loki/blob/master/docs/api.md#lokis-http-api) has been removed. - **Backend plugins**: Grafana now requires backend plugins to be signed, otherwise Grafana will not load/start them. This is an additional security measure to make sure backend plugin binaries and files haven't been tampered with. Refer to [Upgrade Grafana](https://grafana.com/docs/grafana/latest/installation/upgrading/#upgrading-to-v7-0) for more information. - **Docker**: Our Ubuntu based images have been upgraded to Ubuntu [20.04 LTS](https://releases.ubuntu.com/20.04/). -- **@grafana/ui**: Forms migration notice, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/master/packages/grafana-ui/CHANGELOG.md) -- **@grafana/ui**: Select API change for creating custom values, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/master/packages/grafana-ui/CHANGELOG.md) +- **@grafana/ui**: Forms migration notice, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/main/packages/grafana-ui/CHANGELOG.md) +- **@grafana/ui**: Select API change for creating custom values, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/main/packages/grafana-ui/CHANGELOG.md) **Deprecation warnings** @@ -1304,7 +1304,7 @@ Not just visualizing data from anywhere, in Grafana 7 you can transform it too. Data transformations will provide a common set of data operations that were previously duplicated as custom features in many panels or data sources but are now an integral part of the Grafana data processing pipeline and something all data sources and panels can take advantage of. -In Grafana 7.0 we have a shared data model for both time series and table data that we call [DataFrame](https://github.com/grafana/grafana/blob/master/docs/sources/plugins/developing/dataframe.md). A DataFrame is like a table with columns but we refer to columns as fields. A time series is simply a DataFrame with two fields (time & value). +In Grafana 7.0 we have a shared data model for both time series and table data that we call [DataFrame](https://github.com/grafana/grafana/blob/main/docs/sources/plugins/developing/dataframe.md). A DataFrame is like a table with columns but we refer to columns as fields. A time series is simply a DataFrame with two fields (time & value). **Transformations shipping in 7.0** @@ -1414,7 +1414,7 @@ We have also extended the time zone options so you can select any of the standar ### Features / Enhancements - **Docker**: Upgrade to Alpine 3.11. [#24056](https://github.com/grafana/grafana/pull/24056), [@aknuds1](https://github.com/aknuds1) -- **Forms**: Remove Forms namespace [BREAKING]. Will cause all `Forms` imports to stop working. See migration guide in [@grafana/ui changelog](https://github.com/grafana/grafana/blob/master/packages/grafana-ui/CHANGELOG.md)[#24378](https://github.com/grafana/grafana/pull/24378), [@tskarhed](https://github.com/tskarhed) +- **Forms**: Remove Forms namespace [BREAKING]. Will cause all `Forms` imports to stop working. See migration guide in [@grafana/ui changelog](https://github.com/grafana/grafana/blob/main/packages/grafana-ui/CHANGELOG.md)[#24378](https://github.com/grafana/grafana/pull/24378), [@tskarhed](https://github.com/tskarhed) ### Bug Fixes @@ -1429,7 +1429,7 @@ We have also extended the time zone options so you can select any of the standar - **Removed PhantomJS**: PhantomJS was deprecated in [Grafana v6.4](https://grafana.com/docs/grafana/latest/guides/whats-new-in-v6-4/#phantomjs-deprecation) and starting from Grafana v7.0.0, all PhantomJS support has been removed. This means that Grafana no longer ships with a built-in image renderer, and we advise you to install the [Grafana Image Renderer plugin](https://grafana.com/grafana/plugins/grafana-image-renderer). - **Docker**: Our Ubuntu based images have been upgraded to Ubuntu [20.04 LTS](https://releases.ubuntu.com/20.04/). - **Dashboard**: A global minimum dashboard refresh interval is now enforced and defaults to 5 seconds. -- **@grafana/ui**: Forms migration notice, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/master/packages/grafana-ui/CHANGELOG.md) +- **@grafana/ui**: Forms migration notice, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/main/packages/grafana-ui/CHANGELOG.md) - **Interval calculation**: There is now a new option `Max data points` that controls the auto interval `$__interval` calculation. Interval was previously calculated by dividing the panel width by the time range. With the new max data points option it is now easy to set `$__interval` to a dynamic value that is time range agnostic. For example if you set `Max data points` to 10 Grafana will dynamically set `$__interval` by dividing the current time range by 10. - **Datasource/Loki**: Support for [deprecated Loki endpoints](https://github.com/grafana/loki/blob/master/docs/api.md#lokis-http-api) has been removed. @@ -1484,8 +1484,8 @@ We have also extended the time zone options so you can select any of the standar - **Removed PhantomJS**: PhantomJS was deprecated in [Grafana v6.4](https://grafana.com/docs/grafana/latest/guides/whats-new-in-v6-4/#phantomjs-deprecation) and starting from Grafana v7.0.0, all PhantomJS support has been removed. This means that Grafana no longer ships with a built-in image renderer, and we advise you to install the [Grafana Image Renderer plugin](https://grafana.com/grafana/plugins/grafana-image-renderer). - **Docker**: Our Ubuntu based images have been upgraded to Ubuntu [20.04 LTS](https://releases.ubuntu.com/20.04/). - **Dashboard**: A global minimum dashboard refresh interval is now enforced and defaults to 5 seconds. -- **@grafana/ui**: Forms migration notice, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/master/packages/grafana-ui/CHANGELOG.md) -- **@grafana/ui**: Select API change for creating custom values, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/master/packages/grafana-ui/CHANGELOG.md) +- **@grafana/ui**: Forms migration notice, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/main/packages/grafana-ui/CHANGELOG.md) +- **@grafana/ui**: Select API change for creating custom values, see [@grafana/ui changelog](https://github.com/grafana/grafana/blob/main/packages/grafana-ui/CHANGELOG.md) - **Interval calculation**: There is now a new option `Max data points` that controls the auto interval `$__interval` calculation. Interval was previously calculated by dividing the panel width by the time range. With the new max data points option it is now easy to set `$__interval` to a dynamic value that is time range agnostic. For example if you set `Max data points` to 10 Grafana will dynamically set `$__interval` by dividing the current time range by 10. - **Datasource/Loki**: Support for [deprecated Loki endpoints](https://github.com/grafana/loki/blob/master/docs/api.md#lokis-http-api) has been removed. diff --git a/.drone.yml b/.drone.yml index 66224525bb0..f4d661a8615 100644 --- a/.drone.yml +++ b/.drone.yml @@ -124,7 +124,7 @@ steps: name: identify-runner - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install @@ -226,7 +226,7 @@ steps: name: identify-runner - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install @@ -343,7 +343,8 @@ steps: name: wire-install - commands: - apk add --update build-base shared-mime-info shared-mime-info-lang - - go test -tags requires_buildifer -short -covermode=atomic -timeout=5m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -tags requires_buildifer -short -covermode=atomic + -timeout=5m depends_on: - wire-install image: golang:1.21.10-alpine @@ -365,6 +366,7 @@ trigger: - docs/** - '*.md' include: + - Makefile - pkg/** - packaging/** - .drone.yml @@ -461,6 +463,8 @@ trigger: - docs/** - '*.md' include: + - .golangci.toml + - Makefile - pkg/** - packaging/** - .drone.yml @@ -538,7 +542,7 @@ steps: name: wire-install - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install @@ -653,6 +657,59 @@ steps: - e2e/cloud-plugins-suite/azure-monitor.spec.ts repo: - grafana/grafana +- commands: + - sleep 10s + - yarn e2e:playwright + depends_on: + - grafana-server + environment: + HOST: grafana-server + PORT: "3001" + PROV_DIR: /grafana/scripts/grafana-server/tmp/conf/provisioning + image: mcr.microsoft.com/playwright:v1.42.1-jammy + name: playwright-plugin-e2e +- commands: + - apt-get update + - apt-get install -yq zip + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - gsutil cp -r ./playwright-report/. gs://releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report + - export E2E_PLAYWRIGHT_REPORT_URL=https://storage.googleapis.com/releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report/index.html + - "echo \"E2E Playwright report uploaded to: \n $${E2E_PLAYWRIGHT_REPORT_URL}\"" + depends_on: + - playwright-plugin-e2e + environment: + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + failure: ignore + image: google/cloud-sdk:431.0.0 + name: playwright-e2e-report-upload + when: + status: + - success + - failure +- commands: + - if [ ! -d ./playwright-report/trace ]; then echo 'all tests passed'; exit 0; fi + - export E2E_PLAYWRIGHT_REPORT_URL=https://storage.googleapis.com/releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report/index.html + - 'curl -L -X POST https://api.github.com/repos/grafana/grafana/issues/${DRONE_PULL_REQUEST}/comments + -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $${GITHUB_TOKEN}" + -H "X-GitHub-Api-Version: 2022-11-28" -d "{\"body\":\"❌ Failed to run Playwright + plugin e2e tests.

Click [here]($${E2E_PLAYWRIGHT_REPORT_URL}) to + browse the Playwright report and trace viewer.
For information on how to + run Playwright tests locally, refer to the [Developer guide](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#to-run-the-playwright-tests). + \"}"' + depends_on: + - playwright-e2e-report-upload + environment: + GITHUB_TOKEN: + from_secret: github_token + failure: ignore + image: byrnedo/alpine-curl:0.1.8 + name: playwright-e2e-report-post-link + when: + status: + - success + - failure - commands: - if [ -z `find ./e2e -type f -name *spec.ts.mp4` ]; then echo 'missing videos'; false; fi @@ -821,7 +878,7 @@ services: - commands: - /bin/mimir -target=backend -alertmanager.grafana-alertmanager-compatibility-enabled environment: {} - image: grafana/mimir:r274-1780c50 + image: us.gcr.io/kubernetes-dev/mimir:santihernandezc-remove_id_from_grafana_config-d3826b4f8-WIP name: mimir_backend - environment: {} image: redis:6.2.11-alpine @@ -964,7 +1021,8 @@ steps: - commands: - apk add --update build-base - go clean -testcache - - go test -run IntegrationRedis -covermode=atomic -timeout=2m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -run IntegrationRedis -covermode=atomic + -timeout=2m depends_on: - wire-install - wait-for-redis @@ -979,7 +1037,8 @@ steps: - commands: - apk add --update build-base - go clean -testcache - - go test -run IntegrationMemcached -covermode=atomic -timeout=2m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -run IntegrationMemcached -covermode=atomic + -timeout=2m depends_on: - wire-install - wait-for-memcached @@ -1056,13 +1115,13 @@ steps: name: identify-runner - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install - commands: - pip3 install codespell - - codespell -I .codespellignore docs/ + - codespell -I docs/.codespellignore docs/ image: python:3.8 name: codespell - commands: @@ -1175,11 +1234,15 @@ steps: | jq .head.repo.fork) - if [ "$is_fork" != false ]; then return 1; fi - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" - grafana-enterprise - - cd grafana-enterprise + ../grafana-enterprise + - cd ../grafana-enterprise - if git checkout ${DRONE_SOURCE_BRANCH}; then echo "checked out ${DRONE_SOURCE_BRANCH}"; - elif git checkout main; then echo "git checkout main"; else git checkout main; - fi + elif git checkout ${DRONE_TARGET_BRANCH}; then echo "git checkout ${DRONE_TARGET_BRANCH}"; + else git checkout main; fi + - cd ../ + - ln -s src grafana + - cd ./grafana-enterprise + - ./build.sh environment: GITHUB_TOKEN: from_secret: github_token @@ -1191,9 +1254,9 @@ steps: - make swagger-clean && make openapi3-gen - for f in public/api-merged.json public/openapi3.json; do git add $f; done - if [ -z "$(git diff --name-only --cached)" ]; then echo "Everything seems up to - date!"; else echo "Please ensure the branch is up-to-date, then regenerate the - specification by running make swagger-clean && make openapi3-gen" && return 1; - fi + date!"; else git diff --cached && echo "Please ensure the branch is up-to-date, + then regenerate the specification by running make swagger-clean && make openapi3-gen" + && return 1; fi depends_on: - clone-enterprise environment: @@ -1204,12 +1267,6 @@ steps: trigger: event: - pull_request - paths: - exclude: - - docs/** - - '*.md' - include: - - pkg/** type: docker volumes: - host: @@ -1269,7 +1326,7 @@ services: - commands: - /bin/mimir -target=backend -alertmanager.grafana-alertmanager-compatibility-enabled environment: {} - image: grafana/mimir:r274-1780c50 + image: us.gcr.io/kubernetes-dev/mimir:santihernandezc-remove_id_from_grafana_config-d3826b4f8-WIP name: mimir_backend - environment: {} image: redis:6.2.11-alpine @@ -1416,13 +1473,13 @@ steps: name: identify-runner - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install - commands: - pip3 install codespell - - codespell -I .codespellignore docs/ + - codespell -I docs/.codespellignore docs/ image: python:3.8 name: codespell - commands: @@ -1493,7 +1550,7 @@ steps: name: identify-runner - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install @@ -1552,7 +1609,7 @@ steps: name: identify-runner - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install @@ -1647,7 +1704,8 @@ steps: name: wire-install - commands: - apk add --update build-base shared-mime-info shared-mime-info-lang - - go test -tags requires_buildifer -short -covermode=atomic -timeout=5m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -tags requires_buildifer -short -covermode=atomic + -timeout=5m depends_on: - wire-install image: golang:1.21.10-alpine @@ -1815,13 +1873,13 @@ steps: name: wire-install - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install - commands: - apk add --update jq - - new_version=$(cat package.json | jq .version | sed s/pre/${DRONE_BUILD_NUMBER}/g) + - new_version=$(cat package.json | jq -r .version | sed s/pre/${DRONE_BUILD_NUMBER}/g) - 'echo "New version: $new_version"' - yarn run lerna version $new_version --exact --no-git-tag-version --no-push --force-publish -y @@ -1929,6 +1987,59 @@ steps: - e2e/cloud-plugins-suite/azure-monitor.spec.ts repo: - grafana/grafana +- commands: + - sleep 10s + - yarn e2e:playwright + depends_on: + - grafana-server + environment: + HOST: grafana-server + PORT: "3001" + PROV_DIR: /grafana/scripts/grafana-server/tmp/conf/provisioning + image: mcr.microsoft.com/playwright:v1.42.1-jammy + name: playwright-plugin-e2e +- commands: + - apt-get update + - apt-get install -yq zip + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - gsutil cp -r ./playwright-report/. gs://releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report + - export E2E_PLAYWRIGHT_REPORT_URL=https://storage.googleapis.com/releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report/index.html + - "echo \"E2E Playwright report uploaded to: \n $${E2E_PLAYWRIGHT_REPORT_URL}\"" + depends_on: + - playwright-plugin-e2e + environment: + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + failure: ignore + image: google/cloud-sdk:431.0.0 + name: playwright-e2e-report-upload + when: + status: + - success + - failure +- commands: + - if [ ! -d ./playwright-report/trace ]; then echo 'all tests passed'; exit 0; fi + - export E2E_PLAYWRIGHT_REPORT_URL=https://storage.googleapis.com/releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report/index.html + - 'curl -L -X POST https://api.github.com/repos/grafana/grafana/issues/${DRONE_PULL_REQUEST}/comments + -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $${GITHUB_TOKEN}" + -H "X-GitHub-Api-Version: 2022-11-28" -d "{\"body\":\"❌ Failed to run Playwright + plugin e2e tests.

Click [here]($${E2E_PLAYWRIGHT_REPORT_URL}) to + browse the Playwright report and trace viewer.
For information on how to + run Playwright tests locally, refer to the [Developer guide](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#to-run-the-playwright-tests). + \"}"' + depends_on: + - playwright-e2e-report-upload + environment: + GITHUB_TOKEN: + from_secret: github_token + failure: ignore + image: byrnedo/alpine-curl:0.1.8 + name: playwright-e2e-report-post-link + when: + status: + - success + - failure - commands: - if [ -z `find ./e2e -type f -name *spec.ts.mp4` ]; then echo 'missing videos'; false; fi @@ -2216,7 +2327,7 @@ services: - commands: - /bin/mimir -target=backend -alertmanager.grafana-alertmanager-compatibility-enabled environment: {} - image: grafana/mimir:r274-1780c50 + image: us.gcr.io/kubernetes-dev/mimir:santihernandezc-remove_id_from_grafana_config-d3826b4f8-WIP name: mimir_backend - environment: {} image: redis:6.2.11-alpine @@ -2338,7 +2449,8 @@ steps: - commands: - apk add --update build-base - go clean -testcache - - go test -run IntegrationRedis -covermode=atomic -timeout=2m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -run IntegrationRedis -covermode=atomic + -timeout=2m depends_on: - wire-install - wait-for-redis @@ -2353,7 +2465,8 @@ steps: - commands: - apk add --update build-base - go clean -testcache - - go test -run IntegrationMemcached -covermode=atomic -timeout=2m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -run IntegrationMemcached -covermode=atomic + -timeout=2m depends_on: - wire-install - wait-for-memcached @@ -2490,7 +2603,7 @@ trigger: - docs/** - latest.json repo: - - grafana/grafana-security-mirror + - grafana/grafana type: docker volumes: - host: @@ -2739,7 +2852,7 @@ steps: name: compile-build-cmd - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install @@ -3013,7 +3126,7 @@ steps: name: identify-runner - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install @@ -3096,7 +3209,8 @@ steps: name: wire-install - commands: - apk add --update build-base shared-mime-info shared-mime-info-lang - - go test -tags requires_buildifer -short -covermode=atomic -timeout=5m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -tags requires_buildifer -short -covermode=atomic + -timeout=5m depends_on: - wire-install image: golang:1.21.10-alpine @@ -3437,7 +3551,7 @@ steps: name: identify-runner - commands: - apk add --update g++ make python3 && ln -sf /usr/bin/python3 /usr/bin/python - - yarn install --immutable + - yarn install --immutable || yarn install --immutable depends_on: [] image: node:20.9.0-alpine name: yarn-install @@ -3518,7 +3632,8 @@ steps: name: wire-install - commands: - apk add --update build-base shared-mime-info shared-mime-info-lang - - go test -tags requires_buildifer -short -covermode=atomic -timeout=5m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -tags requires_buildifer -short -covermode=atomic + -timeout=5m depends_on: - wire-install image: golang:1.21.10-alpine @@ -4010,7 +4125,7 @@ services: - commands: - /bin/mimir -target=backend -alertmanager.grafana-alertmanager-compatibility-enabled environment: {} - image: grafana/mimir:r274-1780c50 + image: us.gcr.io/kubernetes-dev/mimir:santihernandezc-remove_id_from_grafana_config-d3826b4f8-WIP name: mimir_backend - environment: {} image: redis:6.2.11-alpine @@ -4125,7 +4240,8 @@ steps: - commands: - apk add --update build-base - go clean -testcache - - go test -run IntegrationRedis -covermode=atomic -timeout=2m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -run IntegrationRedis -covermode=atomic + -timeout=2m depends_on: - wire-install - wait-for-redis @@ -4140,7 +4256,8 @@ steps: - commands: - apk add --update build-base - go clean -testcache - - go test -run IntegrationMemcached -covermode=atomic -timeout=2m ./pkg/... + - go list -f '{{.Dir}}/...' -m | xargs go test -run IntegrationMemcached -covermode=atomic + -timeout=2m depends_on: - wire-install - wait-for-memcached @@ -4526,7 +4643,7 @@ steps: - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM plugins/slack - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM python:3.8 - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM postgres:12.3-alpine - - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/mimir:r274-1780c50 + - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM us.gcr.io/kubernetes-dev/mimir:santihernandezc-remove_id_from_grafana_config-d3826b4f8-WIP - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM mysql:5.7.39 - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM mysql:8.0.32 - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM redis:6.2.11-alpine @@ -4539,6 +4656,7 @@ steps: - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM cypress/included:13.1.0 - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM jwilder/dockerize:0.6.1 - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM koalaman/shellcheck:stable + - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM mcr.microsoft.com/playwright:v1.42.1-jammy depends_on: - authenticate-gcr image: aquasec/trivy:0.21.0 @@ -4560,7 +4678,7 @@ steps: - trivy --exit-code 1 --severity HIGH,CRITICAL plugins/slack - trivy --exit-code 1 --severity HIGH,CRITICAL python:3.8 - trivy --exit-code 1 --severity HIGH,CRITICAL postgres:12.3-alpine - - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/mimir:r274-1780c50 + - trivy --exit-code 1 --severity HIGH,CRITICAL us.gcr.io/kubernetes-dev/mimir:santihernandezc-remove_id_from_grafana_config-d3826b4f8-WIP - trivy --exit-code 1 --severity HIGH,CRITICAL mysql:5.7.39 - trivy --exit-code 1 --severity HIGH,CRITICAL mysql:8.0.32 - trivy --exit-code 1 --severity HIGH,CRITICAL redis:6.2.11-alpine @@ -4573,6 +4691,7 @@ steps: - trivy --exit-code 1 --severity HIGH,CRITICAL cypress/included:13.1.0 - trivy --exit-code 1 --severity HIGH,CRITICAL jwilder/dockerize:0.6.1 - trivy --exit-code 1 --severity HIGH,CRITICAL koalaman/shellcheck:stable + - trivy --exit-code 1 --severity HIGH,CRITICAL mcr.microsoft.com/playwright:v1.42.1-jammy depends_on: - authenticate-gcr environment: @@ -4804,6 +4923,6 @@ kind: secret name: gcr_credentials --- kind: signature -hmac: b1c831a3c15c88568802e740cb6bd7af820ce4425d822f4723d5d8e6370a9921 +hmac: 9aca5c8de91c97ea30ac4ff4b5f5acf930a61afa727197d99b8dd4f3311fca47 ... diff --git a/.eslintrc b/.eslintrc index e8cfd522609..b64d731e0c9 100644 --- a/.eslintrc +++ b/.eslintrc @@ -96,16 +96,22 @@ }, { "files": [ + "public/app/plugins/datasource/azuremonitor/*.{ts,tsx}", + "public/app/plugins/datasource/azuremonitor/**/*.{ts,tsx}", + "public/app/plugins/datasource/cloud-monitoring/*.{ts,tsx}", + "public/app/plugins/datasource/cloud-monitoring/**/*.{ts,tsx}", + "public/app/plugins/datasource/elasticsearch/*.{ts,tsx}", + "public/app/plugins/datasource/elasticsearch/**/*.{ts,tsx}", "public/app/plugins/datasource/grafana-postgresql-datasource/*.{ts,tsx}", "public/app/plugins/datasource/grafana-postgresql-datasource/**/*.{ts,tsx}", "public/app/plugins/datasource/grafana-pyroscope-datasource/*.{ts,tsx}", "public/app/plugins/datasource/grafana-pyroscope-datasource/**/*.{ts,tsx}", "public/app/plugins/datasource/grafana-testdata-datasource/*.{ts,tsx}", "public/app/plugins/datasource/grafana-testdata-datasource/**/*.{ts,tsx}", - "public/app/plugins/datasource/azuremonitor/*.{ts,tsx}", - "public/app/plugins/datasource/azuremonitor/**/*.{ts,tsx}", - "public/app/plugins/datasource/cloud-monitoring/*.{ts,tsx}", - "public/app/plugins/datasource/cloud-monitoring/**/*.{ts,tsx}", + "public/app/plugins/datasource/jaeger/*.{ts,tsx}", + "public/app/plugins/datasource/jaeger/**/*.{ts,tsx}", + "public/app/plugins/datasource/loki/*.{ts,tsx}", + "public/app/plugins/datasource/loki/**/*.{ts,tsx}", "public/app/plugins/datasource/mysql/*.{ts,tsx}", "public/app/plugins/datasource/mysql/**/*.{ts,tsx}", "public/app/plugins/datasource/parca/*.{ts,tsx}", @@ -115,7 +121,11 @@ "public/app/plugins/datasource/loki/*.{ts,tsx}", "public/app/plugins/datasource/loki/**/*.{ts,tsx}", "public/app/plugins/datasource/elasticsearch/*.{ts,tsx}", - "public/app/plugins/datasource/elasticsearch/**/*.{ts,tsx}" + "public/app/plugins/datasource/elasticsearch/**/*.{ts,tsx}", + "public/app/plugins/datasource/cloudwatch/*.{ts,tsx}", + "public/app/plugins/datasource/cloudwatch/**/*.{ts,tsx}", + "public/app/plugins/datasource/zipkin/*.{ts,tsx}", + "public/app/plugins/datasource/zipkin/**/*.{ts,tsx}" ], "settings": { "import/resolver": { diff --git a/.gitignore b/.gitignore index 771a993d2a7..151f9af088f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,9 +24,6 @@ __debug_bin* !.yarn/plugins !.yarn/sdks !.yarn/versions -# we temporarily commit this file because yarn downloading it -# somehow produces different checksum values -!.yarn/cache/pa11y-ci-https-1e9675e9e1-668c9119bd.zip .pnp.* # Enterprise emails @@ -134,9 +131,7 @@ pkg/services/quota/quotaimpl/storage/storage.json /devenv/bulk-dashboards/*.json /devenv/bulk-folders/*/*.json -/devenv/bulk_alerting_dashboards/*.json /devenv/datasources_bulk.yaml -/devenv/bulk_alerting_dashboards/bulk_alerting_datasources.yaml /scripts/build/release_publisher/release_publisher *.patch @@ -174,6 +169,11 @@ compilation-stats.json /e2e/build_results.zip /e2e/extensions /e2e/extensions-suite +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ +/playwright/.auth/ # grafana server /scripts/grafana-server/server.log @@ -202,6 +202,7 @@ public/api-spec.json deployment_tools_config.json .betterer.cache +.nx # Temporary file for backporting PRs .pr-body.txt @@ -212,3 +213,6 @@ public/app/plugins/**/dist/ # Ignore transpiled JavaScript resulting from the generate-transformations.ts script. /public/app/features/transformers/docs/*.js /scripts/docs/generate-transformations.js + +# Go coverage files created with go test -cover -coverprogile=something.out ... +*.out diff --git a/.golangci.toml b/.golangci.toml index ef893498d77..c3be795e99d 100644 --- a/.golangci.toml +++ b/.golangci.toml @@ -1,10 +1,6 @@ [run] timeout = "10m" -[linters-settings.goconst] -min-len = 5 -min-occurrences = 5 - [linters-settings.exhaustive] default-signifies-exhaustive = true @@ -67,6 +63,48 @@ files = [ "**/pkg/tsdb/parca/**/*", "**/pkg/tsdb/tempo/*", "**/pkg/tsdb/tempo/**/*", + "**/pkg/tsdb/cloudwatch/*", + "**/pkg/tsdb/cloudwatch/**/*", +] + +[linters-settings.depguard.rules.apiserver] +list-mode = "lax" +allow = [ + "github.com/grafana/grafana/pkg/apimachinery", + "github.com/grafana/grafana/pkg/apiserver", +] +deny = [ + { pkg = "github.com/grafana/grafana/pkg", desc = "apiserver is not allowed to import grafana core" } +] +files = [ + "**/pkg/apiserver/*", + "**/pkg/apiserver/**/*" +] + +[linters-settings.depguard.rules.apimachinery] +list-mode = "lax" +allow = [ + "github.com/grafana/grafana/pkg/apimachinery", +] +deny = [ + { pkg = "github.com/grafana/grafana/pkg", desc = "apimachinery is not allowed to import grafana core" } +] +files = [ + "**/pkg/apimachinery/*", + "**/pkg/apimachinery/**/*" +] + +[linters-settings.depguard.rules.promlib] +list-mode = "lax" # allow unless explicitely denied +deny = [ + { pkg = "github.com/grafana/grafana/pkg", desc = "promlib is not allowed to import grafana core" } +] +allow = [ + "github.com/grafana/grafana/pkg/promlib" +] +files = [ + "**/pkg/promlib/*", + "**/pkg/promlib/**/*" ] [linters-settings.gocritic] @@ -85,7 +123,7 @@ enable = [ "dogsled", "errcheck", # "gochecknoinits", - "goconst", + # "goconst", # "gocritic", # Temporarily disabled on 2022-09-09, running into weird bug "ruleguard: execution error: used Run() with an empty rule set; forgot to call Load() first?" "goimports", "goprintffuncname", @@ -203,3 +241,10 @@ text = "ST1020" [[issues.exclude-rules]] linters = ["stylecheck"] text = "ST1021" + +# Remove this when we have go v1.22 in place +# https://stackoverflow.com/a/68247837/767660 +[[issues.exclude-rules]] +linters = ["gosec"] +path = '(.+)_test\.go' +text = "G601" diff --git a/.pa11yci-pr.conf.js b/.pa11yci-pr.conf.js index 1b29b930222..acbfdd782ab 100644 --- a/.pa11yci-pr.conf.js +++ b/.pa11yci-pr.conf.js @@ -34,7 +34,7 @@ var dashboardSettings = [ wait: 500, rootElement: '.main-view', // TODO: improve the accessibility of the permission tab https://github.com/grafana/grafana/issues/77203 - threshold: 11, + threshold: 5, }, { url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=dashboard_json', @@ -64,7 +64,7 @@ var config = { url: '${HOST}/login', wait: 500, rootElement: '.main-view', - threshold: 13, + threshold: 0, }, { url: '${HOST}/login', @@ -76,13 +76,13 @@ var config = { "click element button[data-testid='data-testid Login button']", "wait for element button[data-testid='data-testid Skip change password button'] to be visible", ], - threshold: 15, + threshold: 2, rootElement: '.main-view', }, { url: '${HOST}/?orgId=1', wait: 500, - threshold: 3, + threshold: 0, }, { url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge', @@ -95,7 +95,7 @@ var config = { url: '${HOST}/?orgId=1&search=open', wait: 500, rootElement: '.main-view', - threshold: 3, + threshold: 0, }, { url: '${HOST}/alerting/list', @@ -103,49 +103,49 @@ var config = { rootElement: '.main-view', // the unified alerting promotion alert's content contrast is too low // see https://github.com/grafana/grafana/pull/41829 - threshold: 6, + threshold: 7, }, { url: '${HOST}/datasources', wait: 500, rootElement: '.main-view', - threshold: 3, + threshold: 0, }, { url: '${HOST}/org/users', wait: 500, rootElement: '.main-view', - threshold: 1, + threshold: 0, }, { url: '${HOST}/org/teams', wait: 500, rootElement: '.main-view', - threshold: 1, + threshold: 0, }, { url: '${HOST}/plugins', wait: 500, rootElement: '.main-view', - threshold: 3, + threshold: 0, }, { url: '${HOST}/org', wait: 500, rootElement: '.main-view', - threshold: 1, + threshold: 0, }, { url: '${HOST}/org/apikeys', wait: 500, rootElement: '.main-view', - threshold: 4, + threshold: 2, }, { url: '${HOST}/dashboards', wait: 500, rootElement: '.main-view', - threshold: 1, + threshold: 0, }, ], }; diff --git a/.prettierignore b/.prettierignore index 524e01209cd..160926fd718 100644 --- a/.prettierignore +++ b/.prettierignore @@ -32,11 +32,5 @@ public/api-merged.json public/api-enterprise-spec.json public/openapi3.json -# Generated Kinds report -kinds/report.json - -# Generated schema docs -docs/sources/developers/kinds/ - # Crowdin files public/locales/**/*.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 0ff75cc92ac..99a3f849ca9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -23,6 +23,21 @@ "--secure-port=8443", "--runtime-config=testdata.datasource.grafana.app/v0alpha1=true"] }, + { + "name": "Run API Server (query-localhost)", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/pkg/cmd/grafana/", + "env": {}, + "cwd": "${workspaceFolder}", + "args": ["apiserver", + "--secure-port=8443", + "--runtime-config=query.grafana.app/v0alpha1=true", + "--grafana.authn.signing-keys-url=http://localhost:3000/api/signing-keys/keys", + "--hg-url=http://localhost:3000", + "--hg-key=$HGAPIKEY"] + }, { "name": "Attach to Chrome", "port": 9222, diff --git a/.yarn/cache/tether-drop-https-3382d2649f-178c3afb88.zip b/.yarn/cache/tether-drop-https-3382d2649f-178c3afb88.zip deleted file mode 100644 index be3f3c66ca9..00000000000 Binary files a/.yarn/cache/tether-drop-https-3382d2649f-178c3afb88.zip and /dev/null differ diff --git a/.yarnrc.yml b/.yarnrc.yml index 4f0f49b98d0..017d8b0c4f0 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -44,9 +44,9 @@ plugins: yarnPath: .yarn/releases/yarn-4.1.0.cjs # Uncomment the following lines if you want to use Verdaccio local npm registry. Read more at packages/README.md -# npmScopes: -# grafana: -# npmRegistryServer: http://localhost:4873 - -# unsafeHttpWhitelist: -# - 'localhost' +#npmScopes: +# grafana: +# npmRegistryServer: http://localhost:4873 +# +#unsafeHttpWhitelist: +# - 'localhost' diff --git a/CHANGELOG.md b/CHANGELOG.md index 61467f3334e..529e6f988a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -268,18 +268,6 @@ The deprecated `email` field to send a report via `/api/reports/email` endpoint - **Grafana UI:** Add code variant to Text component. [#82318](https://github.com/grafana/grafana/issues/82318), [@tskarhed](https://github.com/tskarhed) - - -# 10.4.2 (2024-04-10) - -### Bug fixes - -- **Angular deprecation:** Prefer local "angularDetected" value to the remote one. [#85631](https://github.com/grafana/grafana/issues/85631), [@xnyo](https://github.com/xnyo) -- **AuthProxy:** Fix missing session for ldap auth proxy users. [#85237](https://github.com/grafana/grafana/issues/85237), [@Jguer](https://github.com/Jguer) -- **Alerting:** Fix receiver inheritance when provisioning a notification policy. [#85192](https://github.com/grafana/grafana/issues/85192), [@julienduchesne](https://github.com/julienduchesne) -- **CloudMonitoring:** Only run query if filters are complete. [#85016](https://github.com/grafana/grafana/issues/85016), [@aangelisc](https://github.com/aangelisc) - - # 10.4.1 (2024-03-20) @@ -523,6 +511,50 @@ Any consumers of the specific API should be appropriately adapted. Issue [#74600 - **Grafana/UI:** Add new Splitter component . [#82357](https://github.com/grafana/grafana/issues/82357), [@torkelo](https://github.com/torkelo) + + +# 10.3.5 (2024-03-20) + +### Features and enhancements + +- **Postgres:** Allow disabling SNI on SSL-enabled connections. [#84259](https://github.com/grafana/grafana/issues/84259), [@papagian](https://github.com/papagian) + +### Bug fixes + +- **Snapshots:** Require delete within same org (backport). [#84707](https://github.com/grafana/grafana/issues/84707), [@ryantxu](https://github.com/ryantxu) +- **Elasticsearch:** Fix legend for alerting, expressions and previously frontend queries. [#84684](https://github.com/grafana/grafana/issues/84684), [@ivanahuckova](https://github.com/ivanahuckova) +- **Dashboard:** Fix issue where out-of-view shared query panels caused blank dependent panels. [#84196](https://github.com/grafana/grafana/issues/84196), [@kaydelaney](https://github.com/kaydelaney) +- **Alerting:** Fix preview getting the correct queries from the form. [#81481](https://github.com/grafana/grafana/issues/81481), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron) + + + + +# 10.3.4 (2024-03-06) + +### Features and enhancements + +- **Chore:** Improve domain validation for Google OAuth - Backport 83229 to v10.3.x. [#83725](https://github.com/grafana/grafana/issues/83725), [@linoman](https://github.com/linoman) + +### Bug fixes + +- **LDAP:** Fix LDAP users authenticated via auth proxy not being able to use LDAP active sync. [#83750](https://github.com/grafana/grafana/issues/83750), [@Jguer](https://github.com/Jguer) +- **Tempo:** Add template variable interpolation for filters (#83213). [#83706](https://github.com/grafana/grafana/issues/83706), [@joey-grafana](https://github.com/joey-grafana) +- **Elasticsearch:** Fix adhoc filters not applied in frontend mode. [#83596](https://github.com/grafana/grafana/issues/83596), [@svennergr](https://github.com/svennergr) +- **Dashboards:** Fixes issue where panels would not refresh if time range updated while in panel view mode. [#83525](https://github.com/grafana/grafana/issues/83525), [@kaydelaney](https://github.com/kaydelaney) +- **Auth:** Fix email verification bypass when using basic authentication. [#83484](https://github.com/grafana/grafana/issues/83484) +- **AuthProxy:** Invalidate previous cached item for user when changes are made to any header. [#83203](https://github.com/grafana/grafana/issues/83203), [@klesh](https://github.com/klesh) +- **LibraryPanels/RBAC:** Fix issue where folder scopes weren't being correctly inherited. [#82902](https://github.com/grafana/grafana/issues/82902), [@kaydelaney](https://github.com/kaydelaney) +- **LibraryPanels:** Fix issue with repeated library panels. [#82259](https://github.com/grafana/grafana/issues/82259), [@kaydelaney](https://github.com/kaydelaney) +- **Plugins:** Don't auto prepend app sub url to plugin asset paths. [#82147](https://github.com/grafana/grafana/issues/82147), [@wbrowne](https://github.com/wbrowne) +- **Elasticsearch:** Set middlewares from Grafana's `httpClientProvider`. [#81929](https://github.com/grafana/grafana/issues/81929), [@svennergr](https://github.com/svennergr) +- **Folders:** Fix failure to update folder in SQLite. [#81862](https://github.com/grafana/grafana/issues/81862), [@papagian](https://github.com/papagian) +- **Loki/Elastic:** Assert queryfix value to always be string. [#81463](https://github.com/grafana/grafana/issues/81463), [@svennergr](https://github.com/svennergr) + +### Breaking changes + +We're adding a between the response of the ID token HD parameter and the list of allowed domains. This feature can be disabled through the configuration toggle `validate_hd `. Anyone using the legacy Google OAuth configuration should disable this validation if the ID Token response doesn't have the HD parameter. Issue [#83725](https://github.com/grafana/grafana/issues/83725) + + # 10.3.3 (2024-02-02) @@ -638,6 +670,42 @@ Users who have InfluxDB datasource configured with SQL querying language must up Removes `NamespaceID` from responses of all GET routes underneath the path `/api/ruler/grafana/api/v1/rules` - 3 affected endpoints. All affected routes are not in the publicly documented or `stable` marked portion of the ngalert API. This only breaks clients who are directly using the unstable portion of the API. Such clients should use `NamespaceUID` rather than `NamespaceID` to identify namespaces. Issue [#79359](https://github.com/grafana/grafana/issues/79359) + + +# 10.2.6 (2024-03-25) + +### Features and enhancements + +- **Postgres:** Allow disabling SNI on SSL-enabled connections. [#84258](https://github.com/grafana/grafana/issues/84258), [@papagian](https://github.com/papagian) + +### Bug fixes + +- **CloudMonitoring:** Only run query if filters are complete. [#85014](https://github.com/grafana/grafana/issues/85014), [@aangelisc](https://github.com/aangelisc) +- **Snapshots:** Require delete within same org (backport). [#84730](https://github.com/grafana/grafana/issues/84730), [@ryantxu](https://github.com/ryantxu) +- **Dashboard:** Fix issue where out-of-view shared query panels caused blank dependent panels. [#84195](https://github.com/grafana/grafana/issues/84195), [@kaydelaney](https://github.com/kaydelaney) +- **Dashboards:** Run shared queries even when source panel is in collapsed row. [#84166](https://github.com/grafana/grafana/issues/84166), [@kaydelaney](https://github.com/kaydelaney) +- **Prometheus:** Fix calculating rate interval when there is no interval specified. [#84082](https://github.com/grafana/grafana/issues/84082), [@itsmylife](https://github.com/itsmylife) +- **Prometheus:** Fix $\_\_rate_interval calculation. [#84063](https://github.com/grafana/grafana/issues/84063), [@tolzhabayev](https://github.com/tolzhabayev) + + + + +# 10.2.5 (2024-03-06) + +### Features and enhancements + +- **Alerting:** Add setting to distribute rule group evaluations over time. [#81404](https://github.com/grafana/grafana/issues/81404), [@alexweav](https://github.com/alexweav) + +### Bug fixes + +- **Cloudwatch:** Fix errors while loading queries/datasource on Safari. [#83842](https://github.com/grafana/grafana/issues/83842), [@kevinwcyu](https://github.com/kevinwcyu) +- **Elasticsearch:** Fix adhoc filters not applied in frontend mode. [#83595](https://github.com/grafana/grafana/issues/83595), [@svennergr](https://github.com/svennergr) +- **Auth:** Fix email verification bypass when using basic authentication. [#83489](https://github.com/grafana/grafana/issues/83489) +- **Alerting:** Fix queries and expressions in rule view details. [#82875](https://github.com/grafana/grafana/issues/82875), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron) +- **Plugins:** Don't auto prepend app sub url to plugin asset paths. [#82146](https://github.com/grafana/grafana/issues/82146), [@wbrowne](https://github.com/wbrowne) +- **Folders:** Fix failure to update folder in SQLite. [#81861](https://github.com/grafana/grafana/issues/81861), [@papagian](https://github.com/papagian) + + # 10.2.4 (2024-01-29) @@ -763,7 +831,7 @@ Removes `NamespaceID` from responses of all GET routes underneath the path `/api - **Alerting:** Show receiver in groups view to avoid duplication in the list. [#77109](https://github.com/grafana/grafana/issues/77109), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron) - **Alerting:** Allow more time before Alertmanager expire-resolves alerts. [#77094](https://github.com/grafana/grafana/issues/77094), [@alexweav](https://github.com/alexweav) - **Tempo:** Add new structural operators. [#77056](https://github.com/grafana/grafana/issues/77056), [@fabrizio-grafana](https://github.com/fabrizio-grafana) -- **ServiceAccount:** Add pagination to service accout table. [#77044](https://github.com/grafana/grafana/issues/77044), [@kalleep](https://github.com/kalleep) +- **ServiceAccount:** Add pagination to service account table. [#77044](https://github.com/grafana/grafana/issues/77044), [@kalleep](https://github.com/kalleep) - **Transformations:** Cumulative and window modes for `Add field from calculation`. [#77029](https://github.com/grafana/grafana/issues/77029), [@mdvictor](https://github.com/mdvictor) - **Plugins:** Allow disabling angular deprecation UI for specific plugins. [#77026](https://github.com/grafana/grafana/issues/77026), [@xnyo](https://github.com/xnyo) - **Stat:** Add panel option to control wide layout. [#77018](https://github.com/grafana/grafana/issues/77018), [@nmarrs](https://github.com/nmarrs) @@ -871,7 +939,7 @@ Removes `NamespaceID` from responses of all GET routes underneath the path `/api - **Organize fields transformation:** Fix re-ordering of fields using drag and drop. [#77172](https://github.com/grafana/grafana/issues/77172), [@adela-almasan](https://github.com/adela-almasan) - **Bug fix:** Correctly set permissions on provisioned dashboards. [#77155](https://github.com/grafana/grafana/issues/77155), [@IevaVasiljeva](https://github.com/IevaVasiljeva) - **InfluxDB:** Fix adhoc filter calls by properly checking optional parameter in metricFindQuery. [#77113](https://github.com/grafana/grafana/issues/77113), [@itsmylife](https://github.com/itsmylife) -- **Alerting:** Fix NoRulesSplash being rendered for some seconds, fater creating a rule. [#77048](https://github.com/grafana/grafana/issues/77048), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron) +- **Alerting:** Fix NoRulesSplash being rendered for some seconds, faster creating a rule. [#77048](https://github.com/grafana/grafana/issues/77048), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron) - **RBAC:** Allow scoping access to root level dashboards. [#76987](https://github.com/grafana/grafana/issues/76987), [@IevaVasiljeva](https://github.com/IevaVasiljeva) - **Alerting:** Dont show 1 firing series when no data in Expressions PreviewSummary. [#76981](https://github.com/grafana/grafana/issues/76981), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron) - **InfluxDB:** Fix aliasing with $measurement or $m on backend mode. [#76917](https://github.com/grafana/grafana/issues/76917), [@itsmylife](https://github.com/itsmylife) @@ -1244,7 +1312,7 @@ For the existing backend mode users who have table visualization might see some - **Pyroscope:** Fix error when no profile types are returned. [#75143](https://github.com/grafana/grafana/issues/75143), [@aocenas](https://github.com/aocenas) - **BarChart:** Axes centered zero, borders, and colors. [#75136](https://github.com/grafana/grafana/issues/75136), [@leeoniya](https://github.com/leeoniya) - **Plugins:** Refresh plugin info after installation. [#75074](https://github.com/grafana/grafana/issues/75074), [@oshirohugo](https://github.com/oshirohugo) -- **LDAP:** FIX Enable users on successfull login . [#75073](https://github.com/grafana/grafana/issues/75073), [@gamab](https://github.com/gamab) +- **LDAP:** FIX Enable users on successful login . [#75073](https://github.com/grafana/grafana/issues/75073), [@gamab](https://github.com/gamab) - **XYChart:** Fix numerous axis options. [#75044](https://github.com/grafana/grafana/issues/75044), [@leeoniya](https://github.com/leeoniya) - **Trace View:** Remove "deployment.environment" default traces 2 logs tag. [#74986](https://github.com/grafana/grafana/issues/74986), [@domasx2](https://github.com/domasx2) - **Snapshots:** Use appUrl on snapshot list page. [#74944](https://github.com/grafana/grafana/issues/74944), [@evictorero](https://github.com/evictorero) @@ -1314,6 +1382,24 @@ Starting with 10.2, `parentRowIndex` is deprecated. It will be removed in a futu - **Drawer:** Make content scroll by default. [#75287](https://github.com/grafana/grafana/issues/75287), [@ashharrison90](https://github.com/ashharrison90) + + +# 10.1.9 (2024-03-25) + +### Bug fixes + +- **Snapshots:** Require delete within same org (backport). [#84765](https://github.com/grafana/grafana/issues/84765), [@ryantxu](https://github.com/ryantxu) + + + + +# 10.1.8 (2024-03-06) + +### Bug fixes + +- **Auth:** Fix email verification bypass when using basic authentication. [#83492](https://github.com/grafana/grafana/issues/83492) + + # 10.1.7 (2024-01-29) @@ -1341,7 +1427,7 @@ Starting with 10.2, `parentRowIndex` is deprecated. It will be removed in a futu - **Loki:** Cache extracted labels. [#75905](https://github.com/grafana/grafana/issues/75905), [@gtk-grafana](https://github.com/gtk-grafana) - **DataSourcePicker:** Disable autocomplete for the search input . [#75900](https://github.com/grafana/grafana/issues/75900), [@ivanortegaalba](https://github.com/ivanortegaalba) - **Plugins:** Refresh plugin info after installation. [#75225](https://github.com/grafana/grafana/issues/75225), [@oshirohugo](https://github.com/oshirohugo) -- **LDAP:** FIX Enable users on successfull login . [#75176](https://github.com/grafana/grafana/issues/75176), [@gamab](https://github.com/gamab) +- **LDAP:** FIX Enable users on successful login . [#75176](https://github.com/grafana/grafana/issues/75176), [@gamab](https://github.com/gamab) - **Loki:** Fix filters not being added with multiple expressions and parsers. [#75172](https://github.com/grafana/grafana/issues/75172), [@svennergr](https://github.com/svennergr) - **Recorded Queries:** Add org isolation (remote write target per org), and fix cross org Delete/List. (Enterprise) - **Auditing and UsageInsights:** FIX Loki configuration to use proxy env variables. (Enterprise) @@ -1449,7 +1535,7 @@ Starting with 10.2, `parentRowIndex` is deprecated. It will be removed in a futu - **Geomap:** Promote route + photos layer to beta, promote geojson layer to stable. [#72233](https://github.com/grafana/grafana/issues/72233), [@nmarrs](https://github.com/nmarrs) - **Dashboards:** Add Angular deprecation alert in data source query editor. [#72211](https://github.com/grafana/grafana/issues/72211), [@xnyo](https://github.com/xnyo) - **Auth:** Lock organization roles for users who are managed through an external auth provider. [#72204](https://github.com/grafana/grafana/issues/72204), [@IevaVasiljeva](https://github.com/IevaVasiljeva) -- **Tranformations:** True OUTER JOIN in the join by field transformation used for tabular data . [#72176](https://github.com/grafana/grafana/issues/72176), [@bohandley](https://github.com/bohandley) +- **Transformations:** True OUTER JOIN in the join by field transformation used for tabular data . [#72176](https://github.com/grafana/grafana/issues/72176), [@bohandley](https://github.com/bohandley) - **NestedFolders:** Enable new nested folder picker by default for nested folders. [#72129](https://github.com/grafana/grafana/issues/72129), [@joshhunt](https://github.com/joshhunt) - **Alerting:** Add dashboardUID and panelID query parameters for loki state history. [#72119](https://github.com/grafana/grafana/issues/72119), [@alexweav](https://github.com/alexweav) - **Feature toggles management:** Define get feature toggles api. [#72106](https://github.com/grafana/grafana/issues/72106), [@jcalisto](https://github.com/jcalisto) @@ -1516,7 +1602,7 @@ Starting with 10.2, `parentRowIndex` is deprecated. It will be removed in a futu - **Login:** Adjust error message when user exceed login attempts. [#70736](https://github.com/grafana/grafana/issues/70736), [@RoxanaAnamariaTurc](https://github.com/RoxanaAnamariaTurc) - **Nested folders:** Paginate child folder items. [#70730](https://github.com/grafana/grafana/issues/70730), [@ashharrison90](https://github.com/ashharrison90) - **Units:** Add events/messages/records/rows throughput units. [#70726](https://github.com/grafana/grafana/issues/70726), [@hhromic](https://github.com/hhromic) -- **Plugins:** Enable feature toggles for long running queries by deafult. [#70678](https://github.com/grafana/grafana/issues/70678), [@idastambuk](https://github.com/idastambuk) +- **Plugins:** Enable feature toggles for long running queries by default. [#70678](https://github.com/grafana/grafana/issues/70678), [@idastambuk](https://github.com/idastambuk) - **I18n:** Translate phrases for new Browse Dashboards. [#70654](https://github.com/grafana/grafana/issues/70654), [@Bohdanator](https://github.com/Bohdanator) - **Flamegraph:** Prevent cropping of tooltip by bottom of the viewport. [#70633](https://github.com/grafana/grafana/issues/70633), [@aocenas](https://github.com/aocenas) - **Pyroscope:** Preselect default profile type or app in the query editor dropdown. [#70624](https://github.com/grafana/grafana/issues/70624), [@aocenas](https://github.com/aocenas) @@ -1542,7 +1628,7 @@ Starting with 10.2, `parentRowIndex` is deprecated. It will be removed in a futu - **Geomap:** Add network layer. [#70192](https://github.com/grafana/grafana/issues/70192), [@drew08t](https://github.com/drew08t) - **Alerting:** Bump grafana/alerting and refactor the ImageStore/Provider to provide image URL/bytes. [#70182](https://github.com/grafana/grafana/issues/70182), [@santihernandezc](https://github.com/santihernandezc) - **Auth:** Support google OIDC and group fetching. [#70140](https://github.com/grafana/grafana/issues/70140), [@Jguer](https://github.com/Jguer) -- **Alerting:** Make QueryEditor not collapsable. [#70112](https://github.com/grafana/grafana/issues/70112), [@VikaCep](https://github.com/VikaCep) +- **Alerting:** Make QueryEditor not collapsible. [#70112](https://github.com/grafana/grafana/issues/70112), [@VikaCep](https://github.com/VikaCep) - **TimeSeries:** Add option to disconnect values. [#70097](https://github.com/grafana/grafana/issues/70097), [@drew08t](https://github.com/drew08t) - **Logs:** Add toggle behavior support for "filter for" and "filter out" label within Logs Details. [#70091](https://github.com/grafana/grafana/issues/70091), [@matyax](https://github.com/matyax) - **Plugins:** Periodically update public signing key. [#70080](https://github.com/grafana/grafana/issues/70080), [@andresmgot](https://github.com/andresmgot) @@ -1824,6 +1910,24 @@ Starting with 10.0, changing the folder UID is deprecated. It will be removed in - **Grafana/ui:** Fix margin in RadioButtonGroup option when only icon is present. [#68899](https://github.com/grafana/grafana/issues/68899), [@aocenas](https://github.com/aocenas) + + +# 10.0.13 (2024-03-25) + +### Bug fixes + +- **Snapshots:** Require delete within same org (backport). [#84764](https://github.com/grafana/grafana/issues/84764), [@ryantxu](https://github.com/ryantxu) + + + + +# 10.0.12 (2024-03-06) + +### Bug fixes + +- **Auth:** Fix email verification bypass when using basic authentication. [#83493](https://github.com/grafana/grafana/issues/83493) + + # 10.0.11 (2024-01-29) @@ -2365,6 +2469,29 @@ The `database` field has been deprecated in the Elasticsearch datasource provisi - **InteractiveTable:** Updated design and minor tweak to Correlactions page. [#66443](https://github.com/grafana/grafana/issues/66443), [@torkelo](https://github.com/torkelo) + + +# 9.5.18 (2024-03-25) + +### Bug fixes + +- **Snapshots:** Require delete within same org (backport). [#84762](https://github.com/grafana/grafana/issues/84762), [@ryantxu](https://github.com/ryantxu) + + + + +# 9.5.17 (2024-03-05) + +### Features and enhancements + +- Bump go-git to v5.11.0. [#83711](https://github.com/grafana/grafana/issues/83711), [@papagian](https://github.com/papagian) +- **Plugins:** Bump otelgrpc instrumentation to 0.47.0. [#83674](https://github.com/grafana/grafana/issues/83674), [@wbrowne](https://github.com/wbrowne) + +### Bug fixes + +- **Auth:** Fix email verification bypass when using basic authentication. [#83494](https://github.com/grafana/grafana/issues/83494) + + # 9.5.16 (2024-01-29) @@ -2396,7 +2523,7 @@ The `database` field has been deprecated in the Elasticsearch datasource provisi - **Alerting:** Fix state manager to not keep datasource_uid and ref_id labels in state after Error. [#77391](https://github.com/grafana/grafana/issues/77391), [@yuri-tceretian](https://github.com/yuri-tceretian) - **Transformations:** Config overrides being lost when config from query transform is applied. [#75347](https://github.com/grafana/grafana/issues/75347), [@IbrahimCSAE](https://github.com/IbrahimCSAE) -- **LDAP:** FIX Enable users on successfull login . [#75192](https://github.com/grafana/grafana/issues/75192), [@gamab](https://github.com/gamab) +- **LDAP:** FIX Enable users on successful login . [#75192](https://github.com/grafana/grafana/issues/75192), [@gamab](https://github.com/gamab) - **Auditing and UsageInsights:** FIX Loki configuration to use proxy env variables. (Enterprise) diff --git a/Dockerfile b/Dockerfile index 97488ad51dd..3cd59a30092 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,6 +40,9 @@ ARG GO_BUILD_TAGS="oss" ARG WIRE_TAGS="oss" ARG BINGO="true" +# This is required to allow building on arm64 due to https://github.com/golang/go/issues/22040 +RUN apk add --no-cache binutils-gold + # Install build dependencies RUN if grep -i -q alpine /etc/issue; then \ apk add --no-cache gcc g++ make git; \ @@ -52,6 +55,9 @@ COPY .bingo .bingo # Include vendored dependencies COPY pkg/util/xorm/go.* pkg/util/xorm/ +COPY pkg/apiserver/go.* pkg/apiserver/ +COPY pkg/apimachinery/go.* pkg/apimachinery/ +COPY pkg/promlib/go.* pkg/promlib/ RUN go mod download RUN if [[ "$BINGO" = "true" ]]; then \ diff --git a/GOVERNANCE.md b/GOVERNANCE.md index def47f1a1c1..ff129a87557 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -173,7 +173,7 @@ Supermajority votes must be called explicitly in a separate thread on the approp Votes may take the form of a single proposal, with the option to vote yes or no, or the form of multiple alternatives. -A vote on a single proposal is considered successful if at least two thirds of those eligible to vote vote in favor. +A vote on a single proposal is considered successful if at least two thirds of those eligible to vote in favor. If there are multiple alternatives, members may vote for one or more alternatives, or vote “no” to object to all alternatives. A vote on multiple alternatives is considered decided in favor of one alternative if it has received the most votes in favor, and a vote from at least two thirds of those eligible to vote. Should no alternative reach this quorum, another vote on a reduced number of options may be called separately. diff --git a/HALL_OF_FAME.md b/HALL_OF_FAME.md index 18fd83f6c21..f8950454930 100644 --- a/HALL_OF_FAME.md +++ b/HALL_OF_FAME.md @@ -2,4 +2,4 @@ List of previous team members that have had a big impact on the company or the product and contributed during a long period of time. -- Hugo Häggmark ([School of applied technology](https://salt.study)) +- Hugo Häggmark ([Björn Lundén](https://www.bjornlunden.se/)) diff --git a/LICENSING.md b/LICENSING.md index f8bfef7f945..97f2c53d8e7 100644 --- a/LICENSING.md +++ b/LICENSING.md @@ -18,7 +18,7 @@ packaging/ kinds/ pkg/kinds/ pkg/kindsys/ -pkg/registry/corekind/ +pkg/registry/schemas/ grafana-mixin/ public/app/plugins/datasource/tempo public/app/features/explore/TraceView/components diff --git a/Makefile b/Makefile index cac4b80ef5a..0eb0e538572 100644 --- a/Makefile +++ b/Makefile @@ -7,10 +7,10 @@ WIRE_TAGS = "oss" -include local/Makefile include .bingo/Variables.mk -.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 fix-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 fix-cue gen-feature-toggles GO = go -GO_FILES ?= ./pkg/... +GO_FILES ?= ./pkg/... ./pkg/apiserver/... ./pkg/apimachinery/... ./pkg/promlib/... SH_FILES ?= $(shell find ./scripts -name *.sh) GO_BUILD_FLAGS += $(if $(GO_BUILD_DEV),-dev) GO_BUILD_FLAGS += $(if $(GO_BUILD_TAGS),-build-tags=$(GO_BUILD_TAGS)) @@ -45,12 +45,12 @@ $(NGALERT_SPEC_TARGET): $(MERGED_SPEC_TARGET): swagger-oss-gen swagger-enterprise-gen $(NGALERT_SPEC_TARGET) $(SWAGGER) ## Merge generated and ngalert API specs # known conflicts DsPermissionType, AddApiKeyCommand, Json, Duration (identical models referenced by both specs) - $(SWAGGER) mixin $(SPEC_TARGET) $(ENTERPRISE_SPEC_TARGET) $(NGALERT_SPEC_TARGET) --ignore-conflicts -o $(MERGED_SPEC_TARGET) + $(SWAGGER) mixin -q $(SPEC_TARGET) $(ENTERPRISE_SPEC_TARGET) $(NGALERT_SPEC_TARGET) --ignore-conflicts -o $(MERGED_SPEC_TARGET) swagger-oss-gen: $(SWAGGER) ## Generate API Swagger specification @echo "re-generating swagger for OSS" rm -f $(SPEC_TARGET) - SWAGGER_GENERATE_EXTENSION=false $(SWAGGER) generate spec -m -w pkg/server -o $(SPEC_TARGET) \ + SWAGGER_GENERATE_EXTENSION=false $(SWAGGER) generate spec -q -m -w pkg/server -o $(SPEC_TARGET) \ -x "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" \ -x "github.com/prometheus/alertmanager" \ -i pkg/api/swagger_tags.json \ @@ -66,7 +66,7 @@ else swagger-enterprise-gen: $(SWAGGER) ## Generate API Swagger specification @echo "re-generating swagger for enterprise" rm -f $(ENTERPRISE_SPEC_TARGET) - SWAGGER_GENERATE_EXTENSION=false $(SWAGGER) generate spec -m -w pkg/server -o $(ENTERPRISE_SPEC_TARGET) \ + SWAGGER_GENERATE_EXTENSION=false $(SWAGGER) generate spec -q -m -w pkg/server -o $(ENTERPRISE_SPEC_TARGET) \ -x "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" \ -x "github.com/prometheus/alertmanager" \ -i pkg/api/swagger_tags.json \ @@ -77,7 +77,7 @@ endif swagger-gen: gen-go $(MERGED_SPEC_TARGET) swagger-validate swagger-validate: $(MERGED_SPEC_TARGET) $(SWAGGER) ## Validate API spec - $(SWAGGER) validate $(<) + $(SWAGGER) validate --skip-warnings $(<) swagger-clean: rm -f $(SPEC_TARGET) $(MERGED_SPEC_TARGET) $(OAPI_SPEC_TARGET) @@ -103,14 +103,23 @@ openapi3-gen: swagger-gen ## Generates OpenApi 3 specs from the Swagger 2 alread ##@ Building gen-cue: ## Do all CUE/Thema code generation @echo "generate code from .cue files" - go generate ./pkg/plugins/plugindef go generate ./kinds/gen.go go generate ./public/app/plugins/gen.go - go generate ./pkg/kindsysreport/codegen/report.go -gen-go: $(WIRE) +gen-feature-toggles: +## First go test run fails because it will re-generate the feature toggles. +## Second go test run will compare the generated files and pass. + @echo "generate feature toggles" + go test -v ./pkg/services/featuremgmt/... > /dev/null 2>&1; \ + if [ $$? -eq 0 ]; then \ + echo "feature toggles already up-to-date"; \ + else \ + go test -v ./pkg/services/featuremgmt/...; \ + fi + +gen-go: @echo "generate go files" - $(WIRE) gen -tags $(WIRE_TAGS) ./pkg/server + $(GO) run ./pkg/build/wire/cmd/wire/main.go gen -tags $(WIRE_TAGS) ./pkg/server fix-cue: $(CUE) @echo "formatting cue files" @@ -168,7 +177,8 @@ test-go: test-go-unit test-go-integration .PHONY: test-go-unit test-go-unit: ## Run unit tests for backend with flags. @echo "test backend unit tests" - $(GO) test -short -covermode=atomic -timeout=30m ./pkg/... + go list -f '{{.Dir}}/...' -m | xargs \ + $(GO) test -short -covermode=atomic -timeout=30m .PHONY: test-go-integration test-go-integration: ## Run integration tests for backend with flags. @@ -319,6 +329,7 @@ gen-ts: # Use this make target to regenerate the configuration YAML files when # you modify starlark files. drone: $(DRONE) + bash scripts/drone/env-var-check.sh $(DRONE) starlark --format $(DRONE) lint .drone.yml --trusted $(DRONE) --server https://drone.grafana.net sign --save grafana/grafana diff --git a/README.md b/README.md index 4e9251be782..9f72a649a0a 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ To login, use the environment variables value defined in: * `GF_SECURITY_ADMIN_USER` * `GF_SECURITY_ADMIN_PASSWORD` -Default Version: v10.4.3 +Default Version: v11.0.0 [![Deploy](https://cdn.scalingo.com/deploy/button.svg)](https://dashboard.scalingo.com/create/app?source=https://github.com/Scalingo/grafana-scalingo) diff --git a/WORKFLOW.md b/WORKFLOW.md index fca782e178d..ab1821b468f 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -44,7 +44,7 @@ Once a PR is approved as per above, any team member MAY merge the PR. ## Backporting a PR Critical bug fixes needed for a previous minor release should be backported to the respective release branches after coordinating with the delivery team. -Please see the [contibution guide](./contribute/merge-pull-request.md#should-the-pull-request-be-backported) for further details. +Please see the [contribution guide](./contribute/merge-pull-request.md#should-the-pull-request-be-backported) for further details. # Release workflow diff --git a/conf/defaults.ini b/conf/defaults.ini index 047a59f859c..d15ceb1db10 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -9,10 +9,6 @@ app_mode = production # instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty instance_name = ${HOSTNAME} -# force migration will run migrations that might cause dataloss -# Deprecated, use clean_upgrade option in [unified_alerting.upgrade] instead. -force_migration = false - #################################### Paths ############################### [paths] # Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) @@ -70,6 +66,9 @@ enable_gzip = false cert_file = cert_key = +# Certificates file watch interval +certs_watch_interval = + # Unix socket gid # Changing the gid of a file without privileges requires that the target group is in the group of the process and that the process is the file owner # It is recommended to set the gid as http server user gid @@ -94,6 +93,10 @@ read_timeout = 0 #exampleHeader1 = exampleValue1 #exampleHeader2 = exampleValue2 +[environment] +# Sets whether the local file system is available for Grafana to use. Default is true for backward compatibility. +local_file_system_available = true + #################################### GRPC Server ######################### [grpc_server] network = "tcp" @@ -157,7 +160,10 @@ cache_mode = private # For "sqlite3" only. Enable/disable Write-Ahead Logging, https://sqlite.org/wal.html. Default is false. wal = false -# For "mysql" only if migrationLocking feature toggle is set. How many seconds to wait before failing to lock the database for the migrations, default is 0. +# For "mysql" and "postgres". Lock the database for the migrations, default is true. +migration_locking = true + +# For "mysql" and "postgres" only if migrationLocking is set. How many seconds to wait before failing to lock the database for the migrations, default is 0. locking_attempt_timeout_sec = 0 # For "sqlite" only. How many times to retry query in case of database is locked failures. Default is 0 (disabled). @@ -379,8 +385,8 @@ content_security_policy_report_only = false # $ROOT_PATH is server.root_url without the protocol. content_security_policy_report_only_template = """script-src 'self' 'unsafe-eval' 'unsafe-inline' 'strict-dynamic' $NONCE;object-src 'none';font-src 'self';style-src 'self' 'unsafe-inline' blob:;img-src * data:;base-uri 'self';connect-src 'self' grafana.com ws://$ROOT_PATH wss://$ROOT_PATH;manifest-src 'self';media-src 'none';form-action 'self';""" -# Controls if old angular plugins are supported or not. This will be disabled by default in future release -angular_support_enabled = true +# Controls if old angular plugins are supported or not. +angular_support_enabled = false # The CSRF check will be executed even if the request has no login cookie. csrf_always_check = false @@ -472,6 +478,9 @@ auto_assign_org_role = Viewer # Require email validation before sign up completes verify_email_enabled = false +# Redirect to default OrgId after login +login_default_org_id = + # Background text for the user field on the login page login_hint = email or username password_hint = password @@ -499,6 +508,9 @@ editors_can_admin = false # The duration in time a user invitation remains valid before expiring. This setting should be expressed as a duration. Examples: 6h (hours), 2d (days), 1w (week). Default is 24h (24 hours). The minimum supported duration is 15m (15 minutes). user_invite_max_lifetime_duration = 24h +# The duration in time a verification email, used to update the email address of a user, remains valid before expiring. This setting should be expressed as a duration. Examples: 6h (hours), 2d (days), 1w (week). Default is 1h (1 hour). +verification_email_max_lifetime_duration = 1h + # 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 = @@ -555,10 +567,6 @@ oauth_auto_login = false # OAuth state max age cookie duration in seconds. Defaults to 600 seconds. oauth_state_cookie_max_age = 600 -# Skip forced assignment of OrgID 1 or 'auto_assign_org_id' for social logins -# Deprecated, use skip_org_role_sync option for specific provider instead. -oauth_skip_org_role_update_sync = false - # limit of api_key seconds to live before expiration api_key_max_seconds_to_live = -1 @@ -682,7 +690,7 @@ token_url = https://oauth2.googleapis.com/token api_url = https://openidconnect.googleapis.com/v1/userinfo signout_redirect_url = allowed_domains = -validate_hd = false +validate_hd = true hosted_domain = allowed_groups = role_attribute_path = @@ -831,7 +839,7 @@ enabled = false header_name = X-WEBAUTH-USER header_property = username auto_sign_up = true -sync_ttl = 60 +sync_ttl = 15 whitelist = headers = headers_encoded = false @@ -844,6 +852,8 @@ enable_login_token = false header_name = email_claim = username_claim = +email_attribute_path = +username_attribute_path = jwk_set_url = jwk_set_file = cache_ttl = 60m @@ -857,7 +867,6 @@ auto_sign_up = false url_login = false allow_assign_grafana_admin = false skip_org_role_sync = false -signout_redirect_url = #################################### Auth LDAP ########################### [auth.ldap] @@ -934,6 +943,13 @@ workload_identity_token_file = # Disabled by default, needs to be explicitly enabled user_identity_enabled = false +# Specifies whether user identity authentication fallback credentials should be enabled in data sources +# Enabling this allows data source creators to provide fallback credentials for backend initiated requests +# e.g. alerting, recorded queries etc. +# Enabled by default, needs to be explicitly disabled +# Will not have any effect if user identity is disabled above +user_identity_fallback_credentials_enabled = true + # Override token URL for Azure Active Directory # By default is the same as token URL configured for AAD authentication settings user_identity_token_url = @@ -1129,7 +1145,7 @@ alerting_rule_group_rules = 100 #################################### Unified Alerting #################### [unified_alerting] -# Enable the Unified Alerting sub-system and interface. When enabled we'll migrate all of your alert rules and notification channels to the new system. New alert rules will be created and your notification channels will be converted into an Alertmanager configuration. Previous data is preserved to enable backwards compatibility but new data is removed when switching. When this configuration section and flag are not defined, the state is defined at runtime. See the documentation for more details. +# Enable the Alerting sub-system and interface. enabled = # Comma-separated list of organization IDs for which to disable unified alerting. Only supported if unified alerting is enabled. @@ -1196,17 +1212,17 @@ ha_gossip_interval = 200ms # The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m. ha_push_pull_interval = 60s -# Enable or disable alerting rule execution. The alerting UI remains visible. This option has a legacy version in the `[alerting]` section that takes precedence. +# Enable or disable alerting rule execution. The alerting UI remains visible. execute_alerts = true -# Alert evaluation timeout when fetching data from the datasource. This option has a legacy version in the `[alerting]` section that takes precedence. +# Alert evaluation timeout when fetching data from the datasource. # The timeout string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m. evaluation_timeout = 30s # Number of times we'll attempt to evaluate an alert rule before giving up on that evaluation. The default value is 1. max_attempts = 1 -# Minimum interval to enforce between rule evaluations. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. This option has a legacy version in the `[alerting]` section that takes precedence. +# Minimum interval to enforce between rule evaluations. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. # The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m. min_interval = 10s @@ -1296,6 +1312,10 @@ loki_basic_auth_username = # Optional password for basic authentication on requests sent to Loki. Can be left blank. loki_basic_auth_password = +# For "loki" only. +# Optional max query length for queries sent to Loki. Default is 721h which matches the default Loki value. +loki_max_query_length = 721h + [unified_alerting.state_history.external_labels] # Optional extra labels to attach to outbound state history records or log streams. # Any number of label key-value-pairs can be provided. @@ -1303,12 +1323,16 @@ loki_basic_auth_password = # ex. # mylabelkey = mylabelvalue -[unified_alerting.upgrade] -# If set to true when upgrading from legacy alerting to Unified Alerting, grafana will first delete all existing -# Unified Alerting resources, thus re-upgrading all organizations from scratch. If false or unset, organizations that -# have previously upgraded will not lose their existing Unified Alerting data when switching between legacy and -# Unified Alerting. Should be kept false when not needed as it may cause unintended data-loss if left enabled. -clean_upgrade = false +[unified_alerting.state_history.annotations] +# Controls retention of annotations automatically created while evaluating alert rules. +# Alert state history backend must be configured to be annotations (see setting [unified_alerting.state_history].backend). + +# Configures how long alert annotations are stored for. Default is 0, which keeps them forever. +# This setting should be expressed as a duration. Ex 6h (hours), 10d (days), 2w (weeks), 1M (month). +max_age = + +# Configures max number of alert annotations that Grafana stores. Default value is 0, which keeps all alert annotations. +max_annotations_to_keep = # NOTE: this configuration options are not used yet. [remote.alertmanager] @@ -1332,43 +1356,6 @@ password = sync_interval = 5m -#################################### Alerting ############################ -[alerting] -# Enable the legacy alerting sub-system and interface. If Unified Alerting is already enabled and you try to go back to legacy alerting, all data that is part of Unified Alerting will be deleted. When this configuration section and flag are not defined, the state is defined at runtime. See the documentation for more details. -enabled = - -# Makes it possible to turn off alert execution but alerting UI is visible -execute_alerts = true - -# Default setting for new alert rules. Defaults to categorize error and timeouts as alerting. (alerting, keep_state) -error_or_timeout = alerting - -# Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok) -nodata_or_nullvalues = no_data - -# Alert notifications can include images, but rendering many images at the same time can overload the server -# This limit will protect the server from render overloading and make sure notifications are sent out quickly -concurrent_render_limit = 5 - -# Default setting for alert calculation timeout. Default value is 30 -evaluation_timeout_seconds = 30 - -# Default setting for alert notification timeout. Default value is 30 -notification_timeout_seconds = 30 - -# Default setting for max attempts to sending alert notifications. Default value is 3 -max_attempts = 3 - -# Makes it possible to enforce a minimal interval between evaluations, to reduce load on the backend -min_interval_seconds = 1 - -# Configures for how long alert annotations are stored. Default is 0, which keeps them forever. -# This setting should be expressed as an duration. Ex 6h (hours), 10d (days), 2w (weeks), 1M (month). -max_annotation_age = - -# Configures max number of alert annotations that Grafana stores. Default value is 0, which keeps all alert annotations. -max_annotations_to_keep = - #################################### Annotations ######################### [annotations] # Configures the batch size for the annotation clean-up job. This setting is used for dashboard, API, and alert annotations. @@ -1572,6 +1559,12 @@ concurrent_render_request_limit = 30 # Default is 5m. This should be more than enough for most deployments. # Change the value only if image rendering is failing and you see `Failed to get the render key from cache` in Grafana logs. render_key_lifetime = 5m +# Default width for panel screenshot +default_image_width = 1000 +# Default height for panel screenshot +default_image_height = 500 +# Default scale for panel screenshot +default_image_scale = 1 [panels] # here for to support old env variables, can remove after a few months @@ -1824,3 +1817,18 @@ read_only_toggles = [public_dashboards] # Set to false to disable public dashboards enabled = true + +###################################### Cloud Migration ###################################### +[cloud_migration] +# Set to true to enable target-side migration UI +is_target = false +# Token used to send requests to grafana com +gcom_api_token = "" +# How long to wait for a request to fetch an instance to complete +fetch_instance_timeout = 5s +# How long to wait for a request to create an access policy to complete +create_access_policy_timeout = 5s +# How long to wait for a request to create to fetch an access policy to complete +fetch_access_policy_timeout = 5s +# How long to wait for a request to create to delete an access policy to complete +delete_access_policy_timeout = 5s \ No newline at end of file diff --git a/conf/provisioning/notifiers/sample.yaml b/conf/provisioning/notifiers/sample.yaml deleted file mode 100644 index 7d909839412..00000000000 --- a/conf/provisioning/notifiers/sample.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# # config file version -apiVersion: 1 - -# notifiers: -# - name: default-slack-temp -# type: slack -# org_name: Main Org. -# is_default: true -# uid: notifier1 -# settings: -# recipient: "XXX" -# token: "xoxb" -# uploadImage: true -# url: https://slack.com -# - name: default-email -# type: email -# org_id: 1 -# uid: notifier2 -# is_default: false -# settings: -# addresses: example11111@example.com -# delete_notifiers: -# - name: default-slack-temp -# org_name: Main Org. -# uid: notifier1 \ No newline at end of file diff --git a/conf/sample.ini b/conf/sample.ini index 3f3ed68e7cf..f315784fed2 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -9,10 +9,6 @@ # instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty ;instance_name = ${HOSTNAME} -# force migration will run migrations that might cause dataloss -# Deprecated, use clean_upgrade option in [unified_alerting.upgrade] instead. -;force_migration = false - #################################### Paths #################################### [paths] # Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) @@ -71,6 +67,9 @@ ;cert_file = ;cert_key = +# Certificates file watch interval +;certs_watch_interval = + # Unix socket gid # Changing the gid of a file without privileges requires that the target group is in the group of the process and that the process is the file owner # It is recommended to set the gid as http server user gid @@ -159,7 +158,10 @@ # For "sqlite3" only. Enable/disable Write-Ahead Logging, https://sqlite.org/wal.html. Default is false. ;wal = false -# For "mysql" only if migrationLocking feature toggle is set. How many seconds to wait before failing to lock the database for the migrations, default is 0. +# For "mysql" and "postgres" only. Lock the database for the migrations, default is true. +;migration_locking = true + +# For "mysql" and "postgres" only. How many seconds to wait before failing to lock the database for the migrations, default is 0. ;locking_attempt_timeout_sec = 0 # For "sqlite" only. How many times to retry query in case of database is locked failures. Default is 0 (disabled). @@ -379,8 +381,8 @@ # $NONCE in the template includes a random nonce. # $ROOT_PATH is server.root_url without the protocol. ;content_security_policy_report_only_template = """script-src 'self' 'unsafe-eval' 'unsafe-inline' 'strict-dynamic' $NONCE;object-src 'none';font-src 'self';style-src 'self' 'unsafe-inline' blob:;img-src * data:;base-uri 'self';connect-src 'self' grafana.com ws://$ROOT_PATH wss://$ROOT_PATH;manifest-src 'self';media-src 'none';form-action 'self';""" -# Controls if old angular plugins are supported or not. This will be disabled by default in future release -;angular_support_enabled = true +# Controls if old angular plugins are supported or not. +;angular_support_enabled = false # List of additional allowed URLs to pass by the CSRF check, separated by spaces. Suggested when authentication comes from an IdP. ;csrf_trusted_origins = example.com @@ -452,6 +454,9 @@ # Require email validation before sign up completes ;verify_email_enabled = false +# Redirect to default OrgId after login +;login_default_org_id = + # Background text for the user field on the login page ;login_hint = email or username ;password_hint = password @@ -479,6 +484,9 @@ # The duration in time a user invitation remains valid before expiring. This setting should be expressed as a duration. Examples: 6h (hours), 2d (days), 1w (week). Default is 24h (24 hours). The minimum supported duration is 15m (15 minutes). ;user_invite_max_lifetime_duration = 24h +# The duration in time a verification email, used to update the email address of a user, remains valid before expiring. This setting should be expressed as a duration. Examples: 6h (hours), 2d (days), 1w (week). Default is 1h (1 hour). +;verification_email_max_lifetime_duration = 1h + # 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 = @@ -536,10 +544,6 @@ # OAuth state max age cookie duration in seconds. Defaults to 600 seconds. ;oauth_state_cookie_max_age = 600 -# Skip forced assignment of OrgID 1 or 'auto_assign_org_id' for social logins -# Deprecated, use skip_org_role_sync option for specific provider instead. -;oauth_skip_org_role_update_sync = false - # limit of api_key seconds to live before expiration ;api_key_max_seconds_to_live = -1 @@ -771,6 +775,8 @@ ;header_name = X-JWT-Assertion ;email_claim = sub ;username_claim = sub +;email_attribute_path = jmespath.email +;username_attribute_path = jmespath.username ;jwk_set_url = https://foo.bar/.well-known/jwks.json ;jwk_set_file = /path/to/jwks.json ;cache_ttl = 60m @@ -861,6 +867,13 @@ # Disabled by default, needs to be explicitly enabled ;user_identity_enabled = false +# Specifies whether user identity authentication fallback credentials should be enabled in data sources +# Enabling this allows data source creators to provide fallback credentials for backend initiated requests +# e.g. alerting, recorded queries etc. +# Enabled by default, needs to be explicitly disabled +# Will not have any effect if user identity is disabled above +;user_identity_fallback_credentials_enabled = true + # Override token URL for Azure Active Directory # By default is the same as token URL configured for AAD authentication settings ;user_identity_token_url = @@ -1116,17 +1129,17 @@ # The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m. ;ha_push_pull_interval = "60s" -# Enable or disable alerting rule execution. The alerting UI remains visible. This option has a legacy version in the `[alerting]` section that takes precedence. +# Enable or disable alerting rule execution. The alerting UI remains visible. ;execute_alerts = true -# Alert evaluation timeout when fetching data from the datasource. This option has a legacy version in the `[alerting]` section that takes precedence. +# Alert evaluation timeout when fetching data from the datasource. # The timeout string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m. ;evaluation_timeout = 30s # Number of times we'll attempt to evaluate an alert rule before giving up on that evaluation. The default value is 1. ;max_attempts = 1 -# Minimum interval to enforce between rule evaluations. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. This option has a legacy version in the `[alerting]` section that takes precedence. +# Minimum interval to enforce between rule evaluations. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. # The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m. ;min_interval = 10s @@ -1193,54 +1206,25 @@ # Optional password for basic authentication on requests sent to Loki. Can be left blank. ; loki_basic_auth_password = "mypass" +# For "loki" only. +# Optional max query length for queries sent to Loki. Default is 721h which matches the default Loki value. +; loki_max_query_length = 360h + [unified_alerting.state_history.external_labels] # Optional extra labels to attach to outbound state history records or log streams. # Any number of label key-value-pairs can be provided. ; mylabelkey = mylabelvalue -[unified_alerting.upgrade] -# If set to true when upgrading from legacy alerting to Unified Alerting, grafana will first delete all existing -# Unified Alerting resources, thus re-upgrading all organizations from scratch. If false or unset, organizations that -# have previously upgraded will not lose their existing Unified Alerting data when switching between legacy and -# Unified Alerting. Should be kept false when not needed as it may cause unintended data-loss if left enabled. -;clean_upgrade = false - -#################################### Alerting ############################ -[alerting] -# Disable legacy alerting engine & UI features -;enabled = false - -# Makes it possible to turn off alert execution but alerting UI is visible -;execute_alerts = true - -# Default setting for new alert rules. Defaults to categorize error and timeouts as alerting. (alerting, keep_state) -;error_or_timeout = alerting - -# Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok) -;nodata_or_nullvalues = no_data - -# Alert notifications can include images, but rendering many images at the same time can overload the server -# This limit will protect the server from render overloading and make sure notifications are sent out quickly -;concurrent_render_limit = 5 - -# Default setting for alert calculation timeout. Default value is 30 -;evaluation_timeout_seconds = 30 - -# Default setting for alert notification timeout. Default value is 30 -;notification_timeout_seconds = 30 - -# Default setting for max attempts to sending alert notifications. Default value is 3 -;max_attempts = 3 - -# Makes it possible to enforce a minimal interval between evaluations, to reduce load on the backend -;min_interval_seconds = 1 +[unified_alerting.state_history.annotations] +# This section controls retention of annotations automatically created while evaluating alert rules +# when alerting state history backend is configured to be annotations (a setting [unified_alerting.state_history].backend # Configures for how long alert annotations are stored. Default is 0, which keeps them forever. -# This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month). -;max_annotation_age = +# This setting should be expressed as an duration. Ex 6h (hours), 10d (days), 2w (weeks), 1M (month). +max_age = # Configures max number of alert annotations that Grafana stores. Default value is 0, which keeps all alert annotations. -;max_annotations_to_keep = +max_annotations_to_keep = #################################### Annotations ######################### [annotations] diff --git a/ISSUE_TRIAGE.md b/contribute/ISSUE_TRIAGE.md similarity index 97% rename from ISSUE_TRIAGE.md rename to contribute/ISSUE_TRIAGE.md index 336b6497a25..70ee5c5e7bc 100644 --- a/ISSUE_TRIAGE.md +++ b/contribute/ISSUE_TRIAGE.md @@ -4,7 +4,7 @@ The main goal of issue triage is to categorize all incoming Grafana issues and m > **Note:** This information is for Grafana project Maintainers, Owners, and Admins. If you are a Contributor, then you will not be able to perform most of the tasks in this topic. -The core maintainers of the Grafana project are responsible for categorizing all incoming issues and delegating any critical or important issue to other maintainers. Currently one maintainer each week is responsible. Besides that part, triage provides an important way to contribute to an open source project. +The core maintainers of the Grafana project are responsible for categorizing all incoming issues and delegating any critical or important issue to other maintainers. Currently, one maintainer each week is responsible. Besides that part, triage provides an important way to contribute to an open source project. Triage helps ensure issues resolve quickly by: @@ -136,13 +136,13 @@ To make it easier for everyone to understand and find issues they're searching f Depending on the issue, you might not feel all this information is needed. Use your best judgement. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem. Label issue with `needs more info` and add any related `area/*` or `datasource/*` labels. Alternatively, use `bot/needs more info` label and the Grafana bot will request it for you. -If the author provides the standard information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time. +If the author provides the standard information, but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time. If the author does not respond to the requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided. When you feel you have all the information needed you're ready to [categorizing the issue](#3-categorizing-an-issue). -If you receive a notification with additional information provided but you are not anymore on issue triage and you feel you do not have time to handle it, you should delegate it to the current person on issue triage. +If you receive a notification with additional information provided, but you are not anymore on issue triage and you feel you do not have time to handle it, you should delegate it to the current person on issue triage. ## 3. Categorizing an issue @@ -312,7 +312,7 @@ When an issue has all basic information provided, but the triage responsible hav Investigating issues can be a very time consuming task, especially for the maintainers, given the huge number of combinations of plugins, data sources, platforms, databases, browsers, tools, hardware, integrations, versions and cloud services, etc that are being used with Grafana. There is a certain number of combinations that are more common than others, and these are in general easier for maintainers to investigate. -For some other combinations it may not be possible at all for a maintainer to setup a proper test environment to investigate the issue. In these cases we really appreciate any help we can get from the community. Otherwise the issue is highly likely to be closed. +For some other combinations it may not be possible at all for a maintainer to setup a proper test environment to investigate the issue. In these cases we really appreciate any help we can get from the community. Otherwise, the issue is highly likely to be closed. Even if you don't have the time or knowledge to investigate an issue we highly recommend that you [upvote](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments) the issue if you happen to have the same problem. If you have further details that may help investigating the issue please provide as much information as possible. diff --git a/UPGRADING_DEPENDENCIES.md b/contribute/UPGRADING_DEPENDENCIES.md similarity index 100% rename from UPGRADING_DEPENDENCIES.md rename to contribute/UPGRADING_DEPENDENCIES.md diff --git a/contribute/backend/errors.md b/contribute/backend/errors.md index 1d3ba3c9228..2d79cb8a6e1 100644 --- a/contribute/backend/errors.md +++ b/contribute/backend/errors.md @@ -109,7 +109,7 @@ fully Go modules compatible, but can be viewed using ### Error source You can optionally specify an error source that describes from where an -error originates. By default it's _server_ and means the error originates +error originates. By default, it's _server_ and means the error originates from within the application, e.g. Grafana. The `errutil.WithDownstream()` option may be appended to the NewBase function call to denote an error originates from a _downstream_ server/service. The error source information diff --git a/contribute/backend/instrumentation.md b/contribute/backend/instrumentation.md index a845825828a..d6d50c19c81 100644 --- a/contribute/backend/instrumentation.md +++ b/contribute/backend/instrumentation.md @@ -80,7 +80,7 @@ func doSomething(ctx context.Context) { ### Enable certain log levels for certain loggers -During development it's convenient to enable certain log level, e.g. debug, for certain loggers to minimize the generated log output and make it easier to find things. See [[log.filters]](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#filters) for information how to configure this. +During development, it's convenient to enable certain log level, e.g. debug, for certain loggers to minimize the generated log output and make it easier to find things. See [[log.filters]](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#filters) for information how to configure this. It's also possible to configure multiple loggers: diff --git a/contribute/backend/style-guide.md b/contribute/backend/style-guide.md index 4d50bf95b2e..a0877c3b44b 100644 --- a/contribute/backend/style-guide.md +++ b/contribute/backend/style-guide.md @@ -33,7 +33,7 @@ Tests must use the standard library, `testing`. For assertions, prefer using [te We have a [testsuite](https://github.com/grafana/grafana/tree/main/pkg/tests/testsuite) package which provides utilities for package-level setup and teardown. -Currently this is just used to ensure that test databases are correctly set up and torn down, but it also provides a place we can attach future tasks. +Currently, this is just used to ensure that test databases are correctly set up and torn down, but it also provides a place we can attach future tasks. Each package SHOULD include a [TestMain](https://pkg.go.dev/testing#hdr-Main) function that calls `testsuite.Run(m)`: @@ -78,7 +78,7 @@ func TestIntegrationFoo(t *testing.T) { Use respectively [`assert.*`](https://github.com/stretchr/testify#assert-package) functions to make assertions that should _not_ halt the test ("soft checks") and [`require.*`](https://github.com/stretchr/testify#require-package) -functions to make assertions that _should_ halt the test ("hard checks"). Typically you want to use the latter type of +functions to make assertions that _should_ halt the test ("hard checks"). Typically, you want to use the latter type of check to assert that errors have or have not happened, since continuing the test after such an assertion fails is chaotic (the system under test will be in an undefined state) and you'll often have segfaults in practice. diff --git a/contribute/create-pull-request.md b/contribute/create-pull-request.md index 7fe1023a897..0e41754ea48 100644 --- a/contribute/create-pull-request.md +++ b/contribute/create-pull-request.md @@ -124,7 +124,7 @@ If you're unsure, see the existing [changelog](https://github.com/grafana/grafan The pull request title should be formatted according to `: ` (Both "Area" and "Summary" should start with a capital letter). -The Grafana team _squashes_ all commits into one when we accept a pull request. The title of the pull request becomes the subject line of the squashed commit message. We still encourage contributors to write informative commit messages, as they becomes a part of the Git commit body. +The Grafana team _squashes_ all commits into one when we accept a pull request. The title of the pull request becomes the subject line of the squashed commit message. We still encourage contributors to write informative commit messages, as they become a part of the Git commit body. We use the pull request title when we generate change logs for releases. As such, we strive to make the title as informative as possible. @@ -133,7 +133,7 @@ We use the pull request title when we generate change logs for releases. As such ## Configuration changes -If your PR includes configuration changes, all of the following files must be changed correspondingly: +If your PR includes configuration changes, all the following files must be changed correspondingly: - conf/defaults.ini - conf/sample.ini diff --git a/contribute/developer-guide.md b/contribute/developer-guide.md index 52923577d1a..6df07b690e0 100644 --- a/contribute/developer-guide.md +++ b/contribute/developer-guide.md @@ -8,7 +8,7 @@ Make sure you have the following dependencies installed before setting up your d - [Git](https://git-scm.com/) - [Go](https://golang.org/dl/) (see [go.mod](../go.mod#L3) for minimum required version) -- [Node.js (Long Term Support)](https://nodejs.org), with [corepack enabled](https://nodejs.org/api/corepack.html#enabling-the-feature) +- [Node.js (Long Term Support)](https://nodejs.org), with [corepack enabled](https://nodejs.org/api/corepack.html#enabling-the-feature). See [.nvmrc](../.nvmrc) for supported version. It's recommend you use a version manager such as [nvm](https://github.com/nvm-sh/nvm), [fnm](https://github.com/Schniz/fnm), or similar. - GCC (required for Cgo dependencies) ### macOS @@ -76,6 +76,7 @@ After the command has finished, we can start building our source code: yarn start ``` +This command will generate sass theme files, build all external plugins, then build the frontend assets. Once `yarn start` has built the assets, it will continue to do so whenever any of the files change. This means you don't have to manually build the assets every time you change the code. > Troubleshooting: if your first build works, but after pulling updates you see unexpected errors in the "Type-checking in progress..." stage, these can be caused by the [tsbuildinfo cache supporting incremental builds](https://www.typescriptlang.org/tsconfig#incremental). You can `rm tsconfig.tsbuildinfo` and re-try. @@ -151,7 +152,7 @@ go run build.go test ### Run SQLLite, PostgreSQL and MySQL integration tests -By default grafana runs SQLite, to run test with SQLite +By default, grafana runs SQLite, to run test with SQLite ```bash go test -covermode=atomic -tags=integration ./pkg/... @@ -171,9 +172,11 @@ make test-go-integration-postgres ### Run end-to-end tests -The end to end tests in Grafana use [Cypress](https://www.cypress.io/) to run automated scripts in a headless Chromium browser. Read more about our [e2e framework](/contribute/style-guides/e2e.md). +Grafana uses [Cypress](https://www.cypress.io/) to end-to-end test core features. Core plugins use [Playwright](https://playwright.dev/) to run automated end-to-end tests. You can find more information on how to add end-to-end tests to your core plugin [here](./style-guides/e2e-plugins.md) -To run the tests: +#### Running Cypress tests + +To run all tests in a headless Chromium browser. ``` yarn e2e @@ -197,6 +200,34 @@ To choose a single test to follow in the browser as it runs, use `yarn e2e:dev` yarn e2e:dev ``` +#### To run the Playwright tests: + +**Note:** If you're using VS Code as your development editor, it's recommended to install the [Playwright test extension](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright). It allows you to run, debug and generate Playwright tests from within the editor. For more information about the extension and how to install it, refer to the [Playwright documentation](https://playwright.dev/docs/getting-started-vscode). + +Each version of Playwright needs specific versions of browser binaries to operate. You will need to use the Playwright CLI to install these browsers. + +``` +yarn playwright install chromium +``` + +To run all tests in a headless Chromium browser and display results in the terminal. + +``` +yarn e2e:playwright +``` + +For a better developer experience, open the Playwright UI where you can easily walk through each step of the test and visually see what was happening before, during and after each step. + +``` +yarn e2e:playwright:ui +``` + +To open the HTML reporter for the last test run session. + +``` +yarn e2e:playwright:report +``` + ## Configure Grafana for development The default configuration, `defaults.ini`, is located in the `conf` directory. @@ -300,7 +331,7 @@ For some people, typically using the bash shell, ulimit fails with an error simi ulimit: open files: cannot modify limit: Operation not permitted ``` -If that happens to you, chances are you've already set a lower limit and your shell won't let you set a higher one. Try looking in your shell initialization files (~/.bashrc typically), if there's already a ulimit command that you can tweak. +If that happens to you, chances are you've already set a lower limit and your shell won't let you set a higher one. Try looking in your shell initialization files (~/.bashrc typically), if there's already an ulimit command that you can tweak. ## Next steps diff --git a/contribute/engineering/terminology.md b/contribute/engineering/terminology.md index 4a833dd7fb2..5b28cb7f4b1 100644 --- a/contribute/engineering/terminology.md +++ b/contribute/engineering/terminology.md @@ -6,7 +6,7 @@ This document defines technical terms used in Grafana. ## TLS/SSL -The acronyms [TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security) (Transport Layer Security and +The acronyms [TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security) (Transport Layer Security) and [SSL](https://en.wikipedia.org/wiki/SSL) (Secure Socket Layer) are both used to describe the HTTPS security layer, and are in practice synonymous. However, TLS is considered the current name for the technology, and SSL is considered [deprecated](https://tools.ietf.org/html/rfc7568). diff --git a/contribute/feature-toggles.md b/contribute/feature-toggles.md index 79e0178392d..131834bcaf8 100644 --- a/contribute/feature-toggles.md +++ b/contribute/feature-toggles.md @@ -5,7 +5,7 @@ This guide helps you get started adding your feature behind a feature flag in Gr ## Steps to adding a feature toggle 1. Define the feature toggle in [registry.go](../pkg/services/featuremgmt/registry.go). To see what each feature stage means, look at the comments [here](../pkg/services/featuremgmt/features.go). If you are a community member, use the [CODEOWNERS](../.github/CODEOWNERS) file to determine which team owns the package you are updating. -2. Run the go tests mentioned at the top of [this file](../pkg/services/featuremgmt/toggles_gen.go). This will generate all the additional files needed: `toggles_gen` for the backend, `grafana-data` for the frontend, and docs. You can run the test by running `go test ./pkg/services/featuremgmt/...`. This will say the tests failed the first time, but it will have generated the right code. If you re-run the tests, it will pass. +2. Run the go tests mentioned at the top of [this file](../pkg/services/featuremgmt/toggles_gen.go). This will generate all the additional files needed: `toggles_gen` for the backend, `grafana-data` for the frontend, and docs. You can run the test by running `make gen-feature-toggles`. ## How to use it in the code diff --git a/contribute/internationalization.md b/contribute/internationalization.md index 8d32a65e3ed..7a0ac2a249f 100644 --- a/contribute/internationalization.md +++ b/contribute/internationalization.md @@ -66,13 +66,19 @@ While the `t` function can technically be used outside of React functions (e.g, ## How to add a new language -1. Add new locale in Crowdin and download files to repo - 1. Grafana OSS Crowdin project -> "dot dot dot" menu in top right -> Target languages - 2. If Crowdin's locale code is different from our IETF language tag, add a custom mapping in Project Settings -> Language mapping - 3. GH repo grafana/grafana -> Actions -> Choose `Crowdin Download Action` -> Run workflow -> Creates a PR automatically -2. Review the PR `I18n: Download translations from Crowdin` -3. Update `public/app/core/internationalization/constants.ts` (add new constant, and add to `LOCALES`) and add changes to the open PR -4. Approve and merge the PR +1. Add a new locale in Crowdin + 1. Grafana OSS Crowdin project + 2. "dot dot dot" menu in top right + 3. Target languages, and add the language + 4. If Crowdin's locale code is different from our IETF language tag (such as Chinese Simplified), add a custom mapping in Project Settings -> Language mapping +2. Sync the new (empty) language to the repo + 1. In Grafana's Github Actions, go to [Crowdin Download Action](https://github.com/grafana/grafana/actions/workflows/i18n-crowdin-download.yml) + 2. Select 'Run workflow', from main + 3. The workflow will create a PR with the new language files, which can be reviewed and merged +3. Update `public/app/core/internationalization/constants.ts` + 1. Add a new constant for the new language + 2. Add the new constant to the `LOCALES` array + 3. Create a PR with the changes and merge when you are ready to release the new language (probably wait until we have translations for it) ## How translations work in Grafana diff --git a/contribute/style-guides/e2e-core.md b/contribute/style-guides/e2e-core.md index fb2c24e0bfc..321f02522c9 100644 --- a/contribute/style-guides/e2e-core.md +++ b/contribute/style-guides/e2e-core.md @@ -22,4 +22,4 @@ The above commands use some utils scripts under [_\/e2e_](../../e2e) ## Test suites -All the integration tests are located at _\/e2e/suite\/specs_. The page objects and reusable flows are in the [_\/packages/grafana-e2e_](../../packages/grafana-e2e) package. +All the integration tests are located at _\/e2e/suite\/specs_. diff --git a/contribute/style-guides/e2e-plugins.md b/contribute/style-guides/e2e-plugins.md index a40b9516fa7..f675db96784 100644 --- a/contribute/style-guides/e2e-plugins.md +++ b/contribute/style-guides/e2e-plugins.md @@ -1,28 +1,35 @@ -# End-to-End Tests for plugins +# end-to-end tests for plugins -Be sure that you've read the [generalized E2E document](e2e.md). +When end-to-end testing Grafana plugins, it's recommended to use the [`@grafana/plugin-e2e`](https://www.npmjs.com/package/@grafana/plugin-e2e?activeTab=readme) testing tool. `@grafana/plugin-e2e` extends [`@playwright/test`](https://playwright.dev/) capabilities with relevant fixtures, models, and expect matchers; enabling comprehensive end-to-end testing of Grafana plugins across multiple versions of Grafana. For information on how to get started with Plugin end-to-end testing and Playwright, checkout the [Get started](https://grafana.com/developers/plugin-tools/e2e-test-a-plugin/get-started) guide. -## Commands +## Adding end-to-end tests for a core plugin + +Playwright end-to-end tests for plugins should be added to the [`e2e/plugin-e2e`](https://github.com/grafana/grafana/tree/main/e2e/plugin-e2e) directory. -- `yarn test:e2e` will run [Grafana's E2E utility](../../packages/grafana-e2e) against an already running Grafana server. -- `yarn test:e2e:update` will run `test:e2e` but instead of asserting that screenshots match their expected fixtures, they'll be replaced with new ones. +1. Add a new directory that has the name as your plugin [`here`](https://github.com/grafana/grafana/tree/main/e2e/plugin-e2e). This is where your plugin tests will be kept. -Your running Grafana instance can be targeted by setting the `CYPRESS_BASE_URL`, `CYPRESS_USERNAME` and `CYPRESS_PASSWORD` environment variableS: +2. Playwright uses [projects](https://playwright.dev/docs/test-projects) to logically group tests together. All tests in a project share the same configuration. + In the [Playwright config file](https://github.com/grafana/grafana/blob/main/playwright.config.ts), add a new project item. Make sure the `name` and the `testDir` sub directory matches the name of the directory that contains your plugin tests. + Adding `'authenticate'` to the list of dependencies and specifying `'playwright/.auth/admin.json'` as storage state will ensure all tests in your project will start already authenticated as an admin user. If you wish to use a different role for and perhaps test RBAC for some of your tests, please refer to the plugin-e2e [documentation](https://grafana.com/developers/plugin-tools/e2e-test-a-plugin/use-authentication). -```shell -CYPRESS_BASE_URL=https://localhost:3000 CYPRESS_USERNAME=admin CYPRESS_PASSWORD=admin yarn test:e2e -``` + ```ts + { + name: 'mysql', + testDir: path.join(testDirRoot, '/mysql'), + use: { + ...devices['Desktop Chrome'], + storageState: 'playwright/.auth/admin.json', + }, + dependencies: ['authenticate'], + }, + ``` -## Test suites +3. Update the [CODEOWNERS](https://github.com/grafana/grafana/blob/main/.github/CODEOWNERS/#L315) file so that your team is owner of the tests in the directory you added in step 1. + +## Commands -All tests are located at _\/cypress/integration_ by default. +- `yarn e2e:playwright` will run all Playwright tests. Optionally, you can provide the `--project mysql` argument to run tests in a certain project. -## Things to test +The script above assumes you have Grafana running on `localhost:3000`. You may change this by providing environment variables. -- Add data source (if applicable) -- Add panel -- Edit panel -- Annotations (if applicable) -- Aliases (if applicable) -- Template variables -- "Explore" view +`HOST=127.0.0.1 PORT=3001 yarn e2e:playwright` diff --git a/contribute/style-guides/e2e.md b/contribute/style-guides/e2e.md index 76958b6d53b..285936f2c5b 100644 --- a/contribute/style-guides/e2e.md +++ b/contribute/style-guides/e2e.md @@ -1,13 +1,13 @@ # End-to-End tests -Grafana Labs uses a minimal [homegrown solution](../../packages/grafana-e2e) built on top of [Cypress](https://cypress.io) for its end-to-end (E2E) tests. +Grafana Labs uses a minimal [homegrown solution](../../e2e/utils/index.ts) built on top of [Cypress](https://cypress.io) for its end-to-end (E2E) tests. Important notes: - We generally store all element identifiers ([CSS selectors](https://mdn.io/docs/Web/CSS/CSS_Selectors)) within the framework for reuse and maintainability. - We generally do not use stubs or mocks as to fully simulate a real user. - Cypress' promises [do not behave as you'd expect](https://docs.cypress.io/guides/core-concepts/introduction-to-cypress.html#Mixing-Async-and-Sync-code). -- [Testing core Grafana](e2e-core.md) is slightly different than [testing plugins](e2e-plugins.md). +- [Testing core Grafana](e2e-core.md) is different than [testing plugins](e2e-plugins.md) - core Grafana uses Cypress whereas plugins use [Playwright test](https://playwright.dev/). ## Framework structure diff --git a/devenv/alert_rules.yaml b/devenv/alert_rules.yaml new file mode 100644 index 00000000000..dbf2f996576 --- /dev/null +++ b/devenv/alert_rules.yaml @@ -0,0 +1,158 @@ +apiVersion: 1 +groups: + - orgId: 1 + name: testEvaluationGroup + folder: gdev dashboards + interval: 5m + rules: + - uid: bddn0v6f1kgzkc + title: e2e-ReturnToPrevious-test + condition: C + data: + - refId: A + relativeTimeRange: + from: 600 + to: 0 + datasourceUid: PD8C576611E62080A + model: + intervalMs: 1000 + maxDataPoints: 43200 + refId: A + - refId: B + datasourceUid: __expr__ + model: + conditions: + - evaluator: + params: [] + type: gt + operator: + type: and + query: + params: + - B + reducer: + params: [] + type: last + type: query + datasource: + type: __expr__ + uid: __expr__ + expression: A + intervalMs: 1000 + maxDataPoints: 43200 + reducer: last + refId: B + type: reduce + - refId: C + datasourceUid: __expr__ + model: + conditions: + - evaluator: + params: + - 0 + type: gt + operator: + type: and + query: + params: + - C + reducer: + params: [] + type: last + type: query + datasource: + type: __expr__ + uid: __expr__ + expression: B + intervalMs: 1000 + maxDataPoints: 43200 + refId: C + type: threshold + dashboardUid: j6T00KRZz + panelId: 7 + noDataState: NoData + execErrState: Error + for: 5m + annotations: + __dashboardUid__: j6T00KRZz + __panelId__: "7" + labels: {} + isPaused: false + - orgId: 1 + name: testEvaluationGroup2 + folder: gdev dashboards + interval: 10m + rules: + - uid: dddyksihq7h1ca + title: e2e-ReturnToPrevious-test-2 + condition: C + data: + - refId: A + relativeTimeRange: + from: 600 + to: 0 + datasourceUid: PD8C576611E62080A + model: + intervalMs: 1000 + maxDataPoints: 43200 + refId: A + - refId: B + datasourceUid: __expr__ + model: + conditions: + - evaluator: + params: [] + type: gt + operator: + type: and + query: + params: + - B + reducer: + params: [] + type: last + type: query + datasource: + type: __expr__ + uid: __expr__ + expression: A + intervalMs: 1000 + maxDataPoints: 43200 + reducer: last + refId: B + type: reduce + - refId: C + datasourceUid: __expr__ + model: + conditions: + - evaluator: + params: + - 0 + type: gt + operator: + type: and + query: + params: + - C + reducer: + params: [] + type: last + type: query + datasource: + type: __expr__ + uid: __expr__ + expression: B + intervalMs: 1000 + maxDataPoints: 43200 + refId: C + type: threshold + dashboardUid: j6T00KRZz + panelId: 3 + noDataState: NoData + execErrState: Error + for: 10m + annotations: + __dashboardUid__: j6T00KRZz + __panelId__: "3" + labels: {} + isPaused: false diff --git a/devenv/bulk_alerting_dashboards/bulk_alerting_dashboards.yaml b/devenv/bulk_alerting_dashboards/bulk_alerting_dashboards.yaml deleted file mode 100644 index 1ede5dcd30a..00000000000 --- a/devenv/bulk_alerting_dashboards/bulk_alerting_dashboards.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: 1 - -providers: - - name: 'Bulk alerting dashboards' - folder: 'Bulk alerting dashboards' - type: file - options: - path: devenv/bulk_alerting_dashboards - diff --git a/devenv/bulk_alerting_dashboards/dashboard.libsonnet b/devenv/bulk_alerting_dashboards/dashboard.libsonnet deleted file mode 100644 index d19e1e1e45d..00000000000 --- a/devenv/bulk_alerting_dashboards/dashboard.libsonnet +++ /dev/null @@ -1,169 +0,0 @@ -{ - alertingDashboard(dashboardCounter, datasourceCounter):: { - title: "alerting-title-" + dashboardCounter, - editable: true, - gnetId: null, - graphTooltip: 0, - id: null, - links: [], - panels: [ - { - alert: { - conditions: [ - { - evaluator: { - params: [ - 65 - ], - type: "gt" - }, - operator: { - type: "and" - }, - query: { - params: [ - "A", - "5m", - "now" - ] - }, - reducer: { - params: [], - type: "avg" - }, - type: "query" - } - ], - executionErrorState: "alerting", - frequency: "24h", - handler: 1, - name: "bulk alerting " + dashboardCounter, - noDataState: "no_data", - notifications: [] - }, - aliasColors: {}, - bars: false, - dashLength: 10, - dashes: false, - datasource: "gfdev-bulkalerting-" + datasourceCounter, - fill: 1, - gridPos: { - h: 9, - w: 12, - x: 0, - y: 0 - }, - id: 1, - legend: { - avg: false, - current: false, - max: false, - min: false, - show: true, - total: false, - values: false - }, - lines: true, - linewidth: 1, - nullPointMode: "null", - percentage: false, - pointradius: 5, - points: false, - renderer: "flot", - seriesOverrides: [], - spaceLength: 10, - stack: false, - steppedLine: false, - targets: [ - { - expr: "go_goroutines", - format: "time_series", - intervalFactor: 1, - refId: "A" - } - ], - thresholds: [ - { - colorMode: "critical", - fill: true, - line: true, - op: "gt", - value: 50 - } - ], - timeFrom: null, - timeShift: null, - title: "Panel Title", - tooltip: { - shared: true, - sort: 0, - value_type: "individual" - }, - type: "graph", - xaxis: { - buckets: null, - mode: "time", - name: null, - show: true, - values: [] - }, - yaxes: [ - { - format: "short", - label: null, - logBase: 1, - max: null, - min: null, - show: true - }, - { - format: "short", - label: null, - logBase: 1, - max: null, - min: null, - show: true - } - ] - } - ], - schemaVersion: 16, - tags: [], - templating: { - list: [] - }, - time: { - from: "now-6h", - to: "now" - }, - timepicker: { - refresh_intervals: [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - time_options: [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - timezone: "", - uid: null, - version: 0 - }, -} - diff --git a/devenv/bulk_alerting_dashboards/datasources.jsonnet b/devenv/bulk_alerting_dashboards/datasources.jsonnet deleted file mode 100644 index 453e1a812bf..00000000000 --- a/devenv/bulk_alerting_dashboards/datasources.jsonnet +++ /dev/null @@ -1,14 +0,0 @@ -local arr = std.range(1, 100); - -{ - "apiVersion": 1, - "datasources": [ - { - "name": 'gfdev-bulkalerting-' + counter, - "type": "prometheus", - "access": "proxy", - "url": "http://localhost:9090" - } - for counter in arr - ], -} diff --git a/devenv/dev-dashboards/alerting/testdata_alerts.json b/devenv/dev-dashboards/alerting/testdata_alerts.json deleted file mode 100644 index b76ad5ff9ed..00000000000 --- a/devenv/dev-dashboards/alerting/testdata_alerts.json +++ /dev/null @@ -1,806 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 147, - "links": [], - "liveNow": false, - "panels": [ - { - "alert": { - "alertRuleTags": {}, - "conditions": [ - { - "evaluator": { - "params": [ - 177 - ], - "type": "gt" - }, - "query": { - "params": [ - "A", - "5m", - "now" - ] - }, - "reducer": { - "params": [], - "type": "avg" - }, - "type": "query" - } - ], - "enabled": true, - "executionErrorState": "alerting", - "for": "0m", - "frequency": "60s", - "handler": 1, - "name": "TestData - Always Alerting", - "noDataState": "no_data", - "notifications": [] - }, - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 10, - "x": 0, - "y": 0 - }, - "hiddenSeries": false, - "id": 4, - "isNew": true, - "legend": { - "show": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.4.0-pre", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "refId": "A", - "scenario": "random_walk", - "scenarioId": "csv_metric_values", - "stringInput": "200,445,100,150,200,220,190", - "target": "" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 177 - } - ], - "timeRegions": [], - "title": "Always Alerting", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "min": "0", - "show": true - }, - { - "format": "short", - "label": "", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "alert": { - "alertRuleTags": {}, - "conditions": [ - { - "evaluator": { - "params": [ - 100 - ], - "type": "gt" - }, - "operator": { - "type": "and" - }, - "query": { - "params": [ - "A", - "5m", - "now" - ] - }, - "reducer": { - "params": [], - "type": "avg" - }, - "type": "query" - } - ], - "executionErrorState": "alerting", - "for": "900000h", - "frequency": "1m", - "handler": 1, - "name": "TestData - Always Pending", - "noDataState": "no_data", - "notifications": [] - }, - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 10, - "x": 10, - "y": 0 - }, - "hiddenSeries": false, - "id": 7, - "isNew": true, - "legend": { - "show": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "refId": "A", - "scenario": "random_walk", - "scenarioId": "csv_metric_values", - "stringInput": "200,445,100,150,200,220,190", - "target": "" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 100 - } - ], - "timeRegions": [], - "title": "Always Pending with For", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "min": "0", - "show": true - }, - { - "format": "short", - "label": "", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "gridPos": { - "h": 20, - "w": 4, - "x": 20, - "y": 0 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "refId": "A" - } - ], - "title": "Alert list", - "type": "alertlist" - }, - { - "alert": { - "alertRuleTags": {}, - "conditions": [ - { - "evaluator": { - "params": [ - 177 - ], - "type": "gt" - }, - "operator": { - "type": "and" - }, - "query": { - "params": [ - "A", - "15m", - "now" - ] - }, - "reducer": { - "params": [], - "type": "avg" - }, - "type": "query" - } - ], - "executionErrorState": "alerting", - "for": "1m", - "frequency": "1m", - "handler": 1, - "name": "TestData - Always Alerting For", - "noDataState": "no_data", - "notifications": [] - }, - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 10, - "x": 0, - "y": 7 - }, - "hiddenSeries": false, - "id": 6, - "isNew": true, - "legend": { - "show": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.4.0-pre", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "refId": "A", - "scenario": "random_walk", - "scenarioId": "csv_metric_values", - "stringInput": "200,445,100,150,200,220,190", - "target": "" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 177 - } - ], - "timeRegions": [], - "title": "Always Alerting with For", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "min": "0", - "show": true - }, - { - "format": "short", - "label": "", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "alert": { - "conditions": [ - { - "evaluator": { - "params": [ - 60 - ], - "type": "gt" - }, - "query": { - "params": [ - "A", - "5m", - "now" - ] - }, - "reducer": { - "params": [], - "type": "avg" - }, - "type": "query" - } - ], - "enabled": true, - "frequency": "60s", - "handler": 1, - "name": "TestData - Always OK", - "noDataState": "no_data", - "notifications": [] - }, - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 10, - "x": 10, - "y": 7 - }, - "hiddenSeries": false, - "id": 3, - "isNew": true, - "legend": { - "show": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.4.0-pre", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "refId": "A", - "scenario": "random_walk", - "scenarioId": "csv_metric_values", - "stringInput": "1,20,90,30,5,0", - "target": "" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 60 - } - ], - "timeRegions": [], - "title": "Always OK", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "max": "125", - "min": "0", - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - }, - { - "alert": { - "conditions": [ - { - "evaluator": { - "params": [ - 1 - ], - "type": "gt" - }, - "operator": { - "type": "and" - }, - "query": { - "params": [ - "A", - "15m", - "now" - ] - }, - "reducer": { - "params": [], - "type": "avg" - }, - "type": "query" - } - ], - "executionErrorState": "alerting", - "for": "5m", - "frequency": "1m", - "handler": 1, - "name": "TestData - No data", - "noDataState": "no_data", - "notifications": [] - }, - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 10, - "x": 0, - "y": 13 - }, - "hiddenSeries": false, - "id": 5, - "isNew": true, - "legend": { - "show": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "9.4.0-pre", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "type": "testdata", - "uid": "PD8C576611E62080A" - }, - "refId": "A", - "scenario": "random_walk", - "scenarioId": "no_data_points", - "stringInput": "", - "target": "" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 1 - } - ], - "timeRegions": [], - "title": "No data", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "min": "0", - "show": true - }, - { - "format": "short", - "label": "", - "logBase": 1, - "show": true - } - ], - "yaxis": { - "align": false - } - } - ], - "schemaVersion": 37, - "tags": [ - "gdev", - "alerting" - ], - "templating": { - "list": [ - { - "current": { - "text": "TestData", - "value": "TestData" - }, - "hide": 0, - "includeAll": false, - "label": "alert name filter", - "multi": false, - "name": "namefilter", - "options": [ - { - "selected": true, - "text": "TestData", - "value": "TestData" - }, - { - "selected": false, - "text": "Prometheus", - "value": "Prometheus" - }, - { - "selected": false, - "text": "Graphite", - "value": "Graphite" - } - ], - "query": "TestData,Prometheus,Graphite", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Alerting with TestData", - "uid": "7MeksYbmk", - "version": 1, - "weekStart": "" -} diff --git a/devenv/dev-dashboards/live/live-publish.json b/devenv/dev-dashboards/live/live-publish.json new file mode 100644 index 00000000000..1e7e26b8dfb --- /dev/null +++ b/devenv/dev-dashboards/live/live-publish.json @@ -0,0 +1,447 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 209, + "links": [], + "panels": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 9, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "## This dashboard requires alpha panels to be enabled!", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "type": "text" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 4, + "w": 15, + "x": 0, + "y": 2 + }, + "id": 2, + "options": { + "channel": { + "namespace": "devenv", + "path": "weather", + "scope": "stream" + }, + "display": "none", + "json": { + "hello": "world" + }, + "message": "weather,location=west,sensor=A temperature=82\nweather,location=east,sensor=A temperature=76", + "publish": "influx" + }, + "title": "Panel Title", + "type": "live" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 15, + "y": 2 + }, + "id": 4, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "channel": "stream/devenv/weather", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "measurements", + "refId": "A" + } + ], + "title": "Weather (values)", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "time" + } + ] + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 4, + "w": 15, + "x": 0, + "y": 6 + }, + "id": 5, + "options": { + "channel": { + "namespace": "devenv", + "path": "weather", + "scope": "stream" + }, + "display": "none", + "json": { + "hello": "world" + }, + "message": "weather,location=west,sensor=A temperature=90\nweather,location=east,sensor=A temperature=80", + "publish": "influx" + }, + "title": "Panel Title", + "type": "live" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "channel": "stream/devenv/weather", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "measurements", + "refId": "A" + }, + { + "channel": "stream/devenv/weatherX", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "hide": false, + "queryType": "measurements", + "refId": "B" + } + ], + "title": "Panel Title", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 4, + "w": 15, + "x": 0, + "y": 17 + }, + "id": 6, + "options": { + "channel": { + "namespace": "devenv", + "path": "weather", + "scope": "stream" + }, + "display": "none", + "json": { + "hello": "world" + }, + "message": "weatherX,location=west,sensor=X temperature=82\nweatherX,location=east,sensor=X temperature=76", + "publish": "influx" + }, + "title": "Panel Title", + "type": "live" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 15, + "y": 17 + }, + "id": 7, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "channel": "stream/devenv/weatherX", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "measurements", + "refId": "A" + } + ], + "title": "WeatherX (values)", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "time" + } + ] + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 4, + "w": 15, + "x": 0, + "y": 21 + }, + "id": 8, + "options": { + "channel": { + "namespace": "devenv", + "path": "weather", + "scope": "stream" + }, + "display": "none", + "json": { + "hello": "world" + }, + "message": "weatherX,location=west,sensor=X temperature=90\nweatherX,location=east,sensor=X temperature=22", + "publish": "influx" + }, + "title": "Panel Title", + "type": "live" + } + ], + "schemaVersion": 39, + "tags": [ + "gdev", + "live-tests" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-1m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "live test", + "uid": "addoomtlivedev", + "version": 17, + "weekStart": "" + } \ No newline at end of file diff --git a/devenv/dev-dashboards/migrations/migrations.json b/devenv/dev-dashboards/migrations/migrations.json index 27979e11172..3d13fe327f6 100644 --- a/devenv/dev-dashboards/migrations/migrations.json +++ b/devenv/dev-dashboards/migrations/migrations.json @@ -241,7 +241,7 @@ } }, "percentage": false, - "pluginVersion": "10.4.0-pre", + "pluginVersion": "11.0.0-pre", "pointradius": 2, "points": false, "renderer": "flot", @@ -311,7 +311,281 @@ "content": "# Graph panel >> Timeseries panel\n\nKnown issues:\n* hiding null/empty series\n* time regions", "mode": "markdown" }, - "pluginVersion": "10.4.0-pre", + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "refId": "A" + } + ], + "title": "Status + Notes", + "type": "text" + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "fieldConfig": { + "defaults": { + "unit": "short" + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 11, + "w": 16, + "x": 0, + "y": 11 + }, + "hiddenSeries": false, + "id": 28, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "percentage": false, + "pluginVersion": "11.0.0-pre", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 3 + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Flot graph - x axis series mode", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "series", + "show": true, + "values": [ + "total" + ] + }, + "yaxes": [ + { + "$$hashKey": "object:88", + "format": "short", + "logBase": 1, + "show": true + }, + { + "$$hashKey": "object:89", + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "gridPos": { + "h": 11, + "w": 8, + "x": 16, + "y": 11 + }, + "id": 29, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "# Graph panel >> Bar chart panel\n", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "refId": "A" + } + ], + "title": "Status + Notes", + "type": "text" + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "fieldConfig": { + "defaults": { + "unit": "short" + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 11, + "w": 16, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "id": 30, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "percentage": false, + "pluginVersion": "11.0.0-pre", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 3 + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Flot graph - x axis histogram mode", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "histogram", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:193", + "format": "short", + "logBase": 1, + "show": true + }, + { + "$$hashKey": "object:194", + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "gridPos": { + "h": 11, + "w": 8, + "x": 16, + "y": 22 + }, + "id": 31, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "# Graph panel >> Histogram panel\n", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", "targets": [ { "datasource": { @@ -335,7 +609,7 @@ "h": 10, "w": 16, "x": 0, - "y": 11 + "y": 33 }, "id": 2, "options": { @@ -411,7 +685,7 @@ "h": 10, "w": 8, "x": 16, - "y": 11 + "y": 33 }, "id": 7, "options": { @@ -423,7 +697,7 @@ "content": "# Table (old) >> Table\n\nKnown issues:\n* wrapping text\n* style changes", "mode": "markdown" }, - "pluginVersion": "10.4.0-pre", + "pluginVersion": "11.0.0-pre", "targets": [ { "datasource": { @@ -460,7 +734,7 @@ "h": 8, "w": 8, "x": 0, - "y": 21 + "y": 43 }, "id": 9, "mappingType": 1, @@ -517,64 +791,65 @@ "valueName": "avg" }, { - "colorBackground": false, - "colorValue": true, - "colors": [ - "#299c46", - "#73BF69", - "#d44a3a" - ], "datasource": { "type": "testdata", "uid": "PD8C576611E62080A" }, - "format": "ms", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] }, "gridPos": { "h": 8, "w": 8, "x": 8, - "y": 21 + "y": 43 }, "id": 23, - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], "maxDataPoints": 100, - "nullPointMode": "connected", - "pluginVersion": "6.2.0-pre", - "postfix": "", - "postfixFontSize": "50%", - "prefix": "p95", - "prefixFontSize": "80%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": true + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "tableColumn": "", + "pluginVersion": "11.0.0-pre", "targets": [ { "datasource": { @@ -584,18 +859,8 @@ "refId": "A" } ], - "thresholds": "", "title": "singlestat (old, internal. Migrated if schema < 28)", - "type": "singlestat", - "valueFontSize": "120%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" + "type": "stat" }, { "datasource": { @@ -606,7 +871,7 @@ "h": 8, "w": 8, "x": 16, - "y": 21 + "y": 43 }, "id": 10, "options": { @@ -618,7 +883,7 @@ "content": "# Singlestat >> Stat\n\nKnown issues:\n* limited options", "mode": "markdown" }, - "pluginVersion": "10.4.0-pre", + "pluginVersion": "11.0.0-pre", "targets": [ { "datasource": { @@ -640,7 +905,7 @@ "h": 10, "w": 16, "x": 0, - "y": 29 + "y": 51 }, "id": 24, "options": { @@ -693,7 +958,7 @@ "h": 10, "w": 8, "x": 16, - "y": 29 + "y": 51 }, "id": 25, "options": { @@ -705,7 +970,7 @@ "content": "# grafana-piechart-panel >> piechart\n\nKnown issues:\n* TBD", "mode": "markdown" }, - "pluginVersion": "10.4.0-pre", + "pluginVersion": "11.0.0-pre", "targets": [ { "datasource": { @@ -719,47 +984,35 @@ "type": "text" }, { + "circleMaxSize": 30, + "circleMinSize": 2, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], "datasource": { "type": "grafana-testdata-datasource", "uid": "PD8C576611E62080A" }, - "fieldConfig": { - "defaults": { - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(245, 54, 54, 0.9)" - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 0 - }, - { - "color": "rgba(50, 172, 45, 0.97)", - "value": 10 - } - ] - } - }, - "overrides": [] - }, + "decimals": 0, + "esMetric": "Count", "gridPos": { "h": 10, "w": 16, "x": 0, - "y": 39 + "y": 61 }, + "hideEmpty": false, + "hideZero": false, "id": 26, + "initialZoom": 1, + "locationData": "countries", + "mapCenter": "(0°, 0°)", + "mapCenterLatitude": 0, + "mapCenterLongitude": 0, "maxDataPoints": 1, + "mouseWheelZoom": false, "options": { "basemap": { "name": "Basemap", @@ -831,6 +1084,15 @@ } }, "pluginVersion": "10.4.0-pre", + "showLegend": true, + "stickyLabels": false, + "tableQueryOptions": { + "geohashField": "geohash", + "latitudeField": "latitude", + "longitudeField": "longitude", + "metricField": "metric", + "queryType": "geohash" + }, "targets": [ { "csvFileName": "flight_info_by_state.csv", @@ -842,6 +1104,7 @@ "scenarioId": "csv_file" } ], + "thresholds": "0,10", "title": "grafana-worldmap-panel", "transformations": [ { @@ -859,7 +1122,10 @@ } } ], - "type": "grafana-worldmap-panel" + "type": "grafana-worldmap-panel", + "unitPlural": "", + "unitSingle": "", + "valueName": "total" }, { "datasource": { @@ -870,7 +1136,7 @@ "h": 10, "w": 8, "x": 16, - "y": 39 + "y": 61 }, "id": 27, "options": { @@ -882,7 +1148,7 @@ "content": "# grafana-worldmap-panel >> geomap\n\nKnown issues:\n* TBD", "mode": "markdown" }, - "pluginVersion": "10.4.0-pre", + "pluginVersion": "11.0.0-pre", "targets": [ { "datasource": { @@ -910,10 +1176,11 @@ "from": "now-6h", "to": "now" }, + "timeRangeUpdatedDuringEditOrView": false, "timepicker": {}, "timezone": "", "title": "Devenv - Panel migrations", "uid": "cdd412c4", - "version": 67, + "version": 68, "weekStart": "" } \ No newline at end of file diff --git a/devenv/dev-dashboards/panel-canvas/canvas-connection-examples.json b/devenv/dev-dashboards/panel-canvas/canvas-connection-examples.json index 7e4f1202bc4..784bfb2c865 100644 --- a/devenv/dev-dashboards/panel-canvas/canvas-connection-examples.json +++ b/devenv/dev-dashboards/panel-canvas/canvas-connection-examples.json @@ -27,6 +27,2203 @@ "links": [], "liveNow": false, "panels": [ + { + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 22, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 5, + "options": { + "infinitePan": true, + "inlineEditing": false, + "panZoom": true, + "root": { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "elements": [ + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "text" + }, + "size": 20, + "text": { + "fixed": "Library" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 39", + "placement": { + "height": 118, + "left": 1584, + "top": 259, + "width": 204 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-blue" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "light-blue" + }, + "size": 20, + "text": { + "fixed": "Viewport" + }, + "valign": "bottom" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": -0.8229007633587786, + "y": 0.27741935483870966 + }, + "target": { + "x": 1.0112359550561798, + "y": -0.012987012987012988 + }, + "targetName": "Element 20", + "vertices": [ + { + "x": -0.18181818181818182, + "y": 0 + }, + { + "x": -0.18181818181818182, + "y": 1 + } + ] + }, + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "radius": { + "fixed": 25, + "max": 200, + "min": 0 + }, + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": -0.3068702290076336, + "y": -0.47419354838709676 + }, + "target": { + "x": 1.0112359550561798, + "y": -0.4805194805194805 + }, + "targetName": "Element 20", + "vertices": [ + { + "x": 0.415, + "y": 0 + }, + { + "x": 0.4775, + "y": 1 + } + ] + }, + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "direction": "reverse", + "path": "straight", + "radius": { + "fixed": 0, + "max": 200, + "min": 0 + }, + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 0.7903930131004366, + "y": -0.36935483870967745 + }, + "target": { + "x": 1.0120481927710843, + "y": 0.024691358024691357 + }, + "targetName": "Element 35", + "vertices": [ + { + "x": -0.1607843137254902, + "y": 0 + }, + { + "x": -0.1607843137254902, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 32", + "placement": { + "height": 620, + "left": 1163, + "top": 76, + "width": 687 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "#464646" + }, + "radius": 0, + "width": 2 + }, + "config": { + "align": "center", + "color": { + "fixed": "#505050" + }, + "size": 20, + "text": { + "fixed": "Equipment State" + }, + "valign": "bottom" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 36", + "placement": { + "height": 229, + "left": 1340, + "top": 386, + "width": 438 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-orange" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Subscriptions" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 28", + "placement": { + "height": 77, + "left": 831, + "top": 339, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-orange" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Subscriptions" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 27", + "placement": { + "height": 77, + "left": 821, + "top": 329, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Mutation" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 26", + "placement": { + "height": 77, + "left": 583, + "top": 455, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Mutation" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 25", + "placement": { + "height": 77, + "left": 573, + "top": 445, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#d9d9d9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Subscription" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 24", + "placement": { + "height": 77, + "left": 583, + "top": 338, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Subscription" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 0.8876404494382022, + "y": 0.2597402597402597 + }, + "target": { + "x": -0.9775280898876404, + "y": -0.012987012987012988 + }, + "targetName": "Element 19" + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 23", + "placement": { + "height": 77, + "left": 573, + "top": 328, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Query" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 22", + "placement": { + "height": 77, + "left": 583, + "top": 221, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Query" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 0.8876404494382022, + "y": 0.2597402597402597 + }, + "target": { + "x": -0.9887640449438202, + "y": -0.06493506493506493 + }, + "targetName": "Element 18" + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 21", + "placement": { + "height": 77, + "left": 573, + "top": 211, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Controllers" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": -0.2247191011235955, + "y": -0.4805194805194805 + }, + "target": { + "x": 0.011235955056179775, + "y": 0.922077922077922 + }, + "targetName": "Element 12" + }, + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 0.7752808988764045, + "y": 0.5194805194805194 + }, + "target": { + "x": -1.0833333333333333, + "y": 0.020618556701030927 + }, + "targetName": "Element 15" + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 11", + "placement": { + "height": 77, + "left": 273, + "top": 338, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Controllers" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 10", + "placement": { + "height": 77, + "left": 263, + "top": 328, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "light-orange" + }, + "size": "contain" + }, + "border": { + "color": { + "fixed": "transparent" + }, + "radius": 0, + "width": 5 + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "field": "", + "fixed": "https://upload.wikimedia.org/wikipedia/commons/c/c8/Forme_ligne.svg", + "mode": "fixed" + } + }, + "connections": [], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 2", + "placement": { + "height": 96, + "left": 1390, + "top": 461, + "width": 100 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": {}, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "" + }, + "valign": "middle" + }, + "connections": [], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 3", + "placement": { + "height": 30, + "left": 1390, + "top": 423, + "width": 30 + }, + "type": "ellipse" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": {}, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 4", + "placement": { + "height": 30, + "left": 1460, + "top": 423, + "width": 30 + }, + "type": "ellipse" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Controllers" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "green" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": 0.5 + }, + "target": { + "x": -1.0112359550561798, + "y": -0.012987012987012988 + }, + "targetName": "Element 16", + "vertices": [ + { + "x": 0.42748091603053434, + "y": 0 + }, + { + "x": 0.42748091603053434, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 6", + "placement": { + "height": 77, + "left": 253, + "top": 318, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-purple" + }, + "width": 4 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "DB" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "direction": "both", + "lineStyle": "dashed", + "path": "straight", + "radius": { + "fixed": 50, + "max": 200, + "min": 0 + }, + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 0, + "y": -1 + }, + "target": { + "x": -0.5168539325842697, + "y": 1 + }, + "targetName": "Element 6", + "vertices": [ + { + "x": 0, + "y": 0.5263157894736842 + } + ] + }, + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "direction": "reverse", + "lineStyle": "dashed", + "path": "straight", + "radius": { + "fixed": 15, + "max": 200, + "min": 0 + }, + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 0, + "y": 1 + }, + "target": { + "x": -1.0112359550561798, + "y": -0.012987012987012988 + }, + "targetName": "Element 30", + "vertices": [ + { + "x": 0, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 9", + "placement": { + "height": 75, + "left": 61, + "top": 148, + "width": 178 + }, + "type": "parallelogram" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Recipes" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "direction": "both", + "path": "straight", + "size": { + "fixed": 1, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": 0 + }, + "target": { + "x": -1.0112359550561798, + "y": -0.012987012987012988 + }, + "targetName": "Element 6" + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 7", + "placement": { + "height": 77, + "left": 38, + "top": 318, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-red" + }, + "width": 4 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Queue" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "direction": "both", + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 0, + "y": -1 + }, + "target": { + "x": 0.011235955056179775, + "y": 1.025974025974026 + }, + "targetName": "Element 6" + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 8", + "placement": { + "height": 75, + "left": 253, + "top": 148, + "width": 178 + }, + "type": "parallelogram" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "#5b5959" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Data Pipeline" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 12", + "placement": { + "height": 77, + "left": 253, + "top": 455, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-orange" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Equipment" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "direction": "both", + "path": "straight", + "size": { + "fixed": 1, + "max": 10, + "min": 1 + }, + "source": { + "x": -1, + "y": 0 + }, + "target": { + "x": -1.0224719101123596, + "y": 0.013333333333333334 + }, + "targetName": "Element 9", + "vertices": [ + { + "x": -0.9523809523809523, + "y": 0 + }, + { + "x": -0.9523809523809523, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 13", + "placement": { + "height": 77, + "left": 38, + "top": 455, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Subscription" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 14", + "placement": { + "height": 77, + "left": 563, + "top": 318, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "super-light-blue" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Filter" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 15", + "placement": { + "height": 36, + "left": 497, + "rotation": 90, + "top": 339, + "width": 97 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Query" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 16", + "placement": { + "height": 77, + "left": 563, + "top": 201, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "light-blue" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Mutation" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "dark-orange" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": -1, + "y": 0 + }, + "target": { + "x": 1.0224719101123596, + "y": -0.45454545454545453 + }, + "targetName": "Element 6", + "vertices": [ + { + "x": 0.5692307692307692, + "y": 0 + }, + { + "x": 0.5692307692307692, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 17", + "placement": { + "height": 77, + "left": 563, + "top": 435, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-orange" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Initial State" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": 0 + }, + "target": { + "x": -0.96, + "y": 0.4583333333333333 + }, + "targetName": "Element 2", + "vertices": [ + { + "x": 0.3349875930521092, + "y": 0 + }, + { + "x": 0.3349875930521092, + "y": 0.12727272727272726 + }, + { + "x": 0.826302729528536, + "y": 0.13131313131313133 + }, + { + "x": 0.826302729528536, + "y": 1 + } + ] + }, + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 1, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": -0.5 + }, + "target": { + "x": -0.9761904761904762, + "y": 0.5263157894736842 + }, + "targetName": "Element 34", + "vertices": [ + { + "x": 0.5033557046979866, + "y": 0 + }, + { + "x": 0.5033557046979866, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 18", + "placement": { + "height": 77, + "left": 811, + "top": 201, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-orange" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Subscriptions" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 19", + "placement": { + "height": 77, + "left": 811, + "top": 319, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-orange" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Controls" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": -1, + "y": 0 + }, + "target": { + "x": 1.0112359550561798, + "y": 0.012987012987012988 + }, + "targetName": "Element 17" + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 20", + "placement": { + "height": 77, + "left": 811, + "top": 435, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "super-light-blue" + } + }, + "border": { + "color": { + "fixed": "orange" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Filter" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": -0.5 + }, + "target": { + "x": -1.0238095238095237, + "y": 0.10526315789473684 + }, + "targetName": "Element 33" + }, + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 1, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": 0.5 + }, + "target": { + "x": -1, + "y": 0.05263157894736842 + }, + "targetName": "Element 34", + "vertices": [ + { + "x": 0.5246636771300448, + "y": 0 + }, + { + "x": 0.5246636771300448, + "y": 1 + } + ] + }, + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": 0 + }, + "target": { + "x": -0.98, + "y": -0.10416666666666667 + }, + "targetName": "Element 2", + "vertices": [ + { + "x": 0.7564979480164159, + "y": 0 + }, + { + "x": 0.7564979480164159, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 29", + "placement": { + "height": 36, + "left": 959, + "rotation": 270, + "top": 340, + "width": 97 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "green" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "text" + }, + "size": 20, + "text": { + "fixed": "CAD" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "lineStyle": "dashed", + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": 0 + }, + "target": { + "x": -1.0112359550561798, + "y": -0.012987012987012988 + }, + "targetName": "Element 31" + }, + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "lineStyle": "dashed", + "path": "straight", + "radius": { + "fixed": 15, + "max": 200, + "min": 0 + }, + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 0, + "y": 1 + }, + "target": { + "x": -0.029411764705882353, + "y": 1 + }, + "targetName": "Element 38", + "vertices": [ + { + "x": 0, + "y": -0.08737864077669903 + }, + { + "x": 1, + "y": -0.08737864077669903 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 30", + "placement": { + "height": 77, + "left": 564, + "top": 43, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "green" + }, + "radius": 28, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "text" + }, + "size": 20, + "text": { + "fixed": "Layout" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "radius": { + "fixed": 15, + "max": 200, + "min": 0 + }, + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": 0 + }, + "target": { + "x": -0.9939759036144579, + "y": 0.5061728395061729 + }, + "targetName": "Element 35", + "vertices": [ + { + "x": 0.48, + "y": 0 + }, + { + "x": 0.48, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 31", + "placement": { + "height": 77, + "left": 812, + "top": 43, + "width": 178 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "semi-dark-red" + } + }, + "border": { + "color": { + "fixed": "dark-orange" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Alerts" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": 1, + "y": 0 + }, + "target": { + "x": 1.0337078651685394, + "y": 0.45454545454545453 + }, + "targetName": "Element 20", + "vertices": [ + { + "x": -0.05240174672489083, + "y": 0 + }, + { + "x": -0.05240174672489083, + "y": 1 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 33", + "placement": { + "height": 38, + "left": 1137, + "top": 367, + "width": 84 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "light-green" + } + }, + "border": { + "color": { + "fixed": "dark-green" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Jobs" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 34", + "placement": { + "height": 38, + "left": 1137, + "top": 281, + "width": 84 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "light-blue" + }, + "size": 20, + "text": { + "fixed": "Viewport State" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": -1, + "y": 0 + }, + "target": { + "x": 0.19444444444444445, + "y": 0.9896907216494846 + }, + "targetName": "Element 29", + "vertices": [ + { + "x": 1, + "y": 0 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 35", + "placement": { + "height": 162, + "left": 1189, + "top": 98, + "width": 332 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "semi-dark-blue" + }, + "size": "contain" + }, + "border": { + "color": { + "fixed": "transparent" + }, + "radius": 0, + "width": 5 + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "field": "", + "fixed": "img/icons/iot/pump.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 37", + "placement": { + "height": 96, + "left": 1601, + "top": 461, + "width": 100 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "#222020" + } + }, + "border": { + "color": { + "fixed": "dark-green" + }, + "radius": 0, + "width": 3 + }, + "config": { + "align": "center", + "color": { + "fixed": "text" + }, + "size": 20, + "text": { + "fixed": "Library" + }, + "valign": "middle" + }, + "connections": [ + { + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "path": "straight", + "size": { + "fixed": 2, + "max": 10, + "min": 1 + }, + "source": { + "x": -1, + "y": 0 + }, + "target": { + "x": -0.4977168949771689, + "y": 1.017467248908297 + }, + "targetName": "Element 36", + "vertices": [ + { + "x": 1, + "y": 0 + } + ] + } + ], + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 38", + "placement": { + "height": 118, + "left": 1574, + "top": 249, + "width": 204 + }, + "type": "rectangle" + } + ], + "name": "Element 1711297729286", + "placement": { + "height": 100, + "left": 0, + "rotation": 0, + "top": 0, + "width": 100 + }, + "type": "frame" + }, + "showAdvancedTypes": true + }, + "pluginVersion": "11.1.0-pre", + "targets": [ + { + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 1 + } + ], + "title": "Flowcharting", + "type": "canvas" + }, { "datasource": { "type": "testdata", @@ -42,8 +2239,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "#6ED0E0", @@ -67,11 +2263,13 @@ "h": 11, "w": 15, "x": 5, - "y": 0 + "y": 22 }, "id": 4, "options": { + "infinitePan": false, "inlineEditing": true, + "panZoom": false, "root": { "background": { "color": { @@ -83,6 +2281,10 @@ "fixed": "dark-green" } }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, "elements": [ { "background": { @@ -628,11 +2830,18 @@ } ], "name": "Element 1672955773575", + "placement": { + "height": 100, + "left": 0, + "rotation": 0, + "top": 0, + "width": 100 + }, "type": "frame" }, "showAdvancedTypes": false }, - "pluginVersion": "10.1.0-pre", + "pluginVersion": "11.1.0-pre", "targets": [ { "csvContent": "gateway, product-details, product-reviews, reviews-ratings, details-checkout\n100, 56, 44, 22, 28", @@ -669,8 +2878,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "blue", @@ -694,11 +2902,13 @@ "h": 15, "w": 15, "x": 5, - "y": 11 + "y": 33 }, "id": 2, "options": { + "infinitePan": false, "inlineEditing": false, + "panZoom": false, "root": { "background": { "color": { @@ -1400,7 +3610,7 @@ }, "showAdvancedTypes": false }, - "pluginVersion": "10.1.0-pre", + "pluginVersion": "11.1.0-pre", "targets": [ { "csvContent": "database_server, server_database, server_region, region_server, database2_server, server_database2\n10, 53, 35, 12, 22, 81", @@ -1418,7 +3628,7 @@ ], "refresh": "", "revision": 1, - "schemaVersion": 38, + "schemaVersion": 39, "tags": [ "gdev", "panel-tests", @@ -1431,10 +3641,11 @@ "from": "now-6h", "to": "now" }, + "timeRangeUpdatedDuringEditOrView": false, "timepicker": {}, "timezone": "", "title": "Panel Tests - Canvas Connection Examples", "uid": "Pu8lwQAVz", - "version": 3, + "version": 6, "weekStart": "" } \ No newline at end of file diff --git a/devenv/dev-dashboards/panel-canvas/canvas-datalinks.json b/devenv/dev-dashboards/panel-canvas/canvas-datalinks.json new file mode 100644 index 00000000000..0b95594b58c --- /dev/null +++ b/devenv/dev-dashboards/panel-canvas/canvas-datalinks.json @@ -0,0 +1,3478 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "A-hehwzd" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "A-series data link", + "url": "http://localhost:3000/d/dddouk2ygsb9cc/6114e28a-4041-5fbd-878f-b98718a90c4d?${__url_time_range}" + } + ] + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Count (transformation)" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "Count data link", + "url": "http://localhost:3000/d/dddouk2ygsb9cc/6114e28a-4041-5fbd-878f-b98718a90c4d${__data.fields.A-series}" + } + ] + } + ] + } + ] + }, + "gridPos": { + "h": 30, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "inlineEditing": false, + "panZoom": false, + "root": { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + }, + "width": 0 + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "elements": [ + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Metric Value" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 1", + "placement": { + "height": 50, + "left": 38, + "top": 23, + "width": 144 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "size": 20, + "text": { + "field": "A-hehwzd", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 2", + "placement": { + "height": 50, + "left": 16, + "top": 91, + "width": 188 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "field": "A-hehwzd", + "fixed": "#000000" + }, + "size": 20, + "text": { + "fixed": "Text color", + "mode": "fixed" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 3", + "placement": { + "height": 50, + "left": 16, + "top": 170, + "width": 188 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "transparent" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "text" + }, + "size": 20, + "text": { + "fixed": "Background image", + "mode": "fixed" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 4", + "placement": { + "height": 50, + "left": 16, + "top": 249, + "width": 188 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 2 + }, + "config": { + "align": "center", + "color": { + "fixed": "text" + }, + "size": 20, + "text": { + "fixed": "Border", + "mode": "fixed" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 5", + "placement": { + "height": 50, + "left": 16, + "top": 328, + "width": 188 + }, + "type": "metric-value" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "text" + }, + "size": 16, + "text": { + "field": "A-hehwzd", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 6", + "placement": { + "height": 50, + "left": 262, + "top": 91, + "width": 188 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + }, + "image": { + "fixed": "" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "field": "A-hehwzd", + "fixed": "rgb(204, 204, 220)" + }, + "size": 16, + "text": { + "fixed": "Text color" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 7", + "placement": { + "height": 50, + "left": 262, + "top": 170, + "width": 188 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 16, + "text": { + "fixed": "Background image" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 8", + "placement": { + "height": 50, + "left": 262, + "top": 249, + "width": 188 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 2 + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 16, + "text": { + "fixed": "Border" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 9", + "placement": { + "height": 50, + "left": 262, + "top": 328, + "width": 188 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Text" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 10", + "placement": { + "height": 50, + "left": 284, + "top": 23, + "width": 144 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "backgroundColor": { + "fixed": "#D9D9D9" + }, + "borderColor": { + "fixed": "transparent" + }, + "color": { + "fixed": "#000000" + }, + "text": { + "field": "A-hehwzd", + "mode": "field" + }, + "valign": "middle", + "width": 1 + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 11", + "placement": { + "height": 50, + "left": 530, + "top": 91, + "width": 188 + }, + "type": "ellipse" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "backgroundColor": { + "fixed": "#D9D9D9" + }, + "borderColor": { + "fixed": "transparent" + }, + "color": { + "field": "A-hehwzd", + "fixed": "#000000" + }, + "text": { + "fixed": "Text color" + }, + "valign": "middle", + "width": 1 + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 12", + "placement": { + "height": 50, + "left": 530, + "top": 170, + "width": 188 + }, + "type": "ellipse" + }, + { + "background": { + "color": { + "fixed": "transparent" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "backgroundColor": { + "fixed": "#D9D9D9" + }, + "borderColor": { + "fixed": "transparent" + }, + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Background image" + }, + "valign": "middle", + "width": 1 + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 13", + "placement": { + "height": 50, + "left": 530, + "top": 249, + "width": 188 + }, + "type": "ellipse" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 2 + }, + "config": { + "align": "center", + "backgroundColor": { + "fixed": "#D9D9D9" + }, + "borderColor": { + "fixed": "transparent" + }, + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Border" + }, + "valign": "middle", + "width": 1 + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 14", + "placement": { + "height": 50, + "left": 530, + "top": 328, + "width": 188 + }, + "type": "ellipse" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Ellipse" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 15", + "placement": { + "height": 50, + "left": 552, + "top": 23, + "width": 144 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "field": "A-hehwzd", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 16", + "placement": { + "height": 50, + "left": 798, + "top": 91, + "width": 188 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "field": "A-hehwzd", + "fixed": "#000000" + }, + "text": { + "fixed": "Text color" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 17", + "placement": { + "height": 50, + "left": 798, + "top": 170, + "width": 188 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Background image" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 18", + "placement": { + "height": 50, + "left": 798, + "top": 249, + "width": 188 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 2 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Border" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 19", + "placement": { + "height": 50, + "left": 798, + "top": 328, + "width": 188 + }, + "type": "rectangle" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Rectangle" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 20", + "placement": { + "height": 50, + "left": 820, + "top": 23, + "width": 144 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "field": "A-hehwzd", + "fixed": "img/icons/unicons/question-circle.svg", + "mode": "field" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 21", + "placement": { + "height": 50, + "left": 1066, + "top": 91, + "width": 188 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "field": "A-hehwzd", + "fixed": "#D9D9D9" + }, + "path": { + "fixed": "img/icons/unicons/question-circle.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 22", + "placement": { + "height": 50, + "left": 1066, + "top": 170, + "width": 188 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "fixed": "img/icons/unicons/question-circle.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 23", + "placement": { + "height": 50, + "left": 1066, + "top": 249, + "width": 188 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 2 + }, + "config": { + "fill": { + "fixed": "#D9D9D9" + }, + "path": { + "fixed": "img/icons/unicons/question-circle.svg", + "mode": "fixed" + } + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 24", + "placement": { + "height": 50, + "left": 1066, + "top": 328, + "width": 188 + }, + "type": "icon" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Icon" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 25", + "placement": { + "height": 50, + "left": 1088, + "top": 23, + "width": 144 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "statusColor": { + "field": "A-hehwzd" + }, + "type": "Single" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 26", + "placement": { + "height": 90, + "left": 65, + "top": 516, + "width": 90 + }, + "type": "server" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 2 + }, + "config": { + "type": "Single" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 29", + "placement": { + "height": 90, + "left": 65, + "top": 870, + "width": 90 + }, + "type": "server" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Server" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 30", + "placement": { + "height": 50, + "left": 38, + "top": 438, + "width": 144 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "bulbColor": { + "field": "A-hehwzd" + }, + "statusColor": { + "fixed": "transparent" + }, + "type": "Single" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 31", + "placement": { + "height": 90, + "left": 65, + "top": 634, + "width": 90 + }, + "type": "server" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "blinkRate": { + "field": "A-hehwzd" + }, + "bulbColor": { + "fixed": "#000000" + }, + "statusColor": { + "fixed": "transparent" + }, + "type": "Single" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 32", + "placement": { + "height": 90, + "left": 65, + "top": 752, + "width": 90 + }, + "type": "server" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "rpm": { + "field": "A-hehwzd" + }, + "statusColor": { + "field": "A-hehwzd" + }, + "type": "Single" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 33", + "placement": { + "height": 55, + "left": 329, + "top": 516, + "width": 55 + }, + "type": "windTurbine" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Wind Turbine" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 35", + "placement": { + "height": 50, + "left": 270, + "top": 438, + "width": 172 + }, + "type": "text" + }, + { + "background": { + "color": { + "field": "A-hehwzd", + "fixed": "transparent" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "bulbColor": { + "field": "A-hehwzd" + }, + "statusColor": { + "fixed": "transparent" + }, + "type": "Single" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 36", + "placement": { + "height": 55, + "left": 329, + "top": 633, + "width": 55 + }, + "type": "windTurbine" + }, + { + "background": { + "color": { + "field": "Count (transformation)", + "fixed": "transparent" + }, + "image": { + "field": "A-hehwzd", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + }, + "width": 0 + }, + "config": { + "type": "Single" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 38", + "placement": { + "height": 90, + "left": 65, + "top": 988, + "width": 90 + }, + "type": "server" + }, + { + "background": { + "color": { + "fixed": "transparent" + }, + "image": { + "field": "", + "mode": "field" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 1 + }, + "config": { + "bulbColor": { + "field": "A-hehwzd" + }, + "statusColor": { + "fixed": "transparent" + }, + "type": "Single" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 37", + "placement": { + "height": 55, + "left": 329, + "top": 752, + "width": 55 + }, + "type": "windTurbine" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Cloud" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 39", + "placement": { + "height": 50, + "left": 530, + "top": 438, + "width": 172 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "field": "A-hehwzd", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 40", + "placement": { + "height": 50, + "left": 530, + "top": 517, + "width": 188 + }, + "type": "cloud" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "field": "A-hehwzd", + "fixed": "#000000" + }, + "text": { + "fixed": "Text color" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 41", + "placement": { + "height": 50, + "left": 530, + "top": 596, + "width": 188 + }, + "type": "cloud" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "left", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Background image" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 42", + "placement": { + "height": 50, + "left": 530, + "top": 675, + "width": 188 + }, + "type": "cloud" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 5 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Border" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 43", + "placement": { + "height": 50, + "left": 530, + "top": 754, + "width": 188 + }, + "type": "cloud" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Parallelogram" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 44", + "placement": { + "height": 50, + "left": 806, + "top": 438, + "width": 172 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "field": "A-hehwzd", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 45", + "placement": { + "height": 50, + "left": 798, + "top": 516, + "width": 188 + }, + "type": "parallelogram" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "field": "A-hehwzd", + "fixed": "#000000" + }, + "text": { + "fixed": "Text color" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 46", + "placement": { + "height": 50, + "left": 798, + "top": 595, + "width": 188 + }, + "type": "parallelogram" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "left", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Background image" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 47", + "placement": { + "height": 50, + "left": 798, + "top": 674, + "width": 188 + }, + "type": "parallelogram" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 5 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Border" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 48", + "placement": { + "height": 50, + "left": 798, + "top": 753, + "width": 188 + }, + "type": "parallelogram" + }, + { + "background": { + "color": { + "fixed": "transparent" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "rgb(204, 204, 220)" + }, + "size": 24, + "text": { + "fixed": "Triangle" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 49", + "placement": { + "height": 50, + "left": 1074, + "top": 438, + "width": 172 + }, + "type": "text" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "field": "A-hehwzd", + "fixed": "", + "mode": "field" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 50", + "placement": { + "height": 50, + "left": 1066, + "top": 516, + "width": 188 + }, + "type": "triangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "center", + "color": { + "field": "A-hehwzd", + "fixed": "#000000" + }, + "text": { + "fixed": "Text color" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 51", + "placement": { + "height": 50, + "left": 1066, + "top": 595, + "width": 188 + }, + "type": "triangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + }, + "image": { + "field": "Count (transformation)", + "mode": "field" + } + }, + "border": { + "color": { + "fixed": "dark-green" + } + }, + "config": { + "align": "left", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Background image" + }, + "valign": "bottom" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 52", + "placement": { + "height": 50, + "left": 1066, + "top": 674, + "width": 188 + }, + "type": "triangle" + }, + { + "background": { + "color": { + "fixed": "#D9D9D9" + } + }, + "border": { + "color": { + "field": "A-hehwzd", + "fixed": "dark-green" + }, + "width": 5 + }, + "config": { + "align": "center", + "color": { + "fixed": "#000000" + }, + "text": { + "fixed": "Border" + }, + "valign": "middle" + }, + "constraint": { + "horizontal": "left", + "vertical": "top" + }, + "name": "Element 53", + "placement": { + "height": 50, + "left": 1066, + "top": 753, + "width": 188 + }, + "type": "triangle" + } + ], + "name": "Element 1708700648848", + "placement": { + "height": 100, + "left": 0, + "top": 0, + "width": 100 + }, + "type": "frame" + }, + "showAdvancedTypes": true + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "queryType": "snapshot", + "refId": "A", + "snapshot": [ + { + "data": { + "values": [ + [ + 1708679336805, + 1708679366805, + 1708679396805, + 1708679426805, + 1708679456805, + 1708679486805, + 1708679516805, + 1708679546805, + 1708679576805, + 1708679606805, + 1708679636805, + 1708679666805, + 1708679696805, + 1708679726805, + 1708679756805, + 1708679786805, + 1708679816805, + 1708679846805, + 1708679876805, + 1708679906805, + 1708679936805, + 1708679966805, + 1708679996805, + 1708680026805, + 1708680056805, + 1708680086805, + 1708680116805, + 1708680146805, + 1708680176805, + 1708680206805, + 1708680236805, + 1708680266805, + 1708680296805, + 1708680326805, + 1708680356805, + 1708680386805, + 1708680416805, + 1708680446805, + 1708680476805, + 1708680506805, + 1708680536805, + 1708680566805, + 1708680596805, + 1708680626805, + 1708680656805, + 1708680686805, + 1708680716805, + 1708680746805, + 1708680776805, + 1708680806805, + 1708680836805, + 1708680866805, + 1708680896805, + 1708680926805, + 1708680956805, + 1708680986805, + 1708681016805, + 1708681046805, + 1708681076805, + 1708681106805, + 1708681136805, + 1708681166805, + 1708681196805, + 1708681226805, + 1708681256805, + 1708681286805, + 1708681316805, + 1708681346805, + 1708681376805, + 1708681406805, + 1708681436805, + 1708681466805, + 1708681496805, + 1708681526805, + 1708681556805, + 1708681586805, + 1708681616805, + 1708681646805, + 1708681676805, + 1708681706805, + 1708681736805, + 1708681766805, + 1708681796805, + 1708681826805, + 1708681856805, + 1708681886805, + 1708681916805, + 1708681946805, + 1708681976805, + 1708682006805, + 1708682036805, + 1708682066805, + 1708682096805, + 1708682126805, + 1708682156805, + 1708682186805, + 1708682216805, + 1708682246805, + 1708682276805, + 1708682306805, + 1708682336805, + 1708682366805, + 1708682396805, + 1708682426805, + 1708682456805, + 1708682486805, + 1708682516805, + 1708682546805, + 1708682576805, + 1708682606805, + 1708682636805, + 1708682666805, + 1708682696805, + 1708682726805, + 1708682756805, + 1708682786805, + 1708682816805, + 1708682846805, + 1708682876805, + 1708682906805, + 1708682936805, + 1708682966805, + 1708682996805, + 1708683026805, + 1708683056805, + 1708683086805, + 1708683116805, + 1708683146805, + 1708683176805, + 1708683206805, + 1708683236805, + 1708683266805, + 1708683296805, + 1708683326805, + 1708683356805, + 1708683386805, + 1708683416805, + 1708683446805, + 1708683476805, + 1708683506805, + 1708683536805, + 1708683566805, + 1708683596805, + 1708683626805, + 1708683656805, + 1708683686805, + 1708683716805, + 1708683746805, + 1708683776805, + 1708683806805, + 1708683836805, + 1708683866805, + 1708683896805, + 1708683926805, + 1708683956805, + 1708683986805, + 1708684016805, + 1708684046805, + 1708684076805, + 1708684106805, + 1708684136805, + 1708684166805, + 1708684196805, + 1708684226805, + 1708684256805, + 1708684286805, + 1708684316805, + 1708684346805, + 1708684376805, + 1708684406805, + 1708684436805, + 1708684466805, + 1708684496805, + 1708684526805, + 1708684556805, + 1708684586805, + 1708684616805, + 1708684646805, + 1708684676805, + 1708684706805, + 1708684736805, + 1708684766805, + 1708684796805, + 1708684826805, + 1708684856805, + 1708684886805, + 1708684916805, + 1708684946805, + 1708684976805, + 1708685006805, + 1708685036805, + 1708685066805, + 1708685096805, + 1708685126805, + 1708685156805, + 1708685186805, + 1708685216805, + 1708685246805, + 1708685276805, + 1708685306805, + 1708685336805, + 1708685366805, + 1708685396805, + 1708685426805, + 1708685456805, + 1708685486805, + 1708685516805, + 1708685546805, + 1708685576805, + 1708685606805, + 1708685636805, + 1708685666805, + 1708685696805, + 1708685726805, + 1708685756805, + 1708685786805, + 1708685816805, + 1708685846805, + 1708685876805, + 1708685906805, + 1708685936805, + 1708685966805, + 1708685996805, + 1708686026805, + 1708686056805, + 1708686086805, + 1708686116805, + 1708686146805, + 1708686176805, + 1708686206805, + 1708686236805, + 1708686266805, + 1708686296805, + 1708686326805, + 1708686356805, + 1708686386805, + 1708686416805, + 1708686446805, + 1708686476805, + 1708686506805, + 1708686536805, + 1708686566805, + 1708686596805, + 1708686626805, + 1708686656805, + 1708686686805, + 1708686716805, + 1708686746805, + 1708686776805, + 1708686806805, + 1708686836805, + 1708686866805, + 1708686896805, + 1708686926805, + 1708686956805, + 1708686986805, + 1708687016805, + 1708687046805, + 1708687076805, + 1708687106805, + 1708687136805, + 1708687166805, + 1708687196805, + 1708687226805, + 1708687256805, + 1708687286805, + 1708687316805, + 1708687346805, + 1708687376805, + 1708687406805, + 1708687436805, + 1708687466805, + 1708687496805, + 1708687526805, + 1708687556805, + 1708687586805, + 1708687616805, + 1708687646805, + 1708687676805, + 1708687706805, + 1708687736805, + 1708687766805, + 1708687796805, + 1708687826805, + 1708687856805, + 1708687886805, + 1708687916805, + 1708687946805, + 1708687976805, + 1708688006805, + 1708688036805, + 1708688066805, + 1708688096805, + 1708688126805, + 1708688156805, + 1708688186805, + 1708688216805, + 1708688246805, + 1708688276805, + 1708688306805, + 1708688336805, + 1708688366805, + 1708688396805, + 1708688426805, + 1708688456805, + 1708688486805, + 1708688516805, + 1708688546805, + 1708688576805, + 1708688606805, + 1708688636805, + 1708688666805, + 1708688696805, + 1708688726805, + 1708688756805, + 1708688786805, + 1708688816805, + 1708688846805, + 1708688876805, + 1708688906805, + 1708688936805, + 1708688966805, + 1708688996805, + 1708689026805, + 1708689056805, + 1708689086805, + 1708689116805, + 1708689146805, + 1708689176805, + 1708689206805, + 1708689236805, + 1708689266805, + 1708689296805, + 1708689326805, + 1708689356805, + 1708689386805, + 1708689416805, + 1708689446805, + 1708689476805, + 1708689506805, + 1708689536805, + 1708689566805, + 1708689596805, + 1708689626805, + 1708689656805, + 1708689686805, + 1708689716805, + 1708689746805, + 1708689776805, + 1708689806805, + 1708689836805, + 1708689866805, + 1708689896805, + 1708689926805, + 1708689956805, + 1708689986805, + 1708690016805, + 1708690046805, + 1708690076805, + 1708690106805, + 1708690136805, + 1708690166805, + 1708690196805, + 1708690226805, + 1708690256805, + 1708690286805, + 1708690316805, + 1708690346805, + 1708690376805, + 1708690406805, + 1708690436805, + 1708690466805, + 1708690496805, + 1708690526805, + 1708690556805, + 1708690586805, + 1708690616805, + 1708690646805, + 1708690676805, + 1708690706805, + 1708690736805, + 1708690766805, + 1708690796805, + 1708690826805, + 1708690856805, + 1708690886805, + 1708690916805, + 1708690946805, + 1708690976805, + 1708691006805, + 1708691036805, + 1708691066805, + 1708691096805, + 1708691126805, + 1708691156805, + 1708691186805, + 1708691216805, + 1708691246805, + 1708691276805, + 1708691306805, + 1708691336805, + 1708691366805, + 1708691396805, + 1708691426805, + 1708691456805, + 1708691486805, + 1708691516805, + 1708691546805, + 1708691576805, + 1708691606805, + 1708691636805, + 1708691666805, + 1708691696805, + 1708691726805, + 1708691756805, + 1708691786805, + 1708691816805, + 1708691846805, + 1708691876805, + 1708691906805, + 1708691936805, + 1708691966805, + 1708691996805, + 1708692026805, + 1708692056805, + 1708692086805, + 1708692116805, + 1708692146805, + 1708692176805, + 1708692206805, + 1708692236805, + 1708692266805, + 1708692296805, + 1708692326805, + 1708692356805, + 1708692386805, + 1708692416805, + 1708692446805, + 1708692476805, + 1708692506805, + 1708692536805, + 1708692566805, + 1708692596805, + 1708692626805, + 1708692656805, + 1708692686805, + 1708692716805, + 1708692746805, + 1708692776805, + 1708692806805, + 1708692836805, + 1708692866805, + 1708692896805, + 1708692926805, + 1708692956805, + 1708692986805, + 1708693016805, + 1708693046805, + 1708693076805, + 1708693106805, + 1708693136805, + 1708693166805, + 1708693196805, + 1708693226805, + 1708693256805, + 1708693286805, + 1708693316805, + 1708693346805, + 1708693376805, + 1708693406805, + 1708693436805, + 1708693466805, + 1708693496805, + 1708693526805, + 1708693556805, + 1708693586805, + 1708693616805, + 1708693646805, + 1708693676805, + 1708693706805, + 1708693736805, + 1708693766805, + 1708693796805, + 1708693826805, + 1708693856805, + 1708693886805, + 1708693916805, + 1708693946805, + 1708693976805, + 1708694006805, + 1708694036805, + 1708694066805, + 1708694096805, + 1708694126805, + 1708694156805, + 1708694186805, + 1708694216805, + 1708694246805, + 1708694276805, + 1708694306805, + 1708694336805, + 1708694366805, + 1708694396805, + 1708694426805, + 1708694456805, + 1708694486805, + 1708694516805, + 1708694546805, + 1708694576805, + 1708694606805, + 1708694636805, + 1708694666805, + 1708694696805, + 1708694726805, + 1708694756805, + 1708694786805, + 1708694816805, + 1708694846805, + 1708694876805, + 1708694906805, + 1708694936805, + 1708694966805, + 1708694996805, + 1708695026805, + 1708695056805, + 1708695086805, + 1708695116805, + 1708695146805, + 1708695176805, + 1708695206805, + 1708695236805, + 1708695266805, + 1708695296805, + 1708695326805, + 1708695356805, + 1708695386805, + 1708695416805, + 1708695446805, + 1708695476805, + 1708695506805, + 1708695536805, + 1708695566805, + 1708695596805, + 1708695626805, + 1708695656805, + 1708695686805, + 1708695716805, + 1708695746805, + 1708695776805, + 1708695806805, + 1708695836805, + 1708695866805, + 1708695896805, + 1708695926805, + 1708695956805, + 1708695986805, + 1708696016805, + 1708696046805, + 1708696076805, + 1708696106805, + 1708696136805, + 1708696166805, + 1708696196805, + 1708696226805, + 1708696256805, + 1708696286805, + 1708696316805, + 1708696346805, + 1708696376805, + 1708696406805, + 1708696436805, + 1708696466805, + 1708696496805, + 1708696526805, + 1708696556805, + 1708696586805, + 1708696616805, + 1708696646805, + 1708696676805, + 1708696706805, + 1708696736805, + 1708696766805, + 1708696796805, + 1708696826805, + 1708696856805, + 1708696886805, + 1708696916805, + 1708696946805, + 1708696976805, + 1708697006805, + 1708697036805, + 1708697066805, + 1708697096805, + 1708697126805, + 1708697156805, + 1708697186805, + 1708697216805, + 1708697246805, + 1708697276805, + 1708697306805, + 1708697336805, + 1708697366805, + 1708697396805, + 1708697426805, + 1708697456805, + 1708697486805, + 1708697516805, + 1708697546805, + 1708697576805, + 1708697606805, + 1708697636805, + 1708697666805, + 1708697696805, + 1708697726805, + 1708697756805, + 1708697786805, + 1708697816805, + 1708697846805, + 1708697876805, + 1708697906805, + 1708697936805, + 1708697966805, + 1708697996805, + 1708698026805, + 1708698056805, + 1708698086805, + 1708698116805, + 1708698146805, + 1708698176805, + 1708698206805, + 1708698236805, + 1708698266805, + 1708698296805, + 1708698326805, + 1708698356805, + 1708698386805, + 1708698416805, + 1708698446805, + 1708698476805, + 1708698506805, + 1708698536805, + 1708698566805, + 1708698596805, + 1708698626805, + 1708698656805, + 1708698686805, + 1708698716805, + 1708698746805, + 1708698776805, + 1708698806805, + 1708698836805, + 1708698866805, + 1708698896805, + 1708698926805, + 1708698956805, + 1708698986805, + 1708699016805, + 1708699046805, + 1708699076805, + 1708699106805, + 1708699136805, + 1708699166805, + 1708699196805, + 1708699226805, + 1708699256805, + 1708699286805, + 1708699316805, + 1708699346805, + 1708699376805, + 1708699406805, + 1708699436805, + 1708699466805, + 1708699496805, + 1708699526805, + 1708699556805, + 1708699586805, + 1708699616805, + 1708699646805, + 1708699676805, + 1708699706805, + 1708699736805, + 1708699766805, + 1708699796805, + 1708699826805, + 1708699856805, + 1708699886805, + 1708699916805, + 1708699946805, + 1708699976805, + 1708700006805, + 1708700036805, + 1708700066805, + 1708700096805, + 1708700126805, + 1708700156805, + 1708700186805, + 1708700216805, + 1708700246805, + 1708700276805, + 1708700306805, + 1708700336805, + 1708700366805, + 1708700396805, + 1708700426805, + 1708700456805, + 1708700486805, + 1708700516805, + 1708700546805, + 1708700576805, + 1708700606805, + 1708700636805, + 1708700666805, + 1708700696805, + 1708700726805, + 1708700756805, + 1708700786805, + 1708700816805, + 1708700846805, + 1708700876805, + 1708700906805 + ], + [ + 61.7880220958275, + 61.81270791445456, + 61.829208768453746, + 61.3952804521061, + 61.54378204663586, + 61.793292376739025, + 61.89508181687579, + 62.032346031223305, + 62.090954811114734, + 61.788446359641156, + 61.34681406228381, + 61.37147422434034, + 61.40948125782848, + 61.69144945060843, + 61.790001610516114, + 61.9726511399688, + 62.17186395369245, + 61.841593279449114, + 61.81351577982158, + 61.774548608665306, + 61.45071912098117, + 61.837381696515884, + 61.65059114296433, + 61.1939165193637, + 61.251406089255795, + 60.90456801094042, + 60.56801269725712, + 60.79736902333104, + 60.9367183948152, + 61.40785835680261, + 61.621326272755965, + 61.53478423246078, + 61.616180375313114, + 61.56950269911591, + 61.419724817297585, + 61.76631225002593, + 62.12897242834343, + 62.123394668856335, + 61.84384351878861, + 61.784342739352965, + 61.946359707479985, + 62.00854561243485, + 61.949378148238175, + 61.83251536870273, + 62.10046102360543, + 62.51955528279164, + 62.43194543555232, + 61.93563724102479, + 61.61222776112464, + 61.706572968014584, + 61.25653135192282, + 61.356339636867965, + 61.699918128409436, + 61.700832273918536, + 61.48680261436916, + 61.23885493750151, + 60.88064816100224, + 60.8061115971784, + 60.48689168723215, + 60.55420316390225, + 60.78326551379002, + 60.71763616746389, + 61.0384027799684, + 61.361681117105356, + 61.819694140841825, + 61.60303629180282, + 61.13531779096821, + 61.59247554276454, + 62.073700396192514, + 62.257393021269124, + 62.433793965222456, + 62.250955190991135, + 61.85027922321473, + 61.991414140632, + 62.103475488499456, + 62.1675085033716, + 61.81759701584563, + 61.44204189561965, + 61.39004247589699, + 61.84841370788845, + 62.01982884908544, + 62.29261477385842, + 62.1881407732118, + 61.77974858108549, + 61.30269030921595, + 61.72885233653658, + 62.160061928899516, + 62.13127060574461, + 61.99860014382346, + 62.2713524353439, + 62.45360209624644, + 62.45033536766769, + 62.74579940152534, + 62.652379007396135, + 62.50461375528075, + 62.4923739782267, + 62.87608071230181, + 62.979684959589086, + 63.376138214369306, + 63.66354651661235, + 63.77873383844567, + 64.02365055931571, + 63.57333739418103, + 63.569251641994995, + 63.51940188659398, + 63.81887126104792, + 64.10808860762592, + 64.26214829221084, + 63.81353904099011, + 63.792123977174654, + 64.09459044217124, + 64.49651926575704, + 64.87380353415439, + 65.22102686208456, + 65.49078940759729, + 65.83529933530703, + 66.06313506256244, + 66.36902912666964, + 66.78048161957578, + 66.85326316970041, + 67.14736719324404, + 67.55927886414139, + 67.497025942169, + 67.84593513490577, + 67.47441764273138, + 67.94871645670011, + 68.32729017349827, + 68.0857872436968, + 67.93500201308075, + 67.75781760651351, + 67.62321694227796, + 67.87687655718156, + 68.03974600191707, + 67.82627187210018, + 68.29863099170737, + 67.95842239244082, + 67.56173819267319, + 67.11089985276264, + 67.58721546400895, + 67.43817707268052, + 67.63734474285276, + 67.8608900819446, + 68.2491098921388, + 68.64222598287019, + 68.93436090180123, + 68.58516897681044, + 68.88556663186037, + 68.82509258379442, + 68.43122435581691, + 68.01151775860062, + 68.31539501569645, + 68.01224489043588, + 68.21383479637454, + 67.85864255481124, + 67.85285437130011, + 67.68770174333852, + 67.78834746198736, + 68.07096889676643, + 68.06340992932907, + 68.37116739265392, + 68.25606363201948, + 68.0308569092854, + 68.0279418148109, + 67.68837311892736, + 67.98015788941186, + 68.39001231797856, + 68.55810426314746, + 68.67055538403375, + 68.24669275435873, + 68.3542775530211, + 67.99792233705742, + 67.93848132742042, + 67.54327434886798, + 67.86541640645122, + 67.63715332453567, + 67.44863373545599, + 67.54029786855584, + 67.3799227903252, + 67.272800723832, + 67.65752571426705, + 67.27217330871126, + 67.36259068699385, + 67.6920166495926, + 67.99237921892899, + 68.00526928940994, + 67.67665255949264, + 67.82106088034847, + 68.22225474161398, + 68.17103508007338, + 68.1016199190692, + 67.9715626706774, + 68.32706440829391, + 67.87634330533211, + 67.97207720874553, + 67.87493382264455, + 67.38357737752105, + 66.94768029712087, + 66.67493510394992, + 66.48367657533245, + 66.77035937087237, + 66.87685661575208, + 66.68590889792685, + 67.11545823298368, + 67.39896920212514, + 67.34979904565203, + 67.19769898467558, + 67.45512207826779, + 67.07906680752531, + 67.41541723819202, + 67.15472798048341, + 67.15672773264464, + 67.6290223056695, + 68.11240707910342, + 68.40594352628086, + 67.92798893549167, + 67.46919856375305, + 67.4835115803936, + 67.63236807133978, + 67.17328415938867, + 67.24458272746313, + 66.84593455247185, + 67.01430262963748, + 67.05291762336604, + 67.23817875420809, + 66.98941509949245, + 66.68717338595964, + 67.12826784930103, + 66.74586515933792, + 67.12397362624425, + 66.91465424208462, + 66.68655917540693, + 66.19881496899525, + 66.68817057925634, + 66.37134623059349, + 66.596971028669, + 67.08641642499875, + 67.12758650919066, + 67.38518121414808, + 67.46997153732326, + 67.33145553844577, + 67.65363406004056, + 67.45595043797628, + 67.24978988019829, + 67.39677514651268, + 67.5978323405599, + 67.96140308646021, + 68.00477049936622, + 67.75104436464927, + 67.99988077010511, + 68.19366044789288, + 68.49848829432483, + 68.25947149341026, + 68.6317723773926, + 68.91668608614779, + 68.8159923502771, + 69.17513974647629, + 69.23356802652235, + 69.25309375298245, + 69.21125949874141, + 69.20726323550102, + 68.78019883289588, + 69.24667107728621, + 69.1153426259508, + 69.56206231608063, + 69.72141422867662, + 69.541238907092, + 69.81884141217625, + 69.53432369593423, + 69.43315031151812, + 69.01688148574168, + 68.90923934889648, + 69.13664462290991, + 69.31984528071725, + 69.14875943039056, + 69.48885652654923, + 69.88297168977773, + 69.42462273878934, + 69.12679413148601, + 68.98123233159377, + 68.7762758442149, + 68.48846507574687, + 68.02689832504595, + 68.02852643078998, + 67.555096330903, + 67.4639788904284, + 67.61277291577984, + 67.70121565906206, + 67.66817331556194, + 67.84767253849441, + 68.18538578924706, + 68.29860737971661, + 68.53693780239855, + 68.59722904625475, + 68.72061222893264, + 68.6709989466837, + 69.09400533816238, + 69.20295511428635, + 69.04258759148102, + 68.77139467473914, + 68.57756213054044, + 68.67449080482191, + 68.60860533532343, + 69.01676017621124, + 69.3052161196497, + 68.89017381442457, + 68.87423335356772, + 68.94718162265079, + 69.07199142609447, + 68.79769510366016, + 68.65106890757201, + 68.77703094552813, + 68.28258034480257, + 68.39479364216955, + 68.34220719427985, + 68.64253416645396, + 68.87725555362057, + 68.5131252571485, + 68.89127035251008, + 68.67886068136877, + 68.4447624537287, + 68.00181105736998, + 68.16998112143412, + 68.43591872875314, + 68.02705208136817, + 68.45211203302853, + 68.53289570629535, + 68.58200283313724, + 68.25718933019785, + 68.36370956465593, + 68.05020228727913, + 68.50658655636543, + 68.66449948753682, + 68.2241732330651, + 68.09791466418139, + 67.88940531760399, + 68.36978817923638, + 67.96433264274425, + 68.36349840881765, + 68.48435193949715, + 68.79844380614031, + 69.02017361165895, + 68.52624119834393, + 68.74005315812674, + 68.76067653657759, + 68.27918960695276, + 68.65714329915559, + 68.42872809873309, + 67.98192094490678, + 68.02723949195821, + 68.36423058076824, + 68.71132274325691, + 68.6730162618873, + 68.2039400216969, + 67.86554691576616, + 67.49988053949725, + 67.16307215146469, + 67.0353669125758, + 67.25486895820083, + 66.95629780399439, + 67.11477592840751, + 66.64323746050167, + 66.20269172026232, + 66.48026858749327, + 66.4824015740555, + 66.09931551662274, + 66.52915019033718, + 66.45576884782787, + 66.24667785942938, + 65.81418399593981, + 65.5611498094969, + 65.3398959293035, + 65.77646026507297, + 65.39346792956597, + 65.41692492067247, + 65.80888038895401, + 66.01134945900266, + 65.80681809031556, + 65.32295296805074, + 65.37373854104783, + 64.93533382859144, + 64.7705026812803, + 65.17813748381224, + 65.361732144628, + 64.9021692008158, + 64.7544901225187, + 64.89471070898715, + 64.74868721773261, + 65.00087272748908, + 65.13124433830268, + 64.86532668113782, + 64.51108629312537, + 64.48208116580882, + 64.86340417937541, + 64.5927354669956, + 64.1183990008181, + 63.66603997870095, + 63.670535114339415, + 63.179312479687646, + 62.71414451358941, + 62.349677869382184, + 62.73321111245177, + 62.63668992149067, + 62.246656820357686, + 62.12151749467506, + 62.09114940207692, + 62.13652644719604, + 62.59170540130276, + 62.28435878005047, + 62.62555470862962, + 62.73559453227453, + 62.63492310358647, + 62.99493118502586, + 63.2621260239913, + 62.99279716454684, + 62.8629723908099, + 63.01324605242161, + 63.27456767760901, + 63.11585082867133, + 63.04279509050621, + 63.10999097814922, + 63.544265738869036, + 63.11822935137409, + 63.01523903936018, + 63.20403674621687, + 62.83896086980938, + 62.41843196460615, + 62.11985404869429, + 62.07986319614809, + 61.99277704632526, + 61.668764434861785, + 61.24484474074755, + 61.461440830656386, + 61.276838934561326, + 61.190724244624434, + 61.55613660124493, + 61.12078454699415, + 61.3276958600818, + 61.6042219184118, + 61.25513892816126, + 61.31664892177688, + 61.688070650858535, + 62.01190639528168, + 62.08869564629636, + 61.97211569824653, + 62.06419901170042, + 62.32586483758532, + 62.23902878995992, + 62.10813808603461, + 61.85578175807045, + 62.23028871528028, + 62.632050281179744, + 62.94816419819628, + 62.73043921369783, + 62.23627146727455, + 62.584832680453275, + 62.62993353336442, + 62.8749075179418, + 62.48040775408503, + 62.21373335340891, + 61.79955494265226, + 61.833015907179636, + 61.39273179502193, + 61.269508387088344, + 61.72530078527864, + 62.09495330426252, + 62.151597131318645, + 62.03375578347783, + 62.417839543433374, + 62.857582366978384, + 62.57434410206618, + 63.025461247334185, + 62.891637883802545, + 62.74129737438404, + 62.686344200077194, + 62.74668907124072, + 62.8988624768576, + 62.60573732388666, + 63.025949401766745, + 62.67167444177004, + 62.90064380635685, + 62.864966632927896, + 62.75573606469665, + 62.64819512833622, + 62.568258206957815, + 62.60577268655998, + 62.15762551315059, + 62.567239861872935, + 62.2060758300364, + 62.31900525191699, + 62.28916506290531, + 62.44905922260444, + 62.461296429876256, + 62.500385909925505, + 62.650801268022704, + 62.56666212391569, + 62.40046878730333, + 62.094243157050244, + 62.53663695990193, + 62.42300679544488, + 62.36921559899188, + 62.24670139180489, + 62.569517596988945, + 62.66647211282815, + 62.665771463959715, + 62.876380887882625, + 62.45928337880216, + 62.909344895815984, + 62.792949925824054, + 62.83068709163355, + 62.69318202524612, + 62.87621607310353, + 63.31283919698538, + 63.25629003985129, + 63.705604438529726, + 63.273909526061956, + 63.5892070912608, + 63.25172069842234, + 63.29295380191922, + 63.37827406047424, + 63.40692971848919, + 62.91617622008834, + 62.78539371994352, + 62.67023463643756, + 62.778172553545886, + 62.47010093156481, + 62.73229570857713, + 62.59545419552364, + 63.021765325598885, + 63.12625341655425, + 62.78539970673421, + 62.48947067386955, + 62.50019409861797, + 62.27827076256643, + 62.32133231940964, + 62.28201148707485, + 62.75074499118775, + 62.2850034814543, + 62.11551149639342, + 62.19275216451308, + 61.99131816833137, + 61.53708598957499, + 61.935909883441674, + 61.982544659526965, + 62.47356745991423, + 62.54325753022373, + 62.146857201138765, + 62.189218538018835, + 62.06268691181029, + 62.33603183556959, + 62.82869197777662, + 63.18597742858942, + 63.032993740715966, + 63.5325845753775, + 63.562424373715885, + 63.50147245681481, + 63.9167851513779, + 64.41348447594058, + 64.47641931732102, + 64.00422787602398, + 63.84372934402268, + 63.57536630107787, + 64.06767133087304, + 63.857109831163605, + 63.594856285335126, + 64.01811161431772, + 64.07634398750827, + 64.53914449236566, + 64.0503925198368, + 63.65098131727389, + 63.68701372362301, + 63.69177696813634, + 63.37477814620089, + 62.9056011078514, + 62.51297543133976, + 62.59250225336332, + 62.80712544689635, + 62.841367040210486, + 63.01245999144349, + 63.05987075936997, + 62.7064932753452, + 62.53562962324097, + 62.31063278405174, + 62.266535846784436, + 62.302218124559445, + 62.342098988884466, + 61.85031656038063, + 62.236466943962625, + 62.38666354433638, + 62.50448443527158, + 62.2386149786552, + 62.43706094747305, + 62.48167927367151, + 62.53256313135768, + 62.78282604117919, + 62.610692060658806, + 62.60559562844521, + 62.522478905756024, + 62.11039441006909, + 62.455676051055406, + 62.12208142671207, + 62.08989132214651, + 61.60556028504288, + 61.72080384449528, + 61.67203415718332, + 61.300028102691506, + 61.2882234681282, + 61.67414171824772, + 61.663919195939215, + 61.82126261684866, + 62.14747753168045, + 61.90000454947883, + 61.550477655414085, + 61.823665895055534, + 62.2914692558774, + 61.97827489307881, + 62.373656454593686, + 62.77509964777066, + 63.03123026432718, + 62.71959998560016, + 62.798641799535915, + 62.36309802737797, + 62.187803490902276, + 61.86629603436246, + 61.51332614924758, + 61.670529134596514, + 62.01614193494398, + 62.42759829956865, + 62.04049015814663, + 62.4879050225676, + 62.534578908118796, + 62.53729183335963, + 62.507213724278294, + 62.91741156445245, + 62.80078558969012, + 62.89530940332275, + 62.82952275179085, + 62.931001539540134, + 62.715893011718826, + 63.176668587903144, + 63.25804897932602, + 63.715274804489724, + 63.25110762353138, + 63.703759539930466, + 63.9121877763375, + 63.74483403967367, + 63.278090432146044, + 63.25689283100131, + 63.5587547259249, + 63.99611056226184, + 63.711033213960846, + 63.61430481648302, + 63.37762519043254, + 63.825084284030204, + 63.65971618383464, + 64.11513361026066, + 64.55773804769903, + 64.72114634405787, + 64.92113863156139, + 64.74299967907277, + 64.58315181550863, + 64.53895512079164, + 64.29203322638713, + 64.35539787981175, + 64.51347297698413, + 64.41240397641245, + 64.37002365296716, + 64.54885534394022, + 65.0387758477243, + 64.77700441309366, + 65.18362739291737, + 65.05949296204716, + 64.57684960686204, + 64.47443633413799, + 64.25660237904727, + 64.56848853603353, + 64.13857108098799, + 63.779464548765795, + 63.940686810035814, + 63.47280572727399, + 63.75027671584932, + 63.72842205520389, + 63.28631208752196, + 63.54806381048302, + 63.89145142689777, + 63.77801877620565, + 64.22035568724904, + 63.99613288560804, + 64.03027098363421, + 64.45100338093056, + 64.4954103610469, + 64.0379570128468, + 64.509809400983, + 64.24776908391132, + 64.18308085450447, + 64.02686567211323, + 64.00949969057655, + 64.08790624904579, + 64.44413148646105, + 64.436667344197, + 64.925560935662, + 64.4380208837763, + 64.63611397061874, + 64.53720467943039, + 64.89043109965093, + 65.02933526203901, + 65.38083597755491, + 65.63733460002958, + 66.04889884599933, + 66.15611674378638, + 66.58017724018646, + 66.13733327264003, + 65.69321107501534, + 65.92059175869956, + 65.73905913370584, + 65.39714875503125, + 65.31355908128221, + 65.75886616744013, + 66.05775873128395, + 65.93022978097021, + 66.3107650269844 + ] + ] + }, + "schema": { + "fields": [ + { + "config": { + "interval": 30000 + }, + "name": "time", + "type": "time", + "typeInfo": { + "frame": "time.Time", + "nullable": true + } + }, + { + "config": {}, + "labels": {}, + "name": "A-hehwzd", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + } + ], + "meta": { + "custom": { + "customStat": 10 + }, + "typeVersion": [ + 0, + 0 + ] + }, + "refId": "A" + } + } + ] + } + ], + "title": "Canvas Enhanced Data Links", + "transformations": [ + { + "id": "calculateField", + "options": { + "alias": "Count (transformation)", + "mode": "reduceRow", + "reduce": { + "include": [ + "A-series" + ], + "reducer": "count" + } + } + } + ], + "type": "canvas" + } + ], + "schemaVersion": 39, + "tags": [ + "gdev", + "panel-tests", + "canvas" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timeRangeUpdatedDuringEditOrView": false, + "timepicker": {}, + "timezone": "browser", + "title": "Panel Tests - Canvas Datalinks", + "uid": "adf95uwu7w1s0e", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/devenv/dev-dashboards/panel-timeline/timeline-align-endtime.json b/devenv/dev-dashboards/panel-timeline/timeline-align-endtime.json new file mode 100644 index 00000000000..8542c7349b6 --- /dev/null +++ b/devenv/dev-dashboards/panel-timeline/timeline-align-endtime.json @@ -0,0 +1,271 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 988, + "links": [], + "panels": [ + { + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "fillOpacity": 70, + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineWidth": 0, + "spanNulls": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 15, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "alignValue": "left", + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "mergeValues": true, + "rowHeight": 0.9, + "showValue": "auto", + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "rawFrameContent": "[\n {\n \"schema\": {\n \"refId\": \"A\",\n \"meta\": {\n \"typeVersion\": [\n 0,\n 0\n ]\n },\n \"name\": \"A\",\n \"fields\": [\n {\n \"name\": \"channel\",\n \"config\": {\n \"selector\": \"channel\"\n },\n \"type\": \"string\"\n },\n {\n \"name\": \"name\",\n \"config\": {\n \"selector\": \"name\"\n },\n \"type\": \"string\"\n },\n {\n \"name\": \"starttime\",\n \"config\": {\n \"selector\": \"starttime\"\n },\n \"type\": \"string\"\n },\n {\n \"name\": \"endtime\",\n \"config\": {\n \"selector\": \"endtime\"\n },\n \"type\": \"string\"\n },\n {\n \"name\": \"duration_minutes\",\n \"config\": {\n \"selector\": \"duration_minutes\"\n },\n \"type\": \"number\"\n },\n {\n \"name\": \"state\",\n \"config\": {\n \"selector\": \"state\"\n },\n \"type\": \"string\"\n }\n ]\n },\n \"data\": {\n \"values\": [\n [\n \"Channel 1\",\n \"Channel 2\",\n \"Channel 1\",\n \"Channel 2\"\n ],\n [\n \"Event 1\",\n \"Event 2\",\n \"Event 3\",\n \"Event 4\"\n ],\n [\n \"2024-02-28T08:00:00Z\",\n \"2024-02-28T09:00:00Z\",\n \"2024-02-28T11:00:00Z\",\n \"2024-02-28T12:30:00Z\"\n ],\n [\n \"2024-02-28T10:00:00Z\",\n \"2024-02-28T10:30:00Z\",\n \"2024-02-28T14:00:00Z\",\n \"2024-02-28T13:30:00Z\"\n ],\n [\n 120,\n 90,\n 180,\n 60\n ],\n [\n \"OK\",\n \"ERROR\",\n \"NO_DATA\",\n \"WARNING\"\n ]\n ]\n }\n }\n]", + "refId": "A", + "scenarioId": "raw_frame" + } + ], + "title": "Raw frames w/enums", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "channel": false, + "duration_minutes": true, + "name": true + }, + "includeByName": {}, + "indexByName": {}, + "renameByName": {} + } + }, + { + "id": "convertFieldType", + "options": { + "conversions": [ + { + "destinationType": "time", + "enumConfig": { + "text": [ + "2024-02-28T08:00:00Z", + "2024-02-28T09:00:00Z", + "2024-02-28T11:00:00Z", + "2024-02-28T12:30:00Z" + ] + }, + "targetField": "starttime" + }, + { + "destinationType": "time", + "targetField": "endtime" + }, + { + "destinationType": "enum", + "enumConfig": { + "text": [ + "OK", + "ERROR", + "NO_DATA", + "WARNING" + ] + }, + "targetField": "state" + } + ], + "fields": {} + } + }, + { + "id": "partitionByValues", + "options": { + "fields": [ + "channel" + ], + "keepFields": false, + "naming": { + "asLabels": false + } + } + } + ], + "type": "state-timeline" + }, + { + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "fillOpacity": 70, + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineWidth": 0, + "spanNulls": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 15, + "x": 0, + "y": 13 + }, + "id": 2, + "options": { + "alignValue": "left", + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "mergeValues": true, + "rowHeight": 0.9, + "showValue": "auto", + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "alias": "Channel 1", + "csvContent": "starttime,endtime,state\n1709107200000,1709114400000,OK\n1709118000000,1709128800000,NO_DATA", + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "refId": "A", + "scenarioId": "csv_content" + }, + { + "alias": "Channel 2", + "csvContent": "starttime,endtime,state\n1709110800000,1709116200000,ERROR\n1709123400000,1709127000000,WARNING", + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "refId": "B", + "scenarioId": "csv_content" + } + ], + "title": "CSV content", + "type": "state-timeline" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [ + "gdev", + "panel-tests", + "graph-ng", + "demo" + ], + "templating": { + "list": [] + }, + "time": { + "from": "2024-02-28T07:47:21.428Z", + "to": "2024-02-28T14:12:43.391Z" + }, + "timeRangeUpdatedDuringEditOrView": false, + "timepicker": {}, + "timezone": "browser", + "title": "Panel Tests - StateTimeline - multiple frames with endTime", + "uid": "cdf3gkge5reo0f", + "version": 4, + "weekStart": "" +} \ No newline at end of file diff --git a/devenv/dev-dashboards/panel-timeline/timeline-align-nulls-retain.json b/devenv/dev-dashboards/panel-timeline/timeline-align-nulls-retain.json new file mode 100644 index 00000000000..49907cca771 --- /dev/null +++ b/devenv/dev-dashboards/panel-timeline/timeline-align-nulls-retain.json @@ -0,0 +1,213 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 993, + "links": [], + "panels": [ + { + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "light-blue", + "mode": "fixed" + }, + "custom": { + "fillOpacity": 20, + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineWidth": 1, + "spanNulls": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Dose" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#289fb0", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mix" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#d4b10b", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cook" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#c900c3", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Int. Shear" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#a49225", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Ext. Shear" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#148dd7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Transfer" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#01b70c", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 19, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "alignValue": "center", + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "mergeValues": false, + "rowHeight": 0.9, + "showValue": "auto", + "tooltip": { + "maxHeight": 600, + "mode": "single", + "sort": "none" + } + }, + "repeat": "CHANNEL", + "repeatDirection": "v", + "targets": [ + { + "datasource": { + "type": "grafana-testdata-datasource", + "uid": "PD8C576611E62080A" + }, + "rawFrameContent": "[\n {\n \"schema\": {\n \"refId\": \"Dose\",\n \"meta\": {\n \"executedQueryString\": \"from(bucket: \\\"data\\\")\\r\\n |> range(start: 2023-10-20T05:04:00Z, stop: 2023-10-20T07:22:00Z)\\r\\n |> filter(fn: (r) => r[\\\"_field\\\"] == \\\"FactoryManager_Analogs_DB.A01C02U09.PHS.Dose\\\")\\r\\n |> keep(columns: [\\\"_time\\\", \\\"_value\\\"])\\r\\n |> map(fn: (r) => ({ \\r\\n \\\"Dose\\\": r._value,\\r\\n time: r._time,\\r\\n }))\\r\\n\",\n \"typeVersion\": [\n 0,\n 0\n ]\n },\n \"fields\": [\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"time\",\n \"type\": \"time\",\n \"typeInfo\": {\n \"frame\": \"time.Time\",\n \"nullable\": true\n }\n },\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"Dose\",\n \"type\": \"string\",\n \"typeInfo\": {\n \"frame\": \"string\",\n \"nullable\": true\n }\n }\n ]\n },\n \"data\": {\n \"values\": [\n [\n 1697781872300,\n 1697781963303,\n 1697784138453,\n 1697784160451\n ],\n [\n \"Cold Water Dosing Active (150 ltrs)\",\n null,\n \"Hot Water Dosing Active (50 ltrs)\",\n null\n ]\n ]\n }\n },\n {\n \"schema\": {\n \"refId\": \"Mix\",\n \"meta\": {\n \"executedQueryString\": \"from(bucket: \\\"data\\\")\\r\\n |> range(start: 2023-10-20T05:04:00Z, stop: 2023-10-20T07:22:00Z)\\r\\n |> filter(fn: (r) => r[\\\"_field\\\"] == \\\"FactoryManager_Analogs_DB.A01C02U09.PHS.Mix\\\")\\r\\n |> keep(columns: [\\\"_time\\\", \\\"_value\\\"])\\r\\n |> map(fn: (r) => ({ \\r\\n \\\"Mix\\\": r._value,\\r\\n time: r._time,\\r\\n }))\\r\\n\",\n \"typeVersion\": [\n 0,\n 0\n ]\n },\n \"fields\": [\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"time\",\n \"type\": \"time\",\n \"typeInfo\": {\n \"frame\": \"time.Time\",\n \"nullable\": true\n }\n },\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"Mix\",\n \"type\": \"string\",\n \"typeInfo\": {\n \"frame\": \"string\",\n \"nullable\": true\n }\n }\n ]\n },\n \"data\": {\n \"values\": [\n [\n 1697778291972,\n 1697778393992,\n 1697778986994,\n 1697786485890\n ],\n [\n \"Running Constant Forward\",\n null,\n \"Running Constant Forward\",\n null\n ]\n ]\n }\n },\n {\n \"schema\": {\n \"refId\": \"Cook\",\n \"meta\": {\n \"executedQueryString\": \"from(bucket: \\\"data\\\")\\r\\n |> range(start: 2023-10-20T05:04:00Z, stop: 2023-10-20T07:22:00Z)\\r\\n |> filter(fn: (r) => r[\\\"_field\\\"] == \\\"FactoryManager_Analogs_DB.A01C02U09.PHS.Cook\\\")\\r\\n |> keep(columns: [\\\"_time\\\", \\\"_value\\\"])\\r\\n |> map(fn: (r) => ({ \\r\\n \\\"Cook\\\": r._value,\\r\\n time: r._time,\\r\\n }))\\r\\n\",\n \"typeVersion\": [\n 0,\n 0\n ]\n },\n \"fields\": [\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"time\",\n \"type\": \"time\",\n \"typeInfo\": {\n \"frame\": \"time.Time\",\n \"nullable\": true\n }\n },\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"Cook\",\n \"type\": \"string\",\n \"typeInfo\": {\n \"frame\": \"string\",\n \"nullable\": true\n }\n }\n ]\n },\n \"data\": {\n \"values\": [\n [\n 1697779163986,\n 1697779921045,\n 1697780221094,\n 1697780521111,\n 1697781186192,\n 1697781786291,\n 1697783332361,\n 1697783784395,\n 1697783790397,\n 1697784146478,\n 1697784517471,\n 1697784523487,\n 1697784949480,\n 1697785369505\n ],\n [\n \"Heating to Setpoint (92c)\",\n \"Stage Time Running (5 mins)\",\n null,\n \"Heating to Setpoint (96c)\",\n \"Stage Time Running (10 mins)\",\n null,\n \"Heating to Setpoint (92c)\",\n \"Stage Time Running (0 mins)\",\n null,\n \"Heating to Setpoint (92c)\",\n \"Stage Time Running (0 mins)\",\n null,\n \"CCP in Progress (7 mins)\",\n null\n ]\n ]\n }\n },\n {\n \"schema\": {\n \"refId\": \"Shear\",\n \"meta\": {\n \"executedQueryString\": \"from(bucket: \\\"data\\\")\\r\\n |> range(start: 2023-10-20T05:04:00Z, stop: 2023-10-20T07:22:00Z)\\r\\n |> filter(fn: (r) => r[\\\"_field\\\"] == \\\"FactoryManager_Analogs_DB.A01C02U09.PHS.Shear\\\")\\r\\n |> keep(columns: [\\\"_time\\\", \\\"_value\\\"])\\r\\n |> map(fn: (r) => ({ \\r\\n \\\"Int. Shear\\\": r._value,\\r\\n time: r._time,\\r\\n }))\\r\\n\",\n \"typeVersion\": [\n 0,\n 0\n ]\n },\n \"fields\": [\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"time\",\n \"type\": \"time\",\n \"typeInfo\": {\n \"frame\": \"time.Time\",\n \"nullable\": true\n }\n },\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"Int. Shear\",\n \"type\": \"string\",\n \"typeInfo\": {\n \"frame\": \"string\",\n \"nullable\": true\n }\n }\n ]\n },\n \"data\": {\n \"values\": [\n [\n 1697782100330,\n 1697782832342\n ],\n [\n \"Shearing Active (12 mins)\",\n null\n ]\n ]\n }\n },\n {\n \"schema\": {\n \"refId\": \"Recirc\",\n \"meta\": {\n \"executedQueryString\": \"from(bucket: \\\"data\\\")\\r\\n |> range(start: 2023-10-20T05:04:00Z, stop: 2023-10-20T07:22:00Z)\\r\\n |> filter(fn: (r) => r[\\\"_field\\\"] == \\\"FactoryManager_Analogs_DB.A01C02U09.PHS.Recirc\\\")\\r\\n |> keep(columns: [\\\"_time\\\", \\\"_value\\\"])\\r\\n |> map(fn: (r) => ({ \\r\\n \\\"Ext. Shear\\\": r._value,\\r\\n time: r._time,\\r\\n }))\\r\\n\",\n \"typeVersion\": [\n 0,\n 0\n ]\n },\n \"fields\": []\n },\n \"data\": {\n \"values\": []\n }\n },\n {\n \"schema\": {\n \"refId\": \"Transfer\",\n \"meta\": {\n \"executedQueryString\": \"from(bucket: \\\"data\\\")\\r\\n |> range(start: 2023-10-20T05:04:00Z, stop: 2023-10-20T07:22:00Z)\\r\\n |> filter(fn: (r) => r[\\\"_field\\\"] == \\\"FactoryManager_Analogs_DB.A01C02U09.PHS.Transfer\\\")\\r\\n |> keep(columns: [\\\"_time\\\", \\\"_value\\\"])\\r\\n |> map(fn: (r) => ({ \\r\\n \\\"Transfer\\\": r._value,\\r\\n time: r._time,\\r\\n }))\\r\\n\",\n \"typeVersion\": [\n 0,\n 0\n ]\n },\n \"fields\": [\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"time\",\n \"type\": \"time\",\n \"typeInfo\": {\n \"frame\": \"time.Time\",\n \"nullable\": true\n }\n },\n {\n \"config\": {},\n \"labels\": {},\n \"name\": \"Transfer\",\n \"type\": \"string\",\n \"typeInfo\": {\n \"frame\": \"string\",\n \"nullable\": true\n }\n }\n ]\n },\n \"data\": {\n \"values\": [\n [\n 1697785713869,\n 1697785753879,\n 1697785764887,\n 1697785875872,\n 1697786481929\n ],\n [\n \"Pre-Start Drain\",\n null,\n \"Build Pressure (0.6 Barg)\",\n \"Transfer in progress (0.7 Barg)\",\n \"Wait for pressure dissipation (0.2 Barg)\"\n ]\n ]\n }\n }\n]", + "refId": "A", + "scenarioId": "raw_frame" + } + ], + "title": "Reproduced with embedded data", + "type": "state-timeline" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [ + "gdev", + "panel-tests", + "graph-ng", + "demo" + ], + "templating": { + "list": [] + }, + "time": { + "from": "2023-10-20T05:04:00.000Z", + "to": "2023-10-20T07:22:00.000Z" + }, + "timeRangeUpdatedDuringEditOrView": false, + "timepicker": {}, + "timezone": "utc", + "title": "Panel Tests - StateTimeline - multiple frames with nulls", + "uid": "edf55caay3w8wa", + "version": 4, + "weekStart": "" +} \ No newline at end of file diff --git a/devenv/dev-dashboards/panel-timeseries/timeseries-stacking2.json b/devenv/dev-dashboards/panel-timeseries/timeseries-stacking2.json index 5bdd23574f5..1c12a9a2982 100644 --- a/devenv/dev-dashboards/panel-timeseries/timeseries-stacking2.json +++ b/devenv/dev-dashboards/panel-timeseries/timeseries-stacking2.json @@ -3487,4 +3487,4 @@ "uid": "1KxMUdE7k", "version": 5, "weekStart": "" -} \ No newline at end of file +} diff --git a/devenv/dev-dashboards/panel-xychart/xychart-example.json b/devenv/dev-dashboards/panel-xychart/xychart-example.json index cecdcb0e49d..61d9761864b 100644 --- a/devenv/dev-dashboards/panel-xychart/xychart-example.json +++ b/devenv/dev-dashboards/panel-xychart/xychart-example.json @@ -206,7 +206,7 @@ { "name": "Male", "pointColor": { - "fixed": "#5795f200" + "fixed": "#5795f2" }, "pointSize": { "fixed": 5, @@ -219,7 +219,7 @@ { "name": "Female", "pointColor": { - "fixed": "#ff983000" + "fixed": "#ff9830" }, "pointSize": { "fixed": 5, diff --git a/devenv/dev-dashboards/scenarios/tall_dashboard.json b/devenv/dev-dashboards/scenarios/tall_dashboard.json new file mode 100644 index 00000000000..ca87850c2b0 --- /dev/null +++ b/devenv/dev-dashboards/scenarios/tall_dashboard.json @@ -0,0 +1,1791 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "panels": [ + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 1", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #1", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 2", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #2", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 3, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 3", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #3", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 4, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 4", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #4", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 32 + }, + "id": 5, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 5", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #5", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 40 + }, + "id": 6, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 6", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #6", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 48 + }, + "id": 7, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 7", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #7", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 56 + }, + "id": 8, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 8", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #8", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 64 + }, + "id": 9, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 9", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #9", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 72 + }, + "id": 10, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 10", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #10", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 80 + }, + "id": 11, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 11", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #11", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 88 + }, + "id": 12, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 12", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #12", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 96 + }, + "id": 13, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 13", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #13", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 104 + }, + "id": 14, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 14", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #14", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 112 + }, + "id": 15, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 15", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #15", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 120 + }, + "id": 16, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 16", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #16", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 128 + }, + "id": 17, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 17", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #17", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 136 + }, + "id": 18, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 18", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #18", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 144 + }, + "id": 19, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 19", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #19", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 152 + }, + "id": 20, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 20", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #20", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 160 + }, + "id": 21, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 21", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #21", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 168 + }, + "id": 22, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 22", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #22", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 176 + }, + "id": 23, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 23", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #23", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 184 + }, + "id": 24, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 24", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #24", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 192 + }, + "id": 25, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 25", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #25", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 200 + }, + "id": 26, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 26", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #26", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 208 + }, + "id": 27, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 27", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #27", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 216 + }, + "id": 28, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 28", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #28", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 224 + }, + "id": 29, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 29", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #29", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 232 + }, + "id": 30, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 30", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #30", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 240 + }, + "id": 31, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 31", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #31", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 248 + }, + "id": 32, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 32", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #32", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 256 + }, + "id": 33, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 33", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #33", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 264 + }, + "id": 34, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 34", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #34", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 272 + }, + "id": 35, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 35", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #35", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 280 + }, + "id": 36, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 36", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #36", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 288 + }, + "id": 37, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 37", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #37", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 296 + }, + "id": 38, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 38", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #38", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 304 + }, + "id": 39, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 39", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #39", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 312 + }, + "id": 40, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 40", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #40", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 320 + }, + "id": 41, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 41", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #41", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 328 + }, + "id": 42, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 42", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #42", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 336 + }, + "id": 43, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 43", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #43", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 344 + }, + "id": 44, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 44", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #44", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 352 + }, + "id": 45, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 45", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #45", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 360 + }, + "id": 46, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 46", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #46", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 368 + }, + "id": 47, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 47", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #47", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 376 + }, + "id": 48, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 48", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #48", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 384 + }, + "id": 49, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 49", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #49", + "type": "text" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 392 + }, + "id": 50, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "Dashboard panel 50", + "mode": "markdown" + }, + "pluginVersion": "11.0.0-pre", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Panel #50", + "type": "text" + } + ], + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timeRangeUpdatedDuringEditOrView": false, + "timepicker": {}, + "timezone": "browser", + "title": "A tall dashboard", + "uid": "edediimbjhdz4b", + "version": 1, + "weekStart": "" +} diff --git a/devenv/docker/blocks/auth/README.md b/devenv/docker/blocks/auth/README.md index ed2872704b7..2046804fb9a 100644 --- a/devenv/docker/blocks/auth/README.md +++ b/devenv/docker/blocks/auth/README.md @@ -9,7 +9,7 @@ Spin up a service with the following command from the base directory of this repository. ```bash -make devenv=oauth +make devenv=auth/oauth ``` This will add the `oauth/docker-compose` block to the `docker-compose` file used diff --git a/devenv/docker/blocks/mimir_backend/docker-compose.yaml b/devenv/docker/blocks/mimir_backend/docker-compose.yaml index 058a0d86085..2a9c2dbd98e 100644 --- a/devenv/docker/blocks/mimir_backend/docker-compose.yaml +++ b/devenv/docker/blocks/mimir_backend/docker-compose.yaml @@ -1,5 +1,5 @@ mimir_backend: - image: grafana/mimir:r274-1780c50 + image: us.gcr.io/kubernetes-dev/mimir:santihernandezc-remove_id_from_grafana_config-d3826b4f8-WIP container_name: mimir_backend command: - -target=backend diff --git a/devenv/docker/blocks/tempo/tempo.yaml b/devenv/docker/blocks/tempo/tempo.yaml index 7adf1b53686..f94d4ca96e7 100644 --- a/devenv/docker/blocks/tempo/tempo.yaml +++ b/devenv/docker/blocks/tempo/tempo.yaml @@ -43,7 +43,6 @@ storage: bloom_filter_false_positive: .05 # bloom filter false positive rate. lower values create larger filters but fewer false positives v2_index_downsample_bytes: 1000 # number of bytes per index record v2_encoding: zstd # block encoding/compression. options: none, gzip, lz4-64k, lz4-256k, lz4-1M, lz4, snappy, zstd, s2 - version: vParquet wal: path: /tmp/tempo/wal # where to store the the wal locally v2_encoding: snappy # wal encoding/compression. options: none, gzip, lz4-64k, lz4-256k, lz4-1M, lz4, snappy, zstd, s2 diff --git a/devenv/docker/ha-test-unified-alerting/grafana/provisioning/alerts.jsonnet b/devenv/docker/ha-test-unified-alerting/grafana/provisioning/alerts.jsonnet deleted file mode 100644 index f3db6a51a56..00000000000 --- a/devenv/docker/ha-test-unified-alerting/grafana/provisioning/alerts.jsonnet +++ /dev/null @@ -1,202 +0,0 @@ -local numAlerts = std.extVar('alerts'); -local condition = std.extVar('condition'); -local arr = std.range(1, numAlerts); - -local alertDashboardTemplate = { - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": null, - "links": [], - "panels": [ - { - "alert": { - "conditions": [ - { - "evaluator": { - "params": [ - 65 - ], - "type": "gt" - }, - "operator": { - "type": "and" - }, - "query": { - "params": [ - "A", - "5m", - "now" - ] - }, - "reducer": { - "params": [], - "type": "avg" - }, - "type": "query" - } - ], - "executionErrorState": "alerting", - "frequency": "10s", - "handler": 1, - "for": "1m", - "name": "bulk alerting", - "noDataState": "no_data", - "notifications": [ - { - "id": 2 - } - ] - }, - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "$$hashKey": "object:117", - "expr": "go_goroutines", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 50 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Panel Title", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "schemaVersion": 16, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "New dashboard", - "uid": null, - "version": 0 -}; - - -{ - ['alert-' + std.toString(x) + '.json']: - alertDashboardTemplate + { - panels: [ - alertDashboardTemplate.panels[0] + - { - alert+: { - name: 'Alert rule ' + x, - conditions: [ - alertDashboardTemplate.panels[0].alert.conditions[0] + - { - evaluator+: { - params: [condition] - } - }, - ], - }, - }, - ], - uid: 'alert-' + x, - title: 'Alert ' + x - }, - for x in arr -} \ No newline at end of file diff --git a/devenv/docker/ha-test-unified-alerting/webhook-listener.go b/devenv/docker/ha-test-unified-alerting/webhook-listener.go index d742db681b0..d14617dca06 100644 --- a/devenv/docker/ha-test-unified-alerting/webhook-listener.go +++ b/devenv/docker/ha-test-unified-alerting/webhook-listener.go @@ -122,7 +122,6 @@ func main() { waitDuration := time.Duration(waitSeconds) * time.Second http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { - writer.WriteHeader(http.StatusOK) writer.Write([]byte(landingPage)) }) diff --git a/devenv/docker/ha_test/alerts.sh b/devenv/docker/ha_test/alerts.sh index f2e7b4aec6c..0b35f0d8118 100755 --- a/devenv/docker/ha_test/alerts.sh +++ b/devenv/docker/ha_test/alerts.sh @@ -84,27 +84,6 @@ slack() { http://admin:admin@grafana.loc/api/alert-notifications/2 } -provision() { - alerts=1 - condition=65 - while getopts ":a:c:" o; do - case "${o}" in - a) - alerts=${OPTARG} - ;; - c) - condition=${OPTARG} - ;; - esac - done - shift $((OPTIND-1)) - - requiresJsonnet - - find grafana/provisioning/dashboards/alerts -maxdepth 1 -name 'alert*.json' -delete - jsonnet -m grafana/provisioning/dashboards/alerts grafana/provisioning/alerts.jsonnet --ext-code alerts=$alerts --ext-code condition=$condition -} - pause() { curl -H "Content-Type: application/json" \ -d '{"paused":true}' \ @@ -126,9 +105,6 @@ usage() { echo -e " [-u]\t\t\t url" echo -e " [-r]\t\t\t send reminders" echo -e " [-e ]\t\t default 10m\n" - echo -e " provision\t provision alerts" - echo -e " [-a ]\t default 1" - echo -e " [-c ]\t default 65\n" echo -e " pause\t\t pause all alerts" echo -e " unpause\t unpause all alerts" } @@ -140,8 +116,6 @@ main() { setup elif [[ $cmd == "slack" ]]; then slack "${@:2}" - elif [[ $cmd == "provision" ]]; then - provision "${@:2}" elif [[ $cmd == "pause" ]]; then pause elif [[ $cmd == "unpause" ]]; then diff --git a/devenv/docker/ha_test/grafana/provisioning/alerts.jsonnet b/devenv/docker/ha_test/grafana/provisioning/alerts.jsonnet deleted file mode 100644 index f3db6a51a56..00000000000 --- a/devenv/docker/ha_test/grafana/provisioning/alerts.jsonnet +++ /dev/null @@ -1,202 +0,0 @@ -local numAlerts = std.extVar('alerts'); -local condition = std.extVar('condition'); -local arr = std.range(1, numAlerts); - -local alertDashboardTemplate = { - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": null, - "links": [], - "panels": [ - { - "alert": { - "conditions": [ - { - "evaluator": { - "params": [ - 65 - ], - "type": "gt" - }, - "operator": { - "type": "and" - }, - "query": { - "params": [ - "A", - "5m", - "now" - ] - }, - "reducer": { - "params": [], - "type": "avg" - }, - "type": "query" - } - ], - "executionErrorState": "alerting", - "frequency": "10s", - "handler": 1, - "for": "1m", - "name": "bulk alerting", - "noDataState": "no_data", - "notifications": [ - { - "id": 2 - } - ] - }, - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "$$hashKey": "object:117", - "expr": "go_goroutines", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "fill": true, - "line": true, - "op": "gt", - "value": 50 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Panel Title", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ] - } - ], - "schemaVersion": 16, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "New dashboard", - "uid": null, - "version": 0 -}; - - -{ - ['alert-' + std.toString(x) + '.json']: - alertDashboardTemplate + { - panels: [ - alertDashboardTemplate.panels[0] + - { - alert+: { - name: 'Alert rule ' + x, - conditions: [ - alertDashboardTemplate.panels[0].alert.conditions[0] + - { - evaluator+: { - params: [condition] - } - }, - ], - }, - }, - ], - uid: 'alert-' + x, - title: 'Alert ' + x - }, - for x in arr -} \ No newline at end of file diff --git a/devenv/jsonnet/dev-dashboards.libsonnet b/devenv/jsonnet/dev-dashboards.libsonnet index 7ab736b308d..391e684fca4 100644 --- a/devenv/jsonnet/dev-dashboards.libsonnet +++ b/devenv/jsonnet/dev-dashboards.libsonnet @@ -21,6 +21,7 @@ "barchart-tooltips-legends": (import '../dev-dashboards/panel-barchart/barchart-tooltips-legends.json'), "candlestick": (import '../dev-dashboards/panel-candlestick/candlestick.json'), "canvas-connection-examples": (import '../dev-dashboards/panel-canvas/canvas-connection-examples.json'), + "canvas-datalinks": (import '../dev-dashboards/panel-canvas/canvas-datalinks.json'), "canvas-examples": (import '../dev-dashboards/panel-canvas/canvas-examples.json'), "color_modes": (import '../dev-dashboards/panel-common/color_modes.json'), "config-from-query": (import '../dev-dashboards/transforms/config-from-query.json'), @@ -58,6 +59,7 @@ "join-by-labels": (import '../dev-dashboards/transforms/join-by-labels.json'), "lazy_loading": (import '../dev-dashboards/panel-common/lazy_loading.json'), "linked-viz": (import '../dev-dashboards/panel-common/linked-viz.json'), + "live-publish": (import '../dev-dashboards/live/live-publish.json'), "loki_fakedata": (import '../dev-dashboards/datasource-loki/loki_fakedata.json'), "loki_query_splitting": (import '../dev-dashboards/datasource-loki/loki_query_splitting.json'), "migrations": (import '../dev-dashboards/migrations/migrations.json'), @@ -90,6 +92,7 @@ "table_sparkline_cell": (import '../dev-dashboards/panel-table/table_sparkline_cell.json'), "table_tests": (import '../dev-dashboards/panel-table/table_tests.json'), "table_tests_new": (import '../dev-dashboards/panel-table/table_tests_new.json'), + "tall_dashboard": (import '../dev-dashboards/scenarios/tall_dashboard.json'), "templating-dashboard-links-and-variables": (import '../dev-dashboards/feature-templating/templating-dashboard-links-and-variables.json'), "templating-repeating-panels": (import '../dev-dashboards/feature-templating/templating-repeating-panels.json'), "templating-repeating-rows": (import '../dev-dashboards/feature-templating/templating-repeating-rows.json'), @@ -100,9 +103,10 @@ "testdata-test-variable-output": (import '../dev-dashboards/feature-templating/testdata-test-variable-output.json'), "testdata-variables-textbox": (import '../dev-dashboards/feature-templating/testdata-variables-textbox.json'), "testdata-variables-that-update-on-time-c": (import '../dev-dashboards/feature-templating/testdata-variables-that-update-on-time-change.json'), - "testdata_alerts": (import '../dev-dashboards/alerting/testdata_alerts.json'), "text-options": (import '../dev-dashboards/panel-text/text-options.json'), "time_zone_support": (import '../dev-dashboards/scenarios/time_zone_support.json'), + "timeline-align-endtime": (import '../dev-dashboards/panel-timeline/timeline-align-endtime.json'), + "timeline-align-nulls-retain": (import '../dev-dashboards/panel-timeline/timeline-align-nulls-retain.json'), "timeline-demo": (import '../dev-dashboards/panel-timeline/timeline-demo.json'), "timeline-modes": (import '../dev-dashboards/panel-timeline/timeline-modes.json'), "timeline-thresholds-mappings": (import '../dev-dashboards/panel-timeline/timeline-thresholds-mappings.json'), diff --git a/devenv/setup.sh b/devenv/setup.sh index 906f1601827..ec1b8ea65a6 100755 --- a/devenv/setup.sh +++ b/devenv/setup.sh @@ -14,27 +14,6 @@ bulkDashboard() { ln -s -f ../../../devenv/bulk-dashboards/bulk-dashboards.yaml ../conf/provisioning/dashboards/custom.yaml } -bulkAlertingDashboard() { - - requiresJsonnet - - jsonnet -o "bulk_alerting_dashboards/bulk_alerting_datasources.yaml" ./bulk_alerting_dashboards/datasources.jsonnet - - COUNTER=1 - DS=1 - MAX=1000 - while [ $COUNTER -lt $MAX ]; do - jsonnet -o "bulk_alerting_dashboards/alerting_dashboard${COUNTER}.json" \ - -e "local bulkDash = import 'bulk_alerting_dashboards/dashboard.libsonnet'; bulkDash.alertingDashboard(${COUNTER}, ${DS})" - let COUNTER=COUNTER+1 - let DS=COUNTER/10 - let DS=DS+1 - done - - ln -s -f ../../../devenv/bulk_alerting_dashboards/bulk_alerting_dashboards.yaml ../conf/provisioning/dashboards/custom.yaml - ln -s -f ../../../devenv/bulk_alerting_dashboards/bulk_alerting_datasources.yaml ../conf/provisioning/datasources/custom.yaml -} - bulkFolders() { ./bulk-folders/bulk-folders.sh "$1" ln -s -f ../../../devenv/bulk-folders/bulk-folders.yaml ../conf/provisioning/dashboards/bulk-folders.yaml @@ -70,12 +49,6 @@ undev() { rm -rf bulk-folders/Bulk\ Folder* echo -e " \xE2\x9C\x94 Reverting bulk-folders provisioning" - - # Removing generated dashboard and datasource files from bulk-alerting-dashboards - rm -f bulk_alerting_dashboards/alerting_dashboard*.json - rm -f "bulk_alerting_dashboards/bulk_alerting_datasources.yaml" - echo -e " \xE2\x9C\x94 Reverting bulk-alerting-dashboards provisioning" - # Removing the symlinks rm -f ../conf/provisioning/dashboards/custom.yaml rm -f ../conf/provisioning/dashboards/bulk-folders.yaml @@ -88,7 +61,6 @@ usage() { echo -e "\n" echo "Usage:" echo " bulk-dashboards - provision 400 dashboards" - echo " bulk-alerting-dashboards - provision 400 dashboards with alerts" echo " bulk-folders [folders] [dashboards] - provision many folders with dashboards" echo " bulk-folders - provision 200 folders with 3 dashboards in each" echo " no args - provision core datasources and dev dashboards" @@ -104,9 +76,7 @@ main() { local cmd=$1 local arg1=$2 - if [[ $cmd == "bulk-alerting-dashboards" ]]; then - bulkAlertingDashboard - elif [[ $cmd == "bulk-dashboards" ]]; then + if [[ $cmd == "bulk-dashboards" ]]; then bulkDashboard elif [[ $cmd == "bulk-folders" ]]; then bulkFolders "$arg1" diff --git a/.codespellignore b/docs/.codespellignore similarity index 100% rename from .codespellignore rename to docs/.codespellignore diff --git a/docs/Makefile b/docs/Makefile index 38997200b0d..36b7e4f41be 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -9,7 +9,6 @@ include docs.mk .PHONY: sources/panels-visualizations/query-transform-data/transform-data/index.md sources/panels-visualizations/query-transform-data/transform-data/index.md: ## Generate the Transform Data page source. -sources/panels-visualizations/query-transform-data/transform-data/index.md: cd $(CURDIR)/.. && npx tsc ./scripts/docs/generate-transformations.ts && \ - node ./scripts/docs/generate-transformations.js > $(CURDIR)/$@ && \ + node -e "require('./scripts/docs/generate-transformations').buildMarkdownContent()" && \ npx prettier -w $(CURDIR)/$@ diff --git a/docs/make-docs b/docs/make-docs index cdb2b36f7f2..fc4f3d7a148 100755 --- a/docs/make-docs +++ b/docs/make-docs @@ -738,6 +738,13 @@ POSIX_HERESTRING case "${image}" in 'grafana/doc-validator') + if ! command -v jq >/dev/null 2>&1; then + errr '`jq` must be installed for the `doc-validator` target to work.' + note 'To install `jq`, refer to https://jqlang.github.io/jq/download/,' + + exit 1 + fi + proj="$(new_proj "$1")" printf '\r\n' "${PODMAN}" run \ @@ -750,8 +757,10 @@ case "${image}" in "${DOCS_IMAGE}" \ "--include=${DOC_VALIDATOR_INCLUDE}" \ "--skip-checks=${DOC_VALIDATOR_SKIP_CHECKS}" \ - /hugo/content/docs \ - "$(proj_canonical "${proj}")" | sed "s#$(proj_dst "${proj}")#sources#" + "/hugo/content$(proj_canonical "${proj}")" \ + "$(proj_canonical "${proj}")" \ + | sed "s#$(proj_dst "${proj}")#sources#" \ + | jq -r '"ERROR: \(.location.path):\(.location.range.start.line // 1):\(.location.range.start.column // 1): \(.message)" + if .suggestions[0].text then "\nSuggestion: \(.suggestions[0].text)" else "" end' ;; 'grafana/vale') proj="$(new_proj "$1")" @@ -843,7 +852,8 @@ EOF -e '/rm -rf dist*/ d' \ -e '/Press Ctrl+C to stop/ d' \ -e '/make/ d' \ - -e '/WARNING: The manual_mount source directory/ d' + -e '/WARNING: The manual_mount source directory/ d' \ + -e '/docs\/_index.md .* not found/ d' fi ;; esac diff --git a/docs/sources/_index.md b/docs/sources/_index.md index c552414e6da..da6a832281a 100644 --- a/docs/sources/_index.md +++ b/docs/sources/_index.md @@ -81,8 +81,8 @@ title: Grafana documentation

Provisioning

Learn how to automate your Grafana configuration.

- }}" class="nav-cards__item nav-cards__item--guide"> -

What's new in v10.4

+
}}" class="nav-cards__item nav-cards__item--guide"> +

What's new in v11.0-preview

Explore the features and enhancements in the latest release.

diff --git a/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-loki/index.md b/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-loki/index.md index bb1ab192d74..7a45e25805a 100644 --- a/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-loki/index.md +++ b/docs/sources/administration/data-source-management/teamlbac/configure-teamlbac-for-loki/index.md @@ -17,7 +17,7 @@ Team LBAC is available in private preview on Grafana Cloud for Loki created with ## Before you begin -To be able to use Team LBAC rules, you need to enable the feature toggle `teamHTTPHeaders` on your Grafana instance. Contact support to enable the feature toggle for you. +To be able to use Team LBAC rules, you need to enable the feature toggle `teamHttpHeaders` on your Grafana instance. Contact support to enable the feature toggle for you. - Be sure that you have the permission setup to create a loki tenant in Grafana Cloud - Be sure that you have admin data source permissions for Grafana. diff --git a/docs/sources/administration/data-source-management/teamlbac/create-teamlbac-rules/index.md b/docs/sources/administration/data-source-management/teamlbac/create-teamlbac-rules/index.md index a899d4b3e06..f19fa06ec0f 100644 --- a/docs/sources/administration/data-source-management/teamlbac/create-teamlbac-rules/index.md +++ b/docs/sources/administration/data-source-management/teamlbac/create-teamlbac-rules/index.md @@ -31,6 +31,13 @@ Team LBAC is available on Cloud for data sources created with basic authenticati 1. Define Label Selector for the Rule - Add a label selector to the rule. Refer to Loki query documentation for guidance on the types of log selections you can specify. +### LBAC rule + +A LBAC rule is a `logql` query that runs as a query to the loki instance for your logs. Each rule is it's own filtering operating independently from the other rules within a team. For example, you can create a label policy that includes all log lines with the label. + +One rule `{namespace="dev", cluster="us-west-0"}` created with multiple namespaces will be seen as `namespace="dev"` **AND** `cluster="us-west-0"`. +Two rules `{namespace="dev"}`, `{cluster="us-west-0"}` created for a team will be seen as `namespace="dev"` **OR** `cluster="us-west-0"`. + #### Best practices We recommend you only add `query` permissions for teams that should use the data source and only `Admin` have `Admin` permissions. diff --git a/docs/sources/administration/enterprise-licensing/_index.md b/docs/sources/administration/enterprise-licensing/_index.md index 6dd8c9e2f70..5d793097684 100644 --- a/docs/sources/administration/enterprise-licensing/_index.md +++ b/docs/sources/administration/enterprise-licensing/_index.md @@ -196,6 +196,13 @@ The active users limit is turned off immediately. Settings updates at runtime are not affected by an expired license. +#### Email sharing + +External users can't access dashboards shared via email anymore. +These dashboards are now private but you can make them public and accessible to everyone if you want to. + +Grafana keeps your sharing configurations and restores them after you update your license. + ## Grafana Enterprise license restrictions When you become a Grafana Enterprise customer, you receive a license that governs your use of Grafana Enterprise. diff --git a/docs/sources/administration/provisioning/index.md b/docs/sources/administration/provisioning/index.md index 30468e993b5..0b6d76bc92c 100644 --- a/docs/sources/administration/provisioning/index.md +++ b/docs/sources/administration/provisioning/index.md @@ -15,7 +15,7 @@ weight: 600 # Provision Grafana -In previous versions of Grafana, you could only use the API for provisioning data sources and dashboards. But that required the service to be running before you started creating dashboards and you also needed to set up credentials for the HTTP API. In v5.0 we decided to improve this experience by adding a new active provisioning system that uses config files. This will make GitOps more natural as data sources and dashboards can be defined via files that can be version controlled. We hope to extend this system to later add support for users, orgs and alerts as well. +In previous versions of Grafana, you could only use the API for provisioning data sources and dashboards. But that required the service to be running before you started creating dashboards and you also needed to set up credentials for the HTTP API. In v5.0 we decided to improve this experience by adding a new active provisioning system that uses config files. This will make GitOps more natural as data sources and dashboards can be defined via files that can be version controlled. We hope to extend this system to later add support for users and orgs as well. ## Config File @@ -427,78 +427,6 @@ This feature doesn't currently allow you to create nested folder structures, tha For information on provisioning Grafana Alerting, refer to [Provision Grafana Alerting resources]({{< relref "../../alerting/set-up/provision-alerting-resources/" >}}). -## Alert Notification Channels - -{{% admonition type="note" %}} -Alert Notification Channels are part of legacy alerting, which is deprecated and will be removed in Grafana 10. Use the Provision contact points section in [Create and manage alerting resources using file provisioning]({{< relref "../../alerting/set-up/provision-alerting-resources/file-provisioning" >}}). -{{% /admonition %}} - -Alert Notification Channels can be provisioned by adding one or more YAML config files in the [`provisioning/notifiers`](/administration/configuration/#provisioning) directory. - -Each config file can contain the following top-level fields: - -- `notifiers`, a list of alert notifications that will be added or updated during start up. If the notification channel already exists, Grafana will update it to match the configuration file. -- `delete_notifiers`, a list of alert notifications to be deleted before inserting/updating those in the `notifiers` list. - -Provisioning looks up alert notifications by uid, and will update any existing notification with the provided uid. - -By default, exporting a dashboard as JSON will use a sequential identifier to refer to alert notifications. The field `uid` can be optionally specified to specify a string identifier for the alert name. - -```json -{ - ... - "alert": { - ..., - "conditions": [...], - "frequency": "24h", - "noDataState": "ok", - "notifications": [ - {"uid": "notifier1"}, - {"uid": "notifier2"}, - ] - } - ... -} -``` - -### Example Alert Notification Channels Config File - -```yaml -notifiers: - - name: notification-channel-1 - type: slack - uid: notifier1 - # either - org_id: 2 - # or - org_name: Main Org. - is_default: true - send_reminder: true - frequency: 1h - disable_resolve_message: false - # See `Supported Settings` section for settings supported for each - # alert notification type. - settings: - recipient: 'XXX' - uploadImage: true - token: 'xoxb' # legacy setting since Grafana v7.2 (stored non-encrypted) - url: https://slack.com # legacy setting since Grafana v7.2 (stored non-encrypted) - # Secure settings that will be encrypted in the database (supported since Grafana v7.2). See `Supported Settings` section for secure settings supported for each notifier. - secure_settings: - token: 'xoxb' - url: https://slack.com - -delete_notifiers: - - name: notification-channel-1 - uid: notifier1 - # either - org_id: 2 - # or - org_name: Main Org. - - name: notification-channel-2 - # default org_id: 1 -``` - ### Supported Settings The following sections detail the supported settings and secure settings for each alert notification type. Secure settings are stored encrypted in the database and you add them to `secure_settings` in the YAML file instead of `settings`. diff --git a/docs/sources/administration/roles-and-permissions/access-control/custom-role-actions-scopes/index.md b/docs/sources/administration/roles-and-permissions/access-control/custom-role-actions-scopes/index.md index 22da60ed029..3d2751e4009 100644 --- a/docs/sources/administration/roles-and-permissions/access-control/custom-role-actions-scopes/index.md +++ b/docs/sources/administration/roles-and-permissions/access-control/custom-role-actions-scopes/index.md @@ -29,140 +29,140 @@ To learn more about the Grafana resources to which you can apply RBAC, refer to The following list contains role-based access control actions. -| Action | Applicable scope | Description | -| ------------------------------------ | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `alert.instances.external:read` | `datasources:*`
`datasources:uid:*` | Read alerts and silences in data sources that support alerting. | -| `alert.instances.external:write` | `datasources:*`
`datasources:uid:*` | Manage alerts and silences in data sources that support alerting. | -| `alert.instances:create` | n/a | Create silences in the current organization. | -| `alert.instances:read` | n/a | Read alerts and silences in the current organization. | -| `alert.instances:write` | n/a | Update and expire silences in the current organization. | -| `alert.notifications.external:read` | `datasources:*`
`datasources:uid:*` | Read templates, contact points, notification policies, and mute timings in data sources that support alerting. | -| `alert.notifications.external:write` | `datasources:*`
`datasources:uid:*` | Manage templates, contact points, notification policies, and mute timings in data sources that support alerting. | -| `alert.notifications:write` | n/a | Manage templates, contact points, notification policies, and mute timings in the current organization. | -| `alert.notifications:read` | n/a | Read all templates, contact points, notification policies, and mute timings in the current organization. | -| `alert.rules.external:read` | `datasources:*`
`datasources:uid:*` | Read alert rules in data sources that support alerting (Prometheus, Mimir, and Loki) | -| `alert.rules.external:write` | `datasources:*`
`datasources:uid:*` | Create, update, and delete alert rules in data sources that support alerting (Mimir and Loki). | -| `alert.rules:create` | `folders:*`
`folders:uid:*` | Create Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. | -| `alert.rules:delete` | `folders:*`
`folders:uid:*` | Delete Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. | -| `alert.rules:read` | `folders:*`
`folders:uid:*` | Read Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. | -| `alert.rules:write` | `folders:*`
`folders:uid:*` | Update Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. | -| `alert.provisioning:read` | n/a | Read all Grafana alert rules, notification policies, etc via provisioning API. Permissions to folders and datasource are not required. | -| `alert.provisioning.secrets:read` | n/a | Same as `alert.provisioning:read` plus ability to export resources with decrypted secrets. | -| `alert.provisioning:write` | n/a | Update all Grafana alert rules, notification policies, etc via provisioning API. Permissions to folders and datasource are not required. | -| `annotations:create` | `annotations:*`
`annotations:type:*` | Create annotations. | -| `annotations:delete` | `annotations:*`
`annotations:type:*` | Delete annotations. | -| `annotations:read` | `annotations:*`
`annotations:type:*` | Read annotations and annotation tags. | -| `annotations:write` | `annotations:*`
`annotations:type:*` | Update annotations. | -| `apikeys:create` | n/a | Create API keys. | -| `apikeys:read` | `apikeys:*`
`apikeys:id:*` | Read API keys. | -| `apikeys:delete` | `apikeys:*`
`apikeys:id:*` | Delete API keys. | -| `dashboards:create` | `folders:*`
`folders:uid:*` | Create dashboards in one or more folders and their subfolders. | -| `dashboards:delete` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Delete one or more dashboards. | -| `dashboards.insights:read` | n/a | Read dashboard insights data and see presence indicators. | -| `dashboards.permissions:read` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Read permissions for one or more dashboards. | -| `dashboards.permissions:write` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Update permissions for one or more dashboards. | -| `dashboards:read` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Read one or more dashboards. | -| `dashboards:write` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Update one or more dashboards. | -| `dashboards.public:write` | `dashboards:*`
`dashboards:uid:*` | Write public dashboard configuration. | -| `datasources.caching:read` | `datasources:*`
`datasources:uid:*` | Read data source query caching settings. | -| `datasources.caching:write` | `datasources:*`
`datasources:uid:*` | Update data source query caching settings. | -| `datasources:create` | n/a | Create data sources. | -| `datasources:delete` | `datasources:*`
`datasources:uid:*` | Delete data sources. | -| `datasources:explore` | n/a | Enable access to the **Explore** tab. | -| `datasources.id:read` | `datasources:*`
`datasources:uid:*` | Read data source IDs. | -| `datasources.insights:read` | n/a | Read data sources insights data. | -| `datasources.permissions:read` | `datasources:*`
`datasources:uid:*` | List data source permissions. | -| `datasources.permissions:write` | `datasources:*`
`datasources:uid:*` | Update data source permissions. | -| `datasources:query` | `datasources:*`
`datasources:uid:*` | Query data sources. | -| `datasources:read` | `datasources:*`
`datasources:uid:*` | List data sources. | -| `datasources:write` | `datasources:*`
`datasources:uid:*` | Update data sources. | -| `featuremgmt.read` | n/a | Read feature toggles. | -| `featuremgmt.write` | n/a | Write feature toggles. | -| `folders.permissions:read` | `folders:*`
`folders:uid:*` | Read permissions for one or more folders and their subfolders. | -| `folders.permissions:write` | `folders:*`
`folders:uid:*` | Update permissions for one or more folders and their subfolders. | -| `folders:create` | n/a | Create folders in the root level. If granted together with `folders:write`, also allows creating subfolders under all folders that the user can update. | -| `folders:delete` | `folders:*`
`folders:uid:*` | Delete one or more folders and their subfolders. | -| `folders:read` | `folders:*`
`folders:uid:*` | Read one or more folders and their subfolders. | -| `folders:write` | `folders:*`
`folders:uid:*` | Update one or more folders and their subfolders. If granted together with `folders:create` permission, also allows creating subfolders under these folders. | -| `ldap.config:reload` | n/a | Reload the LDAP configuration. | -| `ldap.status:read` | n/a | Verify the availability of the LDAP server or servers. | -| `ldap.user:read` | n/a | Read users via LDAP. | -| `ldap.user:sync` | n/a | Sync users via LDAP. | -| `library.panels:create` | `folders:*`
`folders:uid:*` | Create a library panel in one or more folders and their subfolders. | -| `library.panels:read` | `folders:*`
`folders:uid:*`
`library.panels:*`
`library.panels:uid:*` | Read one or more library panels. | -| `library.panels:write` | `folders:*`
`folders:uid:*`
`library.panels:*`
`library.panels:uid:*` | Update one or more library panels. | -| `library.panels:delete` | `folders:*`
`folders:uid:*`
`library.panels:*`
`library.panels:uid:*` | Delete one or more library panels. | -| `licensing.reports:read` | n/a | Get custom permission reports. | -| `licensing:delete` | n/a | Delete the license token. | -| `licensing:read` | n/a | Read licensing information. | -| `licensing:write` | n/a | Update the license token. | -| `org.users:write` | `users:*`
`users:id:*` | Update the organization role (`Viewer`, `Editor`, or `Admin`) of a user. | -| `org.users:add` | `users:*`
`users:id:*` | Add a user to an organization or invite a new user to an organization. | -| `org.users:read` | `users:*`
`users:id:*` | Get user profiles within an organization. | -| `org.users:remove` | `users:*`
`users:id:*` | Remove a user from an organization. | -| `orgs.preferences:read` | n/a | Read organization preferences. | -| `orgs.preferences:write` | n/a | Update organization preferences. | -| `orgs.quotas:read` | n/a | Read organization quotas. | -| `orgs.quotas:write` | n/a | Update organization quotas. | -| `orgs:create` | n/a | Create an organization. | -| `orgs:delete` | n/a | Delete one or more organizations. | -| `orgs:read` | n/a | Read one or more organizations. | -| `orgs:write` | n/a | Update one or more organizations. | -| `plugins.app:access` | `plugins:*`
`plugins:id:*` | Access one or more application plugins (still enforcing the organization role) | -| `plugins:install` | n/a | Install and uninstall plugins. | -| `plugins:write` | `plugins:*`
`plugins:id:*` | Edit settings for one or more plugins. | -| `provisioning:reload` | `provisioners:*` | Reload provisioning files. To find the exact scope for specific provisioner, see [Scope definitions]({{< relref "#scope-definitions" >}}). | -| `reports:create` | n/a | Create reports. | -| `reports:write` | `reports:*`
`reports:id:*` | Update reports. | -| `reports.settings:read` | n/a | Read report settings. | -| `reports.settings:write` | n/a | Update report settings. | -| `reports:delete` | `reports:*`
`reports:id:*` | Delete reports. | -| `reports:read` | `reports:*`
`reports:id:*` | List all available reports or get a specific report. | -| `reports:send` | `reports:*`
`reports:id:*` | Send a report email. | -| `roles:delete` | `permissions:type:delegate` | Delete a custom role. | -| `roles:read` | `roles:*`
`roles:uid:*` | List roles and read a specific with its permissions. | -| `roles:write` | `permissions:type:delegate` | Create or update a custom role. | -| `roles:write` | `permissions:type:escalate` | Reset basic roles to their default permissions. | -| `server.stats:read` | n/a | Read Grafana instance statistics. | -| `server.usagestats.report:read` | n/a | View usage statistics report. | -| `serviceaccounts:write` | `serviceaccounts:*` | Create Grafana service accounts. | -| `serviceaccounts:create` | n/a | Update Grafana service accounts. | -| `serviceaccounts:delete` | `serviceaccounts:*`
`serviceaccounts:id:*` | Delete Grafana service accounts. | -| `serviceaccounts:read` | `serviceaccounts:*`
`serviceaccounts:id:*` | Read Grafana service accounts. | -| `serviceaccounts.permissions:write` | `serviceaccounts:*`
`serviceaccounts:id:*` | Update Grafana service account permissions to control who can do what with the service account. | -| `serviceaccounts.permissions:read` | `serviceaccounts:*`
`serviceaccounts:id:*` | Read Grafana service account permissions to see who can do what with the service account. | -| `settings:read` | `settings:*`
`settings:auth.saml:*`
`settings:auth.saml:enabled` (property level) | Read the [Grafana configuration settings]({{< relref "../../../../setup-grafana/configure-grafana/" >}}) | -| `settings:write` | `settings:*`
`settings:auth.saml:*`
`settings:auth.saml:enabled` (property level) | Update any Grafana configuration settings that can be [updated at runtime]({{< relref "../../../../setup-grafana/configure-grafana/settings-updates-at-runtime" >}}). | -| `support.bundles:create` | n/a | Create support bundles. | -| `support.bundles:delete` | n/a | Delete support bundles. | -| `support.bundles:read` | n/a | List and download support bundles. | -| `status:accesscontrol` | `services:accesscontrol` | Get access-control enabled status. | -| `teams.permissions:read` | `teams:*`
`teams:id:*` | Read members and Team Sync setup for teams. | -| `teams.permissions:write` | `teams:*`
`teams:id:*` | Add, remove and update members and manage Team Sync setup for teams. | -| `teams.roles:add` | `permissions:type:delegate` | Assign a role to a team. | -| `teams.roles:read` | `teams:*`
`teams:id:*` | List roles assigned directly to a team. | -| `teams.roles:remove` | `permissions:type:delegate` | Unassign a role from a team. | -| `teams:create` | n/a | Create teams. | -| `teams:delete` | `teams:*`
`teams:id:*` | Delete one or more teams. | -| `teams:read` | `teams:*`
`teams:id:*` | Read one or more teams and team preferences. | -| `teams:write` | `teams:*`
`teams:id:*` | Update one or more teams and team preferences. | -| `users.authtoken:read` | `global.users:*`
`global.users:id:*` | List authentication tokens that are assigned to a user. | -| `users.authtoken:write` | `global.users:*`
`global.users:id:*` | Update authentication tokens that are assigned to a user. | -| `users.password:write` | `global.users:*`
`global.users:id:*` | Update a user’s password. | -| `users.permissions:read` | `users:*` | List permissions of a user. | -| `users.permissions:write` | `global.users:*`
`global.users:id:*` | Update a user’s organization-level permissions. | -| `users.quotas:read` | `global.users:*`
`global.users:id:*` | List a user’s quotas. | -| `users.quotas:write` | `global.users:*`
`global.users:id:*` | Update a user’s quotas. | -| `users.roles:add` | `permissions:type:delegate` | Assign a role to a user or a service account. | -| `users.roles:read` | `users:*` | List roles assigned directly to a user or a service account. | -| `users.roles:remove` | `permissions:type:delegate` | Unassign a role from a user or a service account. | -| `users:create` | n/a | Create a user. | -| `users:delete` | `global.users:*`
`global.users:id:*` | Delete a user. | -| `users:disable` | `global.users:*`
`global.users:id:*` | Disable a user. | -| `users:enable` | `global.users:*`
`global.users:id:*` | Enable a user. | -| `users:logout` | `global.users:*`
`global.users:id:*` | Sign out a user. | -| `users:read` | `global.users:*` | Read or search user profiles. | -| `users:write` | `global.users:*`
`global.users:id:*` | Update a user’s profile. | +| Action | Applicable scope | Description | +| ------------------------------------ | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `alert.instances.external:read` | `datasources:*`
`datasources:uid:*` | Read alerts and silences in data sources that support alerting. | +| `alert.instances.external:write` | `datasources:*`
`datasources:uid:*` | Manage alerts and silences in data sources that support alerting. | +| `alert.instances:create` | n/a | Create silences in the current organization. | +| `alert.instances:read` | n/a | Read alerts and silences in the current organization. | +| `alert.instances:write` | n/a | Update and expire silences in the current organization. | +| `alert.notifications.external:read` | `datasources:*`
`datasources:uid:*` | Read templates, contact points, notification policies, and mute timings in data sources that support alerting. | +| `alert.notifications.external:write` | `datasources:*`
`datasources:uid:*` | Manage templates, contact points, notification policies, and mute timings in data sources that support alerting. | +| `alert.notifications:write` | n/a | Manage templates, contact points, notification policies, and mute timings in the current organization. | +| `alert.notifications:read` | n/a | Read all templates, contact points, notification policies, and mute timings in the current organization. | +| `alert.rules.external:read` | `datasources:*`
`datasources:uid:*` | Read alert rules in data sources that support alerting (Prometheus, Mimir, and Loki) | +| `alert.rules.external:write` | `datasources:*`
`datasources:uid:*` | Create, update, and delete alert rules in data sources that support alerting (Mimir and Loki). | +| `alert.rules:create` | `folders:*`
`folders:uid:*` | Create Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. | +| `alert.rules:delete` | `folders:*`
`folders:uid:*` | Delete Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. | +| `alert.rules:read` | `folders:*`
`folders:uid:*` | Read Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. | +| `alert.rules:write` | `folders:*`
`folders:uid:*` | Update Grafana alert rules in a folder and its subfolders. Combine this permission with `folders:read` in a scope that includes the folder and `datasources:query` in the scope of data sources the user can query. | +| `alert.provisioning:read` | n/a | Read all Grafana alert rules, notification policies, etc via provisioning API. Permissions to folders and datasource are not required. | +| `alert.provisioning.secrets:read` | n/a | Same as `alert.provisioning:read` plus ability to export resources with decrypted secrets. | +| `alert.provisioning:write` | n/a | Update all Grafana alert rules, notification policies, etc via provisioning API. Permissions to folders and datasource are not required. | +| `annotations:create` | `annotations:*`
`annotations:type:*` | Create annotations. | +| `annotations:delete` | `annotations:*`
`annotations:type:*` | Delete annotations. | +| `annotations:read` | `annotations:*`
`annotations:type:*` | Read annotations and annotation tags. | +| `annotations:write` | `annotations:*`
`annotations:type:*` | Update annotations. | +| `apikeys:create` | n/a | Create API keys. | +| `apikeys:read` | `apikeys:*`
`apikeys:id:*` | Read API keys. | +| `apikeys:delete` | `apikeys:*`
`apikeys:id:*` | Delete API keys. | +| `dashboards:create` | `folders:*`
`folders:uid:*` | Create dashboards in one or more folders and their subfolders. | +| `dashboards:delete` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Delete one or more dashboards. | +| `dashboards.insights:read` | n/a | Read dashboard insights data and see presence indicators. | +| `dashboards.permissions:read` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Read permissions for one or more dashboards. | +| `dashboards.permissions:write` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Update permissions for one or more dashboards. | +| `dashboards:read` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Read one or more dashboards. | +| `dashboards:write` | `dashboards:*`
`dashboards:uid:*`
`folders:*`
`folders:uid:*` | Update one or more dashboards. | +| `dashboards.public:write` | `dashboards:*`
`dashboards:uid:*` | Write public dashboard configuration. | +| `datasources.caching:read` | `datasources:*`
`datasources:uid:*` | Read data source query caching settings. | +| `datasources.caching:write` | `datasources:*`
`datasources:uid:*` | Update data source query caching settings. | +| `datasources:create` | n/a | Create data sources. | +| `datasources:delete` | `datasources:*`
`datasources:uid:*` | Delete data sources. | +| `datasources:explore` | n/a | Enable access to the **Explore** tab. | +| `datasources.id:read` | `datasources:*`
`datasources:uid:*` | Read data source IDs. | +| `datasources.insights:read` | n/a | Read data sources insights data. | +| `datasources.permissions:read` | `datasources:*`
`datasources:uid:*` | List data source permissions. | +| `datasources.permissions:write` | `datasources:*`
`datasources:uid:*` | Update data source permissions. | +| `datasources:query` | `datasources:*`
`datasources:uid:*` | Query data sources. | +| `datasources:read` | `datasources:*`
`datasources:uid:*` | List data sources. | +| `datasources:write` | `datasources:*`
`datasources:uid:*` | Update data sources. | +| `featuremgmt.read` | n/a | Read feature toggles. | +| `featuremgmt.write` | n/a | Write feature toggles. | +| `folders.permissions:read` | `folders:*`
`folders:uid:*` | Read permissions for one or more folders and their subfolders. | +| `folders.permissions:write` | `folders:*`
`folders:uid:*` | Update permissions for one or more folders and their subfolders. | +| `folders:create` | n/a | Create folders in the root level. If granted together with `folders:write`, also allows creating subfolders under all folders that the user can update. | +| `folders:delete` | `folders:*`
`folders:uid:*` | Delete one or more folders and their subfolders. | +| `folders:read` | `folders:*`
`folders:uid:*` | Read one or more folders and their subfolders. | +| `folders:write` | `folders:*`
`folders:uid:*` | Update one or more folders and their subfolders. If granted together with `folders:create` permission, also allows creating subfolders under these folders. | +| `ldap.config:reload` | n/a | Reload the LDAP configuration. | +| `ldap.status:read` | n/a | Verify the availability of the LDAP server or servers. | +| `ldap.user:read` | n/a | Read users via LDAP. | +| `ldap.user:sync` | n/a | Sync users via LDAP. | +| `library.panels:create` | `folders:*`
`folders:uid:*` | Create a library panel in one or more folders and their subfolders. | +| `library.panels:read` | `folders:*`
`folders:uid:*`
`library.panels:*`
`library.panels:uid:*` | Read one or more library panels. | +| `library.panels:write` | `folders:*`
`folders:uid:*`
`library.panels:*`
`library.panels:uid:*` | Update one or more library panels. | +| `library.panels:delete` | `folders:*`
`folders:uid:*`
`library.panels:*`
`library.panels:uid:*` | Delete one or more library panels. | +| `licensing.reports:read` | n/a | Get custom permission reports. | +| `licensing:delete` | n/a | Delete the license token. | +| `licensing:read` | n/a | Read licensing information. | +| `licensing:write` | n/a | Update the license token. | +| `org.users:write` | `users:*`
`users:id:*` | Update the organization role (`Viewer`, `Editor`, or `Admin`) of a user. | +| `org.users:add` | `users:*`
`users:id:*` | Add a user to an organization or invite a new user to an organization. | +| `org.users:read` | `users:*`
`users:id:*` | Get user profiles within an organization. | +| `org.users:remove` | `users:*`
`users:id:*` | Remove a user from an organization. | +| `orgs.preferences:read` | n/a | Read organization preferences. | +| `orgs.preferences:write` | n/a | Update organization preferences. | +| `orgs.quotas:read` | n/a | Read organization quotas. | +| `orgs.quotas:write` | n/a | Update organization quotas. | +| `orgs:create` | n/a | Create an organization. | +| `orgs:delete` | n/a | Delete one or more organizations. | +| `orgs:read` | n/a | Read one or more organizations. | +| `orgs:write` | n/a | Update one or more organizations. | +| `plugins.app:access` | `plugins:*`
`plugins:id:*` | Access one or more application plugins (still enforcing the organization role) | +| `plugins:install` | n/a | Install and uninstall plugins. | +| `plugins:write` | `plugins:*`
`plugins:id:*` | Edit settings for one or more plugins. | +| `provisioning:reload` | `provisioners:*` | Reload provisioning files. To find the exact scope for specific provisioner, see [Scope definitions]({{< relref "#scope-definitions" >}}). | +| `reports:create` | n/a | Create reports. | +| `reports:write` | `reports:*`
`reports:id:*` | Update reports. | +| `reports.settings:read` | n/a | Read report settings. | +| `reports.settings:write` | n/a | Update report settings. | +| `reports:delete` | `reports:*`
`reports:id:*` | Delete reports. | +| `reports:read` | `reports:*`
`reports:id:*` | List all available reports or get a specific report. | +| `reports:send` | `reports:*`
`reports:id:*` | Send a report email. | +| `roles:delete` | `permissions:type:delegate` | Delete a custom role. | +| `roles:read` | `roles:*`
`roles:uid:*` | List roles and read a specific role with its permissions. | +| `roles:write` | `permissions:type:delegate` | Create or update a custom role. | +| `roles:write` | `permissions:type:escalate` | Reset basic roles to their default permissions. | +| `server.stats:read` | n/a | Read Grafana instance statistics. | +| `server.usagestats.report:read` | n/a | View usage statistics report. | +| `serviceaccounts:write` | `serviceaccounts:*` | Create Grafana service accounts. | +| `serviceaccounts:create` | n/a | Update Grafana service accounts. | +| `serviceaccounts:delete` | `serviceaccounts:*`
`serviceaccounts:id:*` | Delete Grafana service accounts. | +| `serviceaccounts:read` | `serviceaccounts:*`
`serviceaccounts:id:*` | Read Grafana service accounts. | +| `serviceaccounts.permissions:write` | `serviceaccounts:*`
`serviceaccounts:id:*` | Update Grafana service account permissions to control who can do what with the service account. | +| `serviceaccounts.permissions:read` | `serviceaccounts:*`
`serviceaccounts:id:*` | Read Grafana service account permissions to see who can do what with the service account. | +| `settings:read` | `settings:*`
`settings:auth.saml:*`
`settings:auth.saml:enabled` (property level) | Read the [Grafana configuration settings]({{< relref "../../../../setup-grafana/configure-grafana/" >}}) | +| `settings:write` | `settings:*`
`settings:auth.saml:*`
`settings:auth.saml:enabled` (property level) | Update any Grafana configuration settings that can be [updated at runtime]({{< relref "../../../../setup-grafana/configure-grafana/settings-updates-at-runtime" >}}). | +| `support.bundles:create` | n/a | Create support bundles. | +| `support.bundles:delete` | n/a | Delete support bundles. | +| `support.bundles:read` | n/a | List and download support bundles. | +| `status:accesscontrol` | `services:accesscontrol` | Get access-control enabled status. | +| `teams.permissions:read` | `teams:*`
`teams:id:*` | Read members and Team Sync setup for teams. | +| `teams.permissions:write` | `teams:*`
`teams:id:*` | Add, remove and update members and manage Team Sync setup for teams. | +| `teams.roles:add` | `permissions:type:delegate` | Assign a role to a team. | +| `teams.roles:read` | `teams:*`
`teams:id:*` | List roles assigned directly to a team. | +| `teams.roles:remove` | `permissions:type:delegate` | Unassign a role from a team. | +| `teams:create` | n/a | Create teams. | +| `teams:delete` | `teams:*`
`teams:id:*` | Delete one or more teams. | +| `teams:read` | `teams:*`
`teams:id:*` | Read one or more teams and team preferences. To list teams through the UI one of the following permissions is required in addition to `teams:read`: `teams:write`, `teams.permissions:read` or `teams.permissions:write`. | +| `teams:write` | `teams:*`
`teams:id:*` | Update one or more teams and team preferences. | +| `users.authtoken:read` | `global.users:*`
`global.users:id:*` | List authentication tokens that are assigned to a user. | +| `users.authtoken:write` | `global.users:*`
`global.users:id:*` | Update authentication tokens that are assigned to a user. | +| `users.password:write` | `global.users:*`
`global.users:id:*` | Update a user’s password. | +| `users.permissions:read` | `users:*` | List permissions of a user. | +| `users.permissions:write` | `global.users:*`
`global.users:id:*` | Update a user’s organization-level permissions. | +| `users.quotas:read` | `global.users:*`
`global.users:id:*` | List a user’s quotas. | +| `users.quotas:write` | `global.users:*`
`global.users:id:*` | Update a user’s quotas. | +| `users.roles:add` | `permissions:type:delegate` | Assign a role to a user or a service account. | +| `users.roles:read` | `users:*` | List roles assigned directly to a user or a service account. | +| `users.roles:remove` | `permissions:type:delegate` | Unassign a role from a user or a service account. | +| `users:create` | n/a | Create a user. | +| `users:delete` | `global.users:*`
`global.users:id:*` | Delete a user. | +| `users:disable` | `global.users:*`
`global.users:id:*` | Disable a user. | +| `users:enable` | `global.users:*`
`global.users:id:*` | Enable a user. | +| `users:logout` | `global.users:*`
`global.users:id:*` | Sign out a user. | +| `users:read` | `global.users:*` | Read or search user profiles. | +| `users:write` | `global.users:*`
`global.users:id:*` | Update a user’s profile. | ### Grafana OnCall action definitions (beta) diff --git a/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md b/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md index 232ed3b4818..05d1235169e 100644 --- a/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md +++ b/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md @@ -110,7 +110,7 @@ The following tables list permissions associated with basic and fixed roles. ### Alerting roles -If alerting is [enabled]({{< relref "../../../../alerting/set-up/migrating-alerts" >}}), you can use predefined roles to manage user access to alert rules, alert instances, and alert notification settings and create custom roles to limit user access to alert rules in a folder. +You can use predefined roles to manage user access to alert rules, alert instances, and alert notification settings and create custom roles to limit user access to alert rules in a folder. Access to Grafana alert rules is an intersection of many permissions: diff --git a/docs/sources/alerting/_index.md b/docs/sources/alerting/_index.md index 6d0c0f1a627..65a53f84077 100644 --- a/docs/sources/alerting/_index.md +++ b/docs/sources/alerting/_index.md @@ -1,8 +1,8 @@ --- aliases: - - about-alerting/ - - ./unified-alerting/alerting/ - - ./alerting/unified-alerting/ + - about-alerting/ # /docs/grafana//about-alerting + - ./unified-alerting/alerting/ # /docs/grafana//unified-alerting/alerting/ + - ./alerting/unified-alerting/ # /docs/grafana//alerting/unified-alerting/ canonical: https://grafana.com/docs/grafana/latest/alerting/ description: Learn about the key benefits and features of Grafana Alerting labels: @@ -10,91 +10,57 @@ labels: - cloud - enterprise - oss -title: Alerting +menuTitle: Alerting +title: Grafana Alerting weight: 114 +hero: + title: Grafana Alerting + level: 1 + image: /media/docs/alerting/alerting-bell-icon.png + width: 100 + height: 100 + description: Grafana Alerting allows you to learn about problems in your systems moments after they occur. +cards: + title_class: pt-0 lh-1 + items: + - title: Introduction + href: ./fundamentals/ + description: Learn more about the fundamentals and available features that help you create, manage, and respond to alerts; and improve your team’s ability to resolve issues quickly. + height: 24 + - title: Set up + href: ./set-up/ + description: Set up your implementation of Grafana Alerting. + height: 24 + - title: Configure alert rules + href: ./alerting-rules/ + description: Create, manage, view, and adjust alert rules to alert on your metrics data or log entries from multiple data sources — no matter where your data is stored. + height: 24 + - title: Configure notifications + href: ./configure-notifications/ + description: Choose how, when, and where to send your alert notifications. + height: 24 + - title: Detect and respond + href: ./manage-notifications/ + description: Monitor, respond to, and triage issues within your services. + height: 24 + - title: Monitor + href: ./monitor/ + description: Monitor your alerting metrics to ensure you identify potential issues before they become critical. + height: 24 --- -# Alerting +{{< docs/hero-simple key="hero" >}} -Grafana Alerting allows you to learn about problems in your systems moments after they occur. +--- + +## Overview -Monitor your incoming metrics data or log entries and set up your Alerting system to watch for specific events or circumstances and then send notifications when those things are found. +Monitor your incoming metrics data or log entries and set up your Grafana Alerting system to watch for specific events or circumstances. In this way, you eliminate the need for manual monitoring and provide a first line of defense against system outages or changes that could turn into major incidents. Using Grafana Alerting, you create queries and expressions from multiple data sources — no matter where your data is stored — giving you the flexibility to combine your data and alert on your metrics and logs in new and unique ways. You can then create, manage, and take action on your alerts from a single, consolidated view, and improve your team’s ability to identify and resolve issues quickly. -Grafana Alerting is available for Grafana OSS, Grafana Enterprise, or Grafana Cloud. With Mimir and Loki alert rules you can run alert expressions closer to your data and at massive scale, all managed by the Grafana UI you are already familiar with. - -Watch this video to learn more about Grafana Alerting: {{< vimeo 720001629 >}} - -_Refer to [Manage your alert rules][alerting-rules] for current instructions._ - -## Key features and benefits - -**One page for all alerts** - -A single Grafana Alerting page consolidates both Grafana-managed alerts and alerts that reside in your Prometheus-compatible data source in one single place. - -**Multi-dimensional alerts** - -Alert rules can create multiple individual alert instances per alert rule, known as multi-dimensional alerts, giving you the power and flexibility to gain visibility into your entire system with just a single alert rule. You do this by adding labels to your query to specify which component is being monitored and generate multiple alert instances for a single alert rule. For example, if you want to monitor each server in a cluster, a multi-dimensional alert will alert on each CPU, whereas a standard alert will alert on the overall server. - -**Route alerts** - -Route each alert instance to a specific contact point based on labels you define. Notification policies are the set of rules for where, when, and how the alerts are routed to contact points. - -**Silence alerts** - -Silences stop notifications from getting created and last for only a specified window of time. -Silences allow you to stop receiving persistent notifications from one or more alert rules. You can also partially pause an alert based on certain criteria. Silences have their own dedicated section for better organization and visibility, so that you can scan your paused alert rules without cluttering the main alerting view. - -**Mute timings** - -A mute timing is a recurring interval of time when no new notifications for a policy are generated or sent. Use them to prevent alerts from firing a specific and reoccurring period, for example, a regular maintenance period. - -Similar to silences, mute timings do not prevent alert rules from being evaluated, nor do they stop alert instances from being shown in the user interface. They only prevent notifications from being created. - -## Design your Alerting system - -Monitoring complex IT systems and understanding whether everything is up and running correctly is a difficult task. Setting up an effective alert management system is therefore essential to inform you when things are going wrong before they start to impact your business outcomes. - -Designing and configuring an alert management set up that works takes time. - -Here are some tips on how to create an effective alert management set up for your business: - -**Which are the key metrics for your business that you want to monitor and alert on?** - -- Find events that are important to know about and not so trivial or frequent that recipients ignore them. - -- Alerts should only be created for big events that require immediate attention or intervention. - -- Consider quality over quantity. - -**Which type of Alerting do you want to use?** - -- Choose between Grafana-managed Alerting or Grafana Mimir or Loki-managed Alerting; or both. - -**How do you want to organize your alerts and notifications?** - -- Be selective about who you set to receive alerts. Consider sending them to whoever is on call or a specific Slack channel. -- Automate as far as possible using the Alerting API or alerts as code (Terraform). - -**How can you reduce alert fatigue?** - -- Avoid noisy, unnecessary alerts by using silences, mute timings, or pausing alert rule evaluation. -- Continually tune your alert rules to review effectiveness. Remove alert rules to avoid duplication or ineffective alerts. -- Think carefully about priority and severity levels. -- Continually review your thresholds and evaluation rules. - -## Useful links - -- [Introduction to Alerting][fundamentals] - -{{% docs/reference %}} -[alerting-rules]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules" -[alerting-rules]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules" +## Explore -[fundamentals]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals" -[fundamentals]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals" -{{% /docs/reference %}} +{{< card-grid key="cards" type="simple" >}} diff --git a/docs/sources/alerting/alerting-rules/_index.md b/docs/sources/alerting/alerting-rules/_index.md index 3063d36929a..d4ab108d9e1 100644 --- a/docs/sources/alerting/alerting-rules/_index.md +++ b/docs/sources/alerting/alerting-rules/_index.md @@ -1,58 +1,48 @@ --- aliases: - - old-alerting/create-alerts/ - - rules/ - - unified-alerting/alerting-rules/ - - ./create-alerts/ + - rules/ # /docs/grafana//alerting/rules/ + - unified-alerting/alerting-rules/ # /docs/grafana//alerting/unified-alerting/alerting-rules/ + - ./create-alerts/ # /docs/grafana//alerting/create-alerts/ canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/ -description: Configure the features and integrations you need to create and manage your alerts +description: Configure alert rules labels: products: - cloud - enterprise - oss -menuTitle: Configure -title: Configure Alerting +title: Configure alert rules weight: 120 --- -# Configure Alerting +# Configure alert rules -Configure the features and integrations that you need to create and manage your alerts. +An alert rule consists of one or more queries and expressions that select the data you want to measure. It also contains a condition, which is the threshold that an alert rule must meet or exceed in order to fire. -**Configure alert rules** +Create, manage, view, and adjust alert rules to alert on your metrics data or log entries from multiple data sources — no matter where your data is stored. -[Configure Grafana-managed alert rules][create-grafana-managed-rule]. +The main parts of alert rule creation are: -[Configure data source-managed alert rules][create-mimir-loki-managed-rule] +1. Select your data source +1. Query your data +1. Normalize your data +1. Set your threshold -**Configure recording rules** +**Query, expressions, and alert condition** -_Recording rules are only available for compatible Prometheus or Loki data sources._ +What are you monitoring? How are you measuring it? -For more information, see [Configure recording rules][create-mimir-loki-managed-recording-rule]. +{{< admonition type="note" >}} +Expressions can only be used for Grafana-managed alert rules. +{{< /admonition >}} -**Configure contact points** +**Evaluation** -For information on how to configure contact points, see [Configure contact points][manage-contact-points]. +How do you want your alert to be evaluated? -**Configure notification policies** +**Labels and notifications** -For information on how to configure notification policies, see [Configure notification policies][create-notification-policy]. +How do you want to route your alert? What kind of additional labels could you add to annotate your alert rules and ease searching? -{{% docs/reference %}} -[create-mimir-loki-managed-rule]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-mimir-loki-managed-rule" -[create-mimir-loki-managed-rule]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-mimir-loki-managed-rule" +**Annotations** -[create-mimir-loki-managed-recording-rule]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-mimir-loki-managed-recording-rule" -[create-mimir-loki-managed-recording-rule]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-mimir-loki-managed-recording-rule" - -[create-grafana-managed-rule]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-grafana-managed-rule" -[create-grafana-managed-rule]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-grafana-managed-rule" - -[manage-contact-points]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/manage-contact-points" -[manage-contact-points]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/manage-contact-points" - -[create-notification-policy]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-notification-policy" -[create-notification-policy]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-notification-policy" -{{% /docs/reference %}} +Do you want to add more context on the alert in your notification messages, for example, what caused the alert to fire? Which server did it happen on? 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 ae03719e210..134d90616b1 100644 --- a/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md +++ b/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md @@ -1,6 +1,6 @@ --- aliases: - - ../unified-alerting/alerting-rules/create-grafana-managed-rule/ + - ../unified-alerting/alerting-rules/create-grafana-managed-rule/ # /docs/grafana//alerting/unified-alerting/alerting-rules/create-grafana-managed-rule/ canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/create-grafana-managed-rule/ description: Configure Grafana-managed alert rules to create alerts that can act on data from any of our supported data sources keywords: @@ -38,8 +38,6 @@ Grafana managed alert rules can only be edited or deleted by users with Edit per If you delete an alerting resource created in the UI, you can no longer retrieve it. To make a backup of your configuration and to be able to restore deleted alerting resources, create your alerting resources using file provisioning, Terraform, or the Alerting API. -Watch this video to learn more about creating alert rules: {{< vimeo 720001934 >}} - In the following sections, we’ll guide you through the process of creating your Grafana-managed alert rules. To create a Grafana-managed alert rule, use the in-product alert creation flow and follow these steps to help you. @@ -80,10 +78,6 @@ Define a query to get the data you want to measure and a condition that needs to b. Click **Preview** to verify that the expression is successful. -{{% admonition type="note" %}} -The recovery threshold feature is currently only available in OSS. -{{% /admonition %}} - 1. To add a recovery threshold, turn the **Custom recovery threshold** toggle on and fill in a value for when your alert rule should stop firing. You can only add one recovery threshold in a query and it must be the alert condition. @@ -111,47 +105,17 @@ To do this, you need to make sure that your alert rule is in the right evaluatio 1. Turn on pause alert notifications, if required. - **Note**: - - Pause alert rule evaluation to prevent noisy alerting while tuning your alerts. Pausing stops alert rule evaluation and does not create any alert instances. This is different to mute timings, which stop notifications from being delivered, but still allow for alert rule evaluation and the creation of alert instances. - - You can pause alert rule evaluation to prevent noisy alerting while tuning your alerts. Pausing stops alert rule evaluation and does not create any alert instances. This is different to mute timings, which stop notifications from being delivered, but still allow for alert rule evaluation and the creation of alert instances. + {{< admonition type="note" >}} + You can pause alert rule evaluation to prevent noisy alerting while tuning your alerts. + Pausing stops alert rule evaluation and doesn't create any alert instances. + This is different to mute timings, which stop notifications from being delivered, but still allows for alert rule evaluation and the creation of alert instances. + {{< /admonition >}} 1. In **Configure no data and error handling**, configure alerting behavior in the absence of data. Use the guidelines in [No data and error handling](#configure-no-data-and-error-handling). -## Configure notifications - -{{< admonition type="note" >}} -To try out a simplified version of routing your alerts, enable the alertingSimplifiedRouting feature toggle and refer to the following section Configure notifications (simplified). -{{< /admonition >}} - -1. Add labels to your alert rules to set which notification policy should handle your firing alert instances. - - All alert rules and instances, irrespective of their labels, match the default notification policy. If there are no nested policies, or no nested policies match the labels in the alert rule or alert instance, then the default notification policy is the matching policy. - - Add labels if you want to change the way your notifications are routed. - - Add custom labels by selecting existing key-value pairs from the drop down, or add new labels by entering the new key or value. - -1. Preview your alert instance routing set up. - - Based on the labels added, alert instances are routed to the following notification policies displayed. - - Expand each notification policy below to view more details. - -1. Click See details to view alert routing details and an email preview. - -1. Click **Save rule**. - -## Configure notifications (simplified) - -{{< admonition type="note" >}} -To try this out, enable the alertingSimplifiedRouting feature toggle. - -This feature is currently not available for Grafana Cloud. -{{< /admonition >}} +## Configure labels and notifications In the **Labels** section, you can optionally choose whether to add labels to organize your alert rules, make searching easier, as well as set which notification policy should handle your firing alert instance. @@ -173,16 +137,16 @@ Complete the following steps to set up labels and notifications. 2. You can also optionally select a mute timing as well as groupings and timings to define when not to send notifications. - {{% admonition type="note" %}} - An auto-generated notification policy is generated. Only admins can view these auto-generated policies from the **Notification policies** list view. Any changes have to be made in the alert rules form. {{% /admonition %}} + {{< admonition type="note" >}} + An auto-generated notification policy is generated. Only admins can view these auto-generated policies from the **Notification policies** list view. Any changes have to be made in the alert rules form. {{< /admonition >}} **Use notification policy** 3. Choose this option to use the notification policy tree to direct your notifications. - {{% admonition type="note" %}} + {{< admonition type="note" >}} All alert rules and instances, irrespective of their labels, match the default notification policy. If there are no nested policies, or no nested policies match the labels in the alert rule or alert instance, then the default notification policy is the matching policy. - {{% /admonition %}} + {{< /admonition >}} 4. Preview your alert instance routing set up. @@ -231,7 +195,7 @@ For more information, see [expressions documentation][expression-queries]. To generate a separate alert for each series, create a multi-dimensional rule. Use `Math`, `Reduce`, or `Resample` expressions to create a multi-dimensional rule. For example: -- Add a `Reduce` expression for each query to aggregate values in the selected time range into a single value. (Not needed for [rules using numeric data][alerting-on-numeric-data]. +- Add a `Reduce` expression for each query to aggregate values in the selected time range into a single value. (Not needed for [rules using numeric data][alerting-on-numeric-data]). - Add a `Math` expression with the condition for the rule. Not needed in case a query or a reduce expression already returns 0 if rule should not fire, or a positive number if it should fire. Some examples: `$B > 70` if it should fire in case value of B query/expression is more than 70. `$B < $C * 100` in case it should fire if value of B is less than value of C multiplied by 100. If queries being compared have multiple series in their results, series from different queries are matched if they have the same labels or one is a subset of the other. ![Query section multi dimensional](/static/img/docs/alerting/unified/rule-edit-multi-8-0.png 'Query section multi dimensional screenshot') @@ -278,20 +242,20 @@ This will open the alert rule form, allowing you to configure and create your al {{% docs/reference %}} [add-a-query]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data#add-a-query" -[add-a-query]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/query-transform-data#add-a-query" +[add-a-query]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data#add-a-query" -[alerting-on-numeric-data]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/evaluate-grafana-alerts#alerting-on-numeric-data-1" -[alerting-on-numeric-data]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/evaluate-grafana-alerts#alerting-on-numeric-data-1" +[alerting-on-numeric-data]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/queries-conditions#alert-on-numeric-data" +[alerting-on-numeric-data]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/queries-conditions#alert-on-numeric-data" -[annotation-label]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/annotation-label" -[annotation-label]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/annotation-label" +[annotation-label]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/annotation-label" +[annotation-label]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/annotation-label" [expression-queries]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/expression-queries" -[expression-queries]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/query-transform-data/expression-queries" +[expression-queries]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/expression-queries" [fundamentals]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals" [fundamentals]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals" [time-units-and-relative-ranges]: "/docs/grafana/ -> /docs/grafana//dashboards/use-dashboards#time-units-and-relative-ranges" -[time-units-and-relative-ranges]: "/docs/grafana-cloud/ -> /docs/grafana//dashboards/use-dashboards#time-units-and-relative-ranges" +[time-units-and-relative-ranges]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/use-dashboards#time-units-and-relative-ranges" {{% /docs/reference %}} 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 bedc33a981b..494f92edda0 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 @@ -1,9 +1,9 @@ --- aliases: - - ../unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule/ - - ../unified-alerting/alerting-rules/create-mimir-loki-managed-recording-rule/ + - ../unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule/ # /docs/grafana//alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule/ + - ../unified-alerting/alerting-rules/create-mimir-loki-managed-recording-rule/ # /docs/grafana//alerting/unified-alerting/alerting-rules/create-mimir-loki-managed-recording-rule/ canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/create-mimir-loki-managed-recording-rule/ -description: Configure recording rules for an external Grafana Mimir or Loki instance +description: Create recording rules for an external Grafana Mimir or Loki instance keywords: - grafana - alerting @@ -16,13 +16,16 @@ labels: - cloud - enterprise - oss -title: Configure recording rules +title: Create recording rules weight: 300 --- -# Configure recording rules +# Create recording rules -You can create and manage recording rules for an external Grafana Mimir or Loki instance. Recording rules calculate frequently needed expressions or computationally expensive expressions in advance and save the result as a new set of time series. Querying this new time series is faster, especially for dashboards since they query the same expression every time the dashboards refresh. +You can create and manage recording rules for an external Grafana Mimir or Loki instance. +Recording rules calculate frequently needed expressions or computationally expensive expressions in advance and save the result as a new set of time series. Querying this new time series is faster, especially for dashboards since they query the same expression every time the dashboards refresh. + +For more information on recording rules in Prometheus, refer to [Defining recording rules in Prometheus](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/). **Note:** @@ -48,13 +51,14 @@ To create recording rules, follow these steps. 1. Click **Alerts & IRM** -> **Alerting** -> **Alert rules**. -1. Click **New recording rule**. +1. Select **Rule type** -> **Recording**. +1. Click **+New recording rule**. -1. Set rule name. +1. Enter recording rule name. The recording rule name must be a Prometheus metric name and contain no whitespace. -1. Define query. +1. Define recording rule. - Select your Loki or Prometheus data source. - Enter a query. 1. Add namespace and group. @@ -65,9 +69,8 @@ To create recording rules, follow these steps. 1. Click **Save rule** to save the rule or **Save rule and exit** to save the rule and go back to the Alerting page. {{% docs/reference %}} -[annotation-label]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/annotation-label" -[annotation-label]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/annotation-label" +[annotation-label]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/annotation-label" +[annotation-label]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/annotation-label" -[configure-grafana]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-grafana" -[configure-grafana]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-grafana" +[configure-grafana]: "/docs/ -> /docs/grafana//setup-grafana/configure-grafana" {{% /docs/reference %}} 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 ee27bbde454..0abd6c5550b 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 @@ -1,8 +1,8 @@ --- aliases: - - ../unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule/ - - ../unified-alerting/alerting-rules/create-mimir-loki-managed-recording-rule/ - - ../unified-alerting/alerting-rules/create-mimir-loki-managed-rule/ + - ../unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule/ # /docs/grafana//alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule/ + - ../unified-alerting/alerting-rules/create-mimir-loki-managed-recording-rule/ # /docs/grafana//alerting/unified-alerting/alerting-rules/create-mimir-loki-managed-recording-rule/ + - ../unified-alerting/alerting-rules/create-mimir-loki-managed-rule/ # /docs/grafana//alerting/unified-alerting/alerting-rules/create-mimir-loki-managed-rule/ canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/create-mimir-loki-managed-rule/ description: Configure data source-managed alert rules alert for an external Grafana Mimir or Loki instance keywords: @@ -129,6 +129,6 @@ Annotations add metadata to provide more information on the alert in your alert [alerting]: "/docs/grafana/ -> /docs/grafana//alerting" [alerting]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting" -[annotation-label]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/annotation-label" -[annotation-label]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/annotation-label" +[annotation-label]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/annotation-label" +[annotation-label]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/annotation-label" {{% /docs/reference %}} diff --git a/docs/sources/alerting/alerting-rules/manage-contact-points/_index.md b/docs/sources/alerting/alerting-rules/manage-contact-points/_index.md deleted file mode 100644 index 186c487914b..00000000000 --- a/docs/sources/alerting/alerting-rules/manage-contact-points/_index.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -aliases: - - ../contact-points/ # /docs/grafana//alerting/contact-points/ - - ../contact-points/create-contact-point/ # /docs/grafana//alerting/contact-points/create-contact-point/ - - ../contact-points/delete-contact-point/ # /docs/grafana//alerting/contact-points/delete-contact-point/ - - ../contact-points/edit-contact-point/ # /docs/grafana//alerting/contact-points/edit-contact-point/ - - ../contact-points/test-contact-point/ # /docs/grafana//alerting/contact-points/test-contact-point/ - - ../manage-notifications/manage-contact-points/ # /docs/grafana//alerting/manage-notifications/manage-contact-points/ - - create-contact-point/ # /docs/grafana//alerting/alerting-rules/create-contact-point/ -canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/manage-contact-points/ -description: Configure contact points to define how your contacts are notified when an alert rule fires -keywords: - - grafana - - alerting - - guide - - contact point - - templating -labels: - products: - - cloud - - enterprise - - oss -title: Configure contact points -weight: 410 ---- - -# Configure contact points - -Use contact points to define how your contacts are notified when an alert rule fires. You can add, edit, delete, and test a contact point. - -## Add a contact point - -Complete the following steps to add a contact point. - -1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. -1. Click **Contact points**. -1. From the **Choose Alertmanager** dropdown, select an Alertmanager. By default, **Grafana Alertmanager** is selected. -1. On the **Contact Points** tab, click **+ Add contact point**. -1. Enter a descriptive name for the contact point. -1. From **Integration**, select a type and fill out mandatory fields. For example, if you choose email, enter the email addresses. Or if you choose Slack, enter the Slack channel(s) and users who should be contacted. -1. Some contact point integrations, like email or webhook, have optional settings. In **Optional settings**, specify additional settings for the selected contact point integration. -1. In Notification settings, optionally select **Disable resolved message** if you do not want to be notified when an alert resolves. -1. To add another contact point integration, click **Add contact point integration** and repeat steps 6 through 8. -1. Save your changes. - -## Edit a contact point - -Complete the following steps to edit a contact point. - -1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. -1. Click **Contact points** to view a list of existing contact points. -1. On the **Contact Points** tab, find the contact point you want to edit, and then click **Edit**. -1. Update the contact point and save your changes. - -## Delete a contact point - -Complete the following steps to delete a contact point. - -1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. -1. Click **Contact points** to view a list of existing contact points. -1. On the **Contact Points** tab, find the contact point you want to delete, and then click **More** -> **Delete**. -1. In the confirmation dialog, click **Yes, delete**. - -{{% admonition type="note" %}} -You cannot delete contact points that are in use by a notification policy. Either delete the notification policy or update it to use another contact point. -{{% /admonition %}} - -## Test a contact point - -Complete the following steps to test a contact point. - -1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. -1. Click **Contact points** to view a list of existing contact points. -1. On the **Contact Points** tab, find the contact point you want to test, then click **Edit**. You can also create a new contact point if needed. -1. Click **Test** to open the contact point testing modal. -1. Choose whether to send a predefined test notification or choose custom to add your own custom annotations and labels to include in the notification. -1. Click **Send test notification** to fire the alert. diff --git a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/_index.md b/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/_index.md deleted file mode 100644 index dfd1efd3c6d..00000000000 --- a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/_index.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -aliases: - - alerting/manage-notifications/manage-contact-points/configure-integrations/ -canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/manage-contact-points/integrations/ -description: Configure contact point integrations to select your preferred communication channels for receiving notifications of firing alerts. -keywords: - - Grafana - - alerting - - guide - - notifications - - integrations - - contact points -labels: - products: - - cloud - - enterprise - - oss -title: Configure contact point integrations -weight: 100 ---- - -# Configure contact point integrations - -Configure contact point integrations in Grafana to select your preferred communication channel for receiving notifications when your alert rules are firing. Each integration has its own configuration options and setup process. In most cases, this involves providing an API key or a Webhook URL. - -Once configured, you can use integrations as part of your contact points to receive notifications whenever your alert changes its state. In this section, we'll cover the basic steps to configure your integrations, so you can start receiving real-time alerts and stay on top of your monitoring data. - -## List of supported integrations - -| Name | Type | -| ----------------------- | ------------------------- | -| DingDing | `dingding` | -| Discord | `discord` | -| Email | `email` | -| Google Chat | `googlechat` | -| Hipchat | `hipchat` | -| Kafka | `kafka` | -| Line | `line` | -| Microsoft Teams | `teams` | -| Opsgenie | `opsgenie` | -| Pagerduty | `pagerduty` | -| Prometheus Alertmanager | `prometheus-alertmanager` | -| Pushover | `pushover` | -| Sensu | `sensu` | -| Sensu Go | `sensugo` | -| Slack | `slack` | -| Telegram | `telegram` | -| Threema | `threema` | -| VictorOps | `victorops` | -| Webhook | `webhook` | diff --git a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/pager-duty.md b/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/pager-duty.md deleted file mode 100644 index da79c613ebb..00000000000 --- a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/pager-duty.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/manage-contact-points/integrations/pager-duty/ -description: Configure the PagerDuty integration for Alerting -keywords: - - grafana - - alerting - - pagerduty -labels: - products: - - cloud - - enterprise - - oss -menuTitle: PagerDuty -title: Configure PagerDuty for Alerting -weight: 400 ---- - -# Configure PagerDuty for Alerting - -To set up PagerDuty, provide an integration key. - -| Setting | Description | -| --------------- | ------------------------------------------------------ | -| Integration Key | Integration key for PagerDuty | -| Severity | Level for dynamic notifications, default is `critical` | -| Custom Details | Additional details about the event | - -The `CustomDetails` field is an object containing arbitrary key-value pairs. The user-defined details are merged with the ones we use by default. - -Our default values for `CustomDetails` are: - -```go -{ - "firing": `{{ template "__text_alert_list" .Alerts.Firing }}`, - "resolved": `{{ template "__text_alert_list" .Alerts.Resolved }}`, - "num_firing": `{{ .Alerts.Firing | len }}`, - "num_resolved": `{{ .Alerts.Resolved | len }}`, -} -``` - -In case of duplicate keys, the user-defined details overwrite the default ones. diff --git a/docs/sources/alerting/alerting-rules/templating-labels-annotations.md b/docs/sources/alerting/alerting-rules/templating-labels-annotations.md new file mode 100644 index 00000000000..5177d6dad6f --- /dev/null +++ b/docs/sources/alerting/alerting-rules/templating-labels-annotations.md @@ -0,0 +1,453 @@ +--- +aliases: + - ../fundamentals/annotation-label/variables-label-annotation/ # /docs/grafana//alerting/fundamentals/annotation-label/variables-label-annotation/ +canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/templating-labels-annotations/ +description: Learn about how to template labels and annotations +keywords: + - grafana + - alerting + - templating + - labels + - annotations +labels: + products: + - cloud + - enterprise + - oss +title: Template labels and annotations +weight: 500 +--- + +# Template labels and annotations + +You can use templates to include data from queries and expressions in labels and annotations. For example, you might want to set the severity label for an alert based on the value of the query, or use the instance label from the query in a summary annotation so you know which server is experiencing high CPU usage. + +When using custom labels with templates it is important to make sure that the label value does not change between consecutive evaluations of the alert rule as this will end up creating large numbers of distinct alerts. However, it is OK for the template to produce different label values for different alerts. For example, do not put the value of the query in a custom label as this will end up creating a new set of alerts each time the value changes. Instead use annotations. + +All templates should be written in [text/template](https://pkg.go.dev/text/template). Regardless of whether you are templating a label or an annotation, you should write each template inline inside the label or annotation that you are templating. This means you cannot share templates between labels and annotations, and instead you will need to copy templates wherever you want to use them. + +Each template is evaluated whenever the alert rule is evaluated, and is evaluated for every alert separately. For example, if your alert rule has a templated summary annotation, and the alert rule has 10 firing alerts, then the template will be executed 10 times, once for each alert. You should try to avoid doing expensive computations in your templates as much as possible. + +## Examples + +Rather than write a complete tutorial on text/template, the following examples attempt to show the most common use-cases we have seen for templates. You can use these examples verbatim, or adapt them as necessary for your use case. For more information on how to write text/template refer to the [text/template](https://pkg.go.dev/text/template) documentation. + +### Print all labels, comma separated + +To print all labels, comma separated, print the `$labels` variable: + +``` +{{ $labels }} +``` + +For example, given an alert with the labels `alertname=High CPU usage`, `grafana_folder=CPU alerts` and `instance=server1`, this would print: + +``` +alertname=High CPU usage, grafana_folder=CPU alerts, instance=server1 +``` + +> If you are using classic conditions then `$labels` will not contain any labels from the query. Refer to [the $labels variable](#the-labels-variable) for more information. + +### Print all labels, one per line + +To print all labels, one per line, use a `range` to iterate over each key/value pair and print them individually. Here `$k` refers to the name and `$v` refers to the value of the current label: + +``` +{{ range $k, $v := $labels -}} +{{ $k }}={{ $v }} +{{ end }} +``` + +For example, given an alert with the labels `alertname=High CPU usage`, `grafana_folder=CPU alerts` and `instance=server1`, this would print: + +``` +alertname=High CPU usage +grafana_folder=CPU alerts +instance=server1 +``` + +> If you are using classic conditions then `$labels` will not contain any labels from the query. Refer to [the $labels variable](#the-labels-variable) for more information. + +### Print an individual label + +To print an individual label use the `index` function with the `$labels` variable: + +``` +The host {{ index $labels "instance" }} has exceeded 80% CPU usage for the last 5 minutes +``` + +For example, given an alert with the labels `instance=server1`, this would print: + +``` +The host server1 has exceeded 80% CPU usage for the last 5 minutes +``` + +> If you are using classic conditions then `$labels` will not contain any labels from the query. Refer to [the $labels variable](#the-labels-variable) for more information. + +### Print the value of a query + +To print the value of an instant query you can print its Ref ID using the `index` function and the `$values` variable: + +``` +{{ index $values "A" }} +``` + +For example, given an instant query that returns the value 81.2345, this will print: + +``` +81.2345 +``` + +To print the value of a range query you must first reduce it from a time series to an instant vector with a reduce expression. You can then print the result of the reduce expression by using its Ref ID instead. For example, if the reduce expression takes the average of A and has the Ref ID B you would write: + +``` +{{ index $values "B" }} +``` + +### Print the humanized value of a query + +To print the humanized value of an instant query use the `humanize` function: + +``` +{{ humanize (index $values "A").Value }} +``` + +For example, given an instant query that returns the value 81.2345, this will print: + +``` +81.234 +``` + +To print the humanized value of a range query you must first reduce it from a time series to an instant vector with a reduce expression. You can then print the result of the reduce expression by using its Ref ID instead. For example, if the reduce expression takes the average of A and has the Ref ID B you would write: + +``` +{{ humanize (index $values "B").Value }} +``` + +### Print the value of a query as a percentage + +To print the value of an instant query as a percentage use the `humanizePercentage` function: + +``` +{{ humanizePercentage (index $values "A").Value }} +``` + +This function expects the value to be a decimal number between 0 and 1. If the value is instead a decimal number between 0 and 100 you can either divide it by 100 in your query or using a math expression. If the query is a range query you must first reduce it from a time series to an instant vector with a reduce expression. + +### Set a severity from the value of a query + +To set a severity label from the value of a query use an if statement and the greater than comparison function. Make sure to use decimals (`80.0`, `50.0`, `0.0`, etc) when doing comparisons against `$values` as text/template does not support type coercion. You can find a list of all the supported comparison functions [here](https://pkg.go.dev/text/template#hdr-Functions). + +``` +{{ if (gt $values.A.Value 80.0) -}} +high +{{ else if (gt $values.A.Value 50.0) -}} +medium +{{ else -}} +low +{{- end }} +``` + +### Print all labels from a classic condition + +You cannot use `$labels` to print labels from the query if you are using classic conditions, and must use `$values` instead. The reason for this is classic conditions discard these labels to enforce uni-dimensional behavior (at most one alert per alert rule). If classic conditions didn't discard these labels, then queries that returned many time series would cause alerts to flap between firing and resolved constantly as the labels would change every time the alert rule was evaluated. + +Instead, the `$values` variable contains the reduced values of all time series for all conditions that are firing. For example, if you have an alert rule with a query A that returns two time series, and a classic condition B with two conditions, then `$values` would contain `B0`, `B1`, `B2` and `B3`. If the classic condition B had just one condition, then `$values` would contain just `B0` and `B1`. + +To print all labels of all firing time series use the following template (make sure to replace `B` in the regular expression with the Ref ID of the classic condition if it's different): + +``` +{{ range $k, $v := $values -}} +{{ if (match "B[0-9]+" $k) -}} +{{ $k }}: {{ $v.Labels }}{{ end }} +{{ end }} +``` + +For example, a classic condition for two time series exceeding a single condition would print: + +``` +B0: instance=server1 +B1: instance=server2 +``` + +If the classic condition has two or more conditions, and a time series exceeds multiple conditions at the same time, then its labels will be duplicated for each condition that is exceeded: + +``` +B0: instance=server1 +B1: instance=server2 +B2: instance=server1 +B3: instance=server2 +``` + +If you need to print unique labels you should consider changing your alert rules from uni-dimensional to multi-dimensional instead. You can do this by replacing your classic condition with reduce and math expressions. + +### Print all values from a classic condition + +To print all values from a classic condition take the previous example and replace `$v.Labels` with `$v.Value`: + +``` +{{ range $k, $v := $values -}} +{{ if (match "B[0-9]+" $k) -}} +{{ $k }}: {{ $v.Value }}{{ end }} +{{ end }} +``` + +For example, a classic condition for two time series exceeding a single condition would print: + +``` +B0: 81.2345 +B1: 84.5678 +``` + +If the classic condition has two or more conditions, and a time series exceeds multiple conditions at the same time, then `$values` will contain the values of all conditions: + +``` +B0: 81.2345 +B1: 92.3456 +B2: 84.5678 +B3: 95.6789 +``` + +## Variables + +The following variables are available to you when templating labels and annotations: + +### The labels variable + +The `$labels` variable contains all labels from the query. For example, suppose you have a query that returns CPU usage for all of your servers, and you have an alert rule that fires when any of your servers have exceeded 80% CPU usage for the last 5 minutes. You want to add a summary annotation to the alert that tells you which server is experiencing high CPU usage. With the `$labels` variable you can write a template that prints a human-readable sentence such as: + +``` +CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes +``` + +> If you are using a classic condition then `$labels` will not contain any labels from the query. Classic conditions discard these labels in order to enforce uni-dimensional behavior (at most one alert per alert rule). If you want to use labels from the query in your template then use the example [here](#print-all-labels-from-a-classic-condition). + +### The value variable + +The `$value` variable is a string containing the labels and values of all instant queries; threshold, reduce and math expressions, and classic conditions in the alert rule. It does not contain the results of range queries, as these can return anywhere from 10s to 10,000s of rows or metrics. If it did, for especially large queries a single alert could use 10s of MBs of memory and Grafana would run out of memory very quickly. + +To print the `$value` variable in the summary you would write something like this: + +``` +CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ $value }} +``` + +And would look something like this: + +``` +CPU usage for instance1 has exceeded 80% for the last 5 minutes: [ var='A' labels={instance=instance1} value=81.234 ] +``` + +Here `var='A'` refers to the instant query with Ref ID A, `labels={instance=instance1}` refers to the labels, and `value=81.234` refers to the average CPU usage over the last 5 minutes. + +If you want to print just some of the string instead of the full string then use the `$values` variable. It contains the same information as `$value`, but in a structured table, and is much easier to use then writing a regular expression to match just the text you want. + +### The values variable + +The `$values` variable is a table containing the labels and floating point values of all instant queries and expressions, indexed by their Ref IDs. + +To print the value of the instant query with Ref ID A: + +``` +CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ index $values "A" }} +``` + +For example, given an alert with the labels `instance=server1` and an instant query with the value `81.2345`, this would print: + +``` +CPU usage for instance1 has exceeded 80% for the last 5 minutes: 81.2345 +``` + +If the query in Ref ID A is a range query rather than an instant query then add a reduce expression with Ref ID B and replace `(index $values "A")` with `(index $values "B")`: + +``` +CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ index $values "B" }} +``` + +## Functions + +The following functions are available to you when templating labels and annotations: + +### args + +The `args` function translates a list of objects to a map with keys arg0, arg1 etc. This is intended to allow multiple arguments to be passed to templates: + +``` +{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}} +``` + +``` +1 2 +``` + +### externalURL + +The `externalURL` function returns the external URL of the Grafana server as configured in the ini file(s): + +``` +{{ externalURL }} +``` + +``` +https://example.com/grafana +``` + +### graphLink + +The `graphLink` function returns the path to the graphical view in [Explore][explore] for the given expression and data source: + +``` +{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }} +``` + +``` +/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}] +``` + +### humanize + +The `humanize` function humanizes decimal numbers: + +``` +{{ humanize 1000.0 }} +``` + +``` +1k +``` + +### humanize1024 + +The `humanize1024` works similar to `humanize` but but uses 1024 as the base rather than 1000: + +``` +{{ humanize1024 1024.0 }} +``` + +``` +1ki +``` + +### humanizeDuration + +The `humanizeDuration` function humanizes a duration in seconds: + +``` +{{ humanizeDuration 60.0 }} +``` + +``` +1m 0s +``` + +### humanizePercentage + +The `humanizePercentage` function humanizes a ratio value to a percentage: + +``` +{{ humanizePercentage 0.2 }} +``` + +``` +20% +``` + +### humanizeTimestamp + +The `humanizeTimestamp` function humanizes a Unix timestamp: + +``` +{{ humanizeTimestamp 1577836800.0 }} +``` + +``` +2020-01-01 00:00:00 +0000 UTC +``` + +### match + +The `match` function matches the text against a regular expression pattern: + +``` +{{ match "a.*" "abc" }} +``` + +``` +true +``` + +### pathPrefix + +The `pathPrefix` function returns the path of the Grafana server as configured in the ini file(s): + +``` +{{ pathPrefix }} +``` + +``` +/grafana +``` + +### tableLink + +The `tableLink` function returns the path to the tabular view in [Explore][explore] for the given expression and data source: + +``` +{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }} +``` + +``` +/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}] +``` + +### title + +The `title` function capitalizes the first character of each word: + +``` +{{ title "hello, world!" }} +``` + +``` +Hello, World! +``` + +### toLower + +The `toLower` function returns all text in lowercase: + +``` +{{ toLower "Hello, world!" }} +``` + +``` +hello, world! +``` + +### toUpper + +The `toUpper` function returns all text in uppercase: + +``` +{{ toUpper "Hello, world!" }} +``` + +``` +HELLO, WORLD! +``` + +### reReplaceAll + +The `reReplaceAll` function replaces text matching the regular expression: + +``` +{{ reReplaceAll "localhost:(.*)" "example.com:$1" "localhost:8080" }} +``` + +``` +example.com:8080 +``` + +{{% docs/reference %}} +[explore]: "/docs/ -> /docs/grafana//explore" +{{% /docs/reference %}} diff --git a/docs/sources/alerting/configure-notifications/_index.md b/docs/sources/alerting/configure-notifications/_index.md new file mode 100644 index 00000000000..f709efed8fa --- /dev/null +++ b/docs/sources/alerting/configure-notifications/_index.md @@ -0,0 +1,26 @@ +--- +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications +description: Configure how, when, and where to send your alert notifications +keywords: + - grafana + - alert + - notifications +labels: + products: + - cloud + - enterprise + - oss +menuTitle: Configure notifications +title: Configure notifications +weight: 125 +--- + +# Configure notifications + +Choose how, when, and where to send your alert notifications. + +As a first step, define your contact points; where to send your alert notifications to. A contact point is a set of one or more integrations that are used to deliver notifications. + +Next, create a notification policy which is a set of rules for where, when and how your alerts are routed to contact points. In a notification policy, you define where to send your alert notifications by choosing one of the contact points you created. + +Optionally, you can add notification templates to contact points for reuse and consistent messaging in your notifications. diff --git a/docs/sources/alerting/alerting-rules/create-notification-policy.md b/docs/sources/alerting/configure-notifications/create-notification-policy.md similarity index 89% rename from docs/sources/alerting/alerting-rules/create-notification-policy.md rename to docs/sources/alerting/configure-notifications/create-notification-policy.md index 7c439f75a04..bcd9d8a8064 100644 --- a/docs/sources/alerting/alerting-rules/create-notification-policy.md +++ b/docs/sources/alerting/configure-notifications/create-notification-policy.md @@ -1,9 +1,10 @@ --- aliases: - - ../notifications/ - - ../old-alerting/notifications/ - - ../unified-alerting/notifications/ -canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/create-notification-policy/ + - ../notifications/ # /docs/grafana//alerting/notifications/ + - ../unified-alerting/notifications/ # /docs/grafana//alerting/unified-alerting/notifications/ + - ../alerting-rules/create-notification-policy/ # /docs/grafana//alerting/alerting-rules/create-notification-policy/ + - ../manage-notifications/create-notification-policy/ # /docs/grafana//alerting/manage-notifications/create-notification-policy/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/create-notification-policy/ description: Configure notification policies to determine how alerts are routed to contact points keywords: - grafana @@ -36,10 +37,6 @@ For more information on notification policies, see [fundamentals of Notification ## Edit default notification policy -{{% admonition type="note" %}} -Before Grafana v8.2, the configuration of the embedded Alertmanager was shared across organizations. Users of Grafana 8.0 and 8.1 are advised to use the new Grafana 8 Alerts only if they have one organization. Otherwise, silences for the Grafana managed alerts will be visible by all organizations. -{{% /admonition %}} - 1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. 1. Click **Notification policies**. 1. From the **Choose Alertmanager** dropdown, select an external Alertmanager. By default, the **Grafana Alertmanager** is selected. @@ -111,6 +108,6 @@ An example of an alert configuration. - Create specific routes for particular teams that handle their own on-call rotations. {{% docs/reference %}} -[notification-policies]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/notification-policies" -[notification-policies]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notification-policies" +[notification-policies]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/notifications/notification-policies" +[notification-policies]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/notification-policies" {{% /docs/reference %}} diff --git a/docs/sources/alerting/manage-notifications/create-silence.md b/docs/sources/alerting/configure-notifications/create-silence.md similarity index 79% rename from docs/sources/alerting/manage-notifications/create-silence.md rename to docs/sources/alerting/configure-notifications/create-silence.md index e066a9c048c..01d9062ea22 100644 --- a/docs/sources/alerting/manage-notifications/create-silence.md +++ b/docs/sources/alerting/configure-notifications/create-silence.md @@ -1,12 +1,13 @@ --- aliases: - - ../silences/create-silence/ - - ../silences/edit-silence/ - - ../silences/linking-to-silence-form/ - - ../silences/remove-silence/ - - ../unified-alerting/silences/ - - ../silences/ -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/create-silence/ + - ../silences/create-silence/ # /docs/grafana//alerting/silences/create-silence/ + - ../silences/edit-silence/ # /docs/grafana//alerting/silences/edit-silence/ + - ../silences/linking-to-silence-form/ # /docs/grafana//alerting/silences/linking-to-silence-form/ + - ../silences/remove-silence/ # /docs/grafana//alerting/silences/remove-silence/ + - ../unified-alerting/silences/ # /docs/grafana//alerting/unified-alerting/silences/ + - ../silences/ # /docs/grafana//alerting/silences/ + - ../manage-notifications/create-silence/ # /docs/grafana//alerting/manage-notifications/create-silence/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/create-silence/ description: Create silences to stop notifications from getting created for a specified window of time keywords: - grafana @@ -18,11 +19,11 @@ labels: - cloud - enterprise - oss -title: Manage silences -weight: 410 +title: Configure silences +weight: 440 --- -# Manage silences +# Configure silences Silences stop notifications from getting created and last for only a specified window of time. diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/_index.md b/docs/sources/alerting/configure-notifications/manage-contact-points/_index.md new file mode 100644 index 00000000000..0bb2064e0a8 --- /dev/null +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/_index.md @@ -0,0 +1,144 @@ +--- +aliases: + - ../contact-points/create-contact-point/ # /docs/grafana//alerting/contact-points/create-contact-point/ + - ../contact-points/delete-contact-point/ # /docs/grafana//alerting/contact-points/delete-contact-point/ + - ../contact-points/edit-contact-point/ # /docs/grafana//alerting/contact-points/edit-contact-point/ + - ../contact-points/test-contact-point/ # /docs/grafana//alerting/contact-points/test-contact-point/ + - ../manage-notifications/manage-contact-points/ # /docs/grafana//alerting/manage-notifications/manage-contact-points/ + - ../alerting-rules/create-contact-point/ # /docs/grafana//alerting/alerting-rules/create-contact-point/ + - ../alerting-rules/manage-contact-points/ # /docs/grafana//alerting/alerting-rules/manage-contact-points/ + - ../alerting-rules/create-notification-policy/ # /docs/grafana//alerting/alerting-rules/create-notification-policy/ + - ../alerting-rules/manage-contact-points/integrations/ # /docs/grafana//alerting/alerting-rules/manage-contact-points/integrations/ + - ../manage-notifications/manage-contact-points/ # /docs/grafana//alerting/manage-notifications/manage-contact-points/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/ +description: Configure contact points to define how your contacts are notified when an alert rule fires +keywords: + - grafana + - alerting + - guide + - contact point + - templating +labels: + products: + - cloud + - enterprise + - oss +title: Configure contact points +weight: 410 +--- + +# Configure contact points + +Use contact points to define how your contacts are notified when an alert rule fires. You can add, edit, delete, and test a contact point. + +Configure contact point integrations in Grafana to select your preferred communication channel for receiving notifications when your alert rules are firing. + +## Add a contact point + +Complete the following steps to add a contact point. + +1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. +1. Click **Contact points**. +1. From the **Choose Alertmanager** dropdown, select an Alertmanager. By default, **Grafana Alertmanager** is selected. +1. On the **Contact Points** tab, click **+ Add contact point**. +1. Enter a descriptive name for the contact point. +1. From **Integration**, select a type and fill out mandatory fields. For example, if you choose email, enter the email addresses. Or if you choose Slack, enter the Slack channel(s) and users who should be contacted. +1. Some contact point integrations, like email or webhook, have optional settings. In **Optional settings**, specify additional settings for the selected contact point integration. +1. In Notification settings, optionally select **Disable resolved message** if you do not want to be notified when an alert resolves. +1. To add another contact point integration, click **Add contact point integration** and repeat steps 6 through 8. +1. Save your changes. + +## Edit a contact point + +Complete the following steps to edit a contact point. + +1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. +1. Click **Contact points** to view a list of existing contact points. +1. On the **Contact Points** tab, find the contact point you want to edit, and then click **Edit**. +1. Update the contact point and save your changes. + +## Delete a contact point + +Complete the following steps to delete a contact point. + +1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. +1. Click **Contact points** to view a list of existing contact points. +1. On the **Contact Points** tab, find the contact point you want to delete, and then click **More** -> **Delete**. +1. In the confirmation dialog, click **Yes, delete**. + +{{% admonition type="note" %}} +You cannot delete contact points that are in use by a notification policy. Either delete the notification policy or update it to use another contact point. +{{% /admonition %}} + +## Test a contact point + +Complete the following steps to test a contact point. + +1. In the left-side menu, click **Alerts & IRM** and then **Alerting**. +1. Click **Contact points** to view a list of existing contact points. +1. On the **Contact Points** tab, find the contact point you want to test, then click **Edit**. You can also create a new contact point if needed. +1. Click **Test** to open the contact point testing modal. +1. Choose whether to send a predefined test notification or choose custom to add your own custom annotations and labels to include in the notification. +1. Click **Send test notification** to fire the alert. + +## Manage contact points + +The Contact points list view lists all existing contact points and notification templates. + +On the **Contact Points** tab, you can: + +- Search for name and type of contact points and integrations +- View all existing contact points and integrations +- View how many notification policies each contact point is being used for and navigate directly to the linked notification policies +- View the status of notification deliveries +- Export individual contact points or all contact points in JSON, YAML, or Terraform format +- Delete contact points that are not in use by a notification policy + +On the **Notification templates** tab, you can: + +- View, edit, copy or delete existing notification templates + +## Configure contact point integrations + +Each contact point integration has its own configuration options and setup process. In most cases, this involves providing an API key or a Webhook URL. + +Once configured, you can use integrations as part of your contact points to receive notifications whenever your alert changes its state. In this section, we'll cover the basic steps to configure your integrations, so you can start receiving real-time alerts and stay on top of your monitoring data. + +## List of supported integrations + +| Name | Type | +| ------------------------ | ------------------------- | +| DingDing | `dingding` | +| Discord | `discord` | +| Email | `email` | +| Google Chat | `googlechat` | +| [Grafana Oncall][oncall] | `oncall` | +| Hipchat | `hipchat` | +| Kafka | `kafka` | +| Line | `line` | +| Microsoft Teams | `teams` | +| Opsgenie | `opsgenie` | +| [Pagerduty][pagerduty] | `pagerduty` | +| Prometheus Alertmanager | `prometheus-alertmanager` | +| Pushover | `pushover` | +| Sensu | `sensu` | +| Sensu Go | `sensugo` | +| [Slack][slack] | `slack` | +| Telegram | `telegram` | +| Threema | `threema` | +| VictorOps | `victorops` | +| [Webhook][webhook] | `webhook` | + +{{% docs/reference %}} +[pagerduty]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/manage-contact-points/integrations/pager-duty" +[pagerduty]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points/integrations/pager-duty" + +[oncall]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/manage-contact-points/integrations/configure-oncall" +[oncall]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points/integrations/configure-oncall" + +[slack]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/manage-contact-points/integrations/configure-slack" +[slack]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points/integrations/configure-slack" + +[webhook]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier" +[webhook]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier" +{{% /docs/reference %}} diff --git a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/configure-oncall.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-oncall.md similarity index 81% rename from docs/sources/alerting/alerting-rules/manage-contact-points/integrations/configure-oncall.md rename to docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-oncall.md index f71e5053036..e55761ad318 100644 --- a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/configure-oncall.md +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-oncall.md @@ -1,5 +1,8 @@ --- -canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/manage-contact-points/integrations/configure-oncall/ +aliases: + - ../../../alerting-rules/manage-contact-points/configure-oncall/ # /docs/grafana//alerting/alerting-rules/manage-contact-points/configure-oncall/ + - ../../../alerting-rules/manage-contact-points/integrations/configure-oncall/ # /docs/grafana//alerting/alerting-rules/manage-contact-points/integrations/configure-oncall/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-oncall/ description: Configure the Alerting - Grafana OnCall integration to connect alerts generated by Grafana Alerting with Grafana OnCall keywords: - grafana @@ -7,7 +10,7 @@ keywords: - oncall - integration aliases: - - ../configure-oncall/ # /docs/grafana/latest/alerting/alerting-rules/manage-contact-points/configure-oncall/ + - ../configure-oncall/ # /docs/grafana//alerting/alerting-rules/manage-contact-points/configure-oncall/ labels: products: - cloud @@ -63,8 +66,8 @@ To set up the Grafana OnCall integration using the Grafana Alerting application, This redirects you to the Grafana OnCall integration page in the Grafana OnCall application. From there, you can add [routes and escalation chains][escalation-chain]. {{% docs/reference %}} -[create-notification-policy]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-notification-policy" -[create-notification-policy]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-notification-policy" +[create-notification-policy]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/create-notification-policy" +[create-notification-policy]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/create-notification-policy" [oncall-integration]: "/docs/grafana/ -> /docs/oncall/latest/integrations/grafana-alerting" [oncall-integration]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/oncall/integrations/grafana-alerting" diff --git a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/configure-slack.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-slack.md similarity index 93% rename from docs/sources/alerting/alerting-rules/manage-contact-points/integrations/configure-slack.md rename to docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-slack.md index 0b19f5992b4..e80048d0e53 100644 --- a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/configure-slack.md +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-slack.md @@ -16,7 +16,7 @@ title: Configure Slack for Alerting weight: 300 --- -## Configure Slack for Alerting +# Configure Slack for Alerting Use the Grafana Alerting - Slack integration to send Slack notifications when your alerts are firing. @@ -63,7 +63,7 @@ Make sure you copy the Slack app Webhook URL. You will need this when setting up To create your Slack integration in Grafana Alerting, complete the following steps. -1. Navigate to Alerts&IRM -> Alerting -> Contact points. +1. Navigate to **Alerts & IRM** -> **Alerting** -> **Contact points**. 1. Click **+ Add contact point**. 1. Enter a contact point name. 1. From the Integration list, select Slack. @@ -78,7 +78,7 @@ To create your Slack integration in Grafana Alerting, complete the following ste To add the contact point and integration you created to your default notification policy, complete the following steps. -1. Navigate to **Alerts&IRM** -> **Alerting** -> **Notification policies**. +1. Navigate to **Alerts & IRM** -> **Alerting** -> **Notification policies**. 1. In the **Default policy**, click the ellipsis icon (…) and then **Edit**, 1. Change the default policy to the contact point you created. 1. Click **Update default policy**. @@ -87,7 +87,7 @@ To add the contact point and integration you created to your default notificatio If you have more than one contact point, add a new notification policy rather than edit the default one, so you can route specific alerts to Slack. For more information, refer to [Notification policies][nested-policy]. {{% docs/reference %}} -[nested-policy]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-notification-policy#add-new-nested-policy" +[nested-policy]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/create-notification-policy#add-new-nested-policy" [nested-policy]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/create-notification-policy#add-new-nested-policy" {{% /docs/reference %}} diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-telegram.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-telegram.md new file mode 100644 index 00000000000..e0c237211de --- /dev/null +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-telegram.md @@ -0,0 +1,95 @@ +--- +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-telegram/ +description: Configure the Telegram integration to connect alerts generated by Grafana Alerting +keywords: + - grafana + - alerting + - telegram + - integration +labels: + products: + - cloud + - enterprise + - oss +menuTitle: Telegram +title: Configure Telegram for Alerting +weight: 300 +--- + +# Configure Telegram for Alerting + +Use the Grafana Alerting - Telegram integration to send [Telegram](https://telegram.org/) notifications when your alerts are firing. + +## Before you begin + +### Telegram bot API token and chat ID + +To integrate Grafana with Telegram, you need to obtain a Telegram **bot API token** and a **chat ID** (i.e., the ID of the Telegram chat where you want to receive the alert notifications). + +### Set up your Telegram bot + +Create a [Telegram bot](https://core.telegram.org/bots/api). You can associate this bot to your chats and perform different actions with it, such as receiving alerts from Grafana. + +To set up the bot, complete the following steps. + +1. **Open the Telegram app** on your device. +1. Find the Telegram bot named **BotFather**. +1. Type or press `/newbot`. +1. Choose a name for the bot. It must end in **bot** or **\_bot**. E.g. "my_bot". +1. **Copy the API token**. + +### Chat ID + +Add the bot to a group chat by following the steps below. Once the bot is added to the chat, you will be able to route your alert notifications to that group. + +1. In the Telegram app, **open a group or start a new one**. +1. Search and **add the bot to the group**. +1. **Interact with the bot** by sending a dummy message that starts with "`/`". E.g. `/hola @bot_name`. + + {{< figure src="/media/blog/telegram-grafana-alerting/telegram-screenshot.png" alt="A screenshot that shows a message to a Telegram bot." >}} + +1. To obtain the **chat ID**, send an [HTTP request](https://core.telegram.org/bots/api#getupdates) to the bot. Copy the below URL and replace `{your_bot_api_token}` with your bot API token. + + ``` + https://api.telegram.org/bot{your_bot_api_token}/getUpdates + ``` + +1. **Paste the URL in your browser**. +1. If the request is successful, it will return a response in JSON format. + + ``` + ... + "chat": { + "id": -4065678900, + "title": "Tony and Hello world bot", + "type": "group", + ... + ``` + +1. Copy the value of the `“id”` that appears under `“chat”`. + +## Procedure + +To create your Telegram integration in Grafana Alerting, complete the following steps. + +1. Navigate to **Alerts & IRM** -> **Alerting** -> **Contact points**. +1. Click **+ Add contact point**. +1. Enter a contact point name. +1. From the Integration list, select Telegram. +1. In the **BOT API Token** field, copy in the bot API token. +1. In the **Chat ID** field, copy in the chat ID. +1. Click **Test** to check that your integration works. +1. Click **Save contact point**. + +## Next steps + +To add the contact point and integration you created to your default notification policy, complete the following steps. + +1. Navigate to **Alerts & IRM** -> **Alerting** -> **Notification policies**. +1. In the **Default policy**, click the ellipsis icon (…) and then **Edit**. +1. Change the default policy to the contact point you created. +1. Click **Update default policy**. + +{{}} +If you have more than one contact point, add a new child notification policy rather than edit the default one, so you can route specific alerts to Telegram. +{{}} diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/pager-duty.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/pager-duty.md new file mode 100644 index 00000000000..5ba0bf1789f --- /dev/null +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/pager-duty.md @@ -0,0 +1,73 @@ +--- +aliases: + - ../../../alerting-rules/manage-contact-points/integrations/pager-duty/ # /docs/grafana//alerting/alerting-rules/manage-contact-points/integrations/pager-duty/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/pager-duty/ +description: Configure the PagerDuty integration for Alerting +keywords: + - grafana + - alerting + - pagerduty +labels: + products: + - cloud + - enterprise + - oss +menuTitle: PagerDuty +title: Configure PagerDuty for Alerting +weight: 400 +--- + +# Configure PagerDuty for Alerting + +Use the Grafana Alerting - PagerDuty integration to receive notifications in PagerDuty when your alerts are firing. + +## Before you begin + +To set up PagerDuty for integration with Grafana Alerting, you need to create a [PagerDuty](https://www.pagerduty.com/) account. There are several set up steps to perform within PagerDuty before you set up the integration in Grafana Alerting. + +### Create a Service + +In PagerDuty, a service represents a component, microservice, or infrastructure element that a team oversees, manages, and monitors. + +1. Refer to [PagerDuty’s services and integrations guide](https://support.pagerduty.com/docs/services-and-integrations#create-a-service). + +1. Follow steps 1 to 5 under **Create a Service**. + +{{< admonition type="note" >}} +In step 5, choose **Create a service without an integration**. +{{< /admonition >}} + +### Obtain a PagerDuty integration key + +1. Once the service is created, click **Integrations** within the Service options. +1. Click **+ Add an integration**. +1. Select **Events API V2**. +1. Click **Add**. +1. Click the drop-down arrow to display the integration details. +1. Copy the **Integration Key**. + +## Procedure + +To create your PagerDuty integration in Grafana Alerting, complete the following steps. + +1. Navigate to **Alerts & IRM** -> **Alerting** -> **Contact points**. +1. Click **+ Add contact point**. +1. Enter a contact point name. + F1. rom the Integration list, select **PagerDuty**. +1. In the **Integration Key** field, copy in your integration key. +1. Click **Test** to check that your integration works. + + An incident should display in the Service’s Activity tab in PagerDuty. + +1. Click **Save contact point**. + +## Next steps + +To add the contact point and integration you created to your default notification policy, complete the following steps. + +1. Navigate to **Alerts & IRM** -> **Alerting** -> **Notification policies**. +1. In the Default policy, click the ellipsis icon (…) and then **Edit**. +1. Change the default policy to the contact point you created. +1. Click **Update default policy**. + +{{< admonition type="note" >}} If you have more than one contact point, add a new notification policy rather than edit the default one, so you can route specific alerts to PagerDuty. {{< /admonition >}} diff --git a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/webhook-notifier.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md similarity index 75% rename from docs/sources/alerting/alerting-rules/manage-contact-points/integrations/webhook-notifier.md rename to docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md index 77004bc9205..13d072a0279 100644 --- a/docs/sources/alerting/alerting-rules/manage-contact-points/integrations/webhook-notifier.md +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier.md @@ -1,9 +1,12 @@ --- aliases: - - ../contact-points/notifiers/webhook-notifier/ - - ../fundamentals/contact-points/webhook-notifier/ + - ../../../fundamentals/contact-points/notifiers/webhook-notifier/ # /docs/grafana//alerting/fundamentals/contact-points/notifiers/webhook-notifier/ + - ../../../fundamentals/contact-points/webhook-notifier/ # /docs/grafana//alerting/fundamentals/contact-points/webhook-notifier/ + - ../../../manage-notifications/manage-contact-points/webhook-notifier/ # /docs/grafana//alerting/manage-notifications/manage-contact-points/webhook-notifier/ - alerting/manage-notifications/manage-contact-points/webhook-notifier/ -canonical: https://grafana.com/docs/grafana/latest/alerting/alerting-rules/manage-contact-points/integrations/webhook-notifier/ + - ../../../alerting-rules/manage-contact-points/integrations/webhook-notifier/ # /docs/grafana//alerting/alerting-rules/manage-contact-points/integrations/webhook-notifier/ + +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier/ description: Configure the webhook notifier integration for Alerting keywords: - grafana @@ -21,9 +24,11 @@ title: Configure the webhook notifier for Alerting weight: 200 --- -### Configure the webhook notifier for Alerting +# Configure the webhook notifier for Alerting + +The webhook notification is a simple way to send information about a state change over HTTP to a custom endpoint. Using this notification you could integrate Grafana into a system of your choosing. -Example JSON body: +## Webhook JSON payload ```json { @@ -95,9 +100,9 @@ Example JSON body: } ``` -### Webhook fields +## Webhook fields -## Body +### Body | Key | Type | Description | | ----------------- | ------------------------- | ------------------------------------------------------------------------------- | @@ -133,18 +138,31 @@ Example JSON body: | panelURL | string | **Will be deprecated soon** | | imageURL | string | URL of a screenshot of a panel assigned to the rule that created this notification | -### Removed fields related to dashboards +{{< admonition type="note" >}} +Alert rules are not coupled to dashboards anymore therefore the fields related to dashboards `dashboardId` and `panelId` have been removed. +{{< /admonition >}} + +## Procedure + +To create your webhook integration in Grafana Alerting, complete the following steps: -Alerts are not coupled to dashboards anymore therefore the fields related to dashboards `dashboardId` and `panelId` have been removed. +1. Navigate to **Alerts & IRM** -> **Alerting** -> **Contact points**. +1. Click **+ Add contact point**. +1. Enter a contact point name. +1. From the Integration list, select **Webhook**. +1. In the **URL** field, copy in your Webhook URL. +1. Click **Test** to check that your integration works. +1. Click **Save contact point**. -## WeCom +## Next steps -WeCom contact points need a Webhook URL. These are obtained by setting up a WeCom robot on the corresponding group chat. To obtain a Webhook URL using the WeCom desktop Client please follow these steps: +To add the contact point and integration you created to your default notification policy, complete the following steps. -1. Click the "..." in the top right corner of a group chat that you want your alerts to be delivered to -2. Click "Add Group Robot", select "New Robot" and give your robot a name. Click "Add Robot" -3. There should be a Webhook URL in the panel. +1. Navigate to **Alerts & IRM** -> **Alerting** -> **Notification policies**. +1. In the **Default policy**, click the ellipsis icon (…) and then **Edit**. +1. Change the default policy to the contact point you created. +1. Click **Update default policy**. -| Setting | Description | -| ------- | ------------------ | -| Url | WeCom webhook URL. | +{{< admonition type="note" >}} +If you have more than one contact point, add a new notification policy rather than edit the default one, so you can route specific alerts to your webhook. +{{< /admonition >}} diff --git a/docs/sources/alerting/manage-notifications/mute-timings.md b/docs/sources/alerting/configure-notifications/mute-timings.md similarity index 83% rename from docs/sources/alerting/manage-notifications/mute-timings.md rename to docs/sources/alerting/configure-notifications/mute-timings.md index 86c55ef564b..9e2efeef2b8 100644 --- a/docs/sources/alerting/manage-notifications/mute-timings.md +++ b/docs/sources/alerting/configure-notifications/mute-timings.md @@ -1,8 +1,9 @@ --- aliases: - - ../notifications/mute-timings/ - - ../unified-alerting/notifications/mute-timings/ -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/mute-timings/ + - ../notifications/mute-timings/ # /docs/grafana//alerting/notifications/mute-timings/ + - ../unified-alerting/notifications/mute-timings/ # /docs/grafana//alerting/unified-alerting/notifications/mute-timings/ + - ../manage-notifications/mute-timings/ # /docs/grafana//alerting/manage-notifications/mute-timings/ +canonical: /docs/grafana/latest/alerting/configure-notifications/mute-timings/ description: Create mute timings to prevent alerts from firing during a specific and reoccurring period of time keywords: - grafana @@ -16,17 +17,17 @@ labels: - cloud - enterprise - oss -title: Create mute timings -weight: 420 +title: Configure mute timings +weight: 450 --- -# Create mute timings +# Configure mute timings A mute timing is a recurring interval of time when no new notifications for a policy are generated or sent. Use them to prevent alerts from firing a specific and reoccurring period, for example, a regular maintenance period. Similar to silences, mute timings do not prevent alert rules from being evaluated, nor do they stop alert instances from being shown in the user interface. They only prevent notifications from being created. -You can configure Grafana managed mute timings as well as mute timings for an [external Alertmanager data source][datasources/alertmanager]. For more information, refer to [Alertmanager documentation][fundamentals/alertmanager]. +You can configure Grafana managed mute timings as well as mute timings for an [external Alertmanager data source][datasources/alertmanager]. For more information, refer to [Alertmanager documentation][intro-alertmanager]. ## Mute timings vs silences @@ -82,8 +83,8 @@ If you want to specify an exact duration, specify all the options. For example, {{% docs/reference %}} [datasources/alertmanager]: "/docs/grafana/ -> /docs/grafana//datasources/alertmanager" -[datasources/alertmanager]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/alertmanager" +[datasources/alertmanager]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/connect-externally-hosted/data-sources/alertmanager" -[fundamentals/alertmanager]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alertmanager" -[fundamentals/alertmanager]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alertmanager" +[intro-alertmanager]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/notifications/alertmanager" +[intro-alertmanager]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/alertmanager" {{% /docs/reference %}} diff --git a/docs/sources/alerting/configure-notifications/template-notifications/_index.md b/docs/sources/alerting/configure-notifications/template-notifications/_index.md new file mode 100644 index 00000000000..e4bcf9448de --- /dev/null +++ b/docs/sources/alerting/configure-notifications/template-notifications/_index.md @@ -0,0 +1,62 @@ +--- +aliases: + - ../manage-notifications/template-notifications/ # /docs/grafana//alerting/manage-notifications/template-notifications/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/ +description: Customize your notifications using notification templates +keywords: + - grafana + - alerting + - notifications + - templates +labels: + products: + - cloud + - enterprise + - oss +title: Configure notification messages +weight: 430 +--- + +# Configure notification messages + +Customize the content of your notifications with notifications templates. + +You can use notification templates to change the title, message, and format of the message in your notifications. + +Notification templates are not tied to specific contact point integrations, such as email or Slack. However, you can choose to create separate notification templates for different contact point integrations. + +You can use notification templates to: + +- Customize content: Personalize the subject of an email or the title of a message. Modify text within notifications, like selecting or omitting certain labels, annotations, and links. Format text with bold and italic styles, and add or remove line breaks. + +However, there are limitations. You cannot: + +- Modify Visual Appearance: Add HTML and CSS to email notifications for visual changes. Alter the design of notifications in messaging services like Slack and Microsoft Teams, such as adding custom blocks or adaptive cards. +- Manage Media and Data: Adjust the number and size of images or their placement in notifications. Customize webhook data structure or format, including JSON fields or sending data in XML. Modify HTTP headers in webhooks beyond those in the contact point configuration. + +## Learn more + +[Using Go's templating language][using-go-templating-language] + +Learn how to write the content of your notification templates in Go’s templating language. + +Create reusable notification templates for your contact points. + +[Use notification templates][use-notification-templates] + +Use notification templates to send notifications to your contact points. + +[Reference][reference] + +Data that is available when writing templates. + +{{% docs/reference %}} +[reference]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/reference" +[reference]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/reference" + +[use-notification-templates]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/use-notification-templates" +[use-notification-templates]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/use-notification-templates" + +[using-go-templating-language]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/using-go-templating-language" +[using-go-templating-language]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/using-go-templating-language" +{{% /docs/reference %}} diff --git a/docs/sources/alerting/manage-notifications/template-notifications/create-notification-templates.md b/docs/sources/alerting/configure-notifications/template-notifications/create-notification-templates.md similarity index 96% rename from docs/sources/alerting/manage-notifications/template-notifications/create-notification-templates.md rename to docs/sources/alerting/configure-notifications/template-notifications/create-notification-templates.md index 947556e4e23..19f7f3a4659 100644 --- a/docs/sources/alerting/manage-notifications/template-notifications/create-notification-templates.md +++ b/docs/sources/alerting/configure-notifications/template-notifications/create-notification-templates.md @@ -1,5 +1,7 @@ --- -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/template-notifications/create-notification-templates/ +aliases: + - ../../manage-notifications/template-notifications/create-notification-templates/ # /docs/grafana//alerting/manage-notifications/template-notifications/create-notification-templates/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/create-notification-templates/ description: Create notification templates to sent to your contact points keywords: - grafana diff --git a/docs/sources/alerting/manage-notifications/images-in-notifications.md b/docs/sources/alerting/configure-notifications/template-notifications/images-in-notifications.md similarity index 91% rename from docs/sources/alerting/manage-notifications/images-in-notifications.md rename to docs/sources/alerting/configure-notifications/template-notifications/images-in-notifications.md index 3559abbc660..6bd12602136 100644 --- a/docs/sources/alerting/manage-notifications/images-in-notifications.md +++ b/docs/sources/alerting/configure-notifications/template-notifications/images-in-notifications.md @@ -1,5 +1,7 @@ --- -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/images-in-notifications/ +aliases: + - ../manage-notifications/images-in-notifications/ # /docs/grafana//alerting/manage-notifications/images-in-notifications/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/images-in-notifications/ description: Use images in notifications to help users better understand why alerts are firing or have been resolved keywords: - grafana @@ -12,7 +14,7 @@ labels: - enterprise - oss title: Use images in notifications -weight: 405 +weight: 500 --- # Use images in notifications @@ -33,19 +35,19 @@ Refer to the table at the end of this page for a list of contact points and thei ## Requirements -1. To use images in notifications, Grafana must be set up to use [image rendering][image-rendering]. You can either install the image rendering plugin or run it as a remote rendering service. +1. To use images in notifications, Grafana must be set up to use image rendering. You can either install the image rendering plugin or run it as a remote rendering service. 2. When a screenshot is taken it is saved to the [data][paths] folder, even if Grafana is configured to upload screenshots to a cloud storage service. Grafana must have write-access to this folder otherwise screenshots cannot be saved to disk and an error will be logged for each failed screenshot attempt. 3. You should use a cloud storage service unless sending alerts to Discord, Email, Pushover, Slack or Telegram. These integrations support either embedding screenshots in the email or attaching screenshots to the notification, while other integrations must link screenshots uploaded to a cloud storage bucket. If a cloud storage service has been configured then integrations that support both will link screenshots from the cloud storage bucket instead of embedding or attaching screenshots to the notification. -4. If uploading screenshots to a cloud storage service such as Amazon S3, Azure Blob Storage or Google Cloud Storage; and accessing screenshots in the bucket requires authentication, logging into a VPN or corporate network; then image previews might not work in all instant messaging and communication platforms as some services rewrite URLs to use their CDN. If this happens we recommend using [integrations which support uploading images]({{< relref "#supported-contact-points" >}}) or [disabling images in notifications]({{< relref "#configuration" >}}) altogether. +4. If uploading screenshots to a cloud storage service such as Amazon S3, Azure Blob Storage or Google Cloud Storage; and accessing screenshots in the bucket requires authentication, logging into a VPN or corporate network; then image previews might not work in all instant messaging and communication platforms as some services rewrite URLs to use their CDN. If this happens we recommend using [integrations which support uploading images](#supported-contact-points) or [disabling images in notifications](#configuration) altogether. 5. When uploading screenshots to a cloud storage service Grafana uses a random 20 character (30 characters for Azure Blob Storage) filename for each image. This makes URLs hard to guess but not impossible. 6. Grafana does not delete screenshots from cloud storage. We recommend configuring a retention policy with your cloud storage service to delete screenshots older than 1 month. -7. If Grafana is configured to upload screenshots to its internal web server, and accessing Grafana requires logging into a VPN or corporate network; image previews might not work in all instant messaging and communication platforms as some services rewrite URLs to use their CDN. If this happens we recommend using [integrations which support uploading images]({{< relref "#supported-contact-points" >}}) or [disabling images in notifications]({{< relref "#configuration" >}}) altogether. +7. If Grafana is configured to upload screenshots to its internal web server, and accessing Grafana requires logging into a VPN or corporate network; image previews might not work in all instant messaging and communication platforms as some services rewrite URLs to use their CDN. If this happens we recommend using [integrations which support uploading images](#supported-contact-points) or [disabling images in notifications](#configuration) altogether. 8. Grafana does not delete screenshots uploaded to its internal web server. To delete screenshots from `static_root_path/images/attachments` after a certain amount of time we recommend setting up a CRON job. @@ -69,8 +71,6 @@ If screenshots should be uploaded to cloud storage then `upload_external_image_s # will be persisted to disk for up to temp_data_lifetime. upload_external_image_storage = false -For more information on image rendering, refer to [image rendering][image-rendering]. - Restart Grafana for the changes to take effect. ## Advanced configuration @@ -137,11 +137,3 @@ For example, if a screenshot could not be taken within the expected time (10 sec - `grafana_screenshot_successes_total` - `grafana_screenshot_upload_failures_total` - `grafana_screenshot_upload_successes_total` - -{{% docs/reference %}} -[image-rendering]: "/docs/grafana/ -> /docs/grafana//setup-grafana/image-rendering" -[image-rendering]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/image-rendering" - -[paths]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-grafana#paths" -[paths]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-grafana#paths" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/manage-notifications/template-notifications/reference.md b/docs/sources/alerting/configure-notifications/template-notifications/reference.md similarity index 95% rename from docs/sources/alerting/manage-notifications/template-notifications/reference.md rename to docs/sources/alerting/configure-notifications/template-notifications/reference.md index 16c26acc6d5..d38e517a4d2 100644 --- a/docs/sources/alerting/manage-notifications/template-notifications/reference.md +++ b/docs/sources/alerting/configure-notifications/template-notifications/reference.md @@ -1,5 +1,7 @@ --- -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/template-notifications/reference/ +aliases: + - ../../manage-notifications/template-notifications/reference/ # /docs/grafana//alerting/manage-notifications/template-notifications/reference/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/reference/ description: Learn about templating notifications options keywords: - grafana diff --git a/docs/sources/alerting/configure-notifications/template-notifications/use-notification-templates.md b/docs/sources/alerting/configure-notifications/template-notifications/use-notification-templates.md new file mode 100644 index 00000000000..6dcc4ac35ff --- /dev/null +++ b/docs/sources/alerting/configure-notifications/template-notifications/use-notification-templates.md @@ -0,0 +1,45 @@ +--- +aliases: + - ../../manage-notifications/template-notifications/use-notification-templates/ # /docs/grafana//alerting/manage-notifications/template-notifications/use-notification-templates/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/use-notification-templates/ +description: Use notification templates in contact points to customize your notifications +keywords: + - grafana + - alerting + - notifications + - templates + - use templates +labels: + products: + - cloud + - enterprise + - oss +title: Use notification templates +weight: 300 +--- + +# Use notification templates + +Use templates in contact points to customize your notifications. + +In the Contact points tab, you can see a list of your contact points. + +1. To create a new contact point, click New. + + **Note:** You can edit an existing contact by clicking the Edit icon. + +1. Execute a template from one or more fields such as Message and Subject: + + {{< figure max-width="940px" src="/static/img/docs/alerting/unified/use-notification-template-9-4.png" caption="Use notification template" >}} + + For more information on how to write and execute templates, refer to [Using Go's templating language][using-go-templating-language] and [Create notification templates][create-notification-templates]. + +1. Click **Save contact point**. + +{{% docs/reference %}} +[create-notification-templates]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/create-notification-templates" +[create-notification-templates]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/create-notification-templates" + +[using-go-templating-language]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/using-go-templating-language" +[using-go-templating-language]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/using-go-templating-language" +{{% /docs/reference %}} diff --git a/docs/sources/alerting/manage-notifications/template-notifications/using-go-templating-language.md b/docs/sources/alerting/configure-notifications/template-notifications/using-go-templating-language.md similarity index 89% rename from docs/sources/alerting/manage-notifications/template-notifications/using-go-templating-language.md rename to docs/sources/alerting/configure-notifications/template-notifications/using-go-templating-language.md index 2580962b850..8bb0bad2c3e 100644 --- a/docs/sources/alerting/manage-notifications/template-notifications/using-go-templating-language.md +++ b/docs/sources/alerting/configure-notifications/template-notifications/using-go-templating-language.md @@ -1,5 +1,7 @@ --- -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/template-notifications/using-go-templating-language/ +aliases: + - ../../manage-notifications/template-notifications/using-go-templating-language/ # /docs/grafana//alerting/manage-notifications/template-notifications/using-go-templating-language/ +canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/using-go-templating-language/ description: Use Go's templating language to create your own notification templates keywords: - grafana @@ -32,7 +34,7 @@ In text/template, templates start with `{{` and end with `}}` irrespective of wh ## Print -To print the value of something use `{{` and `}}`. You can print the value of dot, a field of dot, the result of a function, and the value of a [variable]({{< relref "#variables" >}}). For example, to print the `Alerts` field where dot refers to `ExtendedData` you would write the following: +To print the value of something use `{{` and `}}`. You can print the value of dot, a field of dot, the result of a function, and the value of a [variable](#variables). For example, to print the `Alerts` field where dot refers to `ExtendedData` you would write the following: ``` {{ .Alerts }} @@ -280,12 +282,12 @@ grafana_folder = "Test alerts" ``` {{% docs/reference %}} -[create-notification-templates]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications/create-notification-templates" -[create-notification-templates]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications/create-notification-templates" +[create-notification-templates]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/create-notification-templates" +[create-notification-templates]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/create-notification-templates" -[extendeddata]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications/reference#extendeddata" -[extendeddata]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications/reference#extendeddata" +[extendeddata]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/reference#extendeddata" +[extendeddata]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/reference#extendeddata" -[reference]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications/reference" -[reference]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications/reference" +[reference]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/reference" +[reference]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/reference" {{% /docs/reference %}} diff --git a/docs/sources/alerting/difference-old-new.md b/docs/sources/alerting/difference-old-new.md deleted file mode 100644 index 24e4e942940..00000000000 --- a/docs/sources/alerting/difference-old-new.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -_build: - list: false -aliases: - - ./unified-alerting/difference-old-new/ # /docs/grafana//alerting/unified-alerting/difference-old-new/ -canonical: https://grafana.com/docs/grafana/latest/alerting/difference-old-new/ -description: Learn about how Grafana Alerting compares to legacy alerting -keywords: - - grafana - - alerting - - guide -labels: - products: - - cloud - - enterprise - - oss -title: Grafana Alerting vs Legacy dashboard alerting -weight: 108 ---- - -# Grafana Alerting vs Legacy dashboard alerting - -Introduced in Grafana 8.0, and the only system since Grafana 10.0, Grafana Alerting has several enhancements over legacy dashboard alerting. - -## Multi-dimensional alerting - -You can now create alerts that give you system-wide visibility with a single alerting rule. Generate multiple alert instances from a single alert rule. For example, you can create a rule to monitor the disk usage of multiple mount points on a single host. The evaluation engine returns multiple time series from a single query, with each time series identified by its label set. - -## Create alerts outside of Dashboards - -Unlike legacy dashboard alerts, Grafana alerts allow you to create queries and expressions that combine data from multiple sources in unique ways. You can still link dashboards and panels to alerting rules using their ID and quickly troubleshoot the system under observation. - -Since unified alerts are no longer directly tied to panel queries, they do not include images or query values in the notification email. You can use customized notification templates to view query values. - -## Create Loki and Grafana Mimir alerting rules - -In Grafana Alerting, you can manage Loki and Grafana Mimir alerting rules using the same UI and API as your Grafana managed alerts. - -## View and search for alerts from Prometheus compatible data sources - -Alerts for Prometheus compatible data sources are now listed under the Grafana alerts section. You can search for labels across multiple data sources to quickly find relevant alerts. - -## Special alerts for alert state NoData and Error - -Grafana Alerting introduced a new concept of the alert states. When evaluation of an alerting rule produces state NoData or Error, Grafana Alerting will generate special alerts that will have the following labels: - -- `alertname` with value DatasourceNoData or DatasourceError depending on the state. -- `rulename` name of the alert rule the special alert belongs to. -- `datasource_uid` will have the UID of the data source that caused the state. -- all labels and annotations of the original alert rule - -You can handle these alerts the same way as regular alerts by adding a silence, route to a contact point, and so on. - -> **Note:** If the rule uses many data sources and one or many returns no data, the special alert will be created for each data source that caused the alert state. diff --git a/docs/sources/alerting/fundamentals/_index.md b/docs/sources/alerting/fundamentals/_index.md index 1f86d0dc95e..ce5946e948d 100644 --- a/docs/sources/alerting/fundamentals/_index.md +++ b/docs/sources/alerting/fundamentals/_index.md @@ -1,7 +1,7 @@ --- aliases: - - metrics/ - - unified-alerting/fundamentals/ + - ./metrics/ # /docs/grafana//alerting/metrics/ + - ./unified-alerting/fundamentals/ # /docs/grafana//alerting/unified-alerting/fundamentals/ canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/ description: Learn about the fundamentals of Grafana Alerting as well as the key features it offers labels: @@ -18,59 +18,132 @@ weight: 100 Whether you’re just starting out or you're a more experienced user of Grafana Alerting, learn more about the fundamentals and available features that help you create, manage, and respond to alerts; and improve your team’s ability to resolve issues quickly. -## Principles - -In Prometheus-based alerting systems, you have an alert generator that creates alerts and an alert receiver that receives alerts. For example, Prometheus is an alert generator and is responsible for evaluating alert rules, while Alertmanager is an alert receiver and is responsible for grouping, inhibiting, silencing, and sending notifications about firing and resolved alerts. - -Grafana Alerting is built on the Prometheus model of designing alerting systems. It has an internal alert generator responsible for scheduling and evaluating alert rules, as well as an internal alert receiver responsible for grouping, inhibiting, silencing, and sending notifications. Grafana doesn’t use Prometheus as its alert generator because Grafana Alerting needs to work with many other data sources in addition to Prometheus. However, it does use Alertmanager as its alert receiver. - -Alerts are sent to the alert receiver where they are routed, grouped, inhibited, silenced and notified. In Grafana Alerting, the default alert receiver is the Alertmanager embedded inside Grafana, and is referred to as the Grafana Alertmanager. However, you can use other Alertmanagers too, and these are referred to as [External Alertmanagers][external-alertmanagers]. - The following diagram gives you an overview of Grafana Alerting and introduces you to some of the fundamental features that are the principles of how Grafana Alerting works. {{< figure src="/media/docs/alerting/how-alerting-works.png" max-width="750px" caption="How Alerting works" >}} +## How it works at a glance + +- Grafana alerting periodically queries data sources and evaluates the condition defined in the alert rule +- If the condition is breached, an alert instance fires +- Firing and resolved alert instances are routed to notification policies based on matching labels +- Notifications are sent out to the contact points specified in the notification policy + ## Fundamentals +The following concepts are key to your understanding of how Grafana Alerting works. + ### Alert rules -An alert rule is a set of criteria that determine when an alert should fire. It consists of one or more queries and expressions, a condition which needs to be met, an interval which determines how often the alert rule is evaluated, and a duration over which the condition must be met for an alert to fire. +An [alert rule][alert-rules] consists of one or more queries and expressions that select the data you want to measure. It also contains a condition, which is the threshold that an alert rule must meet or exceed in order to fire. -Alert rules are evaluated over their interval, and each alert rule can have zero, one, or any number of alerts firing at a time. The state of the alert rule is determined by its most "severe" alert, which can be one of Normal, Pending, or Firing. For example, if at least one of an alert rule's alerts are firing then the alert rule is also firing. The health of an alert rule is determined by the status of its most recent evaluation. These can be OK, Error, and NoData. +Add labels to uniquely identify your alert rule and configure alert routing. Labels link alert rules to notification policies, so you can easily manage which policy should handle which alerts and who gets notified. -A very important feature of alert rules is that they support custom annotations and labels. These allow you to instrument alerts with additional metadata such as summaries and descriptions, and add additional labels to route alerts to specific notification policies. +Once alert rules are created, they go through various states and transitions. -### Alerts +### Alert instances -Alerts are uniquely identified by sets of key/value pairs called Labels. Each key is a label name and each value is a label value. For example, one alert might have the labels `foo=bar` and another alert might have the labels `foo=baz`. An alert can have many labels such as `foo=bar,bar=baz` but it cannot have the same label twice such as `foo=bar,foo=baz`. Two alerts cannot have the same labels either, and if two alerts have the same labels such as `foo=bar,bar=baz` and `foo=bar,bar=baz` then one of the alerts will be discarded. Alerts are resolved when the condition in the alert rule is no longer met, or the alert rule is deleted. +Each alert rule can produce multiple alert instances (also known as alerts) - one alert instance for each time series. This is exceptionally powerful as it allows us to observe multiple series in a single expression. -In Grafana Managed Alerts, alerts can be in Normal, Pending, Alerting, No Data or Error states. In Datasource Managed Alerts, such as Mimir and Loki, alerts can be in Normal, Pending and Alerting, but not NoData or Error. +```promql +sum by(cpu) ( + rate(node_cpu_seconds_total{mode!="idle"}[1m]) +) +``` -### Contact points +A rule using the PromQL expression above creates as many alert instances as the amount of CPUs we are observing after the first evaluation, enabling a single rule to report the status of each CPU. -Contact points determine where notifications are sent. For example, you might have a contact point that sends notifications to an email address, to Slack, to an incident management system (IRM) such as Grafana OnCall or Pagerduty, or to a webhook. +{{< figure src="/static/img/docs/alerting/unified/multi-dimensional-alert.png" caption="Multiple alert instances from a single alert rule" >}} -The notifications that are sent from contact points can be customized using notification templates. You can use notification templates to change the title, message, and structure of the notification. Notification templates are not specific to individual integrations or contact points. +[Alert rules are frequently evaluated][alert-rule-evaluation] and the state of their alert instances is updated accordingly. Only alert instances that are in a firing or resolved state are routed to notification policies to be handled. ### Notification policies -Notification policies group alerts and then route them to contact points. They determine when notifications are sent, and how often notifications should be repeated. +[Notification policies][notification-policies] group alerts and then route them to contact points. They determine when notifications are sent, and how often notifications should be repeated. -Alerts are matched to notification policies using label matchers. These are human-readable expressions that assert if the alert's labels exactly match, do not exactly match, contain, or do not contain some expected text. For example, the matcher `foo=bar` matches alerts with the label `foo=bar` while the matcher `foo=~[a-zA-Z]+` matches alerts with any label called foo with a value that matches the regular expression `[a-zA-Z]+`. +Alert instances are matched to notification policies using label matchers. This provides a flexible way to organize and route alerts to different receivers. -By default, an alert can only match one notification policy. However, with the `continue` feature alerts can be made to match any number of notification policies at the same time. For more information on notification policies, see [fundamentals of Notification Policies][notification-policies]. +Each policy consists of a set of label matchers (0 or more) that specify which alert instances (identified by their labels) they handle. Notification policies are defined as a tree structure where the root of the notification policy tree is called the **Default notification policy**. Each policy can have child policies. + +{{< figure src="/media/docs/alerting/notification-routing.png" max-width="750px" caption="Notification policy routing" >}} + +### Contact points + +[Contact points][contact-points] determine where notifications are sent. For example, you might have a contact point that sends notifications to an email address, to Slack, to an incident management system (IRM) such as Grafana OnCall or Pagerduty, or to a webhook. + +Notifications sent from contact points are customizable with notification templates, which can be shared between contact points. ### Silences and mute timings -Silences and mute timings allow you to pause notifications for specific alerts or even entire notification policies. Use a silence to pause notifications on an ad-hoc basis, such as during a maintenance window; and use mute timings to pause notifications at regular intervals, such as evenings and weekends. +[Silences][silences] and [mute timings][mute-timings] allow you to pause notifications for specific alerts or even entire notification policies. Use a silence to pause notifications on an ad-hoc basis, such as during a maintenance window; and use mute timings to pause notifications at regular intervals, such as evenings and weekends. + +### Architecture + +Grafana Alerting is built on the Prometheus model of designing alerting systems. + +Prometheus-based alerting systems have two main components: + +- An alert generator that evaluates alert rules and sends firing and resolved alerts to the alert receiver. +- An alert receiver (also known as Alertmanager) that receives the alerts and is responsible for handling them and sending their notifications. + +Grafana doesn’t use Prometheus as its default alert generator because Grafana Alerting needs to work with many other data sources in addition to Prometheus. + +However, Grafana can also use Prometheus as an alert generator as well as external Alertmanagers. For more information about how to use distinct alerting systems, refer to the [Grafana alert rule types][alert-rules]. -## Provisioning +## Design your Alerting system -You can create your alerting resources (alert rules, notification policies, and so on) in the Grafana UI; configmaps, files and configuration management systems using file-based provisioning; and in Terraform using API-based provisioning. +Monitoring complex IT systems and understanding whether everything is up and running correctly is a difficult task. Setting up an effective alert management system is therefore essential to inform you when things are going wrong before they start to impact your business outcomes. + +Designing and configuring an alert management set up that works takes time. + +Here are some tips on how to create an effective alert management set up for your business: + +**Which are the key metrics for your business that you want to monitor and alert on?** + +- Find events that are important to know about and not so trivial or frequent that recipients ignore them. + +- Alerts should only be created for big events that require immediate attention or intervention. + +- Consider quality over quantity. + +**Which type of Alerting do you want to use?** + +- Choose between Grafana-managed Alerting or Grafana Mimir or Loki-managed Alerting; or both. + +**How do you want to organize your alerts and notifications?** + +- Be selective about who you set to receive alerts. Consider sending them to whoever is on call or a specific Slack channel. +- Automate as far as possible using the Alerting API or alerts as code (Terraform). + +**How can you reduce alert fatigue?** + +- Avoid noisy, unnecessary alerts by using silences, mute timings, or pausing alert rule evaluation. +- Continually tune your alert rules to review effectiveness. Remove alert rules to avoid duplication or ineffective alerts. +- Think carefully about priority and severity levels. +- Continually review your thresholds and evaluation rules. {{% docs/reference %}} + +[alert-rules]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules" +[alert-rules]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules" + +[contact-points]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/notifications/contact-points" +[contact-points]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/contact-points" + +[silences]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/create-silence" +[silences]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/create-silence" + +[mute-timings]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/mute-timings" +[mute-timings]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/mute-timings" + +[alertmanager]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/notifications/alertmanager" +[alertmanager]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/alertmanager" + +[alert-rule-evaluation]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/rule-evaluation" +[alert-rule-evaluation]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/rule-evaluation" + [external-alertmanagers]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/configure-alertmanager" [external-alertmanagers]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/configure-alertmanager" -[notification-policies]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/notification-policies" -[notification-policies]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notification-policies" +[notification-policies]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/notifications/notification-policies" +[notification-policies]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/notification-policies" {{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/alert-rules/_index.md b/docs/sources/alerting/fundamentals/alert-rules/_index.md index a7ed8f0f7a0..d6df62acf45 100644 --- a/docs/sources/alerting/fundamentals/alert-rules/_index.md +++ b/docs/sources/alerting/fundamentals/alert-rules/_index.md @@ -1,4 +1,9 @@ --- +aliases: + - ../fundamentals/data-source-alerting/ # /docs/grafana//alerting/fundamentals/data-source-alerting/ + - ../fundamentals/alert-rules/alert-instances/ # /docs/grafana//alerting/fundamentals/alert-rules/alert-instances/ + - ../fundamentals/alert-rules/recording-rules/ # /docs/grafana//alerting/fundamentals/alert-rules/recording-rules/ + - ../fundamentals/alert-rules/alert-rule-types/ # /docs/grafana//alerting/fundamentals/alert-rules/alert-rule-types/ canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/ description: Learn about alert rules keywords: @@ -11,32 +16,98 @@ labels: - enterprise - oss title: Alert rules -weight: 130 +weight: 100 --- # Alert rules -An alert rule is a set of evaluation criteria for when an alert rule should fire. An alert rule consists of one or more queries and expressions, a condition, and the duration over which the condition needs to be met to start firing. +An alert rule is a set of evaluation criteria for when an alert rule should fire. An alert rule consists of: -While queries and expressions select the data set to evaluate, a condition sets the threshold that an alert must meet or exceed to create an alert. +- Queries and expressions that select the data set to evaluate. +- A condition (the threshold) that the query must meet or exceed to trigger the alert instance. +- An interval that specifies the frequency of [alert rule evaluation][alert-rule-evaluation] and a duration indicating how long the condition must be met to trigger the alert instance. +- Other customizable options, for example, setting what should happen in the absence of data, notification messages, and more. -An interval specifies how frequently an alert rule is evaluated. Duration, when configured, indicates how long a condition must be met. The alert rules can also define alerting behavior in the absence of data. +Grafana supports two different alert rule types: Grafana-managed alert rules and data source-managed alert rules. -- [Alert rule types][alert-rule-types] -- [Alert instances][alert-instances] -- [Organising alert rules][organising-alerts] -- [Annotation and labels][annotation-label] +## Grafana-managed alert rules + +Grafana-managed alert rules are the most flexible alert rule type. They allow you to create alerts that can act on data from any of our [supported data sources](#supported-data-sources), and use multiple data sources in a single alert rule. + +Additionally, you can also add [expressions to transform your data][expression-queries], set custom alert conditions, and include [images in alert notifications][notification-images]. + +{{< figure src="/media/docs/alerting/grafana-managed-alerting-architecture.png" max-width="750px" caption="How Grafana-managed alerting works by default" >}} + +1. Alert rules are created within Grafana based on one or more data sources. + +1. Alert rules are evaluated by the Alert Rule Evaluation Engine from within Grafana. + +1. Firing and resolved alert instances are delivered to the internal Grafana [Alertmanager][alert-manager] which handles notifications. + +### Supported data sources + +Grafana-managed alert rules can query backend data sources if Grafana Alerting enabled by specifying `{"backend": true, "alerting": true}` in the [plugin.json](/developers/plugin-tools/reference-plugin-json). + +The following data sources are supported: + +- [Enterprise data source plugins](/grafana/plugins/data-source-plugins/?enterprise=1) and others maintained by Grafana such as [AWS Athena](/grafana/plugins/grafana-athena-datasource/), [AWS X-Ray](/grafana/plugins/grafana-x-ray-datasource/), [AWS Redshift](/grafana/plugins/grafana-redshift-datasource/), [AWS Timestream](/grafana/plugins/grafana-timestream-datasource/), [AWS IoT SiteWise](/grafana/plugins/grafana-iot-sitewise-datasource/), [Azure Data Explorer](/grafana/plugins/grafana-azure-data-explorer-datasource/), [Azure Monitor](/grafana/plugins/grafana-azure-monitor-datasource/), [ClickHouse](/grafana/plugins/grafana-clickhouse-datasource/), [Cloudwatch](/grafana/plugins/cloudwatch/), [CSV](/grafana/plugins/marcusolsson-csv-datasource/), [Elasticsearch](/grafana/plugins/elasticsearch/), [Falcon LogScale](/grafana/plugins/grafana-falconlogscale-datasource/), [GitHub](/grafana/plugins/grafana-github-datasource/), [Google BigQuery](/grafana/plugins/grafana-bigquery-datasource/), [Google Cloud Monitoring](/grafana/plugins/stackdriver/), [Graphite](/grafana/plugins/graphite/), [Loki](/grafana/plugins/loki/), [InfluxDB](/grafana/plugins/influxdb/), [Infinity](/grafana/plugins/yesoreyeram-infinity-datasource/), [MSSQL](/grafana/plugins/mssql/), [MySQL](/grafana/plugins/mysql/), [OpenSearch](/grafana/plugins/grafana-opensearch-datasource/), [OpenTSDB](/grafana/plugins/opentsdb/), [Oracle](/grafana/plugins/grafana-oracle-datasource/), [Orbit](/grafana/plugins/grafana-orbit-datasource/), [PostgreSQL](/grafana/plugins/postgres/), [Prometheus](/grafana/plugins/prometheus/), [Sentry](/grafana/plugins/grafana-sentry-datasource/), [SurrealDB](/grafana/plugins/grafana-surrealdb-datasource/), and [TestData](/grafana/plugins/grafana-testdata-datasource/). +- Backend data sources maintained by the [community](/grafana/plugins/data-source-plugins/?signature=community) and [partners](/grafana/plugins/data-source-plugins/?signature=commercial) that enable alerting. + +## Data source-managed alert rules + +Data source-managed alert rules can improve query performance via [recording rules](#recording-rules) and ensure high-availability and fault tolerance when implementing a distributed architecture. + +They are only supported for Prometheus-based or Loki data sources with the Ruler API enabled. For more information, refer to the [Loki Ruler API](/docs/loki//api/#ruler) or [Mimir Ruler API](/docs/mimir//references/http-api/#ruler). + +{{< figure src="/media/docs/alerting/mimir-managed-alerting-architecture-v2.png" max-width="750px" caption="Mimir-managed alerting architecture" >}} + +1. Alert rules are created and stored within the data source itself. +1. Alert rules can only query Prometheus-based data. It can use either queries or [recording rules](#recording-rules). +1. Alert rules are evaluated by the Alert Rule Evaluation Engine. +1. Firing and resolved alert instances are delivered to the configured [Alertmanager][alert-manager] which handles notifications. + +### Recording rules + +A recording rule allows you to pre-compute frequently needed or computationally expensive expressions and save their result as a new set of time series. This is useful if you want to run alerts on aggregated data or if you have dashboards that query computationally expensive expressions repeatedly. + +Querying this new time series is faster, especially for dashboards since they query the same expression every time the dashboards refresh. For more information, refer to [Create recording rules][create-recording-rules]. + +Alternatively, Grafana Enterprise and Grafana Cloud offer [recorded queries][recorded-queries] that can be executed against any data source. + +## Comparison between alert rule types + +When choosing which alert rule type to use, consider the following comparison between Grafana-managed and data source-managed alert rules. + +|
Feature
|
Grafana-managed alert rule
|
Data source-managed alert rule | +| ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Create alert rules based on data from any of our supported data sources | Yes | No. You can only create alert rules that are based on Prometheus-based data. | +| Mix and match data sources | Yes | No | +| Includes support for recording rules | No | Yes | +| Add expressions to transform your data and set alert conditions | Yes | No | +| Use images in alert notifications | Yes | No | +| Scaling | More resource intensive, depend on the database, and are likely to suffer from transient errors. They only scale vertically. | Store alert rules within the data source itself and allow for “infinite” scaling. Generate and send alert notifications from the location of your data. | +| Alert rule evaluation and delivery | Alert rule evaluation and delivery is done from within Grafana, using an external Alertmanager; or both. | Alert rule evaluation and alert delivery is distributed, meaning there is no single point of failure. | {{% docs/reference %}} -[alert-instances]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/alert-instances" -[alert-instances]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/alert-instances" -[alert-rule-types]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/alert-rule-types" -[alert-rule-types]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/alert-rule-types" +[alert-manager]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/notifications/alertmanager" +[alert-manager]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/alertmanager" + +[create-recording-rules]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-mimir-loki-managed-recording-rule" +[create-recording-rules]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-mimir-loki-managed-recording-rule" + +[alert-rule-evaluation]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/rule-evaluation" +[alert-rule-evaluation]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/rule-evaluation" + +[expression-queries]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/queries-conditions#expression-queries" +[expression-queries]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/queries-conditions#expression-queries" + +[queries-and-conditions]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/queries-conditions" +[queries-and-conditions]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/queries-conditions" + +[notification-images]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications/images-in-notifications" +[notification-images]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/images-in-notifications" -[annotation-label]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/annotation-label" -[annotation-label]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/annotation-label" +[recorded-queries]: "/docs/ -> /docs/grafana//administration/recorded-queries" -[organising-alerts]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/organising-alerts" -[organising-alerts]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/organising-alerts" {{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/alert-rules/alert-instances.md b/docs/sources/alerting/fundamentals/alert-rules/alert-instances.md deleted file mode 100644 index f7a3793c1d4..00000000000 --- a/docs/sources/alerting/fundamentals/alert-rules/alert-instances.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/alert-instances/ -description: Learn about alert instances -keywords: - - grafana - - alerting - - instances -labels: - products: - - cloud - - enterprise - - oss -title: Alert instances -weight: 105 ---- - -# Alert instances - -Grafana managed alerts support multi-dimensional alerting. Each alert rule can create multiple alert instances. This is exceptionally powerful if you are observing multiple series in a single expression. - -Consider the following PromQL expression: - -```promql -sum by(cpu) ( - rate(node_cpu_seconds_total{mode!="idle"}[1m]) -) -``` - -A rule using this expression will create as many alert instances as the amount of CPUs we are observing after the first evaluation, allowing a single rule to report the status of each CPU. - -{{< figure src="/static/img/docs/alerting/unified/multi-dimensional-alert.png" caption="A multi-dimensional Grafana managed alert rule" >}} diff --git a/docs/sources/alerting/fundamentals/alert-rules/alert-rule-types.md b/docs/sources/alerting/fundamentals/alert-rules/alert-rule-types.md deleted file mode 100644 index dd25109c20d..00000000000 --- a/docs/sources/alerting/fundamentals/alert-rules/alert-rule-types.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/alert-rule-types/ -description: Learn about the different alert rule types that Grafana Alerting supports -keywords: - - grafana - - alerting - - rule types -labels: - products: - - cloud - - enterprise - - oss -title: Alert rule types -weight: 102 ---- - -# Alert rule types - -Grafana supports two different alert rule types. Learn more about each of the alert rule types, how they work, and decide which one is best for your use case. - -## Grafana-managed alert rules - -Grafana-managed alert rules are the most flexible alert rule type. They allow you to create alerts that can act on data from any of our supported data sources. - -In addition to supporting multiple data sources, you can also add expressions to transform your data and set alert conditions. Using images in alert notifications is also supported. This is the only type of rule that allows alerting from multiple data sources in a single rule definition. - -The following diagram shows how Grafana-managed alerting works. - -{{< figure src="/media/docs/alerting/grafana-managed-rule.png" max-width="750px" caption="Grafana-managed alerting" >}} - -1. Alert rules are created within Grafana based on one or more data sources. - -1. Alert rules are evaluated by the Alert Rule Evaluation Engine from within Grafana. - -1. Alerts are delivered using the internal Grafana Alertmanager. - -**Note:** - -You can also configure alerts to be delivered using an external Alertmanager; or use both internal and external alertmanagers. -For more information, see Add an external Alertmanager. - -## Data source-managed alert rules - -To create data source-managed alert rules, you must have a compatible Prometheus or Loki data source. - -You can check if your data source supports rule creation via Grafana by testing the data source and observing if the Ruler API is supported. - -For more information on the Ruler API, refer to [Ruler API](/docs/loki/latest/api/#ruler). - -The following diagram shows how data source-managed alerting works. - -{{< figure src="/media/docs/alerting/loki-mimir-rule.png" max-width="750px" caption="Grafana Mimir/Loki-managed alerting" >}} - -1. Alert rules are created and stored within the data source itself. -1. Alert rules can only be created based on Prometheus data. -1. Alert rule evaluation and delivery is distributed across multiple nodes for high availability and fault tolerance. - -## Choose an alert rule type - -When choosing which alert rule type to use, consider the following comparison between Grafana-managed alert rules and Grafana Mimir or Loki alert rules. - -{{< responsive-table >}} -|
Feature
|
Grafana-managed alert rule
|
Loki/Mimir-managed alert rule | -| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Create alert rules based on data from any of our supported data sources | Yes | No: You can only create alert rules that are based on Prometheus data. The data source must have the Ruler API enabled. | -| Mix and match data sources | Yes | No | -| Includes support for recording rules | No | Yes | -| Add expressions to transform your data and set alert conditions | Yes | No | -| Use images in alert notifications | Yes | No | -| Scaling | More resource intensive, depend on the database, and are likely to suffer from transient errors. They only scale vertically. | Store alert rules within the data source itself and allow for “infinite” scaling. Generate and send alert notifications from the location of your data. | -| Alert rule evaluation and delivery | Alert rule evaluation and delivery is done from within Grafana, using an external Alertmanager; or both. | Alert rule evaluation and alert delivery is distributed, meaning there is no single point of failure. | - -{{< /responsive-table >}} - -**Note:** - -If you are using non-Prometheus data, we recommend choosing Grafana-managed alert rules. Otherwise, choose Grafana Mimir or Grafana Loki alert rules where possible. diff --git a/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md b/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md new file mode 100644 index 00000000000..5317dd7b3b1 --- /dev/null +++ b/docs/sources/alerting/fundamentals/alert-rules/annotation-label.md @@ -0,0 +1,143 @@ +--- +aliases: + - ../../fundamentals/annotation-label/ # /docs/grafana//alerting/fundamentals/annotation-label/ + - ../../fundamentals/annotation-label/labels-and-label-matchers/ # /docs/grafana//alerting/fundamentals/annotation-label/labels-and-label-matchers/ + - ../../fundamentals/annotation-label/how-to-use-labels/ # /docs/grafana//alerting/fundamentals/annotation-label/how-to-use-labels/ + - ../../alerting-rules/alert-annotation-label/ # /docs/grafana//alerting/alerting-rules/alert-annotation-label/ + - ../../unified-alerting/alerting-rules/alert-annotation-label/ # /docs/grafana//alerting/unified-alerting/alerting-rules/alert-annotation-label/ +canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/annotation-label/ +description: Learn how to use annotations and labels to store key information about alerts +keywords: + - grafana + - alerting + - guide + - rules + - create +labels: + products: + - cloud + - enterprise + - oss +title: Labels and annotations +weight: 105 +--- + +# Labels and annotations + +Labels and annotations contain information about an alert. Labels are used to differentiate an alert from all other alerts, while annotations are used to add additional information to an existing alert. + +## Labels + +Labels contain information that identifies an alert. An example of a label might be `server=server1` or `team=backend`. Each alert can have more than one label, and the complete set of labels for an alert is called its label set. It is this label set that identifies the alert. + +For example, an alert might have the label set `{alertname="High CPU usage",server="server1"}` while another alert might have the label set `{alertname="High CPU usage",server="server2"}`. These are two separate alerts because although their `alertname` labels are the same, their `server` labels are different. + +Labels are a fundamental component of alerting: + +- The complete set of labels for an alert is what uniquely identifies an alert within Grafana alerts. +- The alerting UI shows labels for every alert instance generated during evaluation of that rule. +- Contact points can access labels to send notification messages that contain specific alert information. +- The Alertmanager uses labels to match alerts for silences and alert groups in notification policies. + +Note that two alert rules cannot have the same labels. If two alert rules have the same labels such as `foo=bar,bar=baz` and `foo=bar,bar=baz` then one of the alerts will be discarded. + +### How label matching works + +Use labels and label matchers to link alert rules to notification policies and silences. This allows for a flexible way to manage your alert instances, specify which policy should handle them, and which alerts to silence. + +A label matchers consists of 3 distinct parts, the **label**, the **value** and the **operator**. + +- The **Label** field is the name of the label to match. It must exactly match the label name. + +- The **Value** field matches against the corresponding value for the specified **Label** name. How it matches depends on the **Operator** value. + +- The **Operator** field is the operator to match against the label value. The available operators are: + + | Operator | Description | + | -------- | -------------------------------------------------- | + | `=` | Select labels that are exactly equal to the value. | + | `!=` | Select labels that are not equal to the value. | + | `=~` | Select labels that regex-match the value. | + | `!~` | Select labels that do not regex-match the value. | + +If you are using multiple label matchers, they are combined using the AND logical operator. This means that all matchers must match in order to link a rule to a policy. + +{{< collapse title="Label matching example" >}} + +If you define the following set of labels for your alert: + +`{ foo=bar, baz=qux, id=12 }` + +then: + +- A label matcher defined as `foo=bar` matches this alert rule. +- A label matcher defined as `foo!=bar` does _not_ match this alert rule. +- A label matcher defined as `id=~[0-9]+` matches this alert rule. +- A label matcher defined as `baz!~[0-9]+` matches this alert rule. +- Two label matchers defined as `foo=bar` and `id=~[0-9]+` match this alert rule. + +**Exclude labels** + +You can also write label matchers to exclude labels. + +Here is an example that shows how to exclude the label `Team`. You can choose between any of the values below to exclude labels. + +| Label | Operator | Value | +| ------ | -------- | ----- | +| `team` | `=` | `""` | +| `team` | `!~` | `.+` | +| `team` | `=~` | `^$` | + +{{< /collapse >}} + +## Label types + +An alert's label set can contain three types of labels: + +- Labels from the datasource, +- Custom labels specified in the alert rule, +- A series of reserved labels, such as `alertname` or `grafana_folder`. + +### Custom Labels + +Custom labels are additional labels configured manually in the alert rule. + +Ensure the label set for an alert does not have two or more labels with the same name. If a custom label has the same name as a label from the datasource then it will replace that label. However, should a custom label have the same name as a reserved label then the custom label will be omitted from the alert. + +{{< collapse title="Key format" >}} + +Grafana's built-in Alertmanager supports both Unicode label keys and values. If you are using an external Prometheus Alertmanager, label keys must be compatible with their [data model](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels). +This means that label keys must only contain **ASCII letters**, **numbers**, as well as **underscores** and match the regex `[a-zA-Z_][a-zA-Z0-9_]*`. +Any invalid characters will be removed or replaced by the Grafana alerting engine before being sent to the external Alertmanager according to the following rules: + +- `Whitespace` will be removed. +- `ASCII characters` will be replaced with `_`. +- `All other characters` will be replaced with their lower-case hex representation. If this is the first character it will be prefixed with `_`. + +Example: A label key/value pair `Alert! 🔔="🔥"` will become `Alert_0x1f514="🔥"`. + +If multiple label keys are sanitized to the same value, the duplicates will have a short hash of the original label appended as a suffix. + +{{< /collapse >}} + +### Reserved labels + +Reserved labels can be used in the same way as manually configured custom labels. The current list of available reserved labels are: + +| Label | Description | +| -------------- | ----------------------------------------- | +| alert_name | The name of the alert rule. | +| grafana_folder | Title of the folder containing the alert. | + +Labels prefixed with `grafana_` are reserved by Grafana for special use. To stop Grafana Alerting from adding a reserved label, you can disable it via the `disabled_labels` option in [unified_alerting.reserved_labels](/docs/grafana//setup-grafana/configure-grafana#unified_alertingreserved_labels) configuration. + +## Annotations + +Both labels and annotations have the same structure: a set of named values; however their intended uses are different. The purpose of annotations is to add additional information to existing alerts. + +There are a number of suggested annotations in Grafana such as `description`, `summary`, `runbook_url`, `dashboardUId` and `panelId`. Like custom labels, annotations must have a name, and their value can contain a combination of text and template code that is evaluated when an alert is fired. + +{{% docs/reference %}} +[variables-label-annotation]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/templating-labels-annotations" +[variables-label-annotation]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/templating-labels-annotations" +{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/alert-rules/organising-alerts.md b/docs/sources/alerting/fundamentals/alert-rules/organising-alerts.md index 7952929c852..09113a1622e 100644 --- a/docs/sources/alerting/fundamentals/alert-rules/organising-alerts.md +++ b/docs/sources/alerting/fundamentals/alert-rules/organising-alerts.md @@ -1,7 +1,7 @@ --- aliases: - - ../unified-alerting/alerting-rules/edit-cortex-loki-namespace-group/ - - ../unified-alerting/alerting-rules/edit-mimir-loki-namespace-group/ + - ../../unified-alerting/alerting-rules/edit-cortex-loki-namespace-group/ # /docs/grafana//alerting/unified-alerting/alerting-rules/edit-cortex-loki-namespace-group/ + - ../../unified-alerting/alerting-rules/edit-mimir-loki-namespace-group/ # /docs/grafana//alerting/unified-alerting/alerting-rules/edit-mimir-loki-namespace-group/ canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/organising-alerts/ description: Learn about organizing alerts using namespaces, folders, and groups keywords: @@ -14,7 +14,7 @@ labels: - enterprise - oss title: Namespaces, folders, and groups -weight: 105 +weight: 107 --- ## Namespaces, folders, and groups diff --git a/docs/sources/alerting/fundamentals/alert-rules/queries-conditions.md b/docs/sources/alerting/fundamentals/alert-rules/queries-conditions.md new file mode 100644 index 00000000000..41e0f2d2101 --- /dev/null +++ b/docs/sources/alerting/fundamentals/alert-rules/queries-conditions.md @@ -0,0 +1,221 @@ +--- +aliases: + - ../../fundamentals/evaluate-grafana-alerts/ # /docs/grafana//alerting/fundamentals/evaluate-grafana-alerts/ + - ../../unified-alerting/fundamentals/evaluate-grafana-alerts/ # /docs/grafana//alerting/unified-alerting/fundamentals/evaluate-grafana-alerts/ +canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/queries-conditions/ +description: Define queries to get the data you want to measure and conditions that need to be met before an alert rule fires +keywords: + - grafana + - alerting + - queries + - conditions +labels: + products: + - cloud + - enterprise + - oss +title: Queries and conditions +weight: 104 +--- + +# Queries and conditions + +In Grafana, queries play a vital role in fetching and transforming data from supported data sources, which include databases like MySQL and PostgreSQL, time series databases like Prometheus, InfluxDB and Graphite, and services like Elasticsearch, AWS CloudWatch, Azure Monitor and Google Cloud Monitoring. + +For more information on supported data sources, see [Data sources][data-source-alerting]. + +The process of executing a query involves defining the data source, specifying the desired data to retrieve, and applying relevant filters or transformations. Query languages or syntaxes specific to the chosen data source are utilized for constructing these queries. + +In Alerting, you define a query to get the data you want to measure and a condition that needs to be met before an alert rule fires. + +An alert rule consists of one or more queries and expressions that select the data you want to measure. + +For more information on queries and expressions, see [Query and transform data][query-transform-data]. + +## Data source queries + +Queries in Grafana can be applied in various ways, depending on the data source and query language being used. Each data source’s query editor provides a customized user interface that helps you write queries that take advantage of its unique capabilities. + +Because of the differences between query languages, each data source query editor looks and functions differently. Depending on your data source, the query editor might provide auto-completion features, metric names, variable suggestions, or a visual query-building interface. + +Some common types of query components include: + +**Metrics or data fields**: Specify the specific metrics or data fields you want to retrieve, such as CPU usage, network traffic, or sensor readings. + +**Time range**: Define the time range for which you want to fetch data, such as the last hour, a specific day, or a custom time range. + +**Filters**: Apply filters to narrow down the data based on specific criteria, such as filtering data by a specific tag, host, or application. + +**Aggregations**: Perform aggregations on the data to calculate metrics like averages, sums, or counts over a given time period. + +**Grouping**: Group the data by specific dimensions or tags to create aggregated views or breakdowns. + +**Note**: + +Grafana does not support alert queries with template variables. More information is available [here](https://community.grafana.com/t/template-variables-are-not-supported-in-alert-queries-while-setting-up-alert/2514). + +## Expression queries + +In Grafana, an expression is used to perform calculations, transformations, or aggregations on the data source queried data. It allows you to create custom metrics or modify existing metrics based on mathematical operations, functions, or logical expressions. + +By leveraging expression queries, users can perform tasks such as calculating the percentage change between two values, applying functions like logarithmic or trigonometric functions, aggregating data over specific time ranges or dimensions, and implementing conditional logic to handle different scenarios. + +In Alerting, you can only use expressions for Grafana-managed alert rules. For each expression, you can choose from the math, reduce, and resample expressions. These are called multi-dimensional rules, because they generate a separate alert for each series. + +You can also use classic condition, which creates an alert rule that triggers a single alert when its condition is met. As a result, Grafana sends only a single alert even when alert conditions are met for multiple series. + +**Note:** + +Classic conditions exist mainly for compatibility reasons and should be avoided if possible. + +**Reduce** + +Aggregates time series values in the selected time range into a single value. + +**Math** + +Performs free-form math functions/operations on time series and number data. Can be used to preprocess time series data or to define an alert condition for number data. + +**Resample** + +Realigns a time range to a new set of timestamps, this is useful when comparing time series data from different data sources where the timestamps would otherwise not align. + +**Threshold** + +Checks if any time series data matches the threshold condition. + +The threshold expression allows you to compare two single values. It returns `0` when the condition is false and `1` if the condition is true. The following threshold functions are available: + +- Is above (x > y) +- Is below (x < y) +- Is within range (x > y1 AND x < y2) +- Is outside range (x < y1 AND x > y2) + +**Classic condition** + +Checks if any time series data matches the alert condition. + +**Note**: + +Classic condition expression queries always produce one alert instance only, no matter how many time series meet the condition. +Classic conditions exist mainly for compatibility reasons and should be avoided if possible. + +## Aggregations + +Grafana Alerting provides the following aggregation functions to enable you to further refine your query. + +These functions are available for **Reduce** and **Classic condition** expressions only. + +| Function | Expression | What it does | +| ---------------- | ---------------- | ------------------------------------------------------------------------------- | +| avg | Reduce / Classic | Displays the average of the values | +| min | Reduce / Classic | Displays the lowest value | +| max | Reduce / Classic | Displays the highest value | +| sum | Reduce / Classic | Displays the sum of all values | +| count | Reduce / Classic | Counts the number of values in the result | +| last | Reduce / Classic | Displays the last value | +| median | Reduce / Classic | Displays the median value | +| diff | Classic | Displays the difference between the newest and oldest value | +| diff_abs | Classic | Displays the absolute value of diff | +| percent_diff | Classic | Displays the percentage value of the difference between newest and oldest value | +| percent_diff_abs | Classic | Displays the absolute value of percent_diff | +| count_non_null | Classic | Displays a count of values in the result set that aren't `null` | + +## Alert condition + +An alert condition is the query or expression that determines whether the alert will fire or not depending on the value it yields. There can be only one condition which will determine the triggering of the alert. + +After you have defined your queries and/or expressions, choose one of them as the alert rule condition. + +When the queried data satisfies the defined condition, Grafana triggers the associated alert, which can be configured to send notifications through various channels like email, Slack, or PagerDuty. The notifications inform you about the condition being met, allowing you to take appropriate actions or investigate the underlying issue. + +By default, the last expression added is used as the alert condition. + +## Recovery threshold + +{{% admonition type="note" %}} +The recovery threshold feature is currently only available in OSS. +{{% /admonition %}} + +To reduce the noise of flapping alerts, you can set a recovery threshold different to the alert threshold. + +Flapping alerts occur when a metric hovers around the alert threshold condition and may lead to frequent state changes, resulting in too many notifications being generated. + +Grafana-managed alert rules are evaluated for a specific interval of time. During each evaluation, the result of the query is checked against the threshold set in the alert rule. If the value of a metric is above the threshold, an alert rule fires and a notification is sent. When the value goes below the threshold and there is an active alert for this metric, the alert is resolved, and another notification is sent. + +It can be tricky to create an alert rule for a noisy metric. That is, when the value of a metric continually goes above and below a threshold. This is called flapping and results in a series of firing - resolved - firing notifications and a noisy alert state history. + +For example, if you have an alert for latency with a threshold of 1000ms and the number fluctuates around 1000 (say 980 ->1010 -> 990 -> 1020, and so on) then each of those will trigger a notification. + +To solve this problem, you can set a (custom) recovery threshold, which basically means having two thresholds instead of one. An alert is triggered when the first threshold is crossed and is resolved only when the second threshold is crossed. + +For example, you could set a threshold of 1000ms and a recovery threshold of 900ms. This way, an alert rule will only stop firing when it goes under 900ms and flapping is reduced. + +## Alert on numeric data + +Among certain data sources numeric data that is not time series can be directly alerted on, or passed into Server Side Expressions (SSE). This allows for more processing and resulting efficiency within the data source, and it can also simplify alert rules. +When alerting on numeric data instead of time series data, there is no need to reduce each labeled time series into a single number. Instead labeled numbers are returned to Grafana instead. + +### Tabular Data + +This feature is supported with backend data sources that query tabular data: + +- SQL data sources such as MySQL, Postgres, MSSQL, and Oracle. +- The Azure Kusto based services: Azure Monitor (Logs), Azure Monitor (Azure Resource Graph), and Azure Data Explorer. + +A query with Grafana managed alerts or SSE is considered numeric with these data sources, if: + +- The "Format AS" option is set to "Table" in the data source query. +- The table response returned to Grafana from the query includes only one numeric (e.g. int, double, float) column, and optionally additional string columns. + +If there are string columns then those columns become labels. The name of column becomes the label name, and the value for each row becomes the value of the corresponding label. If multiple rows are returned, then each row should be uniquely identified their labels. + +**Example** + +For a MySQL table called "DiskSpace": + +| Time | Host | Disk | PercentFree | +| ----------- | ---- | ---- | ----------- | +| 2021-June-7 | web1 | /etc | 3 | +| 2021-June-7 | web2 | /var | 4 | +| 2021-June-7 | web3 | /var | 8 | +| ... | ... | ... | ... | + +You can query the data filtering on time, but without returning the time series to Grafana. For example, an alert that would trigger per Host, Disk when there is less than 5% free space: + +```sql +SELECT Host, Disk, CASE WHEN PercentFree < 5.0 THEN PercentFree ELSE 0 END FROM ( + SELECT + Host, + Disk, + Avg(PercentFree) + FROM DiskSpace + Group By + Host, + Disk + Where __timeFilter(Time) +``` + +This query returns the following Table response to Grafana: + +| Host | Disk | PercentFree | +| ---- | ---- | ----------- | +| web1 | /etc | 3 | +| web2 | /var | 4 | +| web3 | /var | 0 | + +When this query is used as the **condition** in an alert rule, then the non-zero will be alerting. As a result, three alert instances are produced: + +| Labels | Status | +| --------------------- | -------- | +| {Host=web1,disk=/etc} | Alerting | +| {Host=web2,disk=/var} | Alerting | +| {Host=web3,disk=/var} | Normal | + +{{% docs/reference %}} +[data-source-alerting]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules#supported-data-sources" +[data-source-alerting]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules#supported-data-sources" + +[query-transform-data]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data" +[query-transform-data]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data" +{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/alert-rules/queries-conditions/_index.md b/docs/sources/alerting/fundamentals/alert-rules/queries-conditions/_index.md deleted file mode 100644 index c4191ad3844..00000000000 --- a/docs/sources/alerting/fundamentals/alert-rules/queries-conditions/_index.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/queries-conditions/ -description: Define queries to get the data you want to measure and conditions that need to be met before an alert rule fires -keywords: - - grafana - - alerting - - queries - - conditions -labels: - products: - - cloud - - enterprise - - oss -title: Queries and conditions -weight: 104 ---- - -# Queries and conditions - -In Grafana, queries play a vital role in fetching and transforming data from supported data sources, which include databases like MySQL and PostgreSQL, time series databases like Prometheus, InfluxDB and Graphite, and services like Elasticsearch, AWS CloudWatch, Azure Monitor and Google Cloud Monitoring. - -For more information on supported data sources, see [Data sources][data-source-alerting]. - -The process of executing a query involves defining the data source, specifying the desired data to retrieve, and applying relevant filters or transformations. Query languages or syntaxes specific to the chosen data source are utilized for constructing these queries. - -In Alerting, you define a query to get the data you want to measure and a condition that needs to be met before an alert rule fires. - -An alert rule consists of one or more queries and expressions that select the data you want to measure. - -For more information on queries and expressions, see [Query and transform data][query-transform-data]. - -## Data source queries - -Queries in Grafana can be applied in various ways, depending on the data source and query language being used. Each data source’s query editor provides a customized user interface that helps you write queries that take advantage of its unique capabilities. - -Because of the differences between query languages, each data source query editor looks and functions differently. Depending on your data source, the query editor might provide auto-completion features, metric names, variable suggestions, or a visual query-building interface. - -Some common types of query components include: - -**Metrics or data fields**: Specify the specific metrics or data fields you want to retrieve, such as CPU usage, network traffic, or sensor readings. - -**Time range**: Define the time range for which you want to fetch data, such as the last hour, a specific day, or a custom time range. - -**Filters**: Apply filters to narrow down the data based on specific criteria, such as filtering data by a specific tag, host, or application. - -**Aggregations**: Perform aggregations on the data to calculate metrics like averages, sums, or counts over a given time period. - -**Grouping**: Group the data by specific dimensions or tags to create aggregated views or breakdowns. - -**Note**: - -Grafana does not support alert queries with template variables. More information is available [here](https://community.grafana.com/t/template-variables-are-not-supported-in-alert-queries-while-setting-up-alert/2514). - -## Expression queries - -In Grafana, an expression is used to perform calculations, transformations, or aggregations on the data source queried data. It allows you to create custom metrics or modify existing metrics based on mathematical operations, functions, or logical expressions. - -By leveraging expression queries, users can perform tasks such as calculating the percentage change between two values, applying functions like logarithmic or trigonometric functions, aggregating data over specific time ranges or dimensions, and implementing conditional logic to handle different scenarios. - -In Alerting, you can only use expressions for Grafana-managed alert rules. For each expression, you can choose from the math, reduce, and resample expressions. These are called multi-dimensional rules, because they generate a separate alert for each series. - -You can also use classic condition, which creates an alert rule that triggers a single alert when its condition is met. As a result, Grafana sends only a single alert even when alert conditions are met for multiple series. - -**Note:** - -Classic conditions exist mainly for compatibility reasons and should be avoided if possible. - -**Reduce** - -Aggregates time series values in the selected time range into a single value. - -**Math** - -Performs free-form math functions/operations on time series and number data. Can be used to preprocess time series data or to define an alert condition for number data. - -**Resample** - -Realigns a time range to a new set of timestamps, this is useful when comparing time series data from different data sources where the timestamps would otherwise not align. - -**Threshold** - -Checks if any time series data matches the threshold condition. - -The threshold expression allows you to compare two single values. It returns `0` when the condition is false and `1` if the condition is true. The following threshold functions are available: - -- Is above (x > y) -- Is below (x < y) -- Is within range (x > y1 AND x < y2) -- Is outside range (x < y1 AND x > y2) - -**Classic condition** - -Checks if any time series data matches the alert condition. - -**Note**: - -Classic condition expression queries always produce one alert instance only, no matter how many time series meet the condition. -Classic conditions exist mainly for compatibility reasons and should be avoided if possible. - -## Aggregations - -Grafana Alerting provides the following aggregation functions to enable you to further refine your query. - -These functions are available for **Reduce** and **Classic condition** expressions only. - -| Function | Expression | What it does | -| ---------------- | ---------------- | ------------------------------------------------------------------------------- | -| avg | Reduce / Classic | Displays the average of the values | -| min | Reduce / Classic | Displays the lowest value | -| max | Reduce / Classic | Displays the highest value | -| sum | Reduce / Classic | Displays the sum of all values | -| count | Reduce / Classic | Counts the number of values in the result | -| last | Reduce / Classic | Displays the last value | -| median | Reduce / Classic | Displays the median value | -| diff | Classic | Displays the difference between the newest and oldest value | -| diff_abs | Classic | Displays the absolute value of diff | -| percent_diff | Classic | Displays the percentage value of the difference between newest and oldest value | -| percent_diff_abs | Classic | Displays the absolute value of percent_diff | -| count_non_null | Classic | Displays a count of values in the result set that aren't `null` | - -## Alert condition - -An alert condition is the query or expression that determines whether the alert will fire or not depending on the value it yields. There can be only one condition which will determine the triggering of the alert. - -After you have defined your queries and/or expressions, choose one of them as the alert rule condition. - -When the queried data satisfies the defined condition, Grafana triggers the associated alert, which can be configured to send notifications through various channels like email, Slack, or PagerDuty. The notifications inform you about the condition being met, allowing you to take appropriate actions or investigate the underlying issue. - -By default, the last expression added is used as the alert condition. - -## Recovery threshold - -{{% admonition type="note" %}} -The recovery threshold feature is currently only available in OSS. -{{% /admonition %}} - -To reduce the noise of flapping alerts, you can set a recovery threshold different to the alert threshold. - -Flapping alerts occur when a metric hovers around the alert threshold condition and may lead to frequent state changes, resulting in too many notifications being generated. - -Grafana-managed alert rules are evaluated for a specific interval of time. During each evaluation, the result of the query is checked against the threshold set in the alert rule. If the value of a metric is above the threshold, an alert rule fires and a notification is sent. When the value goes below the threshold and there is an active alert for this metric, the alert is resolved, and another notification is sent. - -It can be tricky to create an alert rule for a noisy metric. That is, when the value of a metric continually goes above and below a threshold. This is called flapping and results in a series of firing - resolved - firing notifications and a noisy alert state history. - -For example, if you have an alert for latency with a threshold of 1000ms and the number fluctuates around 1000 (say 980 ->1010 -> 990 -> 1020, and so on) then each of those will trigger a notification. - -To solve this problem, you can set a (custom) recovery threshold, which basically means having two thresholds instead of one. An alert is triggered when the first threshold is crossed and is resolved only when the second threshold is crossed. - -For example, you could set a threshold of 1000ms and a recovery threshold of 900ms. This way, an alert rule will only stop firing when it goes under 900ms and flapping is reduced. - -{{% docs/reference %}} -[data-source-alerting]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/data-source-alerting" -[data-source-alerting]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/data-source-alerting" - -[query-transform-data]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data" -[query-transform-data]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/query-transform-data" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/alert-rules/recording-rules/_index.md b/docs/sources/alerting/fundamentals/alert-rules/recording-rules/_index.md deleted file mode 100644 index 3065ca94086..00000000000 --- a/docs/sources/alerting/fundamentals/alert-rules/recording-rules/_index.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/recording-rules/ -description: Create recording rules to pre-compute frequently needed or computationally expensive expressions and save the result as a new set of time series -keywords: - - grafana - - alerting - - recording rules -labels: - products: - - cloud - - enterprise - - oss -title: Recording rules -weight: 103 ---- - -# Recording rules - -_Recording rules are only available for compatible Prometheus or Loki data sources._ - -A recording rule allows you to pre-compute frequently needed or computationally expensive expressions and save their result as a new set of time series. This is useful if you want to run alerts on aggregated data or if you have dashboards that query computationally expensive expressions repeatedly. - -Querying this new time series is faster, especially for dashboards since they query the same expression every time the dashboards refresh. - -Grafana Enterprise offers an alternative to recorded rules in the form of recorded queries that can be executed against any data source. - -For more information on recording rules in Prometheus, refer to [recording rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/). diff --git a/docs/sources/alerting/fundamentals/alert-rules/rule-evaluation.md b/docs/sources/alerting/fundamentals/alert-rules/rule-evaluation.md new file mode 100644 index 00000000000..a34a508601c --- /dev/null +++ b/docs/sources/alerting/fundamentals/alert-rules/rule-evaluation.md @@ -0,0 +1,72 @@ +--- +canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/rule-evaluation/ +description: Use alert rule evaluation to determine how frequently an alert rule should be evaluated and how quickly it should change its state +keywords: + - grafana + - alerting + - evaluation +labels: + products: + - cloud + - enterprise + - oss +title: Alert rule evaluation +weight: 108 +--- + +# Alert rule evaluation + +Use alert rule evaluation to determine how frequently an alert rule should be evaluated and how quickly it should change its state. + +To do this, you need to make sure that your alert rule is in the right evaluation group and set a pending period time that works best for your use case. + +## Evaluation group + +Every alert rule is part of an evaluation group. Each evaluation group contains an evaluation interval that determines how frequently the alert rule is checked. + +**Data-source managed** alert rules within the same group are evaluated one after the other, while alert rules in different groups can be evaluated simultaneously. This feature is especially useful when you want to ensure that recording rules are evaluated before any alert rules. + +**Grafana-managed** alert rules are evaluated at the same time, regardless of alert rule group. The default evaluation interval is set at 10 seconds, which means that Grafana-managed alert rules are evaluated every 10 seconds to the closest 10-second window on the clock, for example, 10:00:00, 10:00:10, 10:00:20, and so on. You can also configure your own evaluation interval, if required. + +**Note:** + +Evaluation groups and alerts grouping in notification policies are two separate things. Grouping in notification policies allows multiple alerts sharing the same labels to be sent in the same time message. + +## Pending period + +By setting a pending period, you can avoid unnecessary alerts for temporary problems. + +In the pending period, you select the period in which an alert rule can be in breach of the condition until it fires. + +**Example** + +Imagine you have an alert rule evaluation interval set at every 30 seconds and the pending period to 90 seconds. + +Evaluation will occur as follows: + +[00:30] First evaluation - condition not met. + +[01:00] Second evaluation - condition breached. +Pending counter starts. **Alert starts pending.** + +[01:30] Third evaluation - condition breached. Pending counter = 30s. **Pending state.** + +[02:00] Fourth evaluation - condition breached. Pending counter = 60s **Pending state.** + +[02:30] Fifth evaluation - condition breached. Pending counter = 90s. **Alert starts firing** + +If the alert rule has a condition that needs to be in breach for a certain amount of time before it takes action, then its state changes as follows: + +- When the condition is first breached, the rule goes into a "pending" state. + +- The rule stays in the "pending" state until the condition has been broken for the required amount of time - pending period. + +- Once the required time has passed, the rule goes into a "firing" state. + +- If the condition is no longer broken during the pending period, the rule goes back to its normal state. + +**Note:** + +If you want to skip the pending state, you can simply set the pending period to 0. This effectively skips the pending period and your alert rule will start firing as soon as the condition is breached. + +When an alert rule fires, alert instances are produced, which are then sent to the Alertmanager. diff --git a/docs/sources/alerting/fundamentals/alert-rules/rule-evaluation/_index.md b/docs/sources/alerting/fundamentals/alert-rules/rule-evaluation/_index.md deleted file mode 100644 index c5250a07eb7..00000000000 --- a/docs/sources/alerting/fundamentals/alert-rules/rule-evaluation/_index.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/rule-evaluation/ -description: Use alert rule evaluation to determine how frequently an alert rule should be evaluated and how quickly it should change its state -keywords: - - grafana - - alerting - - evaluation -labels: - products: - - cloud - - enterprise - - oss -title: Alert rule evaluation -weight: 106 ---- - -# Alert rule evaluation - -Use alert rule evaluation to determine how frequently an alert rule should be evaluated and how quickly it should change its state. - -To do this, you need to make sure that your alert rule is in the right evaluation group and set a pending period time that works best for your use case. - -## Evaluation group - -Every alert rule is part of an evaluation group. Each evaluation group contains an evaluation interval that determines how frequently the alert rule is checked. - -**Data-source managed** alert rules within the same group are evaluated one after the other, while alert rules in different groups can be evaluated simultaneously. This feature is especially useful when you want to ensure that recording rules are evaluated before any alert rules. - -**Grafana-managed** alert rules are evaluated at the same time, regardless of alert rule group. The default evaluation interval is set at 10 seconds, which means that Grafana-managed alert rules are evaluated every 10 seconds to the closest 10-second window on the clock, for example, 10:00:00, 10:00:10, 10:00:20, and so on. You can also configure your own evaluation interval, if required. - -**Note:** - -Evaluation groups and alerts grouping in notification policies are two separate things. Grouping in notification policies allows multiple alerts sharing the same labels to be sent in the same time message. - -## Pending period - -By setting a pending period, you can avoid unnecessary alerts for temporary problems. - -In the pending period, you select the period in which an alert rule can be in breach of the condition until it fires. - -**Example** - -Imagine you have an alert rule evaluation interval set at every 30 seconds and the pending period to 90 seconds. - -Evaluation will occur as follows: - -[00:30] First evaluation - condition not met. - -[01:00] Second evaluation - condition breached. -Pending counter starts. **Alert starts pending.** - -[01:30] Third evaluation - condition breached. Pending counter = 30s. **Pending state.** - -[02:00] Fourth evaluation - condition breached. Pending counter = 60s **Pending state.** - -[02:30] Fifth evaluation - condition breached. Pending counter = 90s. **Alert starts firing** - -If the alert rule has a condition that needs to be in breach for a certain amount of time before it takes action, then its state changes as follows: - -- When the condition is first breached, the rule goes into a "pending" state. - -- The rule stays in the "pending" state until the condition has been broken for the required amount of time - pending period. - -- Once the required time has passed, the rule goes into a "firing" state. - -- If the condition is no longer broken during the pending period, the rule goes back to its normal state. - -**Note:** - -If you want to skip the pending state, you can simply set the pending period to 0. This effectively skips the pending period and your alert rule will start firing as soon as the condition is breached. - -When an alert rule fires, alert instances are produced, which are then sent to the Alertmanager. diff --git a/docs/sources/alerting/fundamentals/alert-rules/state-and-health.md b/docs/sources/alerting/fundamentals/alert-rules/state-and-health.md index aebbce8ecc2..06ab9b8f2f0 100644 --- a/docs/sources/alerting/fundamentals/alert-rules/state-and-health.md +++ b/docs/sources/alerting/fundamentals/alert-rules/state-and-health.md @@ -1,6 +1,7 @@ --- aliases: - - ../unified-alerting/alerting-rules/state-and-health/ + - ../../fundamentals/state-and-health/ # /docs/grafana//alerting/fundamentals/state-and-health/ + - ../../unified-alerting/alerting-rules/state-and-health/ # /docs/grafana//alerting/unified-alerting/alerting-rules/state-and-health canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/state-and-health/ description: Learn about the state and health of alert rules to understand several key status indicators about your alerts keywords: @@ -15,7 +16,7 @@ labels: - enterprise - oss title: State and health of alert rules -weight: 405 +weight: 109 --- # State and health of alert rules @@ -28,11 +29,13 @@ There are three key components: [alert rule state](#alert-rule-state), [alert in An alert rule can be in either of the following states: -| State | Description | -| ----------- | ---------------------------------------------------------------------------------------------- | -| **Normal** | None of the time series returned by the evaluation engine is in a `Pending` or `Firing` state. | -| **Pending** | At least one time series returned by the evaluation engine is `Pending`. | -| **Firing** | At least one time series returned by the evaluation engine is `Firing`. | +| State | Description | +| ----------- | -------------------------------------------------------------------------------------------------- | +| **Normal** | None of the alert instances returned by the evaluation engine is in a `Pending` or `Firing` state. | +| **Pending** | At least one alert instances returned by the evaluation engine is `Pending`. | +| **Firing** | At least one alert instances returned by the evaluation engine is `Firing`. | + +The alert rule state is determined by the “worst case” state of the alert instances produced. For example, if one alert instance is firing, the alert rule state will also be firing. {{% admonition type="note" %}} Alerts will transition first to `pending` and then `firing`, thus it will take at least two evaluation cycles before an alert is fired. diff --git a/docs/sources/alerting/fundamentals/alertmanager.md b/docs/sources/alerting/fundamentals/alertmanager.md deleted file mode 100644 index 9bdd9fbb082..00000000000 --- a/docs/sources/alerting/fundamentals/alertmanager.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -aliases: - - ../fundamentals/alertmanager/ - - ../metrics/ - - ../unified-alerting/fundamentals/alertmanager/ - - alerting/manage-notifications/alertmanager/ -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alertmanager/ -description: Learn about Alertmanagers and the Alertmanager options for Grafana Alerting -labels: - products: - - cloud - - enterprise - - oss -title: Alertmanager -weight: 140 ---- - -# Alertmanager - -Alertmanager enables you to quickly and efficiently manage and respond to alerts. It receives alerts, handles silencing, inhibition, grouping, and routing by sending notifications out via your channel of choice, for example, email or Slack. - -In Grafana, you can use the Cloud Alertmanager, Grafana Alertmanager, or an external Alertmanager. You can also run multiple Alertmanagers; your decision depends on your set up and where your alerts are being generated. - -**Cloud Alertmanager** - -Cloud Alertmanager runs in Grafana Cloud and it can receive alerts from Grafana, Mimir, and Loki. - -**Grafana Alertmanager** - -Grafana Alertmanager is an internal Alertmanager that is pre-configured and available for selection by default if you run Grafana on-premises or open-source. - -The Grafana Alertmanager can receive alerts from Grafana, but it cannot receive alerts from outside Grafana, for example, from Mimir or Loki. - -**Note that inhibition rules are not supported in the Grafana Alertmanager.** - -**External Alertmanager** - -If you want to use a single Alertmanager to receive all your Grafana, Loki, Mimir, and Prometheus alerts, you can set up Grafana to use an external Alertmanager. This external Alertmanager can be configured and administered from within Grafana itself. - -Here are two examples of when you may want to configure your own external alertmanager and send your alerts there instead of the Grafana Alertmanager: - -1. You may already have Alertmanagers on-premises in your own Cloud infrastructure that you have set up and still want to use, because you have other alert generators, such as Prometheus. - -2. You want to use both Prometheus on-premises and hosted Grafana to send alerts to the same Alertmanager that runs in your Cloud infrastructure. - -Alertmanagers are visible from the drop-down menu on the Alerting Contact Points, Notification Policies, and Silences pages. - -If you are provisioning your data source, set the flag `handleGrafanaManagedAlerts` in the `jsonData` field to `true` to send Grafana-managed alerts to this Alertmanager. - -**Useful links** - -[Prometheus Alertmanager documentation](https://prometheus.io/docs/alerting/latest/alertmanager/) - -[Add an external Alertmanager][configure-alertmanager] - -{{% docs/reference %}} -[configure-alertmanager]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/configure-alertmanager" -[configure-alertmanager]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/configure-alertmanager" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/annotation-label/_index.md b/docs/sources/alerting/fundamentals/annotation-label/_index.md deleted file mode 100644 index 690902b7cc9..00000000000 --- a/docs/sources/alerting/fundamentals/annotation-label/_index.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -aliases: - - ../alerting-rules/alert-annotation-label/ - - ../unified-alerting/alerting-rules/alert-annotation-label/ -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/annotation-label/ -description: Learn how to use annotations and labels to store key information about alerts -keywords: - - grafana - - alerting - - guide - - rules - - create -labels: - products: - - cloud - - enterprise - - oss -title: Labels and annotations -weight: 120 ---- - -# Labels and annotations - -Labels and annotations contain information about an alert. Both labels and annotations have the same structure: a set of named values; however their intended uses are different. An example of label, or the equivalent annotation, might be `alertname="test"`. - -The main difference between a label and an annotation is that labels are used to differentiate an alert from all other alerts, while annotations are used to add additional information to an existing alert. - -For example, consider two high CPU alerts: one for `server1` and another for `server2`. In such an example we might have a label called `server` where the first alert has the label `server="server1"` and the second alert has the label `server="server2"`. However, we might also want to add a description to each alert such as `"The CPU usage for server1 is above 75%."`, where `server1` and `75%` are replaced with the name and CPU usage of the server (please refer to the documentation on [templating labels and annotations][variables-label-annotation] for how to do this). This kind of description would be more suitable as an annotation. - -## Labels - -Labels contain information that identifies an alert. An example of a label might be `server=server1`. Each alert can have more than one label, and the complete set of labels for an alert is called its label set. It is this label set that identifies the alert. - -For example, an alert might have the label set `{alertname="High CPU usage",server="server1"}` while another alert might have the label set `{alertname="High CPU usage",server="server2"}`. These are two separate alerts because although their `alertname` labels are the same, their `server` labels are different. - -The label set for an alert is a combination of the labels from the datasource, custom labels from the alert rule, and a number of reserved labels such as `alertname`. - -### Custom Labels - -Custom labels are additional labels from the alert rule. Like annotations, custom labels must have a name, and their value can contain a combination of text and template code that is evaluated when an alert is fired. Documentation on how to template custom labels can be found [here][variables-label-annotation]. - -When using custom labels with templates it is important to make sure that the label value does not change between consecutive evaluations of the alert rule as this will end up creating large numbers of distinct alerts. However, it is OK for the template to produce different label values for different alerts. For example, do not put the value of the query in a custom label as this will end up creating a new set of alerts each time the value changes. Instead use annotations. - -It is also important to make sure that the label set for an alert does not have two or more labels with the same name. If a custom label has the same name as a label from the datasource then it will replace that label. However, should a custom label have the same name as a reserved label then the custom label will be omitted from the alert. - -## Annotations - -Annotations are named pairs that add additional information to existing alerts. There are a number of suggested annotations in Grafana such as `description`, `summary`, `runbook_url`, `dashboardUId` and `panelId`. Like custom labels, annotations must have a name, and their value can contain a combination of text and template code that is evaluated when an alert is fired. If an annotation contains template code, the template is evaluated once when the alert is fired. It is not re-evaluated, even when the alert is resolved. Documentation on how to template annotations can be found [here][variables-label-annotation]. - -{{% docs/reference %}} -[variables-label-annotation]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/annotation-label/variables-label-annotation" -[variables-label-annotation]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/annotation-label/variables-label-annotation" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/annotation-label/how-to-use-labels.md b/docs/sources/alerting/fundamentals/annotation-label/how-to-use-labels.md deleted file mode 100644 index f287f23a7a0..00000000000 --- a/docs/sources/alerting/fundamentals/annotation-label/how-to-use-labels.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/annotation-label/how-to-use-labels/ -description: Learn how to use labels to link alert rules to notification policies and silences -keywords: - - grafana - - alerting - - guide - - fundamentals -labels: - products: - - cloud - - enterprise - - oss -title: Labels in Grafana Alerting -weight: 117 ---- - -# Labels in Grafana Alerting - -This topic explains why labels are a fundamental component of alerting. - -- The complete set of labels for an alert is what uniquely identifies an alert within Grafana alerts. -- The Alertmanager uses labels to match alerts for silences and alert groups in notification policies. -- The alerting UI shows labels for every alert instance generated during evaluation of that rule. -- Contact points can access labels to dynamically generate notifications that contain information specific to the alert that is resulting in a notification. -- You can add labels to an [alerting rule][alerting-rules]. Labels are manually configurable, use template functions, and can reference other labels. Labels added to an alerting rule take precedence in the event of a collision between labels (except in the case of [Grafana reserved labels](#grafana-reserved-labels)). - -{{< figure src="/static/img/docs/alerting/unified/rule-edit-details-8-0.png" max-width="550px" caption="Alert details" >}} - -## External Alertmanager Compatibility - -Grafana's built-in Alertmanager supports both Unicode label keys and values. If you are using an external Prometheus Alertmanager, label keys must be compatible with their [data model](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels). -This means that label keys must only contain **ASCII letters**, **numbers**, as well as **underscores** and match the regex `[a-zA-Z_][a-zA-Z0-9_]*`. -Any invalid characters will be removed or replaced by the Grafana alerting engine before being sent to the external Alertmanager according to the following rules: - -- `Whitespace` will be removed. -- `ASCII characters` will be replaced with `_`. -- `All other characters` will be replaced with their lower-case hex representation. If this is the first character it will be prefixed with `_`. - -Example: A label key/value pair `Alert! 🔔="🔥"` will become `Alert_0x1f514="🔥"`. - -**Note** If multiple label keys are sanitized to the same value, the duplicates will have a short hash of the original label appended as a suffix. - -## Grafana reserved labels - -{{% admonition type="note" %}} -Labels prefixed with `grafana_` are reserved by Grafana for special use. If a manually configured label is added beginning with `grafana_` it may be overwritten in case of collision. -To stop the Grafana Alerting engine from adding a reserved label, you can disable it via the `disabled_labels` option in [unified_alerting.reserved_labels][unified-alerting-reserved-labels] configuration. -{{% /admonition %}} - -Grafana reserved labels can be used in the same way as manually configured labels. The current list of available reserved labels are: - -| Label | Description | -| -------------- | ----------------------------------------- | -| grafana_folder | Title of the folder containing the alert. | - -{{% docs/reference %}} -[alerting-rules]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules" -[alerting-rules]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules" - -[unified-alerting-reserved-labels]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-grafana#unified_alertingreserved_labels" -[unified-alerting-reserved-labels]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-grafana#unified_alertingreserved_labels" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/annotation-label/labels-and-label-matchers.md b/docs/sources/alerting/fundamentals/annotation-label/labels-and-label-matchers.md deleted file mode 100644 index 44f780fb17e..00000000000 --- a/docs/sources/alerting/fundamentals/annotation-label/labels-and-label-matchers.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/annotation-label/labels-and-label-matchers/ -description: Learn how to use label matchers to link alert rules to notification policies and silences -keywords: - - grafana - - alerting - - guide - - fundamentals -labels: - products: - - cloud - - enterprise - - oss -menuTitle: Label matchers -title: How label matching works -weight: 117 ---- - -# How label matching works - -Use labels and label matchers to link alert rules to notification policies and silences. This allows for a very flexible way to manage your alert instances, specify which policy should handle them, and which alerts to silence. - -A label matchers consists of 3 distinct parts, the **label**, the **value** and the **operator**. - -- The **Label** field is the name of the label to match. It must exactly match the label name. - -- The **Value** field matches against the corresponding value for the specified **Label** name. How it matches depends on the **Operator** value. - -- The **Operator** field is the operator to match against the label value. The available operators are: - -| Operator | Description | -| -------- | -------------------------------------------------- | -| `=` | Select labels that are exactly equal to the value. | -| `!=` | Select labels that are not equal to the value. | -| `=~` | Select labels that regex-match the value. | -| `!~` | Select labels that do not regex-match the value. | - -If you are using multiple label matchers, they are combined using the AND logical operator. This means that all matchers must match in order to link a rule to a policy. - -## Example scenario - -If you define the following set of labels for your alert: - -`{ foo=bar, baz=qux, id=12 }` - -then: - -- A label matcher defined as `foo=bar` matches this alert rule. -- A label matcher defined as `foo!=bar` does _not_ match this alert rule. -- A label matcher defined as `id=~[0-9]+` matches this alert rule. -- A label matcher defined as `baz!~[0-9]+` matches this alert rule. -- Two label matchers defined as `foo=bar` and `id=~[0-9]+` match this alert rule. - -## Exclude labels - -You can also write label matchers to exclude labels. - -Here is an example that shows how to exclude the label `Team`. You can choose between any of the values below to exclude labels. - -| Label | Operator | Value | -| ------ | -------- | ----- | -| `team` | `=` | `""` | -| `team` | `!~` | `.+` | -| `team` | `=~` | `^$` | diff --git a/docs/sources/alerting/fundamentals/annotation-label/variables-label-annotation.md b/docs/sources/alerting/fundamentals/annotation-label/variables-label-annotation.md deleted file mode 100644 index c3d67b9eac6..00000000000 --- a/docs/sources/alerting/fundamentals/annotation-label/variables-label-annotation.md +++ /dev/null @@ -1,450 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/annotation-label/variables-label-annotation/ -description: Learn about how to template labels and annotations -keywords: - - grafana - - alerting - - templating - - labels - - annotations -labels: - products: - - cloud - - enterprise - - oss -title: Templating labels and annotations -weight: 117 ---- - -# Templating labels and annotations - -You can use templates to include data from queries and expressions in labels and annotations. For example, you might want to set the severity label for an alert based on the value of the query, or use the instance label from the query in a summary annotation so you know which server is experiencing high CPU usage. - -All templates should be written in [text/template](https://pkg.go.dev/text/template). Regardless of whether you are templating a label or an annotation, you should write each template inline inside the label or annotation that you are templating. This means you cannot share templates between labels and annotations, and instead you will need to copy templates wherever you want to use them. - -Each template is evaluated whenever the alert rule is evaluated, and is evaluated for every alert separately. For example, if your alert rule has a templated summary annotation, and the alert rule has 10 firing alerts, then the template will be executed 10 times, once for each alert. You should try to avoid doing expensive computations in your templates as much as possible. - -## Examples - -Rather than write a complete tutorial on text/template, the following examples attempt to show the most common use-cases we have seen for templates. You can use these examples verbatim, or adapt them as necessary for your use case. For more information on how to write text/template refer to the [text/template](https://pkg.go.dev/text/template) documentation. - -### Print all labels, comma separated - -To print all labels, comma separated, print the `$labels` variable: - -``` -{{ $labels }} -``` - -For example, given an alert with the labels `alertname=High CPU usage`, `grafana_folder=CPU alerts` and `instance=server1`, this would print: - -``` -alertname=High CPU usage, grafana_folder=CPU alerts, instance=server1 -``` - -> If you are using classic conditions then `$labels` will not contain any labels from the query. Refer to [the $labels variable](#the-labels-variable) for more information. - -### Print all labels, one per line - -To print all labels, one per line, use a `range` to iterate over each key/value pair and print them individually. Here `$k` refers to the name and `$v` refers to the value of the current label: - -``` -{{ range $k, $v := $labels -}} -{{ $k }}={{ $v }} -{{ end }} -``` - -For example, given an alert with the labels `alertname=High CPU usage`, `grafana_folder=CPU alerts` and `instance=server1`, this would print: - -``` -alertname=High CPU usage -grafana_folder=CPU alerts -instance=server1 -``` - -> If you are using classic conditions then `$labels` will not contain any labels from the query. Refer to [the $labels variable](#the-labels-variable) for more information. - -### Print an individual label - -To print an individual label use the `index` function with the `$labels` variable: - -``` -The host {{ index $labels "instance" }} has exceeded 80% CPU usage for the last 5 minutes -``` - -For example, given an alert with the labels `instance=server1`, this would print: - -``` -The host server1 has exceeded 80% CPU usage for the last 5 minutes -``` - -> If you are using classic conditions then `$labels` will not contain any labels from the query. Refer to [the $labels variable](#the-labels-variable) for more information. - -### Print the value of a query - -To print the value of an instant query you can print its Ref ID using the `index` function and the `$values` variable: - -``` -{{ index $values "A" }} -``` - -For example, given an instant query that returns the value 81.2345, this will print: - -``` -81.2345 -``` - -To print the value of a range query you must first reduce it from a time series to an instant vector with a reduce expression. You can then print the result of the reduce expression by using its Ref ID instead. For example, if the reduce expression takes the average of A and has the Ref ID B you would write: - -``` -{{ index $values "B" }} -``` - -### Print the humanized value of a query - -To print the humanized value of an instant query use the `humanize` function: - -``` -{{ humanize (index $values "A").Value }} -``` - -For example, given an instant query that returns the value 81.2345, this will print: - -``` -81.234 -``` - -To print the humanized value of a range query you must first reduce it from a time series to an instant vector with a reduce expression. You can then print the result of the reduce expression by using its Ref ID instead. For example, if the reduce expression takes the average of A and has the Ref ID B you would write: - -``` -{{ humanize (index $values "B").Value }} -``` - -### Print the value of a query as a percentage - -To print the value of an instant query as a percentage use the `humanizePercentage` function: - -``` -{{ humanizePercentage (index $values "A").Value }} -``` - -This function expects the value to be a decimal number between 0 and 1. If the value is instead a decimal number between 0 and 100 you can either divide it by 100 in your query or using a math expression. If the query is a range query you must first reduce it from a time series to an instant vector with a reduce expression. - -### Set a severity from the value of a query - -To set a severity label from the value of a query use an if statement and the greater than comparison function. Make sure to use decimals (`80.0`, `50.0`, `0.0`, etc) when doing comparisons against `$values` as text/template does not support type coercion. You can find a list of all the supported comparison functions [here](https://pkg.go.dev/text/template#hdr-Functions). - -``` -{{ if (gt $values.A.Value 80.0) -}} -high -{{ else if (gt $values.A.Value 50.0) -}} -medium -{{ else -}} -low -{{- end }} -``` - -### Print all labels from a classic condition - -You cannot use `$labels` to print labels from the query if you are using classic conditions, and must use `$values` instead. The reason for this is classic conditions discard these labels to enforce uni-dimensional behavior (at most one alert per alert rule). If classic conditions didn't discard these labels, then queries that returned many time series would cause alerts to flap between firing and resolved constantly as the labels would change every time the alert rule was evaluated. - -Instead, the `$values` variable contains the reduced values of all time series for all conditions that are firing. For example, if you have an alert rule with a query A that returns two time series, and a classic condition B with two conditions, then `$values` would contain `B0`, `B1`, `B2` and `B3`. If the classic condition B had just one condition, then `$values` would contain just `B0` and `B1`. - -To print all labels of all firing time series use the following template (make sure to replace `B` in the regular expression with the Ref ID of the classic condition if it's different): - -``` -{{ range $k, $v := $values -}} -{{ if (match "B[0-9]+" $k) -}} -{{ $k }}: {{ $v.Labels }}{{ end }} -{{ end }} -``` - -For example, a classic condition for two time series exceeding a single condition would print: - -``` -B0: instance=server1 -B1: instance=server2 -``` - -If the classic condition has two or more conditions, and a time series exceeds multiple conditions at the same time, then its labels will be duplicated for each condition that is exceeded: - -``` -B0: instance=server1 -B1: instance=server2 -B2: instance=server1 -B3: instance=server2 -``` - -If you need to print unique labels you should consider changing your alert rules from uni-dimensional to multi-dimensional instead. You can do this by replacing your classic condition with reduce and math expressions. - -### Print all values from a classic condition - -To print all values from a classic condition take the previous example and replace `$v.Labels` with `$v.Value`: - -``` -{{ range $k, $v := $values -}} -{{ if (match "B[0-9]+" $k) -}} -{{ $k }}: {{ $v.Value }}{{ end }} -{{ end }} -``` - -For example, a classic condition for two time series exceeding a single condition would print: - -``` -B0: 81.2345 -B1: 84.5678 -``` - -If the classic condition has two or more conditions, and a time series exceeds multiple conditions at the same time, then `$values` will contain the values of all conditions: - -``` -B0: 81.2345 -B1: 92.3456 -B2: 84.5678 -B3: 95.6789 -``` - -## Variables - -The following variables are available to you when templating labels and annotations: - -### The labels variable - -The `$labels` variable contains all labels from the query. For example, suppose you have a query that returns CPU usage for all of your servers, and you have an alert rule that fires when any of your servers have exceeded 80% CPU usage for the last 5 minutes. You want to add a summary annotation to the alert that tells you which server is experiencing high CPU usage. With the `$labels` variable you can write a template that prints a human-readable sentence such as: - -``` -CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes -``` - -> If you are using a classic condition then `$labels` will not contain any labels from the query. Classic conditions discard these labels in order to enforce uni-dimensional behavior (at most one alert per alert rule). If you want to use labels from the query in your template then use the example [here](#print-all-labels-from-a-classic-condition). - -### The value variable - -The `$value` variable is a string containing the labels and values of all instant queries; threshold, reduce and math expressions, and classic conditions in the alert rule. It does not contain the results of range queries, as these can return anywhere from 10s to 10,000s of rows or metrics. If it did, for especially large queries a single alert could use 10s of MBs of memory and Grafana would run out of memory very quickly. - -To print the `$value` variable in the summary you would write something like this: - -``` -CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ $value }} -``` - -And would look something like this: - -``` -CPU usage for instance1 has exceeded 80% for the last 5 minutes: [ var='A' labels={instance=instance1} value=81.234 ] -``` - -Here `var='A'` refers to the instant query with Ref ID A, `labels={instance=instance1}` refers to the labels, and `value=81.234` refers to the average CPU usage over the last 5 minutes. - -If you want to print just some of the string instead of the full string then use the `$values` variable. It contains the same information as `$value`, but in a structured table, and is much easier to use then writing a regular expression to match just the text you want. - -### The values variable - -The `$values` variable is a table containing the labels and floating point values of all instant queries and expressions, indexed by their Ref IDs. - -To print the value of the instant query with Ref ID A: - -``` -CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ index $values "A" }} -``` - -For example, given an alert with the labels `instance=server1` and an instant query with the value `81.2345`, this would print: - -``` -CPU usage for instance1 has exceeded 80% for the last 5 minutes: 81.2345 -``` - -If the query in Ref ID A is a range query rather than an instant query then add a reduce expression with Ref ID B and replace `(index $values "A")` with `(index $values "B")`: - -``` -CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ index $values "B" }} -``` - -## Functions - -The following functions are available to you when templating labels and annotations: - -### args - -The `args` function translates a list of objects to a map with keys arg0, arg1 etc. This is intended to allow multiple arguments to be passed to templates: - -``` -{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}} -``` - -``` -1 2 -``` - -### externalURL - -The `externalURL` function returns the external URL of the Grafana server as configured in the ini file(s): - -``` -{{ externalURL }} -``` - -``` -https://example.com/grafana -``` - -### graphLink - -The `graphLink` function returns the path to the graphical view in [Explore][explore] for the given expression and data source: - -``` -{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }} -``` - -``` -/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}] -``` - -### humanize - -The `humanize` function humanizes decimal numbers: - -``` -{{ humanize 1000.0 }} -``` - -``` -1k -``` - -### humanize1024 - -The `humanize1024` works similar to `humanize` but but uses 1024 as the base rather than 1000: - -``` -{{ humanize1024 1024.0 }} -``` - -``` -1ki -``` - -### humanizeDuration - -The `humanizeDuration` function humanizes a duration in seconds: - -``` -{{ humanizeDuration 60.0 }} -``` - -``` -1m 0s -``` - -### humanizePercentage - -The `humanizePercentage` function humanizes a ratio value to a percentage: - -``` -{{ humanizePercentage 0.2 }} -``` - -``` -20% -``` - -### humanizeTimestamp - -The `humanizeTimestamp` function humanizes a Unix timestamp: - -``` -{{ humanizeTimestamp 1577836800.0 }} -``` - -``` -2020-01-01 00:00:00 +0000 UTC -``` - -### match - -The `match` function matches the text against a regular expression pattern: - -``` -{{ match "a.*" "abc" }} -``` - -``` -true -``` - -### pathPrefix - -The `pathPrefix` function returns the path of the Grafana server as configured in the ini file(s): - -``` -{{ pathPrefix }} -``` - -``` -/grafana -``` - -### tableLink - -The `tableLink` function returns the path to the tabular view in [Explore][explore] for the given expression and data source: - -``` -{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }} -``` - -``` -/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}] -``` - -### title - -The `title` function capitalizes the first character of each word: - -``` -{{ title "hello, world!" }} -``` - -``` -Hello, World! -``` - -### toLower - -The `toLower` function returns all text in lowercase: - -``` -{{ toLower "Hello, world!" }} -``` - -``` -hello, world! -``` - -### toUpper - -The `toUpper` function returns all text in uppercase: - -``` -{{ toUpper "Hello, world!" }} -``` - -``` -HELLO, WORLD! -``` - -### reReplaceAll - -The `reReplaceAll` function replaces text matching the regular expression: - -``` -{{ reReplaceAll "localhost:(.*)" "example.com:$1" "localhost:8080" }} -``` - -``` -example.com:8080 -``` - -{{% docs/reference %}} -[explore]: "/docs/grafana/ -> /docs/grafana//explore" -[explore]: "/docs/grafana-cloud/ -> /docs/grafana//explore" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/contact-points/index.md b/docs/sources/alerting/fundamentals/contact-points/index.md deleted file mode 100644 index 5494a9b6c0a..00000000000 --- a/docs/sources/alerting/fundamentals/contact-points/index.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -aliases: - - /docs/grafana/latest/alerting/contact-points/ - - /docs/grafana/latest/alerting/unified-alerting/contact-points/ - - /docs/grafana/latest/alerting/fundamentals/contact-points/contact-point-types/ -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/contact-points/ -description: Learn about contact points and the supported contact point integrations -keywords: - - grafana - - alerting - - guide - - contact point - - notification channel - - create -labels: - products: - - cloud - - enterprise - - oss -title: Contact points -weight: 150 ---- - -# Contact points - -Contact points contain the configuration for sending notifications. A contact point is a list of integrations, each of which sends a notification to a particular email address, service or URL. Contact points can have multiple integrations of the same kind, or a combination of integrations of different kinds. For example, a contact point could contain a Pagerduty integration; an email and Slack integration; or a Pagerduty integration, a Slack integration, and two email integrations. You can also configure a contact point with no integrations; in which case no notifications are sent. - -A contact point cannot send notifications until it has been added to a notification policy. A notification policy can only send alerts to one contact point, but a contact point can be added to a number of notification policies at the same time. When an alert matches a notification policy, the alert is sent to the contact point in that notification policy, which then sends a notification to each integration in its configuration. - -Contact points can be configured for the Grafana Alertmanager as well as external alertmanagers. - -You can also use notification templating to customize notification messages for contact point integrations. - -**Note:** - -If you've created an OnCall contact point in the Grafana OnCall application, you can view it in the Alerting application. - -## Supported contact point integrations - -The following table lists the contact point integrations supported by Grafana. - -| Name | Type | Grafana Alertmanager | Other Alertmanagers | -| ------------------------------------------------ | ------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------- | -| [DingDing](https://www.dingtalk.com/en) | `dingding` | Supported | N/A | -| [Discord](https://discord.com/) | `discord` | Supported | N/A | -| Email | `email` | Supported | Supported | -| [Google Chat](https://chat.google.com/) | `googlechat` | Supported | N/A | -| [Kafka](https://kafka.apache.org/) | `kafka` | Supported | N/A | -| [Line](https://line.me/en/) | `line` | Supported | N/A | -| [Microsoft Teams](https://teams.microsoft.com/) | `teams` | Supported | Supported | -| [Opsgenie](https://atlassian.com/opsgenie/) | `opsgenie` | Supported | Supported | -| [Pagerduty](https://www.pagerduty.com/) | `pagerduty` | Supported | Supported | -| [Prometheus Alertmanager](https://prometheus.io) | `prometheus-alertmanager` | Supported | N/A | -| [Pushover](https://pushover.net/) | `pushover` | Supported | Supported | -| [Sensu Go](https://docs.sensu.io/sensu-go/) | `sensugo` | Supported | N/A | -| [Slack](https://slack.com/) | `slack` | Supported | Supported | -| [Telegram](https://telegram.org/) | `telegram` | Supported | N/A | -| [Threema](https://threema.ch/) | `threema` | Supported | N/A | -| [VictorOps](https://help.victorops.com/) | `victorops` | Supported | Supported | -| Webhook | `webhook` | Supported | Supported ([different format](https://prometheus.io/docs/alerting/latest/configuration/#webhook_config)) | -| Cisco Webex Teams | `webex` | Supported | Supported | -| WeCom | `wecom` | Supported | N/A | -| [Zenduty](https://www.zenduty.com/) | `webhook` | Supported | N/A | diff --git a/docs/sources/alerting/fundamentals/data-source-alerting.md b/docs/sources/alerting/fundamentals/data-source-alerting.md deleted file mode 100644 index b7471e23f42..00000000000 --- a/docs/sources/alerting/fundamentals/data-source-alerting.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/data-source-alerting/ -description: Learn about the data sources supported by Grafana Alerting -labels: - products: - - cloud - - enterprise - - oss -title: Data sources and Grafana Alerting -weight: 100 ---- - -# Data sources and Grafana Alerting - -There are a number of data sources that are compatible with Grafana Alerting. Each data source is supported by a plugin. You can use one of the built-in data sources listed below, use [external data source plugins](/grafana/plugins/?type=datasource), or create your own data source plugin. - -If you are creating your own data source plugin, make sure it is a backend plugin as Grafana Alerting requires this in order to be able to evaluate rules using the data source. Frontend data sources are not supported, because the evaluation engine runs on the backend. - -Specifying `{ "alerting": true, “backend”: true }` in the plugin.json file indicates that the data source plugin is compatible with Grafana Alerting and includes the backend data-fetching code. For more information, refer to [Build a data source backend plugin](/tutorials/build-a-data-source-backend-plugin/). - -These are the data sources that are compatible with and supported by Grafana Alerting. - -- [AWS CloudWatch][] -- [Azure Monitor][] -- [Elasticsearch][] -- [Google Cloud Monitoring][] -- [Graphite][] -- [InfluxDB][] -- [Loki][] -- [Microsoft SQL Server (MSSQL)][] -- [MySQL][] -- [Open TSDB][] -- [PostgreSQL][] -- [Prometheus][] -- [Jaeger][] -- [Zipkin][] -- [Tempo][] -- [Testdata][] - -## Useful links - -- [Grafana data sources][] - -{{% docs/reference %}} -[Grafana data sources]: "/docs/grafana/ -> /docs/grafana//datasources" -[Grafana data sources]: "/docs/grafana-cloud/ -> /docs/grafana//datasources" - -[AWS CloudWatch]: "/docs/grafana/ -> /docs/grafana//datasources/aws-cloudwatch" -[AWS CloudWatch]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/aws-cloudwatch" - -[Azure Monitor]: "/docs/grafana/ -> /docs/grafana//datasources/azure-monitor" -[Azure Monitor]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/azure-monitor" - -[Elasticsearch]: "/docs/grafana/ -> /docs/grafana//datasources/elasticsearch" -[Elasticsearch]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/elasticsearch" - -[Google Cloud Monitoring]: "/docs/grafana/ -> /docs/grafana//datasources/google-cloud-monitoring" -[Google Cloud Monitoring]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/google-cloud-monitoring" - -[Graphite]: "/docs/grafana/ -> /docs/grafana//datasources/graphite" -[Graphite]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/graphite" - -[InfluxDB]: "/docs/grafana/ -> /docs/grafana//datasources/influxdb" -[InfluxDB]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/influxdb" - -[Loki]: "/docs/grafana/ -> /docs/grafana//datasources/loki" -[Loki]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/loki" - -[Microsoft SQL Server (MSSQL)]: "/docs/grafana/ -> /docs/grafana//datasources/mssql" -[Microsoft SQL Server (MSSQL)]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/mssql" - -[MySQL]: "/docs/grafana/ -> /docs/grafana//datasources/mysql" -[MySQL]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/mysql" - -[Open TSDB]: "/docs/grafana/ -> /docs/grafana//datasources/opentsdb" -[Open TSDB]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/opentsdb" - -[PostgreSQL]: "/docs/grafana/ -> /docs/grafana//datasources/postgres" -[PostgreSQL]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/postgres" - -[Prometheus]: "/docs/grafana/ -> /docs/grafana//datasources/prometheus" -[Prometheus]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/prometheus" - -[Jaeger]: "/docs/grafana/ -> /docs/grafana//datasources/jaeger" -[Jaeger]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/jaeger" - -[Zipkin]: "/docs/grafana/ -> /docs/grafana//datasources/zipkin" -[Zipkin]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/zipkin" - -[Tempo]: "/docs/grafana/ -> /docs/grafana//datasources/tempo" -[Tempo]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/tempo" - -[Testdata]: "/docs/grafana/ -> /docs/grafana//datasources/testdata" -[Testdata]: "/docs/grafana-cloud/ -> /docs/grafana//datasources/testdata" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/evaluate-grafana-alerts.md b/docs/sources/alerting/fundamentals/evaluate-grafana-alerts.md deleted file mode 100644 index 2a5ca6996a2..00000000000 --- a/docs/sources/alerting/fundamentals/evaluate-grafana-alerts.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -aliases: - - ../metrics/ - - ../unified-alerting/fundamentals/evaluate-grafana-alerts/ -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/evaluate-grafana-alerts/ -description: Learn how how Grafana-managed alerts are evaluated by the backend engine as well as how Grafana handles alerting on numeric rather than time series data -labels: - products: - - cloud - - enterprise - - oss -title: Alerting on numeric data -weight: 110 ---- - -# Alerting on numeric data - -This topic describes how Grafana managed alerts are evaluated by the backend engine as well as how Grafana handles alerting on numeric rather than time series data. - -- [Alerting on numeric data](#alerting-on-numeric-data) - - [Alert evaluation](#alert-evaluation) - - [Metrics from the alerting engine](#metrics-from-the-alerting-engine) - - [Alerting on numeric data](#alerting-on-numeric-data-1) - - [Tabular Data](#tabular-data) - - [Example](#example) - -## Alert evaluation - -Grafana managed alerts query the following backend data sources that have alerting enabled: - -- built-in data sources or those developed and maintained by Grafana: `Graphite`, `Prometheus`, `Loki`, `InfluxDB`, `Elasticsearch`, - `Google Cloud Monitoring`, `Cloudwatch`, `Azure Monitor`, `MySQL`, `PostgreSQL`, `MSSQL`, `OpenTSDB`, `Oracle`, and `Azure Monitor` -- community developed backend data sources with alerting enabled (`backend` and `alerting` properties are set in the [plugin.json](/developers/plugin-tools/reference-plugin-json) - -### Metrics from the alerting engine - -The alerting engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics][set-up-grafana-monitoring]. - -| Metric Name | Type | Description | -| ------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------- | -| `grafana_alerting_alerts` | gauge | How many alerts by state | -| `grafana_alerting_request_duration` | histogram | Histogram of requests to the Alerting API | -| `grafana_alerting_active_configurations` | gauge | The number of active, non default Alertmanager configurations for grafana managed alerts | -| `grafana_alerting_rule_evaluations_total` | counter | The total number of rule evaluations | -| `grafana_alerting_rule_evaluation_failures_total` | counter | The total number of rule evaluation failures | -| `grafana_alerting_rule_evaluation_duration` | summary | The duration for a rule to execute | -| `grafana_alerting_rule_group_rules` | gauge | The number of rules | - -## Alerting on numeric data - -Among certain data sources numeric data that is not time series can be directly alerted on, or passed into Server Side Expressions (SSE). This allows for more processing and resulting efficiency within the data source, and it can also simplify alert rules. -When alerting on numeric data instead of time series data, there is no need to reduce each labeled time series into a single number. Instead labeled numbers are returned to Grafana instead. - -### Tabular Data - -This feature is supported with backend data sources that query tabular data: - -- SQL data sources such as MySQL, Postgres, MSSQL, and Oracle. -- The Azure Kusto based services: Azure Monitor (Logs), Azure Monitor (Azure Resource Graph), and Azure Data Explorer. - -A query with Grafana managed alerts or SSE is considered numeric with these data sources, if: - -- The "Format AS" option is set to "Table" in the data source query. -- The table response returned to Grafana from the query includes only one numeric (e.g. int, double, float) column, and optionally additional string columns. - -If there are string columns then those columns become labels. The name of column becomes the label name, and the value for each row becomes the value of the corresponding label. If multiple rows are returned, then each row should be uniquely identified their labels. - -### Example - -For a MySQL table called "DiskSpace": - -| Time | Host | Disk | PercentFree | -| ----------- | ---- | ---- | ----------- | -| 2021-June-7 | web1 | /etc | 3 | -| 2021-June-7 | web2 | /var | 4 | -| 2021-June-7 | web3 | /var | 8 | -| ... | ... | ... | ... | - -You can query the data filtering on time, but without returning the time series to Grafana. For example, an alert that would trigger per Host, Disk when there is less than 5% free space: - -```sql -SELECT Host, Disk, CASE WHEN PercentFree < 5.0 THEN PercentFree ELSE 0 END FROM ( - SELECT - Host, - Disk, - Avg(PercentFree) - FROM DiskSpace - Group By - Host, - Disk - Where __timeFilter(Time) -``` - -This query returns the following Table response to Grafana: - -| Host | Disk | PercentFree | -| ---- | ---- | ----------- | -| web1 | /etc | 3 | -| web2 | /var | 4 | -| web3 | /var | 0 | - -When this query is used as the **condition** in an alert rule, then the non-zero will be alerting. As a result, three alert instances are produced: - -| Labels | Status | -| --------------------- | -------- | -| {Host=web1,disk=/etc} | Alerting | -| {Host=web2,disk=/var} | Alerting | -| {Host=web3,disk=/var} | Normal | - -{{% docs/reference %}} - -[set-up-grafana-monitoring]: "/docs/grafana/ -> /docs/grafana//setup-grafana/set-up-grafana-monitoring" -[set-up-grafana-monitoring]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/set-up-grafana-monitoring" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/high-availability/_index.md b/docs/sources/alerting/fundamentals/high-availability/_index.md deleted file mode 100644 index c1d5db933b8..00000000000 --- a/docs/sources/alerting/fundamentals/high-availability/_index.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -aliases: - - ../high-availability/ - - ../unified-alerting/high-availability/ -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/high-availability/ -description: Learn about high availability in Grafana Alerting -keywords: - - grafana - - alerting - - tutorials - - ha - - high availability -labels: - products: - - cloud - - enterprise - - oss -title: Alerting high availability -weight: 170 ---- - -# Alerting high availability - -Grafana Alerting uses the Prometheus model of separating the evaluation of alert rules from the delivering of notifications. In this model the evaluation of alert rules is done in the alert generator and the delivering of notifications is done in the alert receiver. In Grafana Alerting, the alert generator is the Scheduler and the receiver is the Alertmanager. - -{{< figure src="/static/img/docs/alerting/unified/high-availability-ua.png" class="docs-image--no-shadow" max-width= "750px" caption="High availability" >}} - -When running multiple instances of Grafana, all alert rules are evaluated on all instances. You can think of the evaluation of alert rules as being duplicated. This is how Grafana Alerting makes sure that as long as at least one Grafana instance is working, alert rules will still be evaluated and notifications for alerts will still be sent. You will see this duplication in state history, and is a good way to tell if you are using high availability. - -While the alert generator evaluates all alert rules on all instances, the alert receiver makes a best-effort attempt to avoid sending duplicate notifications. Alertmanager chooses availability over consistency, which may result in occasional duplicated or out-of-order notifications. It takes the opinion that duplicate or out-of-order notifications are better than no notifications. - -The Alertmanager uses a gossip protocol to share information about notifications between Grafana instances. It also gossips silences, which means a silence created on one Grafana instance is replicated to all other Grafana instances. Both notifications and silences are persisted to the database periodically, and during graceful shut down. - -It is important to make sure that gossiping is configured and tested. You can find the documentation on how to do that [here][configure-high-availability]. - -## Useful links - -[Configure alerting high availability][configure-high-availability] - -{{% docs/reference %}} -[configure-high-availability]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/configure-high-availability" -[configure-high-availability]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/configure-high-availability" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/notification-policies/_index.md b/docs/sources/alerting/fundamentals/notification-policies/_index.md deleted file mode 100644 index 56dc8e06bd3..00000000000 --- a/docs/sources/alerting/fundamentals/notification-policies/_index.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/notification-policies/ -description: Learn about how notification policies work -keywords: - - grafana - - alerting - - notification policies -labels: - products: - - cloud - - enterprise - - oss -title: Notifications -weight: 160 ---- - -# Notifications - -Choosing how, when, and where to send your alert notifications is an important part of setting up your alerting system. These decisions will have a direct impact on your ability to resolve issues quickly and not miss anything important. - -As a first step, define your contact points; where to send your alert notifications to. A contact point is a set of one or more integrations that are used to deliver notifications. Add notification templates to contact points for reuse and consistent messaging in your notifications. - -Next, create a notification policy which is a set of rules for where, when and how your alerts are routed to contact points. In a notification policy, you define where to send your alert notifications by choosing one of the contact points you created. - -## Alertmanagers - -Grafana uses Alertmanagers to send notifications for firing and resolved alerts. Grafana has its own Alertmanager, referred to as "Grafana" in the user interface, but also supports sending notifications from other Alertmanagers too, such as the [Prometheus Alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/). The Grafana Alertmanager uses notification policies and contact points to configure how and where a notification is sent; how often a notification should be sent; and whether alerts should all be sent in the same notification, sent in grouped notifications based on a set of labels, or as separate notifications. - -## Notification policies - -Notification policies control when and where notifications are sent. A notification policy can choose to send all alerts together in the same notification, send alerts in grouped notifications based on a set of labels, or send alerts as separate notifications. You can configure each notification policy to control how often notifications should be sent as well as having one or more mute timings to inhibit notifications at certain times of the day and on certain days of the week. - -Notification policies are organized in a tree structure where at the root of the tree there is a notification policy called the default policy. There can be only one default policy and the default policy cannot be deleted. - -Specific routing policies are children of the default policy and can be used to match either all alerts or a subset of alerts based on a set of matching labels. A notification policy matches an alert when its matching labels match the labels in the alert. - -A nested policy can have its own nested policies, which allow for additional matching of alerts. An example of a nested policy could be sending infrastructure alerts to the Ops team; while a nested policy might send high priority alerts to Pagerduty and low priority alerts as emails. - -All alerts, irrespective of their labels, match the default policy. However, when the default policy receives an alert it looks at each nested policy and sends the alert to the first nested policy that matches the alert. If the nested policy has further nested policies, then it can attempt to the match the alert against one of its nested policies. If no nested policies match the alert then the policy itself is the matching policy. If there are no nested policies, or no nested policies match the alert, then the default policy is the matching policy. - - - -## Notification templates - -You can customize notifications with templates. For example, templates can be used to change the subject and message of an email, or the title and message of notifications sent to Slack. - -Templates are not limited to an individual integration or contact point, but instead can be used in a number of integrations in the same contact point and even integrations across different contact points. For example, a Grafana user can create a template called `custom_subject_or_title` and use it for both templating subjects in emails and titles of Slack messages without having to create two separate templates. - -All notifications templates are written in [Go's templating language](https://pkg.go.dev/text/template), and are in the Contact points tab on the Alerting page. - -## Silences - -You can use silences to mute notifications from one or more firing rules. Silences do not stop alerts from firing or being resolved, or hide firing alerts in the user interface. A silence lasts as long as its duration which can be configured in minutes, hours, days, months or years. diff --git a/docs/sources/alerting/fundamentals/notification-policies/notifications.md b/docs/sources/alerting/fundamentals/notification-policies/notifications.md deleted file mode 100644 index 0bb333a5eb2..00000000000 --- a/docs/sources/alerting/fundamentals/notification-policies/notifications.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -aliases: - - ../notifications/ - - alerting/manage-notifications/create-notification-policy/ -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/notification-policies/notifications/ -description: Learn about how notification policies work and are structured -keywords: - - grafana - - alerting - - alertmanager - - notification policies - - contact points - - silences -labels: - products: - - cloud - - enterprise - - oss -title: Notification policies -weight: 410 ---- - -# Notification policies - -Notification policies provide you with a flexible way of routing alerts to various different receivers. Using label matchers, you can modify alert notification delivery without having to update every individual alert rule. - -Learn more about how notification policies work and are structured, so that you can make the most out of setting up your notification policies. - -## Policy tree - -Notification policies are _not_ a list, but rather are structured according to a [tree structure](https://en.wikipedia.org/wiki/Tree_structure). This means that each policy can have child policies, and so on. The root of the notification policy tree is called the **Default notification policy**. - -Each policy consists of a set of label matchers (0 or more) that specify which labels they are or aren't interested in handling. - -For more information on label matching, see [how label matching works][labels-and-label-matchers]. - -{{% admonition type="note" %}} -If you haven't configured any label matchers for your notification policy, your notification policy will match _all_ alert instances. This may prevent child policies from being evaluated unless you have enabled **Continue matching siblings** on the notification policy. -{{% /admonition %}} - -## Routing - -To determine which notification policy will handle which alert instances, you have to start by looking at the existing set of notification policies, starting with the default notification policy. - -If no policies other than the default policy are configured, the default policy will handle the alert instance. - -If policies other than the default policy are defined, it will evaluate those notification policies in the order they are displayed. - -If a notification policy has label matchers that match the labels of the alert instance, it will descend in to its child policies and, if there are any, will continue to look for any child policies that might have label matchers that further narrow down the set of labels, and so forth until no more child policies have been found. - -If no child policies are defined in a notification policy or if none of the child policies have any label matchers that match the alert instance's labels, the default notification policy is used. - -As soon as a matching policy is found, the system does not continue to look for other matching policies. If you want to continue to look for other policies that may match, enable **Continue matching siblings** on that particular policy. - -Lastly, if none of the notification policies are selected the default notification policy is used. - -### Routing example - -Here is an example of a relatively simple notification policy tree and some alert instances. - -{{< figure src="/media/docs/alerting/notification-routing.png" max-width="750px" caption="Notification policy routing" >}} - -Here's a breakdown of how these policies are selected: - -**Pod stuck in CrashLoop** does not have a `severity` label, so none of its child policies are matched. It does have a `team=operations` label, so the first policy is matched. - -The `team=security` policy is not evaluated since we already found a match and **Continue matching siblings** was not configured for that policy. - -**Disk Usage – 80%** has both a `team` and `severity` label, and matches a child policy of the operations team. - -**Unauthorized log entry** has a `team` label but does not match the first policy (`team=operations`) since the values are not the same, so it will continue searching and match the `team=security` policy. It does not have any child policies, so the additional `severity=high` label is ignored. - -## Inheritance - -In addition to child policies being a useful concept for routing alert instances, they also inherit properties from their parent policy. This also applies to any policies that are child policies of the default notification policy. - -The following properties are inherited by child policies: - -- Contact point -- Grouping options -- Timing options -- Mute timings - -Each of these properties can be overwritten by an individual policy should you wish to override the inherited properties. - -To inherit a contact point from the parent policy, leave it blank. To override the inherited grouping options, enable **Override grouping**. To override the inherited timing options, enable **Override general timings**. - -### Inheritance example - -The example below shows how the notification policy tree from our previous example allows the child policies of the `team=operations` to inherit its contact point. - -In this way, we can avoid having to specify the same contact point multiple times for each child policy. - -{{< figure src="/media/docs/alerting/notification-inheritance.png" max-width="750px" caption="Notification policy inheritance" >}} - -## Additional configuration options - -### Grouping - -Grouping is an important feature of Grafana Alerting as it allows you to batch relevant alerts together into a smaller number of notifications. This is particularly important if notifications are delivered to first-responders, such as engineers on-call, where receiving lots of notifications in a short period of time can be overwhelming and in some cases can negatively impact a first-responders ability to respond to an incident. For example, consider a large outage where many of your systems are down. In this case, grouping can be the difference between receiving 1 phone call and 100 phone calls. - -You choose how alerts are grouped together using the Group by option in a notification policy. By default, notification policies in Grafana group alerts together by alert rule using the `alertname` and `grafana_folder` labels (since alert names are not unique across multiple folders). Should you wish to group alerts by something other than the alert rule, change the grouping to any other combination of labels. - -#### Disable grouping - -Should you wish to receive every alert as a separate notification, you can do so by grouping by a special label called `...`. This is useful when your alerts are being delivered to an automated system instead of a first-responder. - -#### A single group for all alerts - -Should you wish to receive all alerts together in a single notification, you can do so by leaving Group by empty. - -### Timing options - -The timing options decide how often notifications are sent for each group of alerts. There are three timers that you need to know about: Group wait, Group interval, and Repeat interval. - -#### Group wait - -Group wait is the amount of time Grafana waits before sending the first notification for a new group of alerts. The longer Group wait is the more time you have for other alerts to arrive. The shorter Group wait is the earlier the first notification will be sent, but at the risk of sending incomplete notifications. You should always choose a Group wait that makes the most sense for your use case. - -**Default** 30 seconds - -#### Group interval - -Once the first notification has been sent for a new group of alerts, Grafana starts the Group interval timer. This is the amount of time Grafana waits before sending notifications about changes to the group. For example, another firing alert might have just been added to the group while an existing alert might have resolved. If an alert was too late to be included in the first notification due to Group wait, it will be included in subsequent notifications after Group interval. Once Group interval has elapsed, Grafana resets the Group interval timer. This repeats until there are no more alerts in the group after which the group is deleted. - -**Default** 5 minutes - -#### Repeat interval - -Repeat interval decides how often notifications are repeated if the group has not changed since the last notification. You can think of these as reminders that some alerts are still firing. Repeat interval is closely related to Group interval, which means your Repeat interval must not only be greater than or equal to Group interval, but also must be a multiple of Group interval. If Repeat interval is not a multiple of Group interval it will be coerced into one. For example, if your Group interval is 5 minutes, and your Repeat interval is 9 minutes, the Repeat interval will be rounded up to the nearest multiple of 5 which is 10 minutes. - -**Default** 4 hours - -{{% docs/reference %}} -[labels-and-label-matchers]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/annotation-label/labels-and-label-matchers" -[labels-and-label-matchers]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/annotation-label/labels-and-label-matchers" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/notifications/_index.md b/docs/sources/alerting/fundamentals/notifications/_index.md new file mode 100644 index 00000000000..693c673beda --- /dev/null +++ b/docs/sources/alerting/fundamentals/notifications/_index.md @@ -0,0 +1,61 @@ +--- +aliases: + - ./notification-policies/ # /docs/grafana//alerting/fundamentals/notification-policies/ +canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/notifications/ +description: Learn about how notifications work +keywords: + - grafana + - alerting + - notification policies +labels: + products: + - cloud + - enterprise + - oss +title: Notifications +weight: 110 +--- + +# Notifications + +Choosing how, when, and where to send your alert notifications is an important part of setting up your alerting system. These decisions will have a direct impact on your ability to resolve issues quickly and not miss anything important. + +As a first step, define your contact points; where to send your alert notifications to. A contact point is a set of one or more integrations that are used to deliver notifications. Add notification templates to contact points for reuse and consistent messaging in your notifications. + +Next, create a notification policy which is a set of rules for where, when and how your alerts are routed to contact points. In a notification policy, you define where to send your alert notifications by choosing one of the contact points you created. + +## Alertmanagers + +Grafana uses Alertmanagers to send notifications for firing and resolved alerts. Grafana has its own Alertmanager, referred to as "Grafana" in the user interface, but also supports sending notifications from other Alertmanagers too, such as the [Prometheus Alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/). The Grafana Alertmanager uses notification policies and contact points to configure how and where a notification is sent; how often a notification should be sent; and whether alerts should all be sent in the same notification, sent in grouped notifications based on a set of labels, or as separate notifications. + +## Contact points + +Contact points contain the configuration for sending alert notifications, specifying destinations like email, Slack, OnCall, webhooks, and their notification messages. They allow the customization of notification messages and the use of notification templates. + +A contact point is a list of integrations, each sending a message to a specific destination. You can configure them via notification policies or alert rules. + +## Notification policies + +Notification policies control when and where notifications are sent. A notification policy can choose to send all alerts together in the same notification, send alerts in grouped notifications based on a set of labels, or send alerts as separate notifications. You can configure each notification policy to control how often notifications should be sent as well as having one or more mute timings to inhibit notifications at certain times of the day and on certain days of the week. + +Notification policies are organized in a tree structure where at the root of the tree there is a notification policy called the default policy. There can be only one default policy and the default policy cannot be deleted. + +Specific routing policies are children of the default policy and can be used to match either all alerts or a subset of alerts based on a set of matching labels. A notification policy matches an alert when its matching labels match the labels in the alert. + +A nested policy can have its own nested policies, which allow for additional matching of alerts. An example of a nested policy could be sending infrastructure alerts to the Ops team; while a nested policy might send high priority alerts to Pagerduty and low priority alerts as emails. + +All alerts, irrespective of their labels, match the default policy. However, when the default policy receives an alert it looks at each nested policy and sends the alert to the first nested policy that matches the alert. If the nested policy has further nested policies, then it can attempt to the match the alert against one of its nested policies. If no nested policies match the alert then the policy itself is the matching policy. If there are no nested policies, or no nested policies match the alert, then the default policy is the matching policy. + + + +## Notification templates + +You can customize notifications with templates. For example, templates can be used to change the subject and message of an email, or the title and message of notifications sent to Slack. + +Templates are not limited to an individual integration or contact point, but instead can be used in a number of integrations in the same contact point and even integrations across different contact points. For example, a Grafana user can create a template called `custom_subject_or_title` and use it for both templating subjects in emails and titles of Slack messages without having to create two separate templates. + +All notifications templates are written in [Go's templating language](https://pkg.go.dev/text/template), and are in the Contact points tab on the Alerting page. + +## Silences + +You can use silences to mute notifications from one or more firing rules. Silences do not stop alerts from firing or being resolved, or hide firing alerts in the user interface. A silence lasts as long as its duration which can be configured in minutes, hours, days, months or years. diff --git a/docs/sources/alerting/fundamentals/notifications/alertmanager.md b/docs/sources/alerting/fundamentals/notifications/alertmanager.md new file mode 100644 index 00000000000..a7a55219947 --- /dev/null +++ b/docs/sources/alerting/fundamentals/notifications/alertmanager.md @@ -0,0 +1,46 @@ +--- +aliases: + - ../../fundamentals/alertmanager/ # /docs/grafana//alerting/fundamentals/alertmanager/ + - ../../unified-alerting/fundamentals/alertmanager/ # /docs/grafana//alerting/unified-alerting/fundamentals/alertmanager/ + - ../../manage-notifications/alertmanager/ # /docs/grafana//alerting/manage-notifications/alertmanager/ +canonical: https://grafana.com/docs/grafana/latest/alerting/notifications/alertmanager/ +description: Learn about Alertmanagers and the Alertmanager options for Grafana Alerting +labels: + products: + - cloud + - enterprise + - oss +title: Alertmanager +weight: 111 +--- + +# Alertmanager + +Grafana sends firing and resolved alerts to Alertmanagers. The Alertmanager receives alerts, handles silencing, inhibition, grouping, and routing by sending notifications out via your channel of choice, for example, email or Slack. + +Grafana has its own Alertmanager, referred to as "Grafana" in the user interface, but also supports sending alerts to other Alertmanagers, such as the [Prometheus Alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/). You can use both internal and external Alertmanagers. + +The Grafana Alertmanager uses notification policies and contact points to configure how and where a notification is sent; how often a notification should be sent; and whether alerts should all be sent in the same notification, sent in grouped notifications based on a set of labels, or as separate notifications. + +Alertmanagers are visible from the drop-down menu on the Alerting Contact Points, Notification Policies, and Silences pages. + +In Grafana, you can use the Cloud Alertmanager, Grafana Alertmanager, or an external Alertmanager. You can also run multiple Alertmanagers; your decision depends on your set up and where your alerts are being generated. + +- **Grafana Alertmanager** is an internal Alertmanager that is pre-configured and available for selection by default if you run Grafana on-premises or open-source. + + The Grafana Alertmanager can receive alerts from Grafana, but it cannot receive alerts from outside Grafana, for example, from Mimir or Loki. Note that inhibition rules are not supported. + +- **Cloud Alertmanager** runs in Grafana Cloud and it can receive alerts from Grafana, Mimir, and Loki. + +- **External Alertmanager** can receive all your Grafana, Loki, Mimir, and Prometheus alerts. External Alertmanagers can be configured and administered from within Grafana itself. + +Here are two examples of when you may want to [add your own external alertmanager][configure-alertmanager] and send your alerts there instead of the Grafana Alertmanager: + +1. You may already have Alertmanagers on-premises in your own Cloud infrastructure that you have set up and still want to use, because you have other alert generators, such as Prometheus. + +2. You want to use both Prometheus on-premises and hosted Grafana to send alerts to the same Alertmanager that runs in your Cloud infrastructure. + +{{% docs/reference %}} +[configure-alertmanager]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/configure-alertmanager" +[configure-alertmanager]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/configure-alertmanager" +{{% /docs/reference %}} diff --git a/docs/sources/alerting/fundamentals/notifications/contact-points.md b/docs/sources/alerting/fundamentals/notifications/contact-points.md new file mode 100644 index 00000000000..98aa75a0f8c --- /dev/null +++ b/docs/sources/alerting/fundamentals/notifications/contact-points.md @@ -0,0 +1,64 @@ +--- +aliases: + - ../../fundamentals/contact-points/ # /docs/grafana//alerting/fundamentals/contact-points/ + - ../../fundamentals/contact-points/contact-point-types/ # /docs/grafana//alerting/fundamentals/contact-points/contact-point-types/ + - ../../contact-points/ # /docs/grafana//alerting/contact-points/ + - ../../unified-alerting/contact-points/ # /docs/grafana//alerting/unified-alerting/contact-points/ +canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/notifications/contact-points/ +description: Learn about contact points and the supported contact point integrations +keywords: + - grafana + - alerting + - guide + - contact point + - notification channel + - create +labels: + products: + - cloud + - enterprise + - oss +title: Contact points +weight: 112 +--- + +# Contact points + +Contact points contain the configuration for sending notifications. A contact point is a list of integrations, each of which sends a notification to a particular email address, service or URL. Contact points can have multiple integrations of the same kind, or a combination of integrations of different kinds. For example, a contact point could contain a Pagerduty integration; an email and Slack integration; or a Pagerduty integration, a Slack integration, and two email integrations. You can also configure a contact point with no integrations; in which case no notifications are sent. + +A contact point cannot send notifications until it has been added to a notification policy. A notification policy can only send alerts to one contact point, but a contact point can be added to a number of notification policies at the same time. When an alert matches a notification policy, the alert is sent to the contact point in that notification policy, which then sends a notification to each integration in its configuration. + +Contact points can be configured for the Grafana Alertmanager as well as external alertmanagers. + +You can also use notification templating to customize notification messages for contact point integrations. + +**Note:** + +If you've created an OnCall contact point in the Grafana OnCall application, you can view it in the Alerting application. + +## Supported contact point integrations + +The following table lists the contact point integrations supported by Grafana. + +| Name | Type | Grafana Alertmanager | Other Alertmanagers | +| ------------------------------------------------ | ------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------- | +| [DingDing](https://www.dingtalk.com/en) | `dingding` | Supported | N/A | +| [Discord](https://discord.com/) | `discord` | Supported | N/A | +| Email | `email` | Supported | Supported | +| [Google Chat](https://chat.google.com/) | `googlechat` | Supported | N/A | +| [Kafka](https://kafka.apache.org/) | `kafka` | Supported | N/A | +| [Line](https://line.me/en/) | `line` | Supported | N/A | +| [Microsoft Teams](https://teams.microsoft.com/) | `teams` | Supported | Supported | +| [Opsgenie](https://atlassian.com/opsgenie/) | `opsgenie` | Supported | Supported | +| [Pagerduty](https://www.pagerduty.com/) | `pagerduty` | Supported | Supported | +| [Prometheus Alertmanager](https://prometheus.io) | `prometheus-alertmanager` | Supported | N/A | +| [Pushover](https://pushover.net/) | `pushover` | Supported | Supported | +| [Sensu Go](https://docs.sensu.io/sensu-go/) | `sensugo` | Supported | N/A | +| [Slack](https://slack.com/) | `slack` | Supported | Supported | +| [Telegram](https://telegram.org/) | `telegram` | Supported | N/A | +| [Threema](https://threema.ch/) | `threema` | Supported | N/A | +| [VictorOps](https://help.victorops.com/) | `victorops` | Supported | Supported | +| Webhook | `webhook` | Supported | Supported ([different format](https://prometheus.io/docs/alerting/latest/configuration/#webhook_config)) | +| Cisco Webex Teams | `webex` | Supported | Supported | +| WeCom | `wecom` | Supported | N/A | +| [Zenduty](https://www.zenduty.com/) | `webhook` | Supported | N/A | diff --git a/docs/sources/alerting/fundamentals/alert-rules/message-templating.md b/docs/sources/alerting/fundamentals/notifications/message-templating.md similarity index 86% rename from docs/sources/alerting/fundamentals/alert-rules/message-templating.md rename to docs/sources/alerting/fundamentals/notifications/message-templating.md index b9aa80e72ed..9e6d33eae91 100644 --- a/docs/sources/alerting/fundamentals/alert-rules/message-templating.md +++ b/docs/sources/alerting/fundamentals/notifications/message-templating.md @@ -1,9 +1,9 @@ --- aliases: - - ../../contact-points/message-templating/ - - ../../message-templating/ - - ../../unified-alerting/message-templating/ -canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/message-templating/ + - ../../contact-points/message-templating/ # /docs/grafana//alerting/contact-points/message-templating/ + - ../../alert-rules/message-templating/ # /docs/grafana//alerting/alert-rules/message-templating/ + - ../../unified-alerting/message-templating/ # /docs/grafana//alerting/unified-alerting/message-templating/ +canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/notifications/message-templating/ description: Learn about notification templating keywords: - grafana @@ -16,11 +16,11 @@ labels: - cloud - enterprise - oss -title: Notification templating -weight: 415 +title: Notification templates +weight: 114 --- -# Notification templating +# Notification templates Notifications sent via contact points are built using notification templates. Grafana's default templates are based on the [Go templating system](https://golang.org/pkg/text/template) where some fields are evaluated as text, while others are evaluated as HTML (which can affect escaping). diff --git a/docs/sources/alerting/fundamentals/notifications/notification-policies.md b/docs/sources/alerting/fundamentals/notifications/notification-policies.md new file mode 100644 index 00000000000..1e4d1d2dcf6 --- /dev/null +++ b/docs/sources/alerting/fundamentals/notifications/notification-policies.md @@ -0,0 +1,136 @@ +--- +aliases: + - ../notification-policies/notifications/ # /docs/grafana//alerting/fundamentals/notification-policies/notifications/ +canonical: https://grafana.com/docs/grafana/latest/alerting/fundamentals/notifications/notification-policies/ +description: Learn about how notification policies work and are structured +keywords: + - grafana + - alerting + - alertmanager + - notification policies + - contact points + - silences +labels: + products: + - cloud + - enterprise + - oss +title: Notification policies +weight: 113 +--- + +# Notification policies + +Notification policies provide you with a flexible way of routing alerts to various different receivers. Using label matchers, you can modify alert notification delivery without having to update every individual alert rule. + +Learn more about how notification policies work and are structured, so that you can make the most out of setting up your notification policies. + +## Policy tree + +Notification policies are _not_ a list, but rather are structured according to a [tree structure](https://en.wikipedia.org/wiki/Tree_structure). This means that each policy can have child policies, and so on. The root of the notification policy tree is called the **Default notification policy**. + +Each policy consists of a set of label matchers (0 or more) that specify which labels they are or aren't interested in handling. + +For more information on label matching, see [how label matching works][labels-and-label-matchers]. + +{{% admonition type="note" %}} +If you haven't configured any label matchers for your notification policy, your notification policy will match _all_ alert instances. This may prevent child policies from being evaluated unless you have enabled **Continue matching siblings** on the notification policy. +{{% /admonition %}} + +## Routing + +To determine which notification policy will handle which alert instances, you have to start by looking at the existing set of notification policies, starting with the default notification policy. + +If no policies other than the default policy are configured, the default policy will handle the alert instance. + +If policies other than the default policy are defined, it will evaluate those notification policies in the order they are displayed. + +If a notification policy has label matchers that match the labels of the alert instance, it will descend in to its child policies and, if there are any, will continue to look for any child policies that might have label matchers that further narrow down the set of labels, and so forth until no more child policies have been found. + +If no child policies are defined in a notification policy or if none of the child policies have any label matchers that match the alert instance's labels, the default notification policy is used. + +As soon as a matching policy is found, the system does not continue to look for other matching policies. If you want to continue to look for other policies that may match, enable **Continue matching siblings** on that particular policy. + +Lastly, if none of the notification policies are selected the default notification policy is used. + +### Routing example + +Here is an example of a relatively simple notification policy tree and some alert instances. + +{{< figure src="/media/docs/alerting/notification-routing.png" max-width="750px" caption="Notification policy routing" >}} + +Here's a breakdown of how these policies are selected: + +**Pod stuck in CrashLoop** does not have a `severity` label, so none of its child policies are matched. It does have a `team=operations` label, so the first policy is matched. + +The `team=security` policy is not evaluated since we already found a match and **Continue matching siblings** was not configured for that policy. + +**Disk Usage – 80%** has both a `team` and `severity` label, and matches a child policy of the operations team. + +**Unauthorized log entry** has a `team` label but does not match the first policy (`team=operations`) since the values are not the same, so it will continue searching and match the `team=security` policy. It does not have any child policies, so the additional `severity=high` label is ignored. + +## Inheritance + +In addition to child policies being a useful concept for routing alert instances, they also inherit properties from their parent policy. This also applies to any policies that are child policies of the default notification policy. + +The following properties are inherited by child policies: + +- Contact point +- Grouping options +- Timing options +- Mute timings + +Each of these properties can be overwritten by an individual policy should you wish to override the inherited properties. + +To inherit a contact point from the parent policy, leave it blank. To override the inherited grouping options, enable **Override grouping**. To override the inherited timing options, enable **Override general timings**. + +### Inheritance example + +The example below shows how the notification policy tree from our previous example allows the child policies of the `team=operations` to inherit its contact point. + +In this way, we can avoid having to specify the same contact point multiple times for each child policy. + +{{< figure src="/media/docs/alerting/notification-inheritance.png" max-width="750px" caption="Notification policy inheritance" >}} + +## Additional configuration options + +### Grouping + +Grouping is an important feature of Grafana Alerting as it allows you to batch relevant alerts together into a smaller number of notifications. This is particularly important if notifications are delivered to first-responders, such as engineers on-call, where receiving lots of notifications in a short period of time can be overwhelming and in some cases can negatively impact a first-responders ability to respond to an incident. For example, consider a large outage where many of your systems are down. In this case, grouping can be the difference between receiving 1 phone call and 100 phone calls. + +You choose how alerts are grouped together using the Group by option in a notification policy. By default, notification policies in Grafana group alerts together by alert rule using the `alertname` and `grafana_folder` labels (since alert names are not unique across multiple folders). Should you wish to group alerts by something other than the alert rule, change the grouping to any other combination of labels. + +#### Disable grouping + +Should you wish to receive every alert as a separate notification, you can do so by grouping by a special label called `...`. This is useful when your alerts are being delivered to an automated system instead of a first-responder. + +#### A single group for all alerts + +Should you wish to receive all alerts together in a single notification, you can do so by leaving Group by empty. + +### Timing options + +The timing options decide how often notifications are sent for each group of alerts. There are three timers that you need to know about: Group wait, Group interval, and Repeat interval. + +#### Group wait + +Group wait is the amount of time Grafana waits before sending the first notification for a new group of alerts. The longer Group wait is the more time you have for other alerts to arrive. The shorter Group wait is the earlier the first notification will be sent, but at the risk of sending incomplete notifications. You should always choose a Group wait that makes the most sense for your use case. + +**Default** 30 seconds + +#### Group interval + +Once the first notification has been sent for a new group of alerts, Grafana starts the Group interval timer. This is the amount of time Grafana waits before sending notifications about changes to the group. For example, another firing alert might have just been added to the group while an existing alert might have resolved. If an alert was too late to be included in the first notification due to Group wait, it will be included in subsequent notifications after Group interval. Once Group interval has elapsed, Grafana resets the Group interval timer. This repeats until there are no more alerts in the group after which the group is deleted. + +**Default** 5 minutes + +#### Repeat interval + +Repeat interval decides how often notifications are repeated if the group has not changed since the last notification. You can think of these as reminders that some alerts are still firing. Repeat interval is closely related to Group interval, which means your Repeat interval must not only be greater than or equal to Group interval, but also must be a multiple of Group interval. If Repeat interval is not a multiple of Group interval it will be coerced into one. For example, if your Group interval is 5 minutes, and your Repeat interval is 9 minutes, the Repeat interval will be rounded up to the nearest multiple of 5 which is 10 minutes. + +**Default** 4 hours + +{{% docs/reference %}} +[labels-and-label-matchers]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/annotation-label#how-label-matching-works" +[labels-and-label-matchers]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/annotation-label#how-label-matching-works" +{{% /docs/reference %}} diff --git a/docs/sources/alerting/manage-notifications/_index.md b/docs/sources/alerting/manage-notifications/_index.md index 1ea9bc24920..9adb839afcc 100644 --- a/docs/sources/alerting/manage-notifications/_index.md +++ b/docs/sources/alerting/manage-notifications/_index.md @@ -1,47 +1,22 @@ --- canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/ -description: Manage your alerts by creating silences, mute timings, and more +description: Detect and respond for day-to-day triage and analysis of what’s going on and action you need to take keywords: - grafana - - alert - - notifications + - detect + - respond labels: products: - cloud - enterprise - oss -menuTitle: Manage -title: Manage your alerts +menuTitle: Detect and respond +title: Detect and respond weight: 130 --- -# Manage your alerts +# Detect and respond -Once you have set up your alert rules, contact points, and notification policies, you can use Grafana Alerting to: +Use Grafana Alerting to track and generate alerts and send notifications, providing an efficient way for engineers to monitor, respond, and triage issues within their services. -[Create silences][create-silence] - -[Create mute timings][mute-timings] - -[Declare incidents from firing alerts][declare-incident-from-firing-alert] - -[View the state and health of alert rules][view-state-health] - -[View and filter alert rules][view-alert-rules] - -{{% docs/reference %}} -[create-silence]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/create-silence" -[create-silence]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/create-silence" - -[declare-incident-from-firing-alert]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/declare-incident-from-alert" -[declare-incident-from-firing-alert]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/declare-incident-from-alert" - -[mute-timings]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/mute-timings" -[mute-timings]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/mute-timings" - -[view-alert-rules]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/view-alert-rules" -[view-alert-rules]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/view-alert-rules" - -[view-state-health]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/view-state-health" -[view-state-health]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/view-state-health" -{{% /docs/reference %}} +Alerts and alert notifications provide a lot of value as key indicators to issues during the triage process, providing engineers with the information they need to understand what is going on in their system or service. diff --git a/docs/sources/alerting/manage-notifications/declare-incident-from-alert.md b/docs/sources/alerting/manage-notifications/declare-incident-from-alert.md index 10459fa355e..019efae8699 100644 --- a/docs/sources/alerting/manage-notifications/declare-incident-from-alert.md +++ b/docs/sources/alerting/manage-notifications/declare-incident-from-alert.md @@ -1,6 +1,6 @@ --- aliases: - - alerting/alerting-rules/declare-incident-from-alert/ + - ../../alerting/alerting-rules/declare-incident-from-alert/ # /docs/grafana//alerting/alerting-rules/declare-incident-from-alert/ canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/declare-incident-from-alert/ description: Declare an incident from a firing alert keywords: diff --git a/docs/sources/alerting/manage-notifications/manage-contact-points.md b/docs/sources/alerting/manage-notifications/manage-contact-points.md deleted file mode 100644 index bbfd98e4b1e..00000000000 --- a/docs/sources/alerting/manage-notifications/manage-contact-points.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/manage-contact-points/ -description: View, edit, copy, or delete your contact points and notification templates -keywords: - - grafana - - alerting - - contact points - - search - - export -labels: - products: - - cloud - - enterprise - - oss -title: Manage contact points -weight: 410 ---- - -# Manage contact points - -The Contact points list view lists all existing contact points and notification templates. - -On the **Contact Points** tab, you can: - -- Search for name and type of contact points and integrations -- View all existing contact points and integrations -- View how many notification policies each contact point is being used for and navigate directly to the linked notification policies -- View the status of notification deliveries -- Export individual contact points or all contact points in JSON, YAML, or Terraform format -- Delete contact points that are not in use by a notification policy - -On the **Notification templates** tab, you can: - -- View, edit, copy or delete existing notification templates diff --git a/docs/sources/alerting/manage-notifications/template-notifications/_index.md b/docs/sources/alerting/manage-notifications/template-notifications/_index.md deleted file mode 100644 index 1a5507f577a..00000000000 --- a/docs/sources/alerting/manage-notifications/template-notifications/_index.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/template-notifications/ -description: Customize your notifications using notification templates -keywords: - - grafana - - alerting - - notifications - - templates -labels: - products: - - cloud - - enterprise - - oss -title: Customize notifications -weight: 400 ---- - -# Customize notifications - -Customize your notifications with notifications templates. - -You can use notification templates to change the title, message, and format of the message in your notifications. - -Notification templates are not tied to specific contact point integrations, such as email or Slack. However, you can choose to create separate notification templates for different contact point integrations. - -You can use notification templates to: - -- Customize the subject of an email or the title of a message. -- Add, change or remove text in notifications. For example, to select or omit certain labels, annotations and links. -- Format text in bold and italic, and add or remove line breaks. - -You cannot use notification templates to: - -- Add HTML and CSS to email notifications to change their visual appearance. -- Change the design of notifications in instant messaging services such as Slack and Microsoft Teams. For example, to add or remove custom blocks with Slack Block Kit or adaptive cards with Microsoft Teams. -- Choose the number and size of images, or where in the notification images are shown. -- Customize the data in webhooks, including the fields or structure of the JSON data or send the data in other formats such as XML. -- Add or remove HTTP headers in webhooks other than those in the contact point configuration. - -[Using Go's templating language][using-go-templating-language] - -Learn how to write the content of your notification templates in Go’s templating language. - -Create reusable notification templates for your contact points. - -[Use notification templates][use-notification-templates] - -Use notification templates to send notifications to your contact points. - -[Reference][reference] - -Data that is available when writing templates. - -{{% docs/reference %}} -[reference]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications/reference" -[reference]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications/reference" - -[use-notification-templates]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications/use-notification-templates" -[use-notification-templates]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications/use-notification-templates" - -[using-go-templating-language]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications/using-go-templating-language" -[using-go-templating-language]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications/using-go-templating-language" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/manage-notifications/template-notifications/use-notification-templates.md b/docs/sources/alerting/manage-notifications/template-notifications/use-notification-templates.md deleted file mode 100644 index a2a341e02c0..00000000000 --- a/docs/sources/alerting/manage-notifications/template-notifications/use-notification-templates.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/template-notifications/use-notification-templates/ -description: Use notification templates in contact points to customize your notifications -keywords: - - grafana - - alerting - - notifications - - templates - - use templates -labels: - products: - - cloud - - enterprise - - oss -title: Use notification templates -weight: 300 ---- - -# Use notification templates - -Use templates in contact points to customize your notifications. - -In the Contact points tab, you can see a list of your contact points. - -1. To create a new contact point, click New. - - **Note:** You can edit an existing contact by clicking the Edit icon. - -1. Execute a template from one or more fields such as Message and Subject: - - {{< figure max-width="940px" src="/static/img/docs/alerting/unified/use-notification-template-9-4.png" caption="Use notification template" >}} - - For more information on how to write and execute templates, refer to [Using Go's templating language][using-go-templating-language] and [Create notification templates][create-notification-templates]. - -1. Click **Save contact point**. - -{{% docs/reference %}} -[create-notification-templates]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications/create-notification-templates" -[create-notification-templates]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications/create-notification-templates" - -[using-go-templating-language]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications/using-go-templating-language" -[using-go-templating-language]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications/using-go-templating-language" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/manage-notifications/view-alert-groups.md b/docs/sources/alerting/manage-notifications/view-alert-groups.md index 105806767dd..f050af7373f 100644 --- a/docs/sources/alerting/manage-notifications/view-alert-groups.md +++ b/docs/sources/alerting/manage-notifications/view-alert-groups.md @@ -1,10 +1,9 @@ --- aliases: - - -docs/grafana/latest/alerting/manage-notifications/view-alert-groups/ - - ../alert-groups/ - - ../alert-groups/filter-alerts/ - - ../alert-groups/view-alert-grouping/ - - ../unified-alerting/alert-groups/ + - ../../alerting/alert-groups/ # /docs/grafana//alerting/alert-groups/ + - ../../alerting/alert-groups/filter-alerts/ # /docs/grafana//alerting/alert-groups/filter-alerts/ + - ../../alerting/alert-groups/view-alert-grouping/ # /docs/grafana//alerting/alert-groups/view-alert-grouping/ + - ../../alerting/unified-alerting/alert-groups/ # /docs/grafana//alerting/unified-alerting/alert-groups/ canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/view-alert-groups/ description: Alert groups keywords: diff --git a/docs/sources/alerting/manage-notifications/view-alert-rules.md b/docs/sources/alerting/manage-notifications/view-alert-rules.md index 3bc2ff79585..8f70591b733 100644 --- a/docs/sources/alerting/manage-notifications/view-alert-rules.md +++ b/docs/sources/alerting/manage-notifications/view-alert-rules.md @@ -1,10 +1,10 @@ --- aliases: - - ../unified-alerting/alerting-rules/rule-list/ - - ../view-alert-rules/ - - rule-list/ + - ../../alerting/unified-alerting/alerting-rules/rule-list/ # /docs/grafana//alerting/unified-alerting/alerting-rules/rule-list + - ../../alerting/alerting-rules/view-alert-rules/ # /docs/grafana//alerting/alerting-rules/view-alert-rules + - ../../alerting/alerting-rules/rule-list/ # /docs/grafana//alerting/alerting-rules/rule-list canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/view-alert-rules/ -description: View and filter by alert rules +description: View alert rules keywords: - grafana - alerting @@ -16,66 +16,61 @@ labels: - cloud - enterprise - oss -title: View and filter alert rules +title: View alert rules weight: 410 --- -# View and filter alert rules +# View alert rules -The Alerting page lists all existing alert rules. By default, rules are grouped by types of data sources. The Grafana section lists all Grafana managed rules. Alert rules for Prometheus compatible data sources are also listed here. You can view alert rules for Prometheus compatible data sources but you cannot edit them. - -The Mimir/Cortex/Loki rules section lists all rules for Mimir, Cortex, or Loki data sources. Cloud alert rules are also listed in this section. +The Alert rules list view page lists all existing alert rules. By default, alert rules are grouped by alert rule type: Grafana-managed (Grafana) or data source-managed (Mimir/Cortex/Loki). The Grafana section also contains alert rules for Prometheus-compatible data sources. You can view alert rules for Prometheus compatible data sources, but you cannot edit them. When managing large volumes of alerts, you can use extended alert rule search capabilities to filter on folders, evaluation groups, and rules. Additionally, you can filter alert rules by their properties like labels, state, type, and health. -- [View and filter alert rules](#view-and-filter-alert-rules) - - [View alert rules](#view-alert-rules) - - [Export alert rules](#export-alert-rules) - - [View query definitions for provisioned alerts](#view-query-definitions-for-provisioned-alerts) - - [Grouped view](#grouped-view) - - [State view](#state-view) - - [Filter alert rules](#filter-alert-rules) +From the Alert rule list page, you can also duplicate alert rules to help you reuse existing alert rules. ## View alert rules -To view alerting details: +To view your alert rules, complete the following steps. + +1. Click **Alerts & IRM** -> **Alert rules**. +1. In **View as**, toggle between Grouped, List, or State views. +1. Expand each alert rule row to view the state, health, evaluation details, as well as a list of alert instances resulting from the alert rule. +1. Use **Search by data sources** to view alert rules that query the selected data source. -1. Click **Alerts & IRM** -> **Alert rules**. By default, the List view displays. -1. In **View as**, toggle between Grouped, List, or State views by clicking the relevant option. See [Grouped view](#grouped-view) and [State view](#state-view) for more information. -1. Expand the rule row to view the rule labels, annotations, data sources the rule queries, and a list of alert instances resulting from this rule. +### Grouped view -{{< figure src="/static/img/docs/alerting/unified/rule-details-8-0.png" max-width="650px" caption="Alerting rule details" >}} +Grouped view shows Grafana alert rules grouped by folder and Loki or Prometheus alert rules grouped by `namespace` + `group`. This is the default rule list view, intended for managing alert rules. You can expand each group to view a list of rules in this group. -From the Alert list page, you can also make copies of alert rules to help you reuse existing alert rules. +### State view -## Export alert rules +State view shows alert rules grouped by state. Use this view to get an overview of which rules are in which state. You can expand each group to view more details. -Click the **Export rule group** icon next to each alert rule group to export to YAML, JSON, or Terraform. +## View alert rule details -Click **Export rules** to export all Grafana-managed alert rules to YAML, JSON, or Terraform. +To view alert rule details, complete the following steps. -Click **More** -> **Modify export** next to each individual alert rule within a group to edit provisioned alert rules and export a modified version. +1. Click **Alerts & IRM** -> **Alert rules**. +1. Click to expand an alert rule. +1. In **Actions**, click **View** (the eye icon). -## View query definitions for provisioned alerts + The namespace and group are shown in the breadcrumb navigation. They are interactive and can be used to filter rules by namespace or group. -View read-only query definitions for provisioned alerts. Check quickly if your alert rule queries are correct, without diving into your "as-code" repository for rule definitions. + The rest of the alert detail content is split up into tabs: -### Grouped view + **Query and conditions** -Grouped view shows Grafana alert rules grouped by folder and Loki or Prometheus alert rules grouped by `namespace` + `group`. This is the default rule list view, intended for managing rules. You can expand each group to view a list of rules in this group. Expand a rule further to view its details. You can also expand action buttons and alerts resulting from the rule to view their details. + View the details of the query that is used for the alert rule, including the expressions and intermediate values for each step of the expression pipeline. A graph view is included for range queries and data sources that return time series-like data frames. -{{< figure src="/static/img/docs/alerting/unified/rule-list-group-view-8-0.png" max-width="800px" caption="Alerting grouped view" >}} + **Instances** -### State view + Explore each alert instance, its status, labels and various other metadata for multi-dimensional alert rules. -State view shows alert rules grouped by state. Use this view to get an overview of which rules are in what state. Each rule can be expanded to view its details. Action buttons and any alerts generated by this rule, and each alert can be further expanded to view its details. + Use **Search by label** to enter search criteria using label selectors. For example, `environment=production,region=~US|EU,severity!=warning`. -{{< figure src="/static/img/docs/alerting/unified/rule-list-state-view-8-0.png" max-width="800px" caption="Alerting state view" >}} + **History** -## Filter alert rules + Explore the recorded history for an alert rule. You can also filter by alert state. -To filter alert rules: + **Details** -- From **Select data sources**, select a data source. You can see alert rules that query the selected data source. -- In the **Search by label**, enter search criteria using label selectors. For example, `environment=production,region=~US|EU,severity!=warning`. -- From **Filter alerts by state**, select an alerting state you want to see. You can see alerting rules that match the state. Rules matching other states are hidden. + Debug or audit using the alert rule metadata and view the alert rule annotations. diff --git a/docs/sources/alerting/manage-notifications/view-state-health.md b/docs/sources/alerting/manage-notifications/view-state-health.md index 0b4a5fb7190..0a376099295 100644 --- a/docs/sources/alerting/manage-notifications/view-state-health.md +++ b/docs/sources/alerting/manage-notifications/view-state-health.md @@ -1,8 +1,6 @@ --- aliases: - - ../fundamentals/state-and-health/ - - ../unified-alerting/alerting-rules/state-and-health/ - - ../view-state-health/ + - ../../alerting/alerting-rules/view-state-health/ # /docs/grafana//alerting/alerting-rules/view-state-health canonical: https://grafana.com/docs/grafana/latest/alerting/manage-notifications/view-state-health/ description: View the state and health of alert rules keywords: diff --git a/docs/sources/alerting/set-up/_index.md b/docs/sources/alerting/set-up/_index.md index 37ec1194491..e98b0e5e12d 100644 --- a/docs/sources/alerting/set-up/_index.md +++ b/docs/sources/alerting/set-up/_index.md @@ -1,6 +1,6 @@ --- aliases: - - unified-alerting/set-up/ + - unified-alerting/set-up/ # /docs/grafana//alerting/unified-alerting/set-up/ canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/ description: Set up or upgrade your implementation of Grafana Alerting labels: @@ -57,7 +57,7 @@ Grafana Alerting supports many additional configuration options, from configurin The following topics provide you with advanced configuration options for Grafana Alerting. -- [Provision alert rules using file provisioning](/docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning) +- [Provision alert rules using file provisioning][file-provisioning] - [Provision alert rules using Terraform][terraform-provisioning] - [Add an external Alertmanager][configure-alertmanager] - [Configure high availability][configure-high-availability] @@ -69,11 +69,12 @@ The following topics provide you with advanced configuration options for Grafana [configure-high-availability]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/configure-high-availability" [configure-high-availability]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/configure-high-availability" -[data-source-alerting]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/data-source-alerting" -[data-source-alerting]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/data-source-alerting" +[data-source-alerting]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules#supported-data-sources" +[data-source-alerting]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules#supported-data-sources" -[data-source-management]: "/docs/grafana/ -> /docs/grafana//administration/data-source-management" -[data-source-management]: "/docs/grafana-cloud/ -> /docs/grafana//administration/data-source-management" +[data-source-management]: "/docs/ -> /docs/grafana//administration/data-source-management" + +[file-provisioning]: "/docs/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning" [terraform-provisioning]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/terraform-provisioning" [terraform-provisioning]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/terraform-provisioning" diff --git a/docs/sources/alerting/set-up/configure-alert-state-history/index.md b/docs/sources/alerting/set-up/configure-alert-state-history/index.md index c6b47db765e..a9892dc716b 100644 --- a/docs/sources/alerting/set-up/configure-alert-state-history/index.md +++ b/docs/sources/alerting/set-up/configure-alert-state-history/index.md @@ -10,11 +10,11 @@ keywords: labels: products: - oss -title: Configure Alert State History -weight: 600 +title: Configure alert state history +weight: 250 --- -# Configure Alert State History +# Configure alert state history Starting with Grafana 10, Alerting can record all alert rule state changes for your Grafana managed alert rules in a Loki instance. diff --git a/docs/sources/alerting/set-up/configure-alertmanager/index.md b/docs/sources/alerting/set-up/configure-alertmanager/index.md index 3b6d24a6d8a..d2d9c3148c8 100644 --- a/docs/sources/alerting/set-up/configure-alertmanager/index.md +++ b/docs/sources/alerting/set-up/configure-alertmanager/index.md @@ -1,6 +1,6 @@ --- aliases: - - ../configure-alertmanager/ + - ../configure-alertmanager/ # /docs/grafana//configure-alertmanager/ canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/configure-alertmanager/ description: Configure an Alertmanager to receive all of your alerts keywords: @@ -27,11 +27,7 @@ Grafana Alerting does not support sending alerts to the AWS Managed Service for Once you have added the Alertmanager, you can use the Grafana Alerting UI to manage silences, contact points, and notification policies. A drop-down option in these pages allows you to switch between alertmanagers. -{{% admonition type="note" %}} -Starting with Grafana 9.2, the URL configuration of external alertmanagers from the Admin tab on the Alerting page is deprecated. It will be removed in a future release. -{{% /admonition %}} - -External alertmanagers should now be configured as data sources using Grafana Configuration from the main Grafana navigation menu. This enables you to manage the contact points and notification policies of external alertmanagers from within Grafana and also encrypts HTTP basic authentication credentials that were previously visible when configuring external alertmanagers by URL. +External alertmanagers should now be configured as data sources using Grafana Configuration from the main Grafana navigation menu. This enables you to manage the contact points and notification policies of external alertmanagers from within Grafana and also encrypts HTTP basic authentication credentials. To add an external Alertmanager, complete the following steps. diff --git a/docs/sources/alerting/set-up/configure-high-availability/_index.md b/docs/sources/alerting/set-up/configure-high-availability/_index.md index d71926d9d9a..4992fbbe9eb 100644 --- a/docs/sources/alerting/set-up/configure-high-availability/_index.md +++ b/docs/sources/alerting/set-up/configure-high-availability/_index.md @@ -1,9 +1,11 @@ --- aliases: - - ../high-availability/enable-alerting-ha/ - - ../unified-alerting/high-availability/ + - ../unified-alerting/high-availability/ # /docs/grafana//alerting/unified-alerting/high-availability + - ../high-availability/enable-alerting-ha/ # /docs/grafana//alerting/high-availability/enable-alerting-ha/ + - ../high-availability/ # /docs/grafana//alerting/high-availability + - ../fundamentals/high-availability/ # /docs/grafana//alerting/fundamentals/high-availability canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/configure-high-availability/ -description: Enable alerting high availability +description: Configure High Availability keywords: - grafana - alerting @@ -14,14 +16,23 @@ labels: products: - enterprise - oss -title: Enable alerting high availability -weight: 400 +title: Configure high availability +weight: 600 --- -# Enable alerting high availability +# Configure high availability -You can enable alerting high availability support by updating the Grafana configuration file. If you run Grafana in a Kubernetes cluster, additional steps are required. Both options are described below. -Please note that the deduplication is done for the notification, but the alert will still be evaluated on every Grafana instance. This means that events in alerting state history will be duplicated by the number of Grafana instances running. +Grafana Alerting uses the Prometheus model of separating the evaluation of alert rules from the delivering of notifications. In this model, the evaluation of alert rules is done in the alert generator and the delivering of notifications is done in the alert receiver. In Grafana Alerting, the alert generator is the Scheduler and the receiver is the Alertmanager. + +{{< figure src="/static/img/docs/alerting/unified/high-availability-ua.png" class="docs-image--no-shadow" max-width= "750px" caption="High availability" >}} + +When running multiple instances of Grafana, all alert rules are evaluated on all instances. You can think of the evaluation of alert rules as being duplicated by the number of running Grafana instances. This is how Grafana Alerting makes sure that as long as at least one Grafana instance is working, alert rules will still be evaluated and notifications for alerts will still be sent. + +You can find this duplication in state history and it is a good way to confirm if you are using high availability. + +While the alert generator evaluates all alert rules on all instances, the alert receiver makes a best-effort attempt to avoid sending duplicate notifications. Alertmanager chooses availability over consistency, which may result in occasional duplicated or out-of-order notifications. It takes the opinion that duplicate or out-of-order notifications are better than no notifications. + +The Alertmanager uses a gossip protocol to share information about notifications between Grafana instances. It also gossips silences, which means a silence created on one Grafana instance is replicated to all other Grafana instances. Both notifications and silences are persisted to the database periodically, and during graceful shut down. {{% admonition type="note" %}} @@ -30,31 +41,31 @@ This is because the HA settings (`ha_peers`, etc), only apply to the alert notif {{% /admonition %}} -## Enable alerting high availability in Grafana using Memberlist +## Enable alerting high availability using Memberlist -### Before you begin +**Before you begin** Since gossiping of notifications and silences uses both TCP and UDP port `9094`, ensure that each Grafana instance is able to accept incoming connections on these ports. **To enable high availability support:** 1. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the `[unified_alerting]` section. -2. Set `[ha_peers]` to the number of hosts for each Grafana instance in the cluster (using a format of host:port), for example, `ha_peers=10.0.0.5:9094,10.0.0.6:9094,10.0.0.7:9094`. +1. Set `[ha_peers]` to the number of hosts for each Grafana instance in the cluster (using a format of host:port), for example, `ha_peers=10.0.0.5:9094,10.0.0.6:9094,10.0.0.7:9094`. You must have at least one (1) Grafana instance added to the `ha_peers` section. -3. Set `[ha_listen_address]` to the instance IP address using a format of `host:port` (or the [Pod's](https://kubernetes.io/docs/concepts/workloads/pods/) IP in the case of using Kubernetes). +1. Set `[ha_listen_address]` to the instance IP address using a format of `host:port` (or the [Pod's](https://kubernetes.io/docs/concepts/workloads/pods/) IP in the case of using Kubernetes). By default, it is set to listen to all interfaces (`0.0.0.0`). -4. Set `[ha_peer_timeout]` in the `[unified_alerting]` section of the custom.ini to specify the time to wait for an instance to send a notification via the Alertmanager. The default value is 15s, but it may increase if Grafana servers are located in different geographic regions or if the network latency between them is high. +1. Set `[ha_peer_timeout]` in the `[unified_alerting]` section of the custom.ini to specify the time to wait for an instance to send a notification via the Alertmanager. The default value is 15s, but it may increase if Grafana servers are located in different geographic regions or if the network latency between them is high. -## Enable alerting high availability in Grafana using Redis +## Enable alerting high availability using Redis As an alternative to Memberlist, you can use Redis for high availability. This is useful if you want to have a central database for HA and cannot support the meshing of all Grafana servers. 1. Make sure you have a redis server that supports pub/sub. If you use a proxy in front of your redis cluster, make sure the proxy supports pub/sub. -2. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the [unified_alerting] section. -3. Set `ha_redis_address` to the redis server address Grafana should connect to. -4. [Optional] Set the username and password if authentication is enabled on the redis server using `ha_redis_username` and `ha_redis_password`. -5. [Optional] Set `ha_redis_prefix` to something unique if you plan to share the redis server with multiple Grafana instances. +1. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the [unified_alerting] section. +1. Set `ha_redis_address` to the redis server address Grafana should connect to. +1. [Optional] Set the username and password if authentication is enabled on the redis server using `ha_redis_username` and `ha_redis_password`. +1. [Optional] Set `ha_redis_prefix` to something unique if you plan to share the redis server with multiple Grafana instances. The following metrics can be used for meta monitoring, exposed by Grafana's `/metrics` endpoint: @@ -72,67 +83,67 @@ The following metrics can be used for meta monitoring, exposed by Grafana's `/me ## Enable alerting high availability using Kubernetes -If you are using Kubernetes, you can expose the pod IP [through an environment variable](https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/) via the container definition. +1. You can expose the pod IP [through an environment variable](https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/) via the container definition. -```yaml -env: - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP -``` + ```yaml + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + ``` 1. Add the port 9094 to the Grafana deployment: -```yaml -ports: - - containerPort: 3000 - name: http-grafana - protocol: TCP - - containerPort: 9094 - name: grafana-alert - protocol: TCP -``` - -2. Add the environment variables to the Grafana deployment: - -```yaml -env: - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP -``` - -3. Create a headless service that returns the pod IP instead of the service IP, which is what the `ha_peers` need: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: grafana-alerting - namespace: grafana - labels: - app.kubernetes.io/name: grafana-alerting - app.kubernetes.io/part-of: grafana -spec: - type: ClusterIP - clusterIP: 'None' - ports: - - port: 9094 - selector: - app: grafana -``` - -4. Make sure your grafana deployment has the label matching the selector, e.g. `app:grafana`: - -5. Add in the grafana.ini: - -```bash -[unified_alerting] -enabled = true -ha_listen_address = "${POD_IP}:9094" -ha_peers = "grafana-alerting.grafana:9094" -ha_advertise_address = "${POD_IP}:9094" -ha_peer_timeout = 15s -``` + ```yaml + ports: + - containerPort: 3000 + name: http-grafana + protocol: TCP + - containerPort: 9094 + name: grafana-alert + protocol: TCP + ``` + +1. Add the environment variables to the Grafana deployment: + + ```yaml + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + ``` + +1. Create a headless service that returns the pod IP instead of the service IP, which is what the `ha_peers` need: + + ```yaml + apiVersion: v1 + kind: Service + metadata: + name: grafana-alerting + namespace: grafana + labels: + app.kubernetes.io/name: grafana-alerting + app.kubernetes.io/part-of: grafana + spec: + type: ClusterIP + clusterIP: 'None' + ports: + - port: 9094 + selector: + app: grafana + ``` + +1. Make sure your grafana deployment has the label matching the selector, e.g. `app:grafana`: + +1. Add in the grafana.ini: + + ```bash + [unified_alerting] + enabled = true + ha_listen_address = "${POD_IP}:9094" + ha_peers = "grafana-alerting.grafana:9094" + ha_advertise_address = "${POD_IP}:9094" + ha_peer_timeout = 15s + ``` diff --git a/docs/sources/alerting/set-up/migrating-alerts/_index.md b/docs/sources/alerting/set-up/migrating-alerts/_index.md deleted file mode 100644 index 147a76197de..00000000000 --- a/docs/sources/alerting/set-up/migrating-alerts/_index.md +++ /dev/null @@ -1,228 +0,0 @@ ---- -aliases: - - ../migrating-alerts/ # /docs/grafana//alerting/migrating-alerts/ -canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/migrating-alerts/ -description: Upgrade to Grafana Alerting -labels: - products: - - enterprise - - oss -title: Upgrade Alerting -weight: 150 ---- - -# Upgrade Alerting - -{{% admonition type="warning" %}} -Legacy alerting will be removed in Grafana v11.0.0. Grafana v10.4 is the last version that offers legacy alerting and the last version of Grafana where automatic alert upgrades will be available. - -Installing Grafana 11 before upgrading your legacy alerts will result in your existing alerts becoming inaccessible or lost. - -For more information, refer to [Legacy alerting removal: What you need to know about upgrading to Grafana Alerting](https://grafana.com/blog/2024/04/04/legacy-alerting-removal-what-you-need-to-know-about-upgrading-to-grafana-alerting/). -{{% /admonition %}} - -## What happens if I don’t upgrade from legacy alerting to Grafana Alerting before installing Grafana 11? - -Attempting to upgrade to Grafana 11 while still having [legacy alerting explicitly enabled]({{< relref "#rolling-back-to-legacy-alerting" >}}) will result in Grafana not starting and an error message informing you to either: - -1. Downgrade to a version prior to Grafana 11 and then upgrade from legacy alerting to Grafana Alerting using one of the below [upgrade methods]({{< relref "#upgrade-methods" >}}). -2. Confirm that you don't intend to upgrade your legacy alerts by [disabling legacy alerting]({{< relref "#enable-grafana-alerting" >}}) (optionally enable Grafana Alerting) in your configuration file. - -{{% admonition type="note" %}} -Confirming that you don't intend to upgrade your legacy alerts and continuing the Grafana 11 installation may result in your legacy alerts becoming inaccessible or lost. - -Grafana will start with a blank alerting slate and you will need to recreate your alerts from scratch. The below automatic upgrade methods will not be available in Grafana 11. - -As of v11.0, a rolling back to v10.4 will likely restore your legacy alerts. However, this is not guaranteed to always remain the case in future versions. -{{% /admonition %}} - -## Upgrade methods - -Grafana provides two methods for a seamless automatic upgrade of legacy alert rules and notification channels to Grafana Alerting: - -1. **Upgrade with Preview** (Recommended): Offers a safe and controlled preview environment where you can review and adjust your upgraded alerts before fully enabling Grafana Alerting. -2. **Simple Upgrade**: One-step upgrade method for specific needs where a preview environment is not essential. - -### Key Considerations - -| Feature | Upgrade with Preview | Simple Upgrade | -| --------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------- | -| **Safety and Control** | ☑️ Preview environment for review and adjustment | ❌ No preview, potential for unexpected issues | -| **User Experience** | ☑️ Seamless transition by handling issues early | ❌ Possible disruption during upgrade | -| **Granular Control** | ☑️ Re-upgrade specific resources after resolving errors | ❌ All or nothing upgrade, manual error correction | -| **Stakeholder Involvement** | ☑️ Collaboration and review of adjusted alerts | ❌ Review only available after upgrade | -| **Provisioning Support** | ☑️ Configure new as-code before upgrading, simultaneous provisioning | ❌ No built-in provisioning support | -| **Simplicity** | ❌ May take longer to complete | ☑️ Fast, one-step process | -| **Suited for:** | ☑️ Complex setups, risk-averse environments, collaborative teams, heavy as-code use | ☑️ Simple setups, testing environments, large fleets | -| **Version** | Grafana v10.3.0 -> v10.4.x | Grafana v9.0.0 -> v10.4.x | - -{{% admonition type="note" %}} -When upgrading with either method, your legacy dashboard alerts and notification channels are copied to a new format. This is non-destructive and can be [rolled back easily]({{< relref "#rolling-back-to-legacy-alerting" >}}). -{{% /admonition %}} - -## Upgrade with Preview (Recommended) - -### Prerequisites - -- Grafana `v10.3.0 or later`. -- Grafana administrator access. -- Enable `alertingPreviewUpgrade` [feature toggle]({{< relref "../../../setup-grafana/configure-grafana/feature-toggles" >}}) (enabled by default in v10.4.0 or later). - -### Suited for - -- **Complex setups**: Large deployments with intricate alert rules and notification channels. -- **Risk-averse environments**: Situations where minimizing disruption and ensuring a smooth transition are critical. -- **Collaborative teams**: Projects where feedback and review from stakeholders are valuable. -- **Heavy as-code use**: Deployments with large or complex as-code configurations. - -### Overview - -In **Alerts & IRM**, the **Alerting** section provides a preview of Grafana Alerting where you can review and modify your upgraded alerts before finalizing the upgrade. - -In the **Alerting (legacy) -> Alerting upgrade** section, you can upgrade your existing alert rules and notification channels, and view a summary of the upgrade to Grafana Alerting. - -Finalize your upgrade by restarting Grafana with the `[unified_alerting]` section enabled in your configuration. - -{{% admonition type="note" %}} -Alerts generated by the new alerting system are visible in the **Alerting** section of the navigation panel but are not active until the upgrade is finalized. -{{% /admonition %}} - -### To upgrade with preview, complete the following steps. - -1. **Preview the Upgrade**: - - **Initiate the process**: Access the upgrade functionality within Grafana by visiting the **Alerting upgrade** page in the **Alerting (legacy)** section of the navigation panel. From this page you can upgrade your existing alert rules and notification channels to the new Grafana Alerting system. - - **Review the summary table:** Review the detailed table outlining how your existing alert rules and notification channels were upgraded to resources in the new Grafana Alerting system. -1. **Investigate and Resolve Errors**: - - **Identify errors**: Carefully examine the previewed upgrade: - - Any alert rules or notification channels that couldn't be automatically upgraded will be highlighted with error indicators. - - New or removed alert rules and notification channels will be highlighted with warning indicators. - - **Address errors**: You have two options to resolve these issues: - - **Fix legacy issues**: If possible, address the problems within your legacy alerting setup and attempt to upgrade the specific resource again. - - **Create new resources**: If fixing legacy issues isn't viable, create new alert rules, notification policies, or contact points manually within the new Grafana Alerting system to replace the problematic ones. -1. **Update As-Code Setup** (Optional): - - **Export upgraded resources**: If you use provisioning methods to manage alert rules and notification channels, you can export the upgraded versions to generate provisioning files compatible with Grafana Alerting. - - **Test new provisioning definitions**: Ensure your as-code setup aligns with the new system before completing the upgrade process. Both legacy and Grafana Alerting alerts can be provisioned simultaneously to facilitate a smooth transition. -1. **Finalize the Upgrade**: - - **Contact your Grafana server administrator**: Once you're confident in the state of your previewed upgrade, request to [enable Grafana Alerting]({{< relref "#enable-grafana-alerting" >}}). - - **Continued use for upgraded organizations**: Organizations that have already completed the preview upgrade will seamlessly continue using their configured setup. - - **Automatic upgrade for others**: Organizations that haven't initiated the upgrade with preview process will undergo the traditional automatic upgrade during this restart. - - **Address issues before restart**: Exercise caution, as Grafana will not start if any traditional automatic upgrades encounter errors. Ensure all potential issues are resolved before initiating this step. - -## Simple Upgrade - -### Prerequisites - -- Grafana `v9.0.0 or later` (more recent versions are recommended). - -### Suited for - -- **Simple setups**: Limited number of alerts and channels with minimal complexity. -- **Testing environments**: Where a quick upgrade without a preview is sufficient. -- **Large fleets**: Where manually reviewing each instance is not feasible. - -### Overview - -While we recommend the **Upgrade with Preview** method for its enhanced safety and control, the **Simple Upgrade Method** exists for specific situations where a preview environment is not essential. For example, if you have a large fleet of Grafana instances and want to upgrade them all without the need to review and adjust each one individually. - -Configure your Grafana instance to enable Grafana Alerting and disable legacy alerting. Then restart Grafana to automatically upgrade your existing alert rules and notification channels to the new Grafana Alerting system. - -Once Grafana Alerting is enabled, you can review and adjust your upgraded alerts in the **Alerting** section of the navigation panel as well as export them for as-code setup. - -### To perform the simple upgrade, complete the following steps. - -{{% admonition type="note" %}} -Any errors encountered during the upgrade process will fail the upgrade and prevent Grafana from starting. If this occurs, you can [roll back to legacy alerting]({{< relref "#rolling-back-to-legacy-alerting" >}}). -{{% /admonition %}} - -1. **Upgrade to Grafana Alerting**: - - **Enable Grafana Alerting**: [Modify custom configuration file]({{< relref "#enable-grafana-alerting" >}}). - - **Restart Grafana**: Restart Grafana for the configuration changes to take effect. Grafana will automatically upgrade your existing alert rules and notification channels to the new Grafana Alerting system. -1. **Review and Adjust Upgraded Alerts**: - - **Review the upgraded alerts**: Go to the `Alerting` section of the navigation panel to review the upgraded alerts. - - **Export upgraded resources**: If you use provisioning methods to manage alert rules and notification channels, you can export the upgraded versions to generate provisioning files compatible with Grafana Alerting. - -## Additional Information - -### Enable Grafana Alerting - -Go to your custom configuration file ($WORKING_DIR/conf/custom.ini) and enter the following in your configuration: - -```toml -[alerting] -enabled = false - -[unified_alerting] -enabled = true -``` - -{{% admonition type="note" %}} -If you have existing legacy alerts we advise using the [Upgrade with Preview]({{< relref "#upgrade-with-preview-recommended" >}}) method first to ensure a smooth transition. Any organizations that have not completed the preview upgrade will automatically undergo the simple upgrade during the next restart. -{{% /admonition %}} - -### Rolling back to legacy alerting - -{{% admonition type="note" %}} -For Grafana Cloud, contact customer support to enable or disable Grafana Alerting for your stack. -{{% /admonition %}} - -If you have upgraded to Grafana Alerting and want to roll back to legacy alerting, you can do so by disabling Grafana Alerting and re-enabling legacy alerting. - -Go to your custom configuration file ($WORKING_DIR/conf/custom.ini) and enter the following in your configuration: - -```toml -[alerting] -enabled = true - -[unified_alerting] -enabled = false -``` - -This action is non-destructive. You can seamlessly switch between legacy alerting and Grafana Alerting at any time without losing any data. However, the upgrade process will only be performed once. If you have opted out of Grafana Alerting and then opt in again, Grafana will not perform the upgrade again. - -If, after rolling back, you wish to delete any existing Grafana Alerting configuration and upgrade your legacy alerting configuration again from scratch, you can enable the `clean_upgrade` option: - -```toml -[unified_alerting.upgrade] -clean_upgrade = true -``` - -### Differences and limitations - -There are some differences between Grafana Alerting and legacy dashboard alerts, and a number of features that are no longer supported. - -**Differences** - -1. Read and write access to legacy dashboard alerts are governed by the dashboard permissions (including the inherited permissions from the folder) while Grafana alerts are governed by the permissions of the folder only. During the upgrade, an alert rule might be moved to a different folder to match the permissions of the dashboard. The following rules apply: - - - If the inherited dashboard permissions are different from the permissions of the folder, then the rule is moved to a new folder named after the original: ` - `. - - If the inherited dashboard permissions are the same as the permissions of the folder, then the rule is moved to the original folder. - - If the dashboard is in the `General` or `Dashboards` folder (i.e. no folder), then the rule is moved to a new `General Alerting - ` folder. - -{{% admonition type="note" %}} -When updating your as-code provisioning setup for Grafana Alerting, newly generated folders will have a different UID from their original. -{{% /admonition %}} - -1. `NoData` and `Error` settings are upgraded as is to the corresponding settings in Grafana Alerting, except in two situations: - - - As there is no `Keep Last State` option in Grafana Alerting, this option becomes either [`NoData` or `Error`][alerting_config_error_handling]. If using the `Simple Upgrade Method` Grafana automatically creates a 1 year silence for each alert rule with this configuration. If the alert evaluation returns no data or fails (error or timeout), then it creates a [special alert][special_alert], which will be silenced by the silence created during the upgrade. - - Due to lack of validation, legacy alert rules imported via JSON or provisioned along with dashboards can contain arbitrary values for [`NoData` or `Error`][alerting_config_error_handling]. In this situation, Grafana will use the default setting: `NoData` for No data, and `Error` for Error. - -1. Notification channels are upgraded to an Alertmanager configuration with the appropriate routes and receivers. - -1. Unlike legacy dashboard alerts where images in notifications are enabled per contact point, images in notifications for Grafana Alerting must be enabled in the Grafana configuration, either in the configuration file or environment variables, and are enabled for either all or no contact points. - -1. The JSON format for webhook notifications has changed in Grafana Alerting and uses the format from [Prometheus Alertmanager](https://prometheus.io/docs/alerting/latest/configuration/#webhook_config). - -1. Alerting on Prometheus `Both` type queries is not supported in Grafana Alerting. Existing legacy alerts with `Both` type queries are upgraded to Grafana Alerting as alerts with `Range` type queries. - -**Limitations** - -1. Since `Hipchat` and `Sensu` notification channels are no longer supported, legacy alerts associated with these channels are not automatically upgraded to Grafana Alerting. Assign the legacy alerts to a supported notification channel so that you continue to receive notifications for those alerts. - -{{% docs/reference %}} -[alerting_config_error_handling]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-grafana-managed-rule#configure-no-data-and-error-handling" -[alerting_config_error_handling]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-grafana-managed-rule#configure-no-data-and-error-handling" - -[special_alert]: "/docs/grafana/ -> /docs/grafana//alerting/fundamentals/alert-rules/state-and-health#special-alerts-for-nodata-and-error" -[special_alert]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/state-and-health#special-alerts-for-nodata-and-error" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/set-up/migrating-alerts/legacy-alerting-deprecation.md b/docs/sources/alerting/set-up/migrating-alerts/legacy-alerting-deprecation.md deleted file mode 100644 index 8d9514acf8a..00000000000 --- a/docs/sources/alerting/set-up/migrating-alerts/legacy-alerting-deprecation.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -aliases: - - alerting/legacy-alerting-deprecation/ -canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/migrating-alerts/legacy-alerting-deprecation/ -description: Learn about legacy alerting deprecation -keywords: - - grafana - - alerting -labels: - products: - - enterprise - - oss -title: Legacy alerting deprecation -weight: 109 ---- - -# Legacy alerting deprecation - -Starting with Grafana v9.0.0, legacy alerting is deprecated, meaning that it is no longer actively maintained or supported by Grafana. As of Grafana v10.0.0, we do not contribute or accept external contributions to the codebase apart from CVE fixes. - -Legacy alerting refers to the old alerting system that was used prior to the introduction of Grafana Alerting; the new alerting system in Grafana. - -The decision to deprecate legacy alerting was made to encourage users to migrate to the new alerting system, which offers a more powerful and flexible alerting experience based on Prometheus Alertmanager. - -Users who are still using legacy alerting are encouraged to migrate their alerts to the new system as soon as possible to ensure that they continue to receive new features, bug fixes, and support. - -However, we will still patch CVEs until legacy alerting is completely removed in Grafana 11; honoring our commitment to building and distributing secure software. - -We have provided [instructions][migrating-alerts] on how to migrate to the new alerting system, making the process as easy as possible for users. - -## Why are we deprecating legacy alerting? - -The new Grafana alerting system is more powerful and flexible than the legacy alerting feature. - -The new system is based on Prometheus Alertmanager, which offers a more comprehensive set of features for defining and managing alerts. With the new alerting system, users can create alerts based on complex queries, configure alert notifications via various integrations, and set up sophisticated alerting rules with support for conditional expressions, aggregation, and grouping. - -Overall, the new alerting system in Grafana is a major improvement over the legacy alerting feature, providing users with a more powerful and flexible alerting experience. - -Additionally, legacy alerting still requires Angular to function and we are [planning to remove support for it][angular_deprecation] in Grafana 11. - -## When will we remove legacy alerting completely? - -Legacy alerting will be removed from the code-base in Grafana 11, following the same timeline as the [Angular deprecation][angular_deprecation]. - -## How do I migrate to the new Grafana alerting? - -Refer to our [upgrade instructions][migrating-alerts]. - -### Useful links - -- [Upgrade Alerting][migrating-alerts] -- [Angular support deprecation][angular_deprecation] - -{{% docs/reference %}} -[angular_deprecation]: "/docs/grafana/ -> /docs/grafana//developers/angular_deprecation" -[angular_deprecation]: "/docs/grafana-cloud/ -> /docs/grafana//developers/angular_deprecation" - -[migrating-alerts]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/migrating-alerts" -[migrating-alerts]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/migrating-alerts" -{{% /docs/reference %}} diff --git a/docs/sources/alerting/set-up/performance-limitations/index.md b/docs/sources/alerting/set-up/performance-limitations/index.md index 935a889459d..ce38f8545b2 100644 --- a/docs/sources/alerting/set-up/performance-limitations/index.md +++ b/docs/sources/alerting/set-up/performance-limitations/index.md @@ -1,7 +1,7 @@ --- aliases: - - alerting-limitations/ - - alerting/performance-limitations/ + - ./alerting-limitations/ # /docs/grafana//alerting/set-up/alerting-limitations/ + - ../../alerting/performance-limitations/ # /docs/grafana//alerting/performance-limitations/ canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/performance-limitations/ description: Learn about performance considerations and limitations keywords: @@ -54,7 +54,7 @@ Grafana cannot be used to receive external alerts. You can only send alerts to t You have the option to send Grafana managed alerts to an external Alertmanager, you can find this option in the admin tab on the Alerting page. -For more information, refer to [this GitHub discussion](https://github.com/grafana/grafana/discussions/45773). +For more information, refer to [this GitHub issue](https://github.com/grafana/grafana/issues/73447). ## High load on database caused by a high number of alert instances 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 7da5fa634c3..518450be1a5 100644 --- a/docs/sources/alerting/set-up/provision-alerting-resources/_index.md +++ b/docs/sources/alerting/set-up/provision-alerting-resources/_index.md @@ -1,6 +1,4 @@ --- -aliases: - - ../provision-alerting-resources/ canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/provision-alerting-resources/ description: Provision alerting resources keywords: @@ -30,7 +28,7 @@ You cannot edit imported alerting resources in the Grafana UI in the same way as Choose from the options below to import (or provision) your Grafana Alerting resources. -1. [Use configuration files to provision your alerting resources](/docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning), such as alert rules and contact points, through files on disk. +1. [Use configuration files to provision your alerting resources][alerting_file_provisioning], such as alert rules and contact points, through files on disk. {{< admonition type="note" >}} @@ -66,15 +64,16 @@ Provisioned resources are labeled **Provisioned**, so that it is clear that they {{% docs/reference %}} [alerting_tf_provisioning]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/terraform-provisioning" -[alerting_tf_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/terraform-provisioning" +[alerting_tf_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/terraform-provisioning" [alerting_http_provisioning]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning" -[alerting_http_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning" +[alerting_http_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/http-api-provisioning" [alerting_export]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/export-alerting-resources" -[alerting_export]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/export-alerting-resources" +[alerting_export]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/export-alerting-resources" [alerting_export_http]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/export-alerting-resources#export-api-endpoints" -[alerting_export_http]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/export-alerting-resources#export-api-endpoints" +[alerting_export_http]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/export-alerting-resources#export-api-endpoints" -[provisioning]: "/docs/grafana/ -> /docs/grafana//administration/provisioning" -[provisioning]: "/docs/grafana-cloud/ -> /docs/grafana//administration/provisioning" +[alerting_file_provisioning]: "/docs/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning" + +[provisioning]: "/docs/ -> /docs/grafana//administration/provisioning" {{% /docs/reference %}} diff --git a/docs/sources/alerting/set-up/provision-alerting-resources/export-alerting-resources/index.md b/docs/sources/alerting/set-up/provision-alerting-resources/export-alerting-resources/index.md index 212ae9e9f44..4a73fdede68 100644 --- a/docs/sources/alerting/set-up/provision-alerting-resources/export-alerting-resources/index.md +++ b/docs/sources/alerting/set-up/provision-alerting-resources/export-alerting-resources/index.md @@ -1,7 +1,6 @@ --- aliases: - - ../../provision-alerting-resources/view-provisioned-resources/ - - ./view-provisioned-resources/ + - ../../provision-alerting-resources/view-provisioned-resources/ # /docs/grafana//alerting/set-up/provision-alerting-resources/view-provisioned-resources/ canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/provision-alerting-resources/export-alerting-resources/ description: Export alerting resources in Grafana keywords: @@ -36,7 +35,7 @@ If you need to modify provisioned alerting resources in Grafana, refer to [edit ## Export from the Grafana UI -The export options listed below enable you to download resources in YAML, JSON, or Terraform format, facilitating their provisioning through [configuration files](/docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning) or [Terraform][alerting_tf_provisioning]. +The export options listed below enable you to download resources in YAML, JSON, or Terraform format, facilitating their provisioning through [configuration files][alerting_file_provisioning] or [Terraform][alerting_tf_provisioning]. ### Export alert rules @@ -143,7 +142,7 @@ However, note the standard endpoints return a JSON format that is not compatible ### Export API endpoints -The **Alerting HTTP API** provides specific endpoints for exporting alerting resources in YAML or JSON formats, facilitating [provisioning via configuration files][alerting_file_provisioning]. Currently, Terraform format is not supported. +The **Alerting HTTP API** provides specific endpoints for exporting alerting resources in YAML or JSON, facilitating [provisioning via configuration files][alerting_file_provisioning], or Terraform (HCL). | Resource | Method / URI | Summary | | ------------------------ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | @@ -177,36 +176,38 @@ These endpoints accept a `download` parameter to download a file containing the [alerting_http_templates]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/http-api-provisioning#templates" [alerting_tf_provisioning]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/terraform-provisioning" -[alerting_tf_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/terraform-provisioning" +[alerting_tf_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/terraform-provisioning" [alerting_tf_provisioning_template]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/terraform-provisioning#import-contact-points-and-templates" [alerting_tf_provisioning_template]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/terraform-provisioning#import-contact-points-and-templates" [alerting_http_provisioning]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning" -[alerting_http_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning" +[alerting_http_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/http-api-provisioning" + +[alerting_file_provisioning]: "/docs/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning" [alerting_file_provisioning_template]: "/docs/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/file-provisioning#import-templates" -[export_rule]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-alert-rule-exportspan-export-an-alert-rule-in-provisioning-file-format-_routegetalertruleexport_" -[export_rule]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-alert-rule-exportspan-export-an-alert-rule-in-provisioning-file-format-_routegetalertruleexport_" +[export_rule]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-alert-rule-exportspan-export-an-alert-rule-in-provisioning-file-format-_routegetalertruleexport_" +[export_rule]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-alert-rule-exportspan-export-an-alert-rule-in-provisioning-file-format-_routegetalertruleexport_" -[export_rule_group]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-alert-rule-group-exportspan-export-an-alert-rule-group-in-provisioning-file-format-_routegetalertrulegroupexport_" -[export_rule_group]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-alert-rule-group-exportspan-export-an-alert-rule-group-in-provisioning-file-format-_routegetalertrulegroupexport_" +[export_rule_group]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-alert-rule-group-exportspan-export-an-alert-rule-group-in-provisioning-file-format-_routegetalertrulegroupexport_" +[export_rule_group]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-alert-rule-group-exportspan-export-an-alert-rule-group-in-provisioning-file-format-_routegetalertrulegroupexport_" -[export_rules]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-alert-rules-exportspan-export-all-alert-rules-in-provisioning-file-format-_routegetalertrulesexport_" -[export_rules]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-alert-rules-exportspan-export-all-alert-rules-in-provisioning-file-format-_routegetalertrulesexport_" +[export_rules]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-alert-rules-exportspan-export-all-alert-rules-in-provisioning-file-format-_routegetalertrulesexport_" +[export_rules]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-alert-rules-exportspan-export-all-alert-rules-in-provisioning-file-format-_routegetalertrulesexport_" -[export_contacts]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-contactpoints-exportspan-export-all-contact-points-in-provisioning-file-format-_routegetcontactpointsexport_" -[export_contacts]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-contactpoints-exportspan-export-all-contact-points-in-provisioning-file-format-_routegetcontactpointsexport_" +[export_contacts]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-contactpoints-exportspan-export-all-contact-points-in-provisioning-file-format-_routegetcontactpointsexport_" +[export_contacts]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-contactpoints-exportspan-export-all-contact-points-in-provisioning-file-format-_routegetcontactpointsexport_" -[export_mute_timing]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-mute-timing-exportspan-export-a-mute-timing-in-provisioning-file-format-_routegetmutetimingexport_" -[export_mute_timing]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-mute-timing-exportspan-export-a-mute-timing-in-provisioning-file-format-_routegetmutetimingexport_" +[export_mute_timing]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-mute-timing-exportspan-export-a-mute-timing-in-provisioning-file-format-_routegetmutetimingexport_" +[export_mute_timing]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-mute-timing-exportspan-export-a-mute-timing-in-provisioning-file-format-_routegetmutetimingexport_" -[export_mute_timings]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-mute-timings-exportspan-export-all-mute-timings-in-provisioning-file-format-_routegetmutetimingsexport_" -[export_mute_timings]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-mute-timings-exportspan-export-all-mute-timings-in-provisioning-file-format-_routegetmutetimingsexport_" +[export_mute_timings]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-mute-timings-exportspan-export-all-mute-timings-in-provisioning-file-format-_routegetmutetimingsexport_" +[export_mute_timings]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-mute-timings-exportspan-export-all-mute-timings-in-provisioning-file-format-_routegetmutetimingsexport_" -[export_notifications]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-policy-tree-exportspan-export-the-notification-policy-tree-in-provisioning-file-format-_routegetpolicytreeexport_" -[export_notifications]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning/#span-idroute-get-policy-tree-exportspan-export-the-notification-policy-tree-in-provisioning-file-format-_routegetpolicytreeexport_" +[export_notifications]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-policy-tree-exportspan-export-the-notification-policy-tree-in-provisioning-file-format-_routegetpolicytreeexport_" +[export_notifications]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning#span-idroute-get-policy-tree-exportspan-export-the-notification-policy-tree-in-provisioning-file-format-_routegetpolicytreeexport_" {{% /docs/reference %}} diff --git a/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md b/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md index 8986febb57c..245376f6efb 100644 --- a/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md +++ b/docs/sources/alerting/set-up/provision-alerting-resources/file-provisioning/index.md @@ -1,6 +1,4 @@ --- -aliases: - - ../../provision-alerting-resources/file-provisioning/ canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/provision-alerting-resources/file-provisioning/ description: Create and manage resources using file provisioning keywords: @@ -593,7 +591,7 @@ templates: - orgId: 1 # name of the template, must be unique name: my_first_template - # content of the the template + # content of the template template: | {{ define "my_first_template" }} Custom notification message @@ -708,46 +706,6 @@ resetPolicies: - 1 ``` -## Import templates - -Create or delete templates in your Grafana instance(s). - -1. Create a YAML or JSON configuration file. - - Example configuration files can be found below. - -1. Add the file(s) to your GitOps workflow, so that they deploy alongside your Grafana instance(s). - -Here is an example of a configuration file for creating templates. - -```yaml -# config file version -apiVersion: 1 - -# List of templates to import or update -templates: - # organization ID, default = 1 - - orgId: 1 - # name of the template, must be unique - name: my_first_template - # content of the template - template: Alerting with a custom text template -``` - -Here is an example of a configuration file for deleting templates. - -```yaml -# config file version -apiVersion: 1 - -# List of alert rule UIDs that should be deleted -deleteTemplates: - # organization ID, default = 1 - - orgId: 1 - # name of the template, must be unique - name: my_first_template -``` - ## Import mute timings Create or delete mute timings via provisioning files using provisioning files in your Grafana instance(s). @@ -799,40 +757,6 @@ deleteMuteTimes: name: mti_1 ``` -## Template variable interpolation - -Provisioning interpolates environment variables using the `$variable` syntax. - -```yaml -contactPoints: - - orgId: 1 - name: My Contact Email Point - receivers: - - uid: 1 - type: email - settings: - addresses: $EMAIL -``` - -In this example, provisioning replaces `$EMAIL` with the value of the `EMAIL` environment variable or an empty string if it is not present. For more information, refer to [Using environment variables in the Provision documentation][provisioning_env_vars]. - -In alerting resources, most properties support template variable interpolation, with a few exceptions: - -- Alert rule annotations: `groups[].rules[].annotations` -- Alert rule time range: `groups[].rules[].relativeTimeRange` -- Alert rule query model: `groups[].rules[].data.model` -- Mute timings name: `muteTimes[].name` -- Mute timings time intervals: `muteTimes[].time_intervals[]` -- Notification template name: `templates[].name` -- Notification template content: `templates[].template` - -Note for properties that support interpolation, you may unexpectedly substitute template variables when not intended. To avoid this, you can escape the `$variable` with `$$variable`. - -For example, when provisioning a `subject` property in a `contactPoints.receivers.settings` object that is meant to use the `$labels` variable. - -1. `subject: '{{ $labels }}'` will interpolate, incorrectly defining the subject as `subject: '{{ }}'`. -1. `subject: '{{ $$labels }}'` will not interpolate, correctly defining the subject as `subject: '{{ $labels }}'`. - ## More examples For more examples on the concept of this guide: @@ -859,7 +783,6 @@ For more examples on the concept of this guide: [export_mute_timings]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/export-alerting-resources#export-mute-timings" [provisioning]: "/docs/ -> /docs/grafana//administration/provisioning" -[provisioning_env_vars]: "/docs/ -> /docs/grafana//administration/provisioning#using-environment-variables" [reload-provisioning-configurations]: "/docs/ -> /docs/grafana//developers/http_api/admin#reload-provisioning-configurations" diff --git a/docs/sources/alerting/set-up/provision-alerting-resources/terraform-provisioning/index.md b/docs/sources/alerting/set-up/provision-alerting-resources/terraform-provisioning/index.md index 716d84e1427..b3bef7ffc7a 100644 --- a/docs/sources/alerting/set-up/provision-alerting-resources/terraform-provisioning/index.md +++ b/docs/sources/alerting/set-up/provision-alerting-resources/terraform-provisioning/index.md @@ -1,6 +1,4 @@ --- -aliases: - - ../../provision-alerting-resources/terraform-provisioning/ canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/provision-alerting-resources/terraform-provisioning/ description: Create and manage alerting resources using Terraform keywords: @@ -340,6 +338,8 @@ resource "grafana_message_template" "my_template" { ... ``` +Note that `disable_provenance` is not supported for [grafana_mute_timing](https://registry.terraform.io/providers/grafana/grafana/latest/docs/resources/mute_timing). + ## Provision Grafana resources with Terraform To create the previous alerting resources in Grafana with the Terraform CLI, complete the following steps. @@ -391,26 +391,25 @@ For more examples on the concept of this guide: [alerting-rules]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules" [alerting-rules]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules" -[contact-points]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/manage-contact-points" -[contact-points]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/manage-contact-points" +[contact-points]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/manage-contact-points" +[contact-points]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points" -[mute-timings]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/mute-timings" -[mute-timings]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/mute-timings" +[mute-timings]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/mute-timings" +[mute-timings]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/mute-timings" -[notification-policy]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-notification-policy" -[notification-policy]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-notification-policy" +[notification-policy]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/create-notification-policy" +[notification-policy]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/create-notification-policy" -[notification-template]: "/docs/grafana/ -> /docs/grafana//alerting/manage-notifications/template-notifications" -[notification-template]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/template-notifications" +[notification-template]: "/docs/grafana/ -> /docs/grafana//alerting/configure-notifications/template-notifications" +[notification-template]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications" [alerting_export]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/export-alerting-resources" -[alerting_export]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/export-alerting-resources" +[alerting_export]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/export-alerting-resources" [alerting_http_provisioning]: "/docs/grafana/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning" -[alerting_http_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana//alerting/set-up/provision-alerting-resources/http-api-provisioning" +[alerting_http_provisioning]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/set-up/provision-alerting-resources/http-api-provisioning" -[service-accounts]: "/docs/grafana/ -> /docs/grafana//administration/service-accounts" -[service-accounts]: "/docs/grafana-cloud/ -> /docs/grafana//administration/service-accounts" +[service-accounts]: "/docs/ -> /docs/grafana//administration/service-accounts" [testdata]: "/docs/grafana/ -> /docs/grafana//datasources/testdata" [testdata]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/connect-externally-hosted/data-sources/testdata" diff --git a/docs/sources/breaking-changes/breaking-changes-v10-0.md b/docs/sources/breaking-changes/breaking-changes-v10-0.md index 1135ccad11b..8c0dd3f29e2 100644 --- a/docs/sources/breaking-changes/breaking-changes-v10-0.md +++ b/docs/sources/breaking-changes/breaking-changes-v10-0.md @@ -81,7 +81,7 @@ Grafana legacy alerting (dashboard alerts) has been deprecated since Grafana v9. #### Migration path -The new Grafana Alerting was introduced in Grafana 8 and is a superset of legacy alerting. Learn how to migrate your alerts in the [Upgrade Alerting documentation]({{< relref "../alerting/set-up/migrating-alerts/" >}}). +The new Grafana Alerting was introduced in Grafana 8 and is a superset of legacy alerting. Learn how to migrate your alerts in the [Upgrade Alerting documentation]({{< relref "./v10.4/alerting/set-up/migrating-alerts/" >}}). ### API keys are migrating to service accounts diff --git a/docs/sources/dashboards/_index.md b/docs/sources/dashboards/_index.md index 0207994cd73..79ffef5454c 100644 --- a/docs/sources/dashboards/_index.md +++ b/docs/sources/dashboards/_index.md @@ -9,69 +9,63 @@ labels: title: Dashboards weight: 70 description: Create and manage dashboards +hero: + title: Dashboards + level: 1 + width: 110 + height: 110 + description: >- + Dashboards allow you to query, transform, visualize, and understand your data no matter where it’s stored. +cards: + title_class: pt-0 lh-1 + items: + - title: Build dashboards + href: ./build-dashboards/ + description: Get step-by-step directions for how to create or import your first dashboard and modify dashboard settings. Learn about reusable library panels, dashboard links, annotatations, and dashboard JSON. + height: 24 + - title: Manage dashboards + href: ./manage-dashboards/ + description: Learn about dashboard and folder management, as well as generative AI features for dashboards. + height: 24 + - title: Variables + href: ./variables/ + description: Add variables to metric queries and panel titles to create interactive and dynamic dashboards. + height: 24 + - title: Public dashboards + href: ./dashboard-public/ + description: Make your Grafana dashboards public and share them with anyone without requiring access to your Grafana organization. + height: 24 + - title: Reporting + href: ./create-reports/ + description: Automatically generate and share PDF reports from your Grafana dashboards. + height: 24 + - title: Sharing + href: ./share-dashboards-panels/ + description: Share Grafana dashboards and panels within your organization using links, snapshots, and JSON exports. + height: 24 --- -# Dashboards +{{< docs/hero-simple key="hero" >}} -A dashboard is a set of one or more [panels][] organized and arranged into one or more rows. Grafana ships with a variety of panels making it easy to construct the right queries, and customize the visualization so that you can create the perfect dashboard for your need. Each panel can interact with data from any configured Grafana [data source][]. - -Dashboard snapshots are static. Queries and expressions cannot be re-executed from snapshots. As a result, if you update any variables in your query or expression, it will not change your dashboard data. - -Before you begin, ensure that you have configured a data source. See also: - -- [Use dashboards][] -- [Build dashboards][] -- [Create dashboard folders][] -- [Manage dashboards][] -- [Public dashboards][] -- [Annotations][] -- [Playlist][] -- [Reporting][] -- [Version history][] -- [Import][] -- [Export and share][] -- [JSON model][] - -{{% docs/reference %}} -[data source]: "/docs/grafana/ -> /docs/grafana//datasources" -[data source]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/connect-externally-hosted/data-sources" - -[Reporting]: "/docs/grafana/ -> /docs/grafana//dashboards/create-reports" -[Reporting]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/create-reports" - -[Public dashboards]: "/docs/grafana/ -> /docs/grafana//dashboards/dashboard-public" -[Public dashboards]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/dashboard-public" - -[Version history]: "/docs/grafana/ -> /docs/grafana//dashboards/build-dashboards/manage-version-history" -[Version history]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/build-dashboards/manage-version-history" - -[panels]: "/docs/grafana/ -> /docs/grafana//panels-visualizations" -[panels]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations" +--- -[Annotations]: "/docs/grafana/ -> /docs/grafana//dashboards/build-dashboards/annotate-visualizations" -[Annotations]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/build-dashboards/annotate-visualizations" +## Overview -[Create dashboard folders]: "/docs/grafana/ -> /docs/grafana//dashboards/manage-dashboards#create-a-dashboard-folder" -[Create dashboard folders]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/manage-dashboards#create-a-dashboard-folder" +A Grafana dashboard is a set of one or more [panels][], organized and arranged into one or more rows, that provide an at-a-glance view of related information. These panels are created using components that query and transform raw data from a data source into charts, graphs, and other visualizations. -[JSON model]: "/docs/grafana/ -> /docs/grafana//dashboards/build-dashboards/view-dashboard-json-model" -[JSON model]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/build-dashboards/view-dashboard-json-model" +A data source can be an SQL database, Grafana Loki, Grafana Mimir, or a JSON-based API. It can even be a basic CSV file. Data source plugins take a query you want answered, retrieve the data from the data source, and reconcile the differences between the data model of the data source and the data model of Grafana dashboards. -[Import]: "/docs/grafana/ -> /docs/grafana//dashboards/build-dashboards/import-dashboards" -[Import]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/build-dashboards/import-dashboards" +Queries allow you to reduce the entirety of your data to a specific dataset, providing a more manageable visualization. Since data sources have their own distinct query languages, Grafana dashboards provide you with a query editor to accommodate these differences. -[Export and share]: "/docs/grafana/ -> /docs/grafana//dashboards/share-dashboards-panels" -[Export and share]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/share-dashboards-panels" +A panel is the container that displays the visualization and provides you with various controls to manipulate it. Panel options let you customize many aspects of a visualization and the options differ based on which visualization you select. When the data format in a visualization doesn’t meet your requirements, you can apply a transformation that manipulates the data returned by a query. -[Manage dashboards]: "/docs/grafana/ -> /docs/grafana//dashboards/manage-dashboards" -[Manage dashboards]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/manage-dashboards" +With 150+ data source plugins, you can unify all your data sources into a single dashboard to streamline data monitoring and troubleshooting. With Grafana, you can translate, transform, and visualize data in flexible and versatile dashboards. -[Build dashboards]: "/docs/grafana/ -> /docs/grafana//dashboards/build-dashboards" -[Build dashboards]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/build-dashboards" +## Explore -[Use dashboards]: "/docs/grafana/ -> /docs/grafana//dashboards/use-dashboards" -[Use dashboards]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/use-dashboards" +{{< card-grid key="cards" type="simple" >}} -[Playlist]: "/docs/grafana/ -> /docs/grafana//dashboards/create-manage-playlists" -[Playlist]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/create-manage-playlists" +{{% docs/reference %}} +[panels]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/panel-overview" +[panels]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/panel-overview" {{% /docs/reference %}} diff --git a/docs/sources/dashboards/build-dashboards/create-dashboard/index.md b/docs/sources/dashboards/build-dashboards/create-dashboard/index.md index 03e89a27c44..6ebaa3e3e46 100644 --- a/docs/sources/dashboards/build-dashboards/create-dashboard/index.md +++ b/docs/sources/dashboards/build-dashboards/create-dashboard/index.md @@ -62,10 +62,7 @@ Dashboards and panels allow you to show your data in visual form. Each panel nee For more information about individual visualizations, refer to [Visualizations options][]. -1. Under **Panel options**, enter a title and description for your panel. - - Alternatively, Grafana can generate a panel title and description for you using the OpenAI integration. Learn more in the [Set up generative AI features for dashboards documentation][]. - +1. Under **Panel options**, enter a title and description for your panel or have Grafana create them using [generative AI features][]. 1. Refer to the following documentation for ways you can adjust panel settings. While not required, most visualizations need some adjustment before they properly display the information that you need. @@ -80,14 +77,8 @@ Dashboards and panels allow you to show your data in visual form. Each panel nee Alternatively, click **Apply** if you want to see your changes applied to the dashboard first. Then click the save icon in the dashboard header. -1. Enter a summary of your dashboard changes. - - Alternatively, Grafana can generate a summary for you using the OpenAI integration. Learn more in the [Set up generative AI features for dashboards documentation][]. - -1. Enter a title for your dashboard and select a folder, if applicable. - - Alternatively, Grafana can generate a dashboard title for you using the OpenAI integration. Learn more in the [Set up generative AI features for dashboards documentation][]. - +1. Enter a title and description for your dashboard or have Grafana create them using [generative AI features][]. +1. Select a folder, if applicable. 1. Click **Save**. 1. To add more panels to the dashboard, click **Add** in the dashboard header and select **Visualization** in the drop-down. @@ -197,6 +188,6 @@ You can size a dashboard panel to suits your needs. [Configure standard options]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options" [Configure standard options]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-standard-options" -[Set up generative AI features for dashboards documentation]: "/docs/grafana/ -> /docs/grafana//dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" -[Set up generative AI features for dashboards documentation]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" +[generative AI features]: "/docs/grafana/ -> /docs/grafana//dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" +[generative AI features]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" {{% /docs/reference %}} diff --git a/docs/sources/dashboards/build-dashboards/manage-dashboard-links/index.md b/docs/sources/dashboards/build-dashboards/manage-dashboard-links/index.md index 52e4605bff9..ba83b0e073c 100644 --- a/docs/sources/dashboards/build-dashboards/manage-dashboard-links/index.md +++ b/docs/sources/dashboards/build-dashboards/manage-dashboard-links/index.md @@ -94,7 +94,7 @@ Add a link to a URL at the top of your current dashboard. You can link to any av - `from` - Defines the lower limit of the time range, specified in ms epoch. - `to` - Defines the upper limit of the time range, specified in ms epoch. - `time` and `time.window` - Define a time range from `time-time.window/2` to `time+time.window/2`. Both params should be specified in ms. For example `?time=1500000000000&time.window=10000` will result in 10s time range from 1499999995000 to 1500000005000. - - **Variable values** – Select this option to include template variables currently used as query parameters in the link. When the user clicks the link, any matching templates in the linked dashboard are set to the values from the link. Here is the variable format: `https://${you-domain}/path/to/your/dashboard?var-${template-varable1}=value1&var-{template-variable2}=value2` **Example:** https://play.grafana.org/d/000000074/alerting?var-app=backend&var-server=backend_01&var-server=backend_03&var-interval=1h + - **Variable values** – Select this option to include template variables currently used as query parameters in the link. When the user clicks the link, any matching templates in the linked dashboard are set to the values from the link. Here is the variable format: `https://${you-domain}/path/to/your/dashboard?var-${template-variable1}=value1&var-{template-variable2}=value2` **Example:** https://play.grafana.org/d/000000074/alerting?var-app=backend&var-server=backend_01&var-server=backend_03&var-interval=1h - **Open in new tab** – Select this option if you want the dashboard link to open in a new tab or window. 1. Click **Add**. diff --git a/docs/sources/dashboards/manage-dashboards/index.md b/docs/sources/dashboards/manage-dashboards/index.md index 40929b16408..0c7ccb06176 100644 --- a/docs/sources/dashboards/manage-dashboards/index.md +++ b/docs/sources/dashboards/manage-dashboards/index.md @@ -100,14 +100,12 @@ For more information about dashboard permissions, refer to [Dashboard permission ## Set up generative AI features for dashboards -{{< docs/public-preview product="Generative AI in dashboards" featureFlag="`dashgpt`" >}} - You can use generative AI to help you with the following tasks: - **Generate panel and dashboard titles and descriptions**: Generate a title and description based on the data you’ve added for your panel or dashboard. This is useful when you want to visualize your data quickly and don’t want to spend time coming up with a title or description. - **Generate dashboard save changes summary**: Generate a summary of the changes you’ve made to a dashboard when you save it. This is great for easily tracking the history of a dashboard. -To access these features, enable the `dashgpt` feature toggle. Then install and configure Grafana’s Large Language Model (LLM) app plugin. For more information, refer to the [Grafana LLM plugin documentation][]. +To access these features, install and configure Grafana’s Large Language Model (LLM) app plugin. For more information, refer to the [Grafana LLM plugin documentation][]. When enabled, the **✨ Auto generate** option displays next to the **Title** and **Description** fields in your panels and dashboards, or when you press the **Save** button. diff --git a/docs/sources/dashboards/share-dashboards-panels/index.md b/docs/sources/dashboards/share-dashboards-panels/index.md index 08d89f7e35c..7fd7a4a4e93 100644 --- a/docs/sources/dashboards/share-dashboards-panels/index.md +++ b/docs/sources/dashboards/share-dashboards-panels/index.md @@ -85,7 +85,7 @@ A dashboard snapshot shares an interactive dashboard publicly. Grafana strips se You can publish snapshots to your local instance or to [snapshots.raintank.io](http://snapshots.raintank.io). The latter is a free service provided by Grafana Labs that enables you to publish dashboard snapshots to an external Grafana instance. Anyone with the link can view it. You can set an expiration time if you want the snapshot removed after a certain time period. 1. Click the **Snapshot** tab. -1. Click **Publish to snapshots.raintank.io** or **Local Snapshot**. +1. Click **Publish to snapshots.raintank.io** or **Publish Snapshot**. Grafana generates a link of the snapshot. @@ -178,10 +178,16 @@ https://play.grafana.org/d/000000012/grafana-play-home?orgId=1&from=156871968017 A panel snapshot shares an interactive panel publicly. Grafana strips sensitive data leaving only the visible metric data and series names embedded in the dashboard. Panel snapshots can be accessed by anyone with the link. -You can publish snapshots to your local instance or to [snapshots.raintank.io](http://snapshots.raintank.io). The latter is a free service provided by [Grafana Labs](https://grafana.com), that enables you to publish dashboard snapshots to an external Grafana instance. You can optionally set an expiration time if you want the snapshot to be removed after a certain time period. +You can publish snapshots to your local instance or to [snapshots.raintank.io](http://snapshots.raintank.io). The latter is a free service provided by [Grafana Labs](https://grafana.com), that enables you to publish dashboard snapshots to an external Grafana instance. + +{{< admonition type="note" >}} +As of Grafana 11, the option to publish to [snapshots.raintank.io](http://snapshots.raintank.io) is no longer available for Grafana Cloud. +{{< /admonition >}} + +You can optionally set an expiration time if you want the snapshot to be removed after a certain time period. 1. In the **Share Panel** dialog, click **Snapshot** to go to the tab. -1. Click **Publish to snapshots.raintank.io** or **Local Snapshot**. +1. Click **Publish to snapshots.raintank.io** or **Publish Snapshot**. Grafana generates the link of the snapshot. diff --git a/docs/sources/dashboards/use-dashboards/index.md b/docs/sources/dashboards/use-dashboards/index.md index 9bb1f9f52e3..cb20fd7e62b 100644 --- a/docs/sources/dashboards/use-dashboards/index.md +++ b/docs/sources/dashboards/use-dashboards/index.md @@ -36,7 +36,7 @@ The following image and descriptions highlight all dashboard features. {{< figure src="/media/docs/grafana/dashboards/screenshot-dashboard-annotated-9-5-0.png" width="700px" alt="An annotated image of a dashboard" >}} - (1) **Grafana home**: Click **Home** in the breadcrumb to be redirected to the home page configured in the Grafana instance. -- (2) **Dashboard title**: When you click the dashboard title, you can search for dashboards contained in the current folder. +- (2) **Dashboard title**: When you click the dashboard title, you can search for dashboards contained in the current folder. You can create your own dashboard titles or have Grafana create them for you using [generative AI features][]. - (3) **Share dashboard or panel**: Use this option to share the current dashboard or panel using a link or snapshot. You can also export the dashboard definition from the share modal. - (4) **Add**: Use this option to add a panel, dashboard row, or library panel to the current dashboard. - (5) **Save dashboard**: Click to save changes to your dashboard. @@ -53,6 +53,7 @@ The following image and descriptions highlight all dashboard features. - Library panels can be shared among many dashboards. - To move a panel, drag the panel header to another location. - To resize a panel, click and drag the lower right corner of the panel. + - Use [generative AI features][] to create panel titles and descriptions. - (14) **Graph legend**: Change series colors, y-axis and series visibility directly from the legend. - (15) **Dashboard row**: A dashboard row is a logical divider within a dashboard that groups panels together. - Rows can be collapsed or expanded allowing you to hide parts of the dashboard. @@ -61,7 +62,7 @@ The following image and descriptions highlight all dashboard features. ## Keyboard shortcuts -Grafana has a number of keyboard shortcuts available. Press `?` or `h` on your keyboard to display all keyboard shortcuts available in your version of Grafana. +Grafana has a number of keyboard shortcuts available. Press `?` or `Ctrl+h` on your keyboard to display all keyboard shortcuts available in your version of Grafana. - `Ctrl+S`: Saves the current dashboard. - `f`: Opens the dashboard finder / search. @@ -232,4 +233,7 @@ You can control the time range of a dashboard by providing the following query p [repeating rows]: "/docs/grafana/ -> /docs/grafana//dashboards/build-dashboards/create-dashboard#configure-repeating-rows" [repeating rows]: "/docs/grafana-cloud/ -> /docs/grafana//dashboards/build-dashboards/create-dashboard#configure-repeating-rows" + +[generative AI features]: "/docs/grafana/ -> /docs/grafana//dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" +[generative AI features]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" {{% /docs/reference %}} diff --git a/docs/sources/datasources/azure-monitor/_index.md b/docs/sources/datasources/azure-monitor/_index.md index 4aeb8ea648a..ad421cdbdc9 100644 --- a/docs/sources/datasources/azure-monitor/_index.md +++ b/docs/sources/datasources/azure-monitor/_index.md @@ -136,6 +136,28 @@ datasources: version: 1 ``` +**Current User:** + +{{< admonition type="note" >}} +The `oauthPassThru` property is required for current user authentication to function. +Additionally, `disableGrafanaCache` is necessary to prevent the data source returning cached responses for resources users don't have access to. +{{< /admonition >}} + +```yaml +apiVersion: 1 # config file version + +datasources: + - name: Azure Monitor + type: grafana-azure-monitor-datasource + access: proxy + jsonData: + azureAuthType: currentuser + oauthPassThru: true + disableGrafanaCache: true + subscriptionId: # Optional, default subscription + version: 1 +``` + #### Supported cloud names | Azure Cloud | `cloudName` Value | @@ -144,6 +166,11 @@ datasources: | **Microsoft Chinese national cloud** | `chinaazuremonitor` | | **US Government cloud** | `govazuremonitor` | +{{< admonition type="note" >}} +Cloud names for current user authentication differ to the `cloudName` values in the preceding table. +The public cloud name is `AzureCloud`, the Chinese national cloud name is `AzureChinaCloud`, and the US Government cloud name is `AzureUSGovernment`. +{{< /admonition >}} + ### Configure Managed Identity You can use managed identity to configure Azure Monitor in Grafana if you host Grafana in Azure (such as an App Service or with Azure Virtual Machines) and have managed identity enabled on your VM. @@ -204,6 +231,66 @@ For details on workload identity, refer to the [Azure workload identity document workload_identity_token_file = TOKEN_FILE_PATH ``` +### Configure Current User authentication + +{{< admonition type="note" >}} +Current user authentication is an [experimental feature](/docs/release-life-cycle). Engineering and on-call support is not available. Documentation is either limited or not provided outside of code comments. No SLA is provided. Contact Grafana Support to enable this feature in Grafana Cloud. Aspects of Grafana may not work as expected when using this authentication method. +{{< /admonition >}} + +If your Grafana instance is configured with Azure Entra (formerly Active Directory) authentication for login, this authentication method can be used to forward the currently logged in user's credentials to the data source. The users credentials will then be used when requesting data from the data source. For details on how to configure your Grafana instance using Azure Entra refer to the [documentation][configure-grafana-azure-auth]. + +{{< admonition type="note" >}} +Additional configuration is required to ensure that the App Registration used to login a user via Azure provides an access token with the permissions required by the data source. + +The App Registration must be configured to issue both **Access Tokens** and **ID Tokens**. + +1. In the Azure Portal, open the App Registration that requires configuration. +2. Select **Authentication** in the side menu. +3. Under **Implicit grant and hybrid flows** check both the **Access tokens** and **ID tokens** boxes. +4. Save the changes to ensure the App Registration is updated. + +The App Registration must also be configured with additional **API Permissions** to provide authenticated users with access to the APIs utilised by the data source. + +1. In the Azure Portal, open the App Registration that requires configuration. +1. Select **API Permissions** in the side menu. +1. Ensure the `openid`, `profile`, `email`, and `offline_access` permissions are present under the **Microsoft Graph** section. If not, they must be added. +1. Select **Add a permission** and choose the following permissions. They must be added individually. Refer to the [Azure documentation](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-configure-app-access-web-apis) for more information. + - Select **Azure Service Management** > **Delegated permissions** > `user_impersonation` > **Add permissions** + - Select **APIs my organization uses** > Search for **Log Analytics API** and select it > **Delegated permissions** > `Date.Read` > **Add permissions** + +Once all permissions have been added, the Azure authentication section in Grafana must be updated. The `scopes` section must be updated to include the `.default` scope to ensure that a token with access to all APIs declared on the App Registration is requested by Grafana. Once updated the scopes value should equal: `.default openid email profile`. +{{< /admonition >}} + +This method of authentication doesn't inherently support all backend functionality as a user's credentials won't be in scope. +Affected functionality includes alerting, reporting, and recorded queries. +In order to support backend queries when using a data source configured with current user authentication, you can configure service credentials. +Also, note that query and resource caching is disabled by default for data sources using current user authentication. + +{{< admonition type="note" >}} +To configure fallback service credentials the [feature toggle][configure-grafana-feature-toggles] `idForwarding` must be set to `true` and `user_identity_fallback_credentials_enabled` must be enabled in the [Azure configuration section][configure-grafana-azure] (enabled by default when `user_identity_enabled` is set to `true`). +{{< /admonition >}} + +Permissions for fallback credentials may need to be broad to appropriately support backend functionality. +For example, an alerting query created by a user is dependent on their permissions. +If a user tries to create an alert for a resource that the fallback credentials can't access, the alert will fail. + +**To enable current user authentication for Grafana:** + +1. Set the `user_identity_enabled` flag in the `[azure]` section of the [Grafana server configuration][configure-grafana-azure]. + By default this will also enable fallback service credentials. + If you want to disable service credentials at the instance level set `user_identity_fallback_credentials_enabled` to false. + + ```ini + [azure] + user_identity_enabled = true + ``` + +1. In the Azure Monitor data source configuration, set **Authentication** to **Current User**. + If fallback service credentials are enabled at the instance level, an additional configuration section is visible that you can use to enable or disable using service credentials for this data source. + {{< figure src="/media/docs/grafana/data-sources/screenshot-current-user.png" max-width="800px" class="docs-image--no-shadow" caption="Azure Monitor screenshot showing Current User authentication" >}} + +1. If you want backend functionality to work with this data source, enable service credentials and configure the data source using the most applicable credentials for your circumstances. + ## Query the data source The Azure Monitor data source can query data from Azure Monitor Metrics and Logs, the Azure Resource Graph, and Application Insights Traces. Each source has its own specialized query editor. @@ -218,7 +305,7 @@ Grafana refers to such variables as template variables. For details, see the [template variables documentation]({{< relref "./template-variables" >}}). -## Application Insights and Insights Analytics (removed)) +## Application Insights and Insights Analytics (removed) Until Grafana v8.0, you could query the same Azure Application Insights data using Application Insights and Insights Analytics. @@ -233,6 +320,15 @@ If you're upgrading from a Grafana version prior to v9.0 and relied on Applicati [configure-grafana-azure]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-grafana#azure" [configure-grafana-azure]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-grafana#azure" +[configure-grafana-azure-auth]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-security/configure-authentication/azuread" +[configure-grafana-azure-auth]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-security/configure-authentication/azuread" + +[configure-grafana-azure-auth-scopes]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-security/configure-authentication/azuread/#enable-azure-ad-oauth-in-grafana" +[configure-grafana-azure-auth-scopes]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-security/configure-authentication/azuread/#enable-azure-ad-oauth-in-grafana" + +[configure-grafana-feature-toggles]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-grafana/#feature_toggles" +[configure-grafana-feature-toggles]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-grafana/#feature_toggles" + [data-source-management]: "/docs/grafana/ -> /docs/grafana//administration/data-source-management" [data-source-management]: "/docs/grafana-cloud/ -> /docs/grafana//administration/data-source-management" diff --git a/docs/sources/datasources/elasticsearch/_index.md b/docs/sources/datasources/elasticsearch/_index.md index 9388062f64f..d70d0e73392 100644 --- a/docs/sources/datasources/elasticsearch/_index.md +++ b/docs/sources/datasources/elasticsearch/_index.md @@ -34,7 +34,7 @@ The following will help you get started working with Elasticsearch and Grafana: This data source supports these versions of Elasticsearch: -- v7.16+ +- v7.17+ - v8.x Our maintenance policy for Elasticsearch data source is aligned with the [Elastic Product End of Life Dates](https://www.elastic.co/support/eol) and we ensure proper functionality for supported versions. If you are using an Elasticsearch with version that is past its end-of-life (EOL), you can still execute queries, but you will receive a notification in the query builder indicating that the version of Elasticsearch you are using is no longer supported. It's important to note that in such cases, we do not guarantee the correctness of the functionality, and we will not be addressing any related issues. diff --git a/docs/sources/datasources/elasticsearch/query-editor/index.md b/docs/sources/datasources/elasticsearch/query-editor/index.md index 8d15a47e36d..bb801bcabac 100644 --- a/docs/sources/datasources/elasticsearch/query-editor/index.md +++ b/docs/sources/datasources/elasticsearch/query-editor/index.md @@ -24,7 +24,11 @@ weight: 300 # Elasticsearch query editor Grafana provides a query editor for Elasticsearch. Elasticsearch queries are in Lucene format. -See [Lucene query syntax](https://www.elastic.co/guide/en/kibana/current/lucene-query.html) and and [Query string syntax](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/query-dsl-query-string-query.html#query-string-syntax) if you are new to working with Lucene queries in Elasticsearch. +See [Lucene query syntax](https://www.elastic.co/guide/en/kibana/current/lucene-query.html) and [Query string syntax](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/query-dsl-query-string-query.html#query-string-syntax) if you are new to working with Lucene queries in Elasticsearch. + +{{% admonition type="note" %}} +When composing Lucene queries, ensure that you use uppercase boolean operators: `AND`, `OR`, and `NOT`. Lowercase versions of these operators are not supported by the Lucene query syntax. +{{% /admonition %}} {{< figure src="/static/img/docs/elasticsearch/elastic-query-editor-10.1.png" max-width="800px" class="docs-image--no-shadow" caption="Elasticsearch query editor" >}} diff --git a/docs/sources/datasources/graphite/query-editor/index.md b/docs/sources/datasources/graphite/query-editor/index.md index 74e0dd6bbda..098a98b2b94 100644 --- a/docs/sources/datasources/graphite/query-editor/index.md +++ b/docs/sources/datasources/graphite/query-editor/index.md @@ -55,6 +55,10 @@ Some functions like aliasByNode support an optional second argument. To add an a To learn more, refer to [Graphite's documentation on functions](https://graphite.readthedocs.io/en/latest/functions.html). +{{% admonition type="warning" %}} +Some functions take a second argument that may be a function that returns a series. If you are adding a second argument that is a function, it is suggested to use a series reference from a second query instead of the function itself. The query editor does not currently support parsing of a second argument that is a function when switching between the query editor and the code editor. +{{% /admonition %}} + ### Sort labels If you have the same labels on multiple graphs, they are both sorted differently and use different colors. diff --git a/docs/sources/datasources/graphite/template-variables/index.md b/docs/sources/datasources/graphite/template-variables/index.md index 1490b9aaddb..49aacaee33d 100644 --- a/docs/sources/datasources/graphite/template-variables/index.md +++ b/docs/sources/datasources/graphite/template-variables/index.md @@ -143,7 +143,7 @@ The Graphite data source supports two variable syntaxes for use in the **Query** ### Templated dashboard example -To view an example templated dashboard, refer to [Graphite Templated Dashboard](https://play.grafana.org/dashboard/db/graphite-templated-nested). +To view an example templated dashboard, refer to [Graphite Templated Nested dashboard](https://play.grafana.org/d/cvDFGseGz/graphite-templated-nested). {{% docs/reference %}} [add-template-variables]: "/docs/grafana/ -> /docs/grafana//dashboards/variables/add-template-variables" diff --git a/docs/sources/datasources/influxdb/_index.md b/docs/sources/datasources/influxdb/_index.md index d6421c22871..22b240421d2 100644 --- a/docs/sources/datasources/influxdb/_index.md +++ b/docs/sources/datasources/influxdb/_index.md @@ -126,10 +126,11 @@ Configure these options if you select the InfluxQL (classic InfluxDB) query lang Configure these options if you select the SQL query language: -| Name | Description | -| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Database** | Sets the ID of the bucket to query. Copy this from the Buckets page of the InfluxDB UI. | -| **Token** | API token used for SQL queries. It can be generated on InfluxDB Cloud dashboard under [Load Data > API Tokens](https://docs.influxdata.com/influxdb/cloud-serverless/get-started/setup/#create-an-all-access-api-token) menu. | +| Name | Description | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Database** | Sets the ID of the bucket to query. Copy this from the Buckets page of the InfluxDB UI. | +| **Token** | API token used for SQL queries. It can be generated on InfluxDB Cloud dashboard under [Load Data > API Tokens](https://docs.influxdata.com/influxdb/cloud-serverless/get-started/setup/#create-an-all-access-api-token) menu. | +| **Insecure Connection** | Disable gRPC TLS security. | ### Configure Flux @@ -138,7 +139,7 @@ Configure these options if you select the Flux query language: | Name | Description | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Organization** | The [Influx organization](https://v2.docs.influxdata.com/v2.0/organizations/) that will be used for Flux queries. This is also used to for the `v.organization` query macro. | -| **Token** | The authentication token used for Flux queries. With Influx 2.0, use the [influx authentication token to function](https://v2.docs.influxdata.com/v2.0/security/tokens/create-token/). Token must be set as `Authorization` header with the value `Token `. For influx 1.8, the token is `username:password`. | +| **Token** | The authentication token used for Flux queries. With Influx 2.0, use the [influx authentication token to function](https://v2.docs.influxdata.com/v2.0/security/tokens/create-token/). Token must be set as `Authorization` header with the value `Token `. For influx 1.8, the token is `username:password`. | | **Default bucket** | _(Optional)_ The [Influx bucket](https://v2.docs.influxdata.com/v2.0/organizations/buckets/) that will be used for the `v.defaultBucket` macro in Flux queries. | ### Provision the data source @@ -203,9 +204,8 @@ datasources: access: proxy url: http://localhost:8086 jsonData: - version: SQL - metadata: - - database: + dbName: site + httpHeaderName1: 'Authorization' secureJsonData: httpHeaderValue1: 'Token ' ``` @@ -216,13 +216,15 @@ datasources: apiVersion: 1 datasources: - - name: InfluxDB_v2_InfluxQL + - name: InfluxDB_v3_InfluxQL type: influxdb access: proxy url: http://localhost:8086 jsonData: + version: SQL dbName: site httpMode: POST + insecureGrpc: false secureJsonData: token: '' ``` diff --git a/docs/sources/datasources/influxdb/template-variables/index.md b/docs/sources/datasources/influxdb/template-variables/index.md index 4395741f93c..908a2c0fd4e 100644 --- a/docs/sources/datasources/influxdb/template-variables/index.md +++ b/docs/sources/datasources/influxdb/template-variables/index.md @@ -87,7 +87,7 @@ When you enable the **Multi-value** or **Include all value** options, Grafana co ### Templated dashboard example -To view an example templated dashboard, refer to [InfluxDB Templated Dashboard](https://play.grafana.org/dashboard/db/influxdb-templated). +To view an example templated dashboard, refer to this [InfluxDB templated dashboard](https://play.grafana.org/d/f62a0410-5abb-4dd8-9dfc-caddfc3e2ffd/eccb2445-b0a2-5e83-8e0f-6d5ea53ad575). {{% docs/reference %}} [add-template-variables-chained-variables]: "/docs/grafana/ -> /docs/grafana//dashboards/variables/add-template-variables#chained-variables" diff --git a/docs/sources/datasources/jaeger/_index.md b/docs/sources/datasources/jaeger/_index.md index 4f0e9ee0fa7..36dc7d0131e 100644 --- a/docs/sources/datasources/jaeger/_index.md +++ b/docs/sources/datasources/jaeger/_index.md @@ -123,11 +123,6 @@ The following table describes the ways in which you can configure your trace to ### Trace to metrics -{{% admonition type="note" %}} -This feature is behind the `traceToMetrics` [feature toggle][configure-grafana-feature-toggles]. -If you use Grafana Cloud, open a [support ticket in the Cloud Portal](/profile/org#support) to access this feature. -{{% /admonition %}} - The **Trace to metrics** setting configures the [trace to metrics feature](/blog/2022/08/18/new-in-grafana-9.1-trace-to-metrics-allows-users-to-navigate-from-a-trace-span-to-a-selected-data-source/) available when integrating Grafana with Jaeger. To configure trace to metrics: diff --git a/docs/sources/datasources/loki/_index.md b/docs/sources/datasources/loki/_index.md index 179432fd3cb..b048a9f4c43 100644 --- a/docs/sources/datasources/loki/_index.md +++ b/docs/sources/datasources/loki/_index.md @@ -32,6 +32,12 @@ The following guides will help you get started with Loki: - [LogQL](/docs/loki/latest/logql/) - [Loki query editor]({{< relref "./query-editor" >}}) +## Supported Loki versions + +This data source supports these versions of Loki: + +- v2.8+ + ## Adding a data source For instructions on how to add a data source to Grafana, refer to the [administration documentation][data-source-management] diff --git a/docs/sources/datasources/mssql/_index.md b/docs/sources/datasources/mssql/_index.md index 9bf5ccf3a00..89403bb3f7b 100644 --- a/docs/sources/datasources/mssql/_index.md +++ b/docs/sources/datasources/mssql/_index.md @@ -52,7 +52,7 @@ To configure basic settings for the data source, complete the following steps: | **Default** | Sets the data source that's pre-selected for new panels. | | **Host** | Sets the IP address/hostname and optional port of your MS SQL instance. Default port is 0, the driver default. You can specify multiple connection properties, such as `ApplicationIntent`, by separating each property with a semicolon (`;`). | | **Database** | Sets the name of your MS SQL database. | -| **Authentication** | Sets the authentication mode, either using SQL Server Authentication or Windows Authentication (single sign-on for Windows users). | +| **Authentication** | Sets the authentication mode, either using SQL Server authentication, Windows authentication (single sign-on for Windows users), Azure Active Directory authentication, or various forms of Windows Active Directory authentication. | | **User** | Defines the database user's username. | | **Password** | Defines the database user's password. | | **Encrypt** | Determines whether or to which extent a secure SSL TCP/IP connection will be negotiated with the server. Options include: `disable` - data sent between client and server is not encrypted; `false` - data sent between client and server is not encrypted beyond the login packet; `true` - data sent between client and server is encrypted. Default is `false`. | @@ -89,6 +89,18 @@ You can also override this setting in a dashboard panel under its data source op The **Connection timeout** setting defines the maximum number of seconds to wait for a connection to the database before timing out. Default is 0 for no timeout. +### UDP Preference Limit + +The **UDP Preference Limit** setting defines the maximum size packet that the Kerberos libraries will attempt to send over a UDP connection before retrying with TCP. Default is 1 which means always use TCP. + +### DNS Lookup KDC + +The **DNS Lookup KDC** setting controls whether to [lookup KDC in DNS](https://web.mit.edu/kerberos/krb5-latest/doc/admin/realm_config.html#mapping-hostnames-onto-kerberos-realms). Default is true. + +### KRB5 config file path + +The **KRB5 config file path** stores the location of the `krb5` config file. Default is `/etc/krb5.conf` + ### Database user permissions Grafana doesn't validate that a query is safe, and could include any SQL statement. diff --git a/docs/sources/datasources/tempo/configure-tempo-data-source.md b/docs/sources/datasources/tempo/configure-tempo-data-source.md index 0f357e59784..ffde7d5ffe8 100644 --- a/docs/sources/datasources/tempo/configure-tempo-data-source.md +++ b/docs/sources/datasources/tempo/configure-tempo-data-source.md @@ -91,11 +91,6 @@ The following table describes the ways in which you can configure your trace to ## Trace to metrics -{{% admonition type="note" %}} -This feature is behind the `traceToMetrics` [feature toggle][configure-grafana-feature-toggles]. -If you use Grafana Cloud, open a [support ticket in the Cloud Portal](/profile/org#support) to access this feature. -{{% /admonition %}} - The **Trace to metrics** setting configures the [trace to metrics feature](/blog/2022/08/18/new-in-grafana-9.1-trace-to-metrics-allows-users-to-navigate-from-a-trace-span-to-a-selected-data-source/) available when integrating Grafana with Tempo. {{< youtube id="TkapvLeMMpc" >}} @@ -119,7 +114,7 @@ To use a simple configuration, follow these steps: ### Custom queries -To use custom queriess with the configuration, follow these steps: +To use custom queries with the configuration, follow these steps: 1. Select a metrics data source from the **Data source** drop-down. 1. Optional: Choose any tags to use in the query. If left blank, the default values of `cluster`, `hostname`, `namespace`, `pod`, `service.name` and `service.namespace` are used. @@ -191,13 +186,6 @@ The **Search** setting configures [Tempo search](/docs/tempo/latest/configuratio You can configure the **Hide search** setting to hide the search query option in **Explore** if search is not configured in the Tempo instance. -## Loki search - -The **Loki search** setting configures the Loki search query type. - -Configure the **Data source** setting to define which Loki instance you want to use to search traces. -You must configure [derived fields]({{< relref "../loki#configure-derived-fields" >}}) in the Loki instance. - ## TraceID query The **TraceID query** setting modifies how TraceID queries are run. The time range can be used when there are performance issues or timeouts since it will narrow down the search to the defined range. This setting is disabled by default. @@ -271,8 +259,6 @@ datasources: enabled: true search: hide: false - lokiSearch: - datasourceUid: 'loki' traceQuery: timeShiftEnabled: true spanStartTimeShift: '1h' @@ -286,9 +272,6 @@ datasources: [build-dashboards]: "/docs/grafana/ -> /docs/grafana//dashboards/build-dashboards" [build-dashboards]: "/docs/grafana-cloud/ -> /docs/grafana//dashboards/build-dashboards" -[configure-grafana-feature-toggles]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-grafana#feature_toggles" -[configure-grafana-feature-toggles]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-grafana#feature_toggles" - [data-source-management]: "/docs/grafana/ -> /docs/grafana//administration/data-source-management" [data-source-management]: "/docs/grafana-cloud/ -> /docs/grafana//administration/data-source-management" diff --git a/docs/sources/datasources/tempo/query-editor/_index.md b/docs/sources/datasources/tempo/query-editor/_index.md index c88b8f9b5a7..f80a938d22b 100644 --- a/docs/sources/datasources/tempo/query-editor/_index.md +++ b/docs/sources/datasources/tempo/query-editor/_index.md @@ -99,17 +99,6 @@ To query a particular trace: {{< figure src="/static/img/docs/tempo/query-editor-traceid.png" class="docs-image--no-shadow" max-width="750px" caption="Screenshot of the Tempo TraceID query type" >}} -## Query Loki for traces - -{{< admonition type="caution" >}} -Starting with Grafana v11.0, the Loki query tab will no longer be available. -{{< /admonition >}} - -To find traces to visualize, you can use the [Loki query editor]({{< relref "../../loki#loki-query-editor" >}}). -For results, you must configure [derived fields]({{< relref "../../loki#configure-derived-fields" >}}) in the Loki data source that point to this data source. - -{{< figure src="/static/img/docs/tempo/query-editor-search.png" class="docs-image--no-shadow" max-width="750px" caption="Screenshot of the Tempo query editor showing the Loki Search tab" >}} - {{% docs/reference %}} [explore]: "/docs/grafana/ -> /docs/grafana//explore" [explore]: "/docs/grafana-cloud/ -> /docs/grafana//explore" diff --git a/docs/sources/datasources/zipkin/_index.md b/docs/sources/datasources/zipkin/_index.md index c1d96a86256..b12037fbe2c 100644 --- a/docs/sources/datasources/zipkin/_index.md +++ b/docs/sources/datasources/zipkin/_index.md @@ -121,11 +121,6 @@ The following table describes the ways in which you can configure your trace to ### Trace to metrics -{{% admonition type="note" %}} -This feature is behind the `traceToMetrics` [feature toggle][configure-grafana-feature-toggles]. -If you use Grafana Cloud, open a [support ticket in the Cloud Portal](/profile/org/#support) to access this feature. -{{% /admonition %}} - The **Trace to metrics** setting configures the [trace to metrics feature](/blog/2022/08/18/new-in-grafana-9.1-trace-to-metrics-allows-users-to-navigate-from-a-trace-span-to-a-selected-data-source/) available when integrating Grafana with Zipkin. To configure trace to metrics: diff --git a/docs/sources/developers/http_api/admin.md b/docs/sources/developers/http_api/admin.md index b7a40e1d741..b8d88c4e90d 100644 --- a/docs/sources/developers/http_api/admin.md +++ b/docs/sources/developers/http_api/admin.md @@ -152,6 +152,7 @@ Content-Type: application/json "server":{ "cert_file":"", "cert_key":"", + "certs_watch_interval": "0s", "domain":"mygraf.com", "enable_gzip":"false", "enforce_domain":"false", @@ -473,45 +474,6 @@ Content-Type: application/json {"message": "User deleted"} ``` -## Pause all alerts - -`POST /api/admin/pause-all-alerts` - -{{% admonition type="note" %}} -This API is relevant for the [legacy dashboard alerts](https://grafana.com/docs/grafana/v8.5/alerting/old-alerting/) only. For default alerting, use silences to stop alerts from being delivered. -{{% /admonition %}} - -Only works with Basic Authentication (username and password). See [introduction](http://docs.grafana.org/http_api/admin/#admin-api) for an explanation. - -**Example Request**: - -```http -POST /api/admin/pause-all-alerts HTTP/1.1 -Accept: application/json -Content-Type: application/json - -{ - "paused": true -} -``` - -JSON Body schema: - -- **paused** – If true then all alerts are to be paused, false unpauses all alerts. - -**Example Response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "state": "Paused", - "message": "alert paused", - "alertsAffected": 1 -} -``` - ## Auth tokens for User `GET /api/admin/users/:id/auth-tokens` @@ -654,8 +616,6 @@ Content-Type: application/json `POST /api/admin/provisioning/plugins/reload` -`POST /api/admin/provisioning/notifications/reload` - `POST /api/admin/provisioning/access-control/reload` `POST /api/admin/provisioning/alerting/reload` @@ -676,7 +636,6 @@ See note in the [introduction]({{< ref "#admin-api" >}}) for an explanation. | provisioning:reload | provisioners:dashboards | dashboards | | provisioning:reload | provisioners:datasources | datasources | | provisioning:reload | provisioners:plugins | plugins | -| provisioning:reload | provisioners:notifications | notifications | | provisioning:reload | provisioners:alerting | alerting | **Example Request**: diff --git a/docs/sources/developers/http_api/alerting.md b/docs/sources/developers/http_api/alerting.md deleted file mode 100644 index ceece602a88..00000000000 --- a/docs/sources/developers/http_api/alerting.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -aliases: - - ../../http_api/alerting/ -canonical: /docs/grafana/latest/developers/http_api/alerting/ -description: Grafana Alerts HTTP API -keywords: - - grafana - - http - - documentation - - api - - alerting - - alerts -labels: - products: - - enterprise - - oss -title: Legacy Alerting API ---- - -# Legacy Alerting API - -{{% admonition type="note" %}} -Starting with v9.0, the Legacy Alerting HTTP API is deprecated. It will be removed in a future release. -{{% /admonition %}} - -This topic is relevant for the [legacy dashboard alerts](/docs/grafana/v8.5/alerting/old-alerting/) only. - -If you are using Grafana Alerting, refer to [Alerting provisioning API]({{< relref "./alerting_provisioning" >}}) - -You can find Grafana Alerting API specification details [here](https://editor.swagger.io/?url=https://raw.githubusercontent.com/grafana/grafana/main/pkg/services/ngalert/api/tooling/post.json). Also, refer to [Grafana Alerting alerts documentation][] for details on how to create and manage new alerts. - -You can use the Alerting API to get information about legacy dashboard alerts and their states but this API cannot be used to modify the alert. -To create new alerts or modify them you need to update the dashboard JSON that contains the alerts. - -## Get alerts - -`GET /api/alerts/` - -**Example Request**: - -```http -GET /api/alerts HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -Querystring Parameters: - -These parameters are used as querystring parameters. For example: - -`/api/alerts?dashboardId=1` - -- **dashboardId** – Limit response to alerts in specified dashboard(s). You can specify multiple dashboards, e.g. dashboardId=23&dashboardId=35. -- **panelId** – Limit response to alert for a specified panel on a dashboard. -- **query** - Limit response to alerts having a name like this value. -- **state** - Return alerts with one or more of the following alert states: `ALL`,`no_data`, `paused`, `alerting`, `ok`, `pending`. To specify multiple states use the following format: `?state=paused&state=alerting` -- **limit** - Limit response to _X_ number of alerts. -- **folderId** – Limit response to alerts of dashboards in specified folder(s). You can specify multiple folders, e.g. folderId=23&folderId=35. -- **dashboardQuery** - Limit response to alerts having a dashboard name like this value. -- **dashboardTag** - Limit response to alerts of dashboards with specified tags. To do an "AND" filtering with multiple tags, specify the tags parameter multiple times e.g. dashboardTag=tag1&dashboardTag=tag2. - -**Example Response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -[ - { - "id": 1, - "dashboardId": 1, - "dashboardUId": "ABcdEFghij" - "dashboardSlug": "sensors", - "panelId": 1, - "name": "fire place sensor", - "state": "alerting", - "newStateDate": "2018-05-14T05:55:20+02:00", - "evalDate": "0001-01-01T00:00:00Z", - "evalData": null, - "executionError": "", - "url": "http://grafana.com/dashboard/db/sensors" - } -] -``` - -## Get alert by id - -`GET /api/alerts/:id` - -**Example Request**: - -```http -GET /api/alerts/1 HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example Response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "id": 1, - "dashboardId": 1, - "dashboardUId": "ABcdEFghij" - "dashboardSlug": "sensors", - "panelId": 1, - "name": "fire place sensor", - "state": "alerting", - "message": "Someone is trying to break in through the fire place", - "newStateDate": "2018-05-14T05:55:20+02:00", - "evalDate": "0001-01-01T00:00:00Z", - "evalData": "evalMatches": [ - { - "metric": "movement", - "tags": { - "name": "fireplace_chimney" - }, - "value": 98.765 - } - ], - "executionError": "", - "url": "http://grafana.com/dashboard/db/sensors" -} -``` - -**Important Note**: -"evalMatches" data is cached in the db when and only when the state of the alert changes -(e.g. transitioning from "ok" to "alerting" state). - -If data from one server triggers the alert first and, before that server is seen leaving alerting state, -a second server also enters a state that would trigger the alert, the second server will not be visible in "evalMatches" data. - -## Pause alert by id - -`POST /api/alerts/:id/pause` - -**Example Request**: - -```http -POST /api/alerts/1/pause HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk - -{ - "paused": true -} -``` - -The :id query parameter is the id of the alert to be paused or unpaused. - -JSON Body Schema: - -- **paused** – Can be `true` or `false`. True to pause an alert. False to unpause an alert. - -**Example Response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "alertId": 1, - "state": "Paused", - "message": "alert paused" -} -``` - -## Pause all alerts - -See [Admin API][]. - -{{% docs/reference %}} -[Admin API]: "/docs/grafana/ -> /docs/grafana//developers/http_api/admin#pause-all-alerts" -[Admin API]: "/docs/grafana/ -> /docs/grafana//developers/http_api/admin#pause-all-alerts" - -[Grafana Alerting alerts documentation]: "/docs/grafana/ -> /docs/grafana//alerting" -[Grafana Alerting alerts documentation]: "/docs/grafana-cloud/ -> /docs/grafana//alerting" -{{% /docs/reference %}} diff --git a/docs/sources/developers/http_api/alerting_notification_channels.md b/docs/sources/developers/http_api/alerting_notification_channels.md deleted file mode 100644 index 440237b3287..00000000000 --- a/docs/sources/developers/http_api/alerting_notification_channels.md +++ /dev/null @@ -1,424 +0,0 @@ ---- -aliases: - - ../../http_api/alerting_notification_channels/ -canonical: /docs/grafana/latest/developers/http_api/alerting_notification_channels/ -description: Grafana Alerting Notification Channel HTTP API -keywords: - - grafana - - http - - documentation - - api - - alerting - - alerts - - notifications -labels: - products: - - enterprise - - oss -title: Legacy Alerting Notification Channels API ---- - -# Legacy Alerting Notification Channels API - -{{% admonition type="note" %}} -Starting with v9.0, the Legacy Alerting Notification Channels API is deprecated. It will be removed in a future release. -{{% /admonition %}} - -This page documents the Alerting Notification Channels API. - -## Identifier (id) vs unique identifier (uid) - -The identifier (id) of a notification channel is an auto-incrementing numeric value and is only unique per Grafana install. - -The unique identifier (uid) of a notification channel can be used for uniquely identify a notification channel between -multiple Grafana installs. It's automatically generated if not provided when creating a notification channel. The uid -allows having consistent URLs for accessing notification channels and when syncing notification channels between multiple -Grafana installations, refer to [alert notification channel provisioning]({{< relref "/docs/grafana/latest/administration/provisioning#alert-notification-channels" >}}). - -The uid can have a maximum length of 40 characters. - -## Get all notification channels - -Returns all notification channels that the authenticated user has permission to view. - -`GET /api/alert-notifications` - -**Example request**: - -```http -GET /api/alert-notifications HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -[ - { - "id": 1, - "uid": "team-a-email-notifier", - "name": "Team A", - "type": "email", - "isDefault": false, - "sendReminder": false, - "disableResolveMessage": false, - "settings": { - "addresses": "dev@grafana.com" - }, - "created": "2018-04-23T14:44:09+02:00", - "updated": "2018-08-20T15:47:49+02:00" - } -] - -``` - -## Get all notification channels (lookup) - -Returns all notification channels, but with less detailed information. Accessible by any authenticated user and is mainly used by providing alert notification channels in Grafana UI when configuring alert rule. - -`GET /api/alert-notifications/lookup` - -**Example request**: - -```http -GET /api/alert-notifications/lookup HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -[ - { - "id": 1, - "uid": "000000001", - "name": "Test", - "type": "email", - "isDefault": false - }, - { - "id": 2, - "uid": "000000002", - "name": "Slack", - "type": "slack", - "isDefault": false - } -] - -``` - -## Get notification channel by uid - -`GET /api/alert-notifications/uid/:uid` - -Returns the notification channel given the notification channel uid. - -**Example request**: - -```http -GET /api/alert-notifications/uid/team-a-email-notifier HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "id": 1, - "uid": "team-a-email-notifier", - "name": "Team A", - "type": "email", - "isDefault": false, - "sendReminder": false, - "disableResolveMessage": false, - "settings": { - "addresses": "dev@grafana.com" - }, - "created": "2018-04-23T14:44:09+02:00", - "updated": "2018-08-20T15:47:49+02:00" -} -``` - -## Get notification channel by id - -`GET /api/alert-notifications/:id` - -Returns the notification channel given the notification channel id. - -**Example request**: - -```http -GET /api/alert-notifications/1 HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "id": 1, - "uid": "team-a-email-notifier", - "name": "Team A", - "type": "email", - "isDefault": false, - "sendReminder": false, - "disableResolveMessage": false, - "settings": { - "addresses": "dev@grafana.com" - }, - "created": "2018-04-23T14:44:09+02:00", - "updated": "2018-08-20T15:47:49+02:00" -} -``` - -## Create notification channel - -You can find the full list of [supported notifiers](/docs/grafana/v8.5/alerting/old-alerting/notifications/) on the alert notifiers page. - -`POST /api/alert-notifications` - -**Example request**: - -```http -POST /api/alert-notifications HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk - -{ - "uid": "new-alert-notification", // optional - "name": "new alert notification", //Required - "type": "email", //Required - "isDefault": false, - "sendReminder": false, - "settings": { - "addresses": "dev@grafana.com" - } -} -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "id": 1, - "uid": "new-alert-notification", - "name": "new alert notification", - "type": "email", - "isDefault": false, - "sendReminder": false, - "settings": { - "addresses": "dev@grafana.com" - }, - "created": "2018-04-23T14:44:09+02:00", - "updated": "2018-08-20T15:47:49+02:00" -} -``` - -## Update notification channel by uid - -`PUT /api/alert-notifications/uid/:uid` - -Updates an existing notification channel identified by uid. - -**Example request**: - -```http -PUT /api/alert-notifications/uid/cIBgcSjkk HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk - -{ - "uid": "new-alert-notification", // optional - "name": "new alert notification", //Required - "type": "email", //Required - "isDefault": false, - "sendReminder": true, - "frequency": "15m", - "settings": { - "addresses": "dev@grafana.com" - } -} -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "id": 1, - "uid": "new-alert-notification", - "name": "new alert notification", - "type": "email", - "isDefault": false, - "sendReminder": true, - "frequency": "15m", - "settings": { - "addresses": "dev@grafana.com" - }, - "created": "2017-01-01 12:34", - "updated": "2017-01-01 12:34" -} -``` - -## Update notification channel by id - -`PUT /api/alert-notifications/:id` - -Updates an existing notification channel identified by id. - -**Example request**: - -```http -PUT /api/alert-notifications/1 HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk - -{ - "id": 1, - "uid": "new-alert-notification", // optional - "name": "new alert notification", //Required - "type": "email", //Required - "isDefault": false, - "sendReminder": true, - "frequency": "15m", - "settings": { - "addresses": "dev@grafana.com" - } -} -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "id": 1, - "uid": "new-alert-notification", - "name": "new alert notification", - "type": "email", - "isDefault": false, - "sendReminder": true, - "frequency": "15m", - "settings": { - "addresses": "dev@grafana.com" - }, - "created": "2017-01-01 12:34", - "updated": "2017-01-01 12:34" -} -``` - -## Delete alert notification by uid - -`DELETE /api/alert-notifications/uid/:uid` - -Deletes an existing notification channel identified by uid. - -**Example request**: - -```http -DELETE /api/alert-notifications/uid/team-a-email-notifier HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "message": "Notification deleted" -} -``` - -## Delete alert notification by id - -`DELETE /api/alert-notifications/:id` - -Deletes an existing notification channel identified by id. - -**Example request**: - -```http -DELETE /api/alert-notifications/1 HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "message": "Notification deleted" -} -``` - -## Test notification channel - -Sends a test notification message for the given notification channel type and settings. -You can find the full list of [supported notifiers](/alerting/notifications/#all-supported-notifier) at the alert notifiers page. - -`POST /api/alert-notifications/test` - -**Example request**: - -```http -POST /api/alert-notifications/test HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk - -{ - "type": "email", - "settings": { - "addresses": "dev@grafana.com" - } -} -``` - -**Example response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "message": "Test notification sent" -} -``` diff --git a/docs/sources/developers/http_api/annotations.md b/docs/sources/developers/http_api/annotations.md index 337bb230886..4d58b32a829 100644 --- a/docs/sources/developers/http_api/annotations.md +++ b/docs/sources/developers/http_api/annotations.md @@ -189,7 +189,7 @@ Content-Type: application/json "what": "Event - deploy", "tags": ["deploy", "production"], "when": 1467844481, - "data": "deploy of master branch happened at Wed Jul 6 22:34:41 UTC 2016" + "data": "deploy of main branch happened at Wed Jul 6 22:34:41 UTC 2016" } ``` diff --git a/docs/sources/developers/http_api/reporting.md b/docs/sources/developers/http_api/reporting.md index 8716edcdff8..871775fe15a 100644 --- a/docs/sources/developers/http_api/reporting.md +++ b/docs/sources/developers/http_api/reporting.md @@ -241,7 +241,7 @@ Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk "to": "2022-09-02T17:00:00+02:00" }, "reportVariables": { - "varibale1": "Value1" + "variable1": "Value1" } } ], diff --git a/docs/sources/developers/http_api/sso-settings.md b/docs/sources/developers/http_api/sso-settings.md index e1e284c76d8..c7c8a343a3a 100644 --- a/docs/sources/developers/http_api/sso-settings.md +++ b/docs/sources/developers/http_api/sso-settings.md @@ -22,6 +22,10 @@ title: SSO Settings API > If you are running Grafana Enterprise, for some endpoints you'll need to have specific permissions. Refer to [Role-based access control permissions]({{< relref "/docs/grafana/latest/administration/roles-and-permissions/access-control/custom-role-actions-scopes" >}}) for more information. +{{% admonition type="note" %}} +Available in Public Preview in Grafana 10.4 and on Grafana Cloud behind the `ssoSettingsApi` feature toggle. +{{% /admonition %}} + The API can be used to create, update, delete, get, and list SSO Settings. ## List SSO Settings diff --git a/docs/sources/developers/kinds/_index.md b/docs/sources/developers/kinds/_index.md deleted file mode 100644 index de9fa0e3fb1..00000000000 --- a/docs/sources/developers/kinds/_index.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -_build: - list: false -labels: - products: - - enterprise - - oss -title: Grafana schema -weight: 200 ---- - -# Grafana schema - -> Grafana’s schemas, kind system and related code generation are in active development. - -Grafana is moving to a schema-centric model of development, where schemas are the single source of truth that specify -the shape of objects - for example, dashboards, datasources, users - in the frontend, backend, and plugin code. -Eventually, all of Grafana’s object types will be schematized within the “Kind System.” Kinds, their schemas, the Kind -system rules, and associated code generators will collectively provide a clear, consistent foundation for Grafana’s -APIs, documentation, persistent storage, clients, as-code tooling, and so forth. - -It’s exciting to imagine the possibilities that a crisp, consistent development workflow will enable - this is why -companies build [developer platforms](https://internaldeveloperplatform.org/)! At the same time, it’s also -overwhelming - any schema system that can meet Grafana’s complex requirements will necessarily have a lot of moving -parts. Additionally, we must account for having Grafana continue to work as we make the transition - a prerequisite -for every large-scale refactoring. - -In the Grafana ecosystem, there are three basic Kind categories and associated schema categories: - -- [Core Kinds]({{< relref "core/" >}}) -- Custom Kinds -- [Composable Kinds]({{< relref "composable/" >}}) - -The schema authoring workflow for each varies, as does the path to maturity. -[Grafana Kinds - From Zero to Maturity]({{< relref "maturity/" >}}) contains general reference material applicable to -all Kind-writing, and links to the guides for each category of Kind. diff --git a/docs/sources/developers/kinds/composable/_index.md b/docs/sources/developers/kinds/composable/_index.md deleted file mode 100644 index 14e40cd6a3f..00000000000 --- a/docs/sources/developers/kinds/composable/_index.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -labels: - products: - - enterprise - - oss -title: Composable kinds -weight: 200 ---- - -# Grafana composable kinds - -{{< section >}} diff --git a/docs/sources/developers/kinds/composable/alertgroups/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/alertgroups/panelcfg/schema-reference.md deleted file mode 100644 index 8d69846cf26..00000000000 --- a/docs/sources/developers/kinds/composable/alertgroups/panelcfg/schema-reference.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: AlertGroupsPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## AlertGroupsPanelCfg - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -| Property | Type | Required | Default | Description | -|----------------|---------|----------|---------|-------------------------------------------------------------| -| `alertmanager` | string | **Yes** | | Name of the alertmanager used as a source for alerts | -| `expandAll` | boolean | **Yes** | | Expand all alert groups by default | -| `labels` | string | **Yes** | | Comma-separated list of values used to filter alert results | - - diff --git a/docs/sources/developers/kinds/composable/annotationslist/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/annotationslist/panelcfg/schema-reference.md deleted file mode 100644 index eb739f4509d..00000000000 --- a/docs/sources/developers/kinds/composable/annotationslist/panelcfg/schema-reference.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: AnnotationsListPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## AnnotationsListPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -| Property | Type | Required | Default | Description | -|-------------------------|----------|----------|---------|-------------| -| `limit` | uint32 | **Yes** | `10` | | -| `navigateAfter` | string | **Yes** | `10m` | | -| `navigateBefore` | string | **Yes** | `10m` | | -| `navigateToPanel` | boolean | **Yes** | `true` | | -| `onlyFromThisDashboard` | boolean | **Yes** | `false` | | -| `onlyInTimeRange` | boolean | **Yes** | `false` | | -| `showTags` | boolean | **Yes** | `true` | | -| `showTime` | boolean | **Yes** | `true` | | -| `showUser` | boolean | **Yes** | `true` | | -| `tags` | string[] | **Yes** | | | - - diff --git a/docs/sources/developers/kinds/composable/azuremonitor/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/azuremonitor/dataquery/schema-reference.md deleted file mode 100644 index 7c8f8241778..00000000000 --- a/docs/sources/developers/kinds/composable/azuremonitor/dataquery/schema-reference.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: AzureMonitorDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## AzureMonitorDataQuery - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/composable/barchart/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/barchart/panelcfg/schema-reference.md deleted file mode 100644 index 2a3e4d43c76..00000000000 --- a/docs/sources/developers/kinds/composable/barchart/panelcfg/schema-reference.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: BarChartPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## BarChartPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|---------------|------------------------|----------|---------|-------------| -| `FieldConfig` | [object](#fieldconfig) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | - -### FieldConfig - -It extends [AxisConfig](#axisconfig) and [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `fillOpacity` | integer | No | `80` | Controls the fill opacity of the bars.
Constraint: `>=0 & <=100`. | -| `gradientMode` | string | No | | Set the mode of the gradient fill. Fill gradient is based on the line color. To change the color, use the standard color scheme field option.
Gradient appearance is influenced by the Fill opacity setting. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `lineWidth` | integer | No | `1` | Controls line width of the bars.
Constraint: `>=0 & <=10`. | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs | -| `thresholdsStyle` | [GraphThresholdsStyleConfig](#graphthresholdsstyleconfig) | No | | TODO docs | - -### AxisConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | | -| `axisCenteredZero` | boolean | No | | | -| `axisColorMode` | string | No | | TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | | -| `axisLabel` | string | No | | | -| `axisPlacement` | string | No | | TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | | -| `axisSoftMin` | number | No | | | -| `axisWidth` | number | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### ScaleDistributionConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------------|--------|----------|---------|--------------------------------------------------------------------------| -| `type` | string | **Yes** | | TODO docs
Possible values are: `linear`, `log`, `ordinal`, `symlog`. | -| `linearThreshold` | number | No | | | -| `log` | number | No | | | - -### GraphThresholdsStyleConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `off`, `line`, `dashed`, `area`, `line+area`, `dashed+area`, `series`. | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### Options - -It extends [OptionsWithLegend](#optionswithlegend) and [OptionsWithTooltip](#optionswithtooltip) and [OptionsWithTextFormatting](#optionswithtextformatting). - -| Property | Type | Required | Default | Description | -|-----------------------|-------------------------------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------| -| `barWidth` | number | **Yes** | `0.97` | Controls the width of bars. 1 = Max width, 0 = Min width.
Constraint: `>=0 & <=1`. | -| `fullHighlight` | boolean | **Yes** | `false` | Enables mode which highlights the entire bar area and shows tooltip when cursor
hovers over highlighted area | -| `groupWidth` | number | **Yes** | `0.7` | Controls the width of groups. 1 = max with, 0 = min width.
Constraint: `>=0 & <=1`. | -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | *(Inherited from [OptionsWithLegend](#optionswithlegend))*
TODO docs | -| `orientation` | string | **Yes** | | Controls the orientation of the bar chart, either vertical or horizontal. | -| `showValue` | string | **Yes** | | This controls whether values are shown on top or to the left of bars. | -| `stacking` | string | **Yes** | | Controls whether bars are stacked or not, either normally or in percent mode. | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | *(Inherited from [OptionsWithTooltip](#optionswithtooltip))*
TODO docs | -| `xTickLabelMaxLength` | integer | **Yes** | | Sets the max length that a label can have before it is truncated.
Constraint: `>=0 & <=2147483647`. | -| `xTickLabelRotation` | integer | **Yes** | `0` | Controls the rotation of the x axis labels.
Constraint: `>=-90 & <=90`. | -| `barRadius` | number | No | `0` | Controls the radius of each bar.
Constraint: `>=0 & <=0.5`. | -| `colorByField` | string | No | | Use the color value for a sibling field to color each bar value. | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [OptionsWithTextFormatting](#optionswithtextformatting))*
TODO docs | -| `xField` | string | No | | Manually select which field from the dataset to represent the x field. | -| `xTickLabelSpacing` | int32 | No | `0` | Controls the spacing between x axis labels.
negative values indicate backwards skipping behavior | - -### OptionsWithLegend - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------|----------|---------|-------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### OptionsWithTextFormatting - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------------|----------|---------|-------------| -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | TODO docs | - -### VizTextDisplayOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|--------------------------| -| `titleSize` | number | No | | Explicit title text size | -| `valueSize` | number | No | | Explicit value text size | - -### OptionsWithTooltip - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------------------|----------|---------|-------------| -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - - diff --git a/docs/sources/developers/kinds/composable/bargauge/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/bargauge/panelcfg/schema-reference.md deleted file mode 100644 index db7bc0e5c09..00000000000 --- a/docs/sources/developers/kinds/composable/bargauge/panelcfg/schema-reference.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: BarGaugePanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## BarGaugePanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -It extends [SingleStatBaseOptions](#singlestatbaseoptions). - -| Property | Type | Required | Default | Description | -|-----------------|-------------------------------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------| -| `displayMode` | string | **Yes** | | Enum expressing the possible display modes
for the bar gauge component of Grafana UI
Possible values are: `basic`, `lcd`, `gradient`. | -| `maxVizHeight` | uint32 | **Yes** | `300` | | -| `minVizHeight` | uint32 | **Yes** | `16` | | -| `minVizWidth` | uint32 | **Yes** | `8` | | -| `namePlacement` | string | **Yes** | | Allows for the bar gauge name to be placed explicitly
Possible values are: `auto`, `top`, `left`. | -| `showUnfilled` | boolean | **Yes** | `true` | | -| `sizing` | string | **Yes** | | Allows for the bar gauge size to be set explicitly
Possible values are: `auto`, `manual`. | -| `valueMode` | string | **Yes** | | Allows for the table cell gauge display type to set the gauge mode.
Possible values are: `color`, `text`, `hidden`. | -| `orientation` | string | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs
Possible values are: `auto`, `vertical`, `horizontal`. | -| `reduceOptions` | [ReduceDataOptions](#reducedataoptions) | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs | - -### ReduceDataOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|---------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | When !values, pick one value for the whole field | -| `fields` | string | No | | Which fields to show. By default this is only numeric fields | -| `limit` | number | No | | if showing all values limit | -| `values` | boolean | No | | If true show each row value | - -### SingleStatBaseOptions - -TODO docs - -It extends [OptionsWithTextFormatting](#optionswithtextformatting). - -| Property | Type | Required | Default | Description | -|-----------------|-------------------------------------------------|----------|---------|------------------------------------------------------------------------------------------| -| `orientation` | string | **Yes** | | TODO docs
Possible values are: `auto`, `vertical`, `horizontal`. | -| `reduceOptions` | [ReduceDataOptions](#reducedataoptions) | **Yes** | | TODO docs | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [OptionsWithTextFormatting](#optionswithtextformatting))*
TODO docs | - -### OptionsWithTextFormatting - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------------|----------|---------|-------------| -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | TODO docs | - -### VizTextDisplayOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|--------------------------| -| `titleSize` | number | No | | Explicit title text size | -| `valueSize` | number | No | | Explicit value text size | - - diff --git a/docs/sources/developers/kinds/composable/candlestick/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/candlestick/panelcfg/schema-reference.md deleted file mode 100644 index db0bbe51881..00000000000 --- a/docs/sources/developers/kinds/composable/candlestick/panelcfg/schema-reference.md +++ /dev/null @@ -1,277 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: CandlestickPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## CandlestickPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------------------|---------------------------------------|----------|---------|-------------------------------------------------------------| -| `CandleStyle` | string | **Yes** | | Possible values are: `candles`, `ohlcbars`. | -| `CandlestickColors` | [object](#candlestickcolors) | **Yes** | | | -| `CandlestickFieldMap` | [object](#candlestickfieldmap) | **Yes** | | | -| `ColorStrategy` | string | **Yes** | | Possible values are: `open-close`, `close-close`. | -| `FieldConfig` | [GraphFieldConfig](#graphfieldconfig) | **Yes** | | TODO docs | -| `Options` | [object](#options) | **Yes** | | | -| `VizDisplayMode` | string | **Yes** | | Possible values are: `candles+volume`, `candles`, `volume`. | - -### CandlestickColors - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `down` | string | **Yes** | `red` | | -| `flat` | string | **Yes** | `gray` | | -| `up` | string | **Yes** | `green` | | - -### CandlestickFieldMap - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|------------------------------------------------------------------------------| -| `close` | string | No | | Corresponds to the final (end) value of the given period | -| `high` | string | No | | Corresponds to the highest value of the given period | -| `low` | string | No | | Corresponds to the lowest value of the given period | -| `open` | string | No | | Corresponds to the starting value of the given period | -| `volume` | string | No | | Corresponds to the sample count in the given period. (e.g. number of trades) | - -### GraphFieldConfig - -TODO docs - -It extends [LineConfig](#lineconfig) and [FillConfig](#fillconfig) and [PointsConfig](#pointsconfig) and [AxisConfig](#axisconfig) and [BarConfig](#barconfig) and [StackableFieldConfig](#stackablefieldconfig) and [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `barAlignment` | integer | No | | *(Inherited from [BarConfig](#barconfig))*
TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | *(Inherited from [BarConfig](#barconfig))* | -| `barWidthFactor` | number | No | | *(Inherited from [BarConfig](#barconfig))* | -| `drawStyle` | string | No | | TODO docs
Possible values are: `line`, `bars`, `points`. | -| `fillBelowTo` | string | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `fillColor` | string | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `fillOpacity` | number | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `gradientMode` | string | No | | TODO docs
Possible values are: `none`, `opacity`, `hue`, `scheme`. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `lineColor` | string | No | | *(Inherited from [LineConfig](#lineconfig))* | -| `lineInterpolation` | string | No | | *(Inherited from [LineConfig](#lineconfig))*
TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | *(Inherited from [LineConfig](#lineconfig))*
TODO docs | -| `lineWidth` | number | No | | *(Inherited from [LineConfig](#lineconfig))* | -| `pointColor` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `pointSize` | number | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `pointSymbol` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs | -| `showPoints` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))*
TODO docs
Possible values are: `auto`, `never`, `always`. | -| `spanNulls` | | No | | *(Inherited from [LineConfig](#lineconfig))*
Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | -| `stacking` | [StackingConfig](#stackingconfig) | No | | *(Inherited from [StackableFieldConfig](#stackablefieldconfig))*
TODO docs | -| `thresholdsStyle` | [GraphThresholdsStyleConfig](#graphthresholdsstyleconfig) | No | | TODO docs | -| `transform` | string | No | | TODO docs
Possible values are: `constant`, `negative-Y`. | - -### AxisConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | | -| `axisCenteredZero` | boolean | No | | | -| `axisColorMode` | string | No | | TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | | -| `axisLabel` | string | No | | | -| `axisPlacement` | string | No | | TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | | -| `axisSoftMin` | number | No | | | -| `axisWidth` | number | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### ScaleDistributionConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------------|--------|----------|---------|--------------------------------------------------------------------------| -| `type` | string | **Yes** | | TODO docs
Possible values are: `linear`, `log`, `ordinal`, `symlog`. | -| `linearThreshold` | number | No | | | -| `log` | number | No | | | - -### BarConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------------|---------|----------|---------|----------------------------------------------------| -| `barAlignment` | integer | No | | TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | | -| `barWidthFactor` | number | No | | | - -### FillConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|-------------| -| `fillBelowTo` | string | No | | | -| `fillColor` | string | No | | | -| `fillOpacity` | number | No | | | - -### GraphThresholdsStyleConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `off`, `line`, `dashed`, `area`, `line+area`, `dashed+area`, `series`. | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### LineConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lineColor` | string | No | | | -| `lineInterpolation` | string | No | | TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | TODO docs | -| `lineWidth` | number | No | | | -| `spanNulls` | | No | | Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | - -### LineStyle - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|--------------------------------------------------------| -| `dash` | number[] | No | | | -| `fill` | string | No | | Possible values are: `solid`, `dash`, `dot`, `square`. | - -### PointsConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|---------------------------------------------------------------| -| `pointColor` | string | No | | | -| `pointSize` | number | No | | | -| `pointSymbol` | string | No | | | -| `showPoints` | string | No | | TODO docs
Possible values are: `auto`, `never`, `always`. | - -### StackableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|-----------------------------------|----------|---------|-------------| -| `stacking` | [StackingConfig](#stackingconfig) | No | | TODO docs | - -### StackingConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------| -| `group` | string | No | | | -| `mode` | string | No | | TODO docs
Possible values are: `none`, `normal`, `percent`. | - -### Options - -It extends [OptionsWithLegend](#optionswithlegend) and [OptionsWithTooltip](#optionswithtooltip). - -| Property | Type | Required | Default | Description | -|--------------------|-----------------------------------------|----------|---------|----------------------------------------------------------------------------| -| `candleStyle` | string | **Yes** | | Sets the style of the candlesticks | -| `colorStrategy` | string | **Yes** | | Sets the color strategy for the candlesticks | -| `colors` | [CandlestickColors](#candlestickcolors) | **Yes** | | | -| `fields` | [object](#fields) | **Yes** | `map[]` | Map fields to appropriate dimension | -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | *(Inherited from [OptionsWithLegend](#optionswithlegend))*
TODO docs | -| `mode` | string | **Yes** | | Sets which dimensions are used for the visualization | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | *(Inherited from [OptionsWithTooltip](#optionswithtooltip))*
TODO docs | -| `includeAllFields` | boolean | No | `false` | When enabled, all fields will be sent to the graph | - -### OptionsWithLegend - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------|----------|---------|-------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### OptionsWithTooltip - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------------------|----------|---------|-------------| -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - -### Fields - -Map fields to appropriate dimension - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------|----------|---------|-------------| -| `object` | Possible types are: [](#), [](#). | | | - - diff --git a/docs/sources/developers/kinds/composable/canvas/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/canvas/panelcfg/schema-reference.md deleted file mode 100644 index 64177f5f42d..00000000000 --- a/docs/sources/developers/kinds/composable/canvas/panelcfg/schema-reference.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: CanvasPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## CanvasPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-------------------------|----------------------------------|----------|---------|-----------------------------------------------------------------------| -| `BackgroundConfig` | [object](#backgroundconfig) | **Yes** | | | -| `BackgroundImageSize` | string | **Yes** | | Possible values are: `original`, `contain`, `cover`, `fill`, `tile`. | -| `CanvasConnection` | [object](#canvasconnection) | **Yes** | | | -| `CanvasElementOptions` | [object](#canvaselementoptions) | **Yes** | | | -| `ConnectionCoordinates` | [object](#connectioncoordinates) | **Yes** | | | -| `ConnectionPath` | string | **Yes** | | Possible values are: `straight`. | -| `Constraint` | [object](#constraint) | **Yes** | | | -| `HorizontalConstraint` | string | **Yes** | | Possible values are: `left`, `right`, `leftright`, `center`, `scale`. | -| `HttpRequestMethod` | string | **Yes** | | Possible values are: `GET`, `POST`, `PUT`. | -| `LineConfig` | [object](#lineconfig) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | -| `Placement` | [object](#placement) | **Yes** | | | -| `VerticalConstraint` | string | **Yes** | | Possible values are: `top`, `bottom`, `topbottom`, `center`, `scale`. | - -### BackgroundConfig - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------| -| `color` | [ColorDimensionConfig](#colordimensionconfig) | No | | | -| `image` | [ResourceDimensionConfig](#resourcedimensionconfig) | No | | Links to a resource (image/svg path) | -| `size` | string | No | | Possible values are: `original`, `contain`, `cover`, `fill`, `tile`. | - -### ColorDimensionConfig - -It extends [BaseDimensionConfig](#basedimensionconfig). - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------| -| `field` | string | No | | *(Inherited from [BaseDimensionConfig](#basedimensionconfig))*
fixed: T -- will be added by each element | -| `fixed` | string | No | | | - -### BaseDimensionConfig - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------------------------------------| -| `field` | string | No | | fixed: T -- will be added by each element | - -### ResourceDimensionConfig - -Links to a resource (image/svg path) - -It extends [BaseDimensionConfig](#basedimensionconfig). - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | Possible values are: `fixed`, `field`, `mapping`. | -| `field` | string | No | | *(Inherited from [BaseDimensionConfig](#basedimensionconfig))*
fixed: T -- will be added by each element | -| `fixed` | string | No | | | - -### CanvasConnection - -| Property | Type | Required | Default | Description | -|--------------|-------------------------------------------------|----------|---------|----------------------------------| -| `path` | string | **Yes** | | Possible values are: `straight`. | -| `source` | [ConnectionCoordinates](#connectioncoordinates) | **Yes** | | | -| `target` | [ConnectionCoordinates](#connectioncoordinates) | **Yes** | | | -| `color` | [ColorDimensionConfig](#colordimensionconfig) | No | | | -| `size` | [ScaleDimensionConfig](#scaledimensionconfig) | No | | | -| `targetName` | string | No | | | - -### ConnectionCoordinates - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `x` | number | **Yes** | | | -| `y` | number | **Yes** | | | - -### ScaleDimensionConfig - -It extends [BaseDimensionConfig](#basedimensionconfig). - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------| -| `max` | number | **Yes** | | | -| `min` | number | **Yes** | | | -| `field` | string | No | | *(Inherited from [BaseDimensionConfig](#basedimensionconfig))*
fixed: T -- will be added by each element | -| `fixed` | number | No | | | -| `mode` | string | No | | Possible values are: `linear`, `quad`. | - -### CanvasElementOptions - -| Property | Type | Required | Default | Description | -|---------------|-----------------------------------------|----------|---------|---------------------------------------------------------| -| `name` | string | **Yes** | | | -| `type` | string | **Yes** | | | -| `background` | [BackgroundConfig](#backgroundconfig) | No | | | -| `border` | [LineConfig](#lineconfig) | No | | | -| `config` | | No | | TODO: figure out how to define this (element config(s)) | -| `connections` | [CanvasConnection](#canvasconnection)[] | No | | | -| `constraint` | [Constraint](#constraint) | No | | | -| `placement` | [Placement](#placement) | No | | | - -### Constraint - -| Property | Type | Required | Default | Description | -|--------------|--------|----------|---------|-----------------------------------------------------------------------| -| `horizontal` | string | No | | Possible values are: `left`, `right`, `leftright`, `center`, `scale`. | -| `vertical` | string | No | | Possible values are: `top`, `bottom`, `topbottom`, `center`, `scale`. | - -### LineConfig - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------------------|----------|---------|-------------| -| `color` | [ColorDimensionConfig](#colordimensionconfig) | No | | | -| `width` | number | No | | | - -### Placement - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `bottom` | number | No | | | -| `height` | number | No | | | -| `left` | number | No | | | -| `right` | number | No | | | -| `top` | number | No | | | -| `width` | number | No | | | - -### Options - -| Property | Type | Required | Default | Description | -|---------------------|-----------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------| -| `infinitePan` | boolean | **Yes** | `true` | Enable infinite pan | -| `inlineEditing` | boolean | **Yes** | `true` | Enable inline editing | -| `panZoom` | boolean | **Yes** | `true` | Enable pan and zoom | -| `root` | [object](#root) | **Yes** | | The root element of canvas (frame), where all canvas elements are nested
TODO: Figure out how to define a default value for this | -| `showAdvancedTypes` | boolean | **Yes** | `true` | Show all available element types | - -### Root - -The root element of canvas (frame), where all canvas elements are nested -TODO: Figure out how to define a default value for this - -| Property | Type | Required | Default | Description | -|------------|-------------------------------------------------|----------|---------|----------------------------------------------------------------| -| `elements` | [CanvasElementOptions](#canvaselementoptions)[] | **Yes** | | The list of canvas elements attached to the root element | -| `name` | string | **Yes** | | Name of the root element | -| `type` | string | **Yes** | | Type of root element (frame)
Possible values are: `frame`. | - - diff --git a/docs/sources/developers/kinds/composable/cloudwatch/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/cloudwatch/dataquery/schema-reference.md deleted file mode 100644 index 78cb0d0f470..00000000000 --- a/docs/sources/developers/kinds/composable/cloudwatch/dataquery/schema-reference.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: CloudWatchDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## CloudWatchDataQuery - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/composable/dashboardlist/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/dashboardlist/panelcfg/schema-reference.md deleted file mode 100644 index 732b4ea5837..00000000000 --- a/docs/sources/developers/kinds/composable/dashboardlist/panelcfg/schema-reference.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: DashboardListPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## DashboardListPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -| Property | Type | Required | Default | Description | -|----------------------|----------|----------|---------|-----------------------------------------------------------------| -| `includeVars` | boolean | **Yes** | `false` | | -| `keepTime` | boolean | **Yes** | `false` | | -| `maxItems` | integer | **Yes** | `10` | | -| `query` | string | **Yes** | `` | | -| `showHeadings` | boolean | **Yes** | `true` | | -| `showRecentlyViewed` | boolean | **Yes** | `false` | | -| `showSearch` | boolean | **Yes** | `false` | | -| `showStarred` | boolean | **Yes** | `true` | | -| `tags` | string[] | **Yes** | | | -| `folderId` | integer | No | | folderId is deprecated, and migrated to folderUid on panel init | -| `folderUID` | string | No | | | - - diff --git a/docs/sources/developers/kinds/composable/datagrid/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/datagrid/panelcfg/schema-reference.md deleted file mode 100644 index adc4c54aec4..00000000000 --- a/docs/sources/developers/kinds/composable/datagrid/panelcfg/schema-reference.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: DatagridPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## DatagridPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -| Property | Type | Required | Default | Description | -|------------------|---------|----------|---------|-----------------------------------| -| `selectedSeries` | integer | **Yes** | `0` | Constraint: `>=0 & <=2147483647`. | - - diff --git a/docs/sources/developers/kinds/composable/debug/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/debug/panelcfg/schema-reference.md deleted file mode 100644 index 90832442886..00000000000 --- a/docs/sources/developers/kinds/composable/debug/panelcfg/schema-reference.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: DebugPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## DebugPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|----------------|-------------------------|----------|---------|---------------------------------------------------------------------------| -| `DebugMode` | string | **Yes** | | Possible values are: `render`, `events`, `cursor`, `State`, `ThrowError`. | -| `Options` | [object](#options) | **Yes** | | | -| `UpdateConfig` | [object](#updateconfig) | **Yes** | | | - -### Options - -| Property | Type | Required | Default | Description | -|------------|-------------------------------|----------|---------|---------------------------------------------------------------------------| -| `mode` | string | **Yes** | | Possible values are: `render`, `events`, `cursor`, `State`, `ThrowError`. | -| `counters` | [UpdateConfig](#updateconfig) | No | | | - -### UpdateConfig - -| Property | Type | Required | Default | Description | -|-----------------|---------|----------|---------|-------------| -| `dataChanged` | boolean | **Yes** | | | -| `render` | boolean | **Yes** | | | -| `schemaChanged` | boolean | **Yes** | | | - - diff --git a/docs/sources/developers/kinds/composable/elasticsearch/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/elasticsearch/dataquery/schema-reference.md deleted file mode 100644 index 384fe82ee0a..00000000000 --- a/docs/sources/developers/kinds/composable/elasticsearch/dataquery/schema-reference.md +++ /dev/null @@ -1,283 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: ElasticsearchDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## ElasticsearchDataQuery - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|--------------|-------------------------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `refId` | string | **Yes** | | A unique identifier for the query within the list of targets.
In server side expressions, the refId is used as a variable name to identify results.
By default, the UI will assign A->Z; however setting meaningful names may be useful. | -| `alias` | string | No | | Alias pattern | -| `bucketAggs` | [BucketAggregation](#bucketaggregation)[] | No | | List of bucket aggregations | -| `datasource` | | No | | For mixed data sources the selected datasource is on the query level.
For non mixed scenarios this is undefined.
TODO find a better way to do this ^ that's friendly to schema
TODO this shouldn't be unknown but DataSourceRef | null | -| `hide` | boolean | No | | true if query is disabled (ie should not be returned to the dashboard)
Note this does not always imply that the query should not be executed since
the results from a hidden query may be used as the input to other queries (SSE etc) | -| `metrics` | [MetricAggregation](#metricaggregation)[] | No | | List of metric aggregations | -| `queryType` | string | No | | Specify the query flavor
TODO make this required and give it a default | -| `query` | string | No | | Lucene query | -| `timeField` | string | No | | Name of time field | - -### BucketAggregation - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------|-------------| -| `object` | Possible types are: [DateHistogram](#datehistogram), [Histogram](#histogram), [Terms](#terms), [Filters](#filters), [GeoHashGrid](#geohashgrid), [Nested](#nested). | | | - -### DateHistogram - -It extends [BucketAggregationWithField](#bucketaggregationwithfield). - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))*
Possible values are: `terms`, `filters`, `geohash_grid`, `date_histogram`, `histogram`, `nested`. | -| `field` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `id` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `settings` | | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | - -### BucketAggregationWithField - -It extends [BaseBucketAggregation](#basebucketaggregation). - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `id` | string | **Yes** | | *(Inherited from [BaseBucketAggregation](#basebucketaggregation))* | -| `type` | string | **Yes** | | *(Inherited from [BaseBucketAggregation](#basebucketaggregation))*
Possible values are: `terms`, `filters`, `geohash_grid`, `date_histogram`, `histogram`, `nested`. | -| `field` | string | No | | | -| `settings` | | No | | *(Inherited from [BaseBucketAggregation](#basebucketaggregation))* | - -### BaseBucketAggregation - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|---------------------------------------------------------------------------------------------------| -| `id` | string | **Yes** | | | -| `type` | string | **Yes** | | Possible values are: `terms`, `filters`, `geohash_grid`, `date_histogram`, `histogram`, `nested`. | -| `settings` | | No | | | - -### Filters - -It extends [BaseBucketAggregation](#basebucketaggregation). - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `id` | string | **Yes** | | *(Inherited from [BaseBucketAggregation](#basebucketaggregation))* | -| `type` | string | **Yes** | | *(Inherited from [BaseBucketAggregation](#basebucketaggregation))*
Possible values are: `terms`, `filters`, `geohash_grid`, `date_histogram`, `histogram`, `nested`. | -| `settings` | | No | | *(Inherited from [BaseBucketAggregation](#basebucketaggregation))* | - -### GeoHashGrid - -It extends [BucketAggregationWithField](#bucketaggregationwithfield). - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))*
Possible values are: `terms`, `filters`, `geohash_grid`, `date_histogram`, `histogram`, `nested`. | -| `field` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `id` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `settings` | | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | - -### Histogram - -It extends [BucketAggregationWithField](#bucketaggregationwithfield). - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))*
Possible values are: `terms`, `filters`, `geohash_grid`, `date_histogram`, `histogram`, `nested`. | -| `field` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `id` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `settings` | | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | - -### Nested - -It extends [BucketAggregationWithField](#bucketaggregationwithfield). - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))*
Possible values are: `terms`, `filters`, `geohash_grid`, `date_histogram`, `histogram`, `nested`. | -| `field` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `id` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `settings` | | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | - -### Terms - -It extends [BucketAggregationWithField](#bucketaggregationwithfield). - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))*
Possible values are: `terms`, `filters`, `geohash_grid`, `date_histogram`, `histogram`, `nested`. | -| `field` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `id` | string | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | -| `settings` | | No | | *(Inherited from [BucketAggregationWithField](#bucketaggregationwithfield))* | - -### MetricAggregation - -| Property | Type | Required | Default | Description | -|----------|------------------------------------------------------------------------------------------------------|----------|---------|-------------| -| `object` | Possible types are: [Count](#count), [PipelineMetricAggregation](#pipelinemetricaggregation), [](#). | | | - -### Count - -It extends [BaseMetricAggregation](#basemetricaggregation). - -| Property | Type | Required | Default | Description | -|----------|---------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `id` | string | **Yes** | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))* | -| `type` | string | **Yes** | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))*
Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `hide` | boolean | No | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))* | - -### BaseMetricAggregation - -| Property | Type | Required | Default | Description | -|----------|---------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `id` | string | **Yes** | | | -| `type` | string | **Yes** | | Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `hide` | boolean | No | | | - -### PipelineMetricAggregation - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------|-------------| -| `object` | Possible types are: [MovingAverage](#movingaverage), [Derivative](#derivative), [CumulativeSum](#cumulativesum), [BucketScript](#bucketscript). | | | - -### BucketScript - -It extends [PipelineMetricAggregationWithMultipleBucketPaths](#pipelinemetricaggregationwithmultiplebucketpaths). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [PipelineMetricAggregationWithMultipleBucketPaths](#pipelinemetricaggregationwithmultiplebucketpaths))*
Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `hide` | boolean | No | | *(Inherited from [PipelineMetricAggregationWithMultipleBucketPaths](#pipelinemetricaggregationwithmultiplebucketpaths))* | -| `id` | string | No | | *(Inherited from [PipelineMetricAggregationWithMultipleBucketPaths](#pipelinemetricaggregationwithmultiplebucketpaths))* | -| `pipelineVariables` | [PipelineVariable](#pipelinevariable)[] | No | | *(Inherited from [PipelineMetricAggregationWithMultipleBucketPaths](#pipelinemetricaggregationwithmultiplebucketpaths))* | -| `settings` | [object](#settings) | No | | | - -### PipelineMetricAggregationWithMultipleBucketPaths - -It extends [BaseMetricAggregation](#basemetricaggregation). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `id` | string | **Yes** | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))* | -| `type` | string | **Yes** | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))*
Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `hide` | boolean | No | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))* | -| `pipelineVariables` | [PipelineVariable](#pipelinevariable)[] | No | | | - -### PipelineVariable - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|-------------| -| `name` | string | **Yes** | | | -| `pipelineAgg` | string | **Yes** | | | - -### Settings - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| -| `script` | | No | | | - -### CumulativeSum - -It extends [BasePipelineMetricAggregation](#basepipelinemetricaggregation). - -| Property | Type | Required | Default | Description | -|---------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))*
Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `field` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `hide` | boolean | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `id` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `pipelineAgg` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `settings` | [object](#settings) | No | | | - -### BasePipelineMetricAggregation - -It extends [MetricAggregationWithField](#metricaggregationwithfield). - -| Property | Type | Required | Default | Description | -|---------------|---------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [MetricAggregationWithField](#metricaggregationwithfield))*
Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `field` | string | No | | *(Inherited from [MetricAggregationWithField](#metricaggregationwithfield))* | -| `hide` | boolean | No | | *(Inherited from [MetricAggregationWithField](#metricaggregationwithfield))* | -| `id` | string | No | | *(Inherited from [MetricAggregationWithField](#metricaggregationwithfield))* | -| `pipelineAgg` | string | No | | | - -### MetricAggregationWithField - -It extends [BaseMetricAggregation](#basemetricaggregation). - -| Property | Type | Required | Default | Description | -|----------|---------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `id` | string | **Yes** | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))* | -| `type` | string | **Yes** | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))*
Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `field` | string | No | | | -| `hide` | boolean | No | | *(Inherited from [BaseMetricAggregation](#basemetricaggregation))* | - -### Settings - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `format` | string | No | | | - -### Derivative - -It extends [BasePipelineMetricAggregation](#basepipelinemetricaggregation). - -| Property | Type | Required | Default | Description | -|---------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))*
Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `field` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `hide` | boolean | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `id` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `pipelineAgg` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `settings` | [object](#settings) | No | | | - -### Settings - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `unit` | string | No | | | - -### MovingAverage - -#MovingAverage's settings are overridden in types.ts - -It extends [BasePipelineMetricAggregation](#basepipelinemetricaggregation). - -| Property | Type | Required | Default | Description | -|---------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))*
Possible values are: `count`, `avg`, `sum`, `min`, `max`, `extended_stats`, `percentiles`, `cardinality`, `raw_document`, `raw_data`, `logs`, `rate`, `top_metrics`, `moving_avg`, `moving_fn`, `derivative`, `serial_diff`, `cumulative_sum`, `bucket_script`. | -| `field` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `hide` | boolean | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `id` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `pipelineAgg` | string | No | | *(Inherited from [BasePipelineMetricAggregation](#basepipelinemetricaggregation))* | -| `settings` | [object](#settings) | No | | | - -### Settings - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Meta - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Settings - -| Property | Type | Required | Default | Description | -|-----------|----------|----------|---------|-------------| -| `metrics` | string[] | No | | | -| `orderBy` | string | No | | | -| `order` | string | No | | | - - diff --git a/docs/sources/developers/kinds/composable/gauge/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/gauge/panelcfg/schema-reference.md deleted file mode 100644 index 5cc9eaa99c6..00000000000 --- a/docs/sources/developers/kinds/composable/gauge/panelcfg/schema-reference.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: GaugePanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## GaugePanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -It extends [SingleStatBaseOptions](#singlestatbaseoptions). - -| Property | Type | Required | Default | Description | -|------------------------|-------------------------------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------| -| `minVizHeight` | uint32 | **Yes** | `75` | | -| `minVizWidth` | uint32 | **Yes** | `75` | | -| `showThresholdLabels` | boolean | **Yes** | `false` | | -| `showThresholdMarkers` | boolean | **Yes** | `true` | | -| `sizing` | string | **Yes** | | Allows for the bar gauge size to be set explicitly
Possible values are: `auto`, `manual`. | -| `orientation` | string | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs
Possible values are: `auto`, `vertical`, `horizontal`. | -| `reduceOptions` | [ReduceDataOptions](#reducedataoptions) | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs | - -### ReduceDataOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|---------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | When !values, pick one value for the whole field | -| `fields` | string | No | | Which fields to show. By default this is only numeric fields | -| `limit` | number | No | | if showing all values limit | -| `values` | boolean | No | | If true show each row value | - -### SingleStatBaseOptions - -TODO docs - -It extends [OptionsWithTextFormatting](#optionswithtextformatting). - -| Property | Type | Required | Default | Description | -|-----------------|-------------------------------------------------|----------|---------|------------------------------------------------------------------------------------------| -| `orientation` | string | **Yes** | | TODO docs
Possible values are: `auto`, `vertical`, `horizontal`. | -| `reduceOptions` | [ReduceDataOptions](#reducedataoptions) | **Yes** | | TODO docs | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [OptionsWithTextFormatting](#optionswithtextformatting))*
TODO docs | - -### OptionsWithTextFormatting - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------------|----------|---------|-------------| -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | TODO docs | - -### VizTextDisplayOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|--------------------------| -| `titleSize` | number | No | | Explicit title text size | -| `valueSize` | number | No | | Explicit value text size | - - diff --git a/docs/sources/developers/kinds/composable/geomap/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/geomap/panelcfg/schema-reference.md deleted file mode 100644 index cfa0b3c9138..00000000000 --- a/docs/sources/developers/kinds/composable/geomap/panelcfg/schema-reference.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: GeomapPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## GeomapPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-------------------|----------------------------|----------|---------|-----------------------------------------------| -| `ControlsOptions` | [object](#controlsoptions) | **Yes** | | | -| `MapCenterID` | string | **Yes** | | Possible values are: `zero`, `coords`, `fit`. | -| `MapViewConfig` | [object](#mapviewconfig) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | -| `TooltipMode` | string | **Yes** | | Possible values are: `none`, `details`. | -| `TooltipOptions` | [object](#tooltipoptions) | **Yes** | | | - -### ControlsOptions - -| Property | Type | Required | Default | Description | -|-------------------|---------|----------|---------|--------------------------| -| `mouseWheelZoom` | boolean | No | | let the mouse wheel zoom | -| `showAttribution` | boolean | No | | Lower right | -| `showDebug` | boolean | No | | Show debug | -| `showMeasure` | boolean | No | | Show measure | -| `showScale` | boolean | No | | Scale options | -| `showZoom` | boolean | No | | Zoom (upper left) | - -### MapViewConfig - -| Property | Type | Required | Default | Description | -|-------------|---------|----------|---------|-------------| -| `id` | string | **Yes** | `zero` | | -| `allLayers` | boolean | No | `true` | | -| `lastOnly` | boolean | No | | | -| `lat` | int64 | No | `0` | | -| `layer` | string | No | | | -| `lon` | int64 | No | `0` | | -| `maxZoom` | integer | No | | | -| `minZoom` | integer | No | | | -| `padding` | integer | No | | | -| `shared` | boolean | No | | | -| `zoom` | int64 | No | `1` | | - -### Options - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `basemap` | [MapLayerOptions](#maplayeroptions) | **Yes** | | | -| `controls` | [ControlsOptions](#controlsoptions) | **Yes** | | | -| `layers` | [MapLayerOptions](#maplayeroptions)[] | **Yes** | | | -| `tooltip` | [TooltipOptions](#tooltipoptions) | **Yes** | | | -| `view` | [MapViewConfig](#mapviewconfig) | **Yes** | | | - -### MapLayerOptions - -| Property | Type | Required | Default | Description | -|--------------|---------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------| -| `name` | string | **Yes** | | configured unique display name | -| `type` | string | **Yes** | | | -| `config` | | No | | Custom options depending on the type | -| `filterData` | | No | | Defines a frame MatcherConfig that may filter data for the given layer | -| `location` | [FrameGeometrySource](#framegeometrysource) | No | | | -| `opacity` | integer | No | | Common properties:
https://openlayers.org/en/latest/apidoc/module-ol_layer_Base-BaseLayer.html
Layer opacity (0-1) | -| `tooltip` | boolean | No | | Check tooltip (defaults to true) | - -### FrameGeometrySource - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|-------------------------------------------------------------| -| `mode` | string | **Yes** | | Possible values are: `auto`, `geohash`, `coords`, `lookup`. | -| `gazetteer` | string | No | | Path to Gazetteer | -| `geohash` | string | No | | Field mappings | -| `latitude` | string | No | | | -| `longitude` | string | No | | | -| `lookup` | string | No | | | -| `wkt` | string | No | | | - -### TooltipOptions - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------| -| `mode` | string | **Yes** | | Possible values are: `none`, `details`. | - - diff --git a/docs/sources/developers/kinds/composable/googlecloudmonitoring/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/googlecloudmonitoring/dataquery/schema-reference.md deleted file mode 100644 index d8f28ff51d6..00000000000 --- a/docs/sources/developers/kinds/composable/googlecloudmonitoring/dataquery/schema-reference.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: GoogleCloudMonitoringDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## GoogleCloudMonitoringDataQuery - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/composable/grafanapyroscope/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/grafanapyroscope/dataquery/schema-reference.md deleted file mode 100644 index 3b7a95d56c6..00000000000 --- a/docs/sources/developers/kinds/composable/grafanapyroscope/dataquery/schema-reference.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: GrafanaPyroscopeDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## GrafanaPyroscopeDataQuery - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------------|----------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `groupBy` | string[] | **Yes** | | Allows to group the results. | -| `labelSelector` | string | **Yes** | `{}` | Specifies the query label selectors. | -| `profileTypeId` | string | **Yes** | | Specifies the type of profile to query. | -| `refId` | string | **Yes** | | A unique identifier for the query within the list of targets.
In server side expressions, the refId is used as a variable name to identify results.
By default, the UI will assign A->Z; however setting meaningful names may be useful. | -| `datasource` | | No | | For mixed data sources the selected datasource is on the query level.
For non mixed scenarios this is undefined.
TODO find a better way to do this ^ that's friendly to schema
TODO this shouldn't be unknown but DataSourceRef | null | -| `hide` | boolean | No | | true if query is disabled (ie should not be returned to the dashboard)
Note this does not always imply that the query should not be executed since
the results from a hidden query may be used as the input to other queries (SSE etc) | -| `maxNodes` | integer | No | | Sets the maximum number of nodes in the flamegraph. | -| `queryType` | string | No | | Specify the query flavor
TODO make this required and give it a default | -| `spanSelector` | string[] | No | | Specifies the query span selectors. | - - diff --git a/docs/sources/developers/kinds/composable/heatmap/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/heatmap/panelcfg/schema-reference.md deleted file mode 100644 index 3c704e12265..00000000000 --- a/docs/sources/developers/kinds/composable/heatmap/panelcfg/schema-reference.md +++ /dev/null @@ -1,250 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: HeatmapPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## HeatmapPanelCfg - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------------------|--------------------------------|----------|---------|-------------------------------------------------------------------------------------------| -| `CellValues` | [object](#cellvalues) | **Yes** | | Controls cell value options | -| `ExemplarConfig` | [object](#exemplarconfig) | **Yes** | | Controls exemplar options | -| `FieldConfig` | [object](#fieldconfig) | **Yes** | | | -| `FilterValueRange` | [object](#filtervaluerange) | **Yes** | | Controls the value filter range | -| `HeatmapColorMode` | string | **Yes** | | Controls the color mode of the heatmap
Possible values are: `opacity`, `scheme`. | -| `HeatmapColorOptions` | [object](#heatmapcoloroptions) | **Yes** | | Controls various color options | -| `HeatmapColorScale` | string | **Yes** | | Controls the color scale of the heatmap
Possible values are: `linear`, `exponential`. | -| `HeatmapLegend` | [object](#heatmaplegend) | **Yes** | | Controls legend options | -| `HeatmapTooltip` | [object](#heatmaptooltip) | **Yes** | | Controls tooltip options | -| `Options` | [object](#options) | **Yes** | | | -| `RowsHeatmapOptions` | [object](#rowsheatmapoptions) | **Yes** | | Controls frame rows options | -| `YAxisConfig` | [object](#yaxisconfig) | **Yes** | | Configuration options for the yAxis | - -### CellValues - -Controls cell value options - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|-------------------------------------------------| -| `decimals` | number | No | | Controls the number of decimals for cell values | -| `unit` | string | No | | Controls the cell value unit | - -### ExemplarConfig - -Controls exemplar options - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|----------------------------------------| -| `color` | string | **Yes** | | Sets the color of the exemplar markers | - -### FieldConfig - -It extends [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|------------------------------------------------------------------------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### ScaleDistributionConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------------|--------|----------|---------|--------------------------------------------------------------------------| -| `type` | string | **Yes** | | TODO docs
Possible values are: `linear`, `log`, `ordinal`, `symlog`. | -| `linearThreshold` | number | No | | | -| `log` | number | No | | | - -### FilterValueRange - -Controls the value filter range - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------------------------------------------| -| `ge` | number | No | | Sets the filter range to values greater than or equal to the given value | -| `le` | number | No | | Sets the filter range to values less than or equal to the given value | - -### HeatmapColorOptions - -Controls various color options - -| Property | Type | Required | Default | Description | -|------------|---------|----------|---------|-------------------------------------------------------------------------------------------| -| `exponent` | number | **Yes** | | Controls the exponent when scale is set to exponential | -| `fill` | string | **Yes** | | Controls the color fill when in opacity mode | -| `reverse` | boolean | **Yes** | | Reverses the color scheme | -| `scheme` | string | **Yes** | | Controls the color scheme used | -| `steps` | integer | **Yes** | | Controls the number of color steps
Constraint: `>=2 & <=128`. | -| `max` | number | No | | Sets the maximum value for the color scale | -| `min` | number | No | | Sets the minimum value for the color scale | -| `mode` | string | No | | Controls the color mode of the heatmap
Possible values are: `opacity`, `scheme`. | -| `scale` | string | No | | Controls the color scale of the heatmap
Possible values are: `linear`, `exponential`. | - -### HeatmapLegend - -Controls legend options - -| Property | Type | Required | Default | Description | -|----------|---------|----------|---------|---------------------------------| -| `show` | boolean | **Yes** | | Controls if the legend is shown | - -### HeatmapTooltip - -Controls tooltip options - -| Property | Type | Required | Default | Description | -|------------------|---------|----------|---------|----------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | -| `showColorScale` | boolean | No | | Controls if the tooltip shows a color scale in header | -| `yHistogram` | boolean | No | | Controls if the tooltip shows a histogram of the y-axis values | - -### Options - -| Property | Type | Required | Default | Description | -|----------------|---------------------------------------------------------|----------|----------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `color` | [object](#color) | **Yes** | `map[exponent:0.5 fill:dark-orange reverse:false scheme:Oranges steps:64]` | Controls the color options | -| `exemplars` | [ExemplarConfig](#exemplarconfig) | **Yes** | | Controls exemplar options | -| `legend` | [HeatmapLegend](#heatmaplegend) | **Yes** | | Controls legend options | -| `showValue` | string | **Yes** | | | *{
layout: ui.HeatmapCellLayout & "auto" // TODO: fix after remove when https://github.com/grafana/cuetsy/issues/74 is fixed
}
Controls the display of the value in the cell | -| `tooltip` | [object](#tooltip) | **Yes** | `map[mode:single showColorScale:false yHistogram:false]` | Controls tooltip options | -| `yAxis` | [YAxisConfig](#yaxisconfig) | **Yes** | | Configuration options for the yAxis | -| `calculate` | boolean | No | `false` | Controls if the heatmap should be calculated from data | -| `calculation` | [HeatmapCalculationOptions](#heatmapcalculationoptions) | No | | | -| `cellGap` | integer | No | `1` | Controls gap between cells
Constraint: `>=0 & <=25`. | -| `cellRadius` | number | No | | Controls cell radius | -| `cellValues` | [object](#cellvalues) | No | `map[]` | Controls cell value unit | -| `filterValues` | [object](#filtervalues) | No | `map[le:1e-09]` | Filters values between a given range | -| `rowsFrame` | [RowsHeatmapOptions](#rowsheatmapoptions) | No | | Controls frame rows options | - -### HeatmapCalculationOptions - -| Property | Type | Required | Default | Description | -|------------|-------------------------------------------------------------------|----------|---------|-------------| -| `xBuckets` | [HeatmapCalculationBucketConfig](#heatmapcalculationbucketconfig) | No | | | -| `yBuckets` | [HeatmapCalculationBucketConfig](#heatmapcalculationbucketconfig) | No | | | - -### HeatmapCalculationBucketConfig - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------------------------|----------|---------|----------------------------------------------------------| -| `mode` | string | No | | Possible values are: `size`, `count`. | -| `scale` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | -| `value` | string | No | | The number of buckets to use for the axis in the heatmap | - -### RowsHeatmapOptions - -Controls frame rows options - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|----------------------------------------------------------| -| `layout` | string | No | | Possible values are: `le`, `ge`, `unknown`, `auto`. | -| `value` | string | No | | Sets the name of the cell when not calculating from data | - -### YAxisConfig - -Configuration options for the yAxis - -It extends [AxisConfig](#axisconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `decimals` | number | No | | Controls the number of decimals for yAxis values | -| `max` | number | No | | Sets the maximum value for the yAxis | -| `min` | number | No | | Sets the minimum value for the yAxis | -| `reverse` | boolean | No | | Reverses the yAxis | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs | -| `unit` | string | No | | Sets the yAxis unit | - -### AxisConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | | -| `axisCenteredZero` | boolean | No | | | -| `axisColorMode` | string | No | | TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | | -| `axisLabel` | string | No | | | -| `axisPlacement` | string | No | | TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | | -| `axisSoftMin` | number | No | | | -| `axisWidth` | number | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### CellValues - -Controls cell value unit - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------|----------|---------|-------------| -| `object` | Possible types are: [](#), [](#). | | | - -### Color - -Controls the color options - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------|----------|---------|-------------| -| `object` | Possible types are: [](#), [](#). | | | - -### FilterValues - -Filters values between a given range - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------|----------|---------|-------------| -| `object` | Possible types are: [](#), [](#). | | | - -### Tooltip - -Controls tooltip options - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------|----------|---------|-------------| -| `object` | Possible types are: [](#), [](#). | | | - - diff --git a/docs/sources/developers/kinds/composable/histogram/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/histogram/panelcfg/schema-reference.md deleted file mode 100644 index d4408fbade5..00000000000 --- a/docs/sources/developers/kinds/composable/histogram/panelcfg/schema-reference.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: HistogramPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## HistogramPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|---------------|------------------------|----------|---------|-------------| -| `FieldConfig` | [object](#fieldconfig) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | - -### FieldConfig - -It extends [AxisConfig](#axisconfig) and [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `fillOpacity` | integer | No | `80` | Controls the fill opacity of the bars.
Constraint: `>=0 & <=100`. | -| `gradientMode` | string | No | | Set the mode of the gradient fill. Fill gradient is based on the line color. To change the color, use the standard color scheme field option.
Gradient appearance is influenced by the Fill opacity setting. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `lineWidth` | integer | No | `1` | Controls line width of the bars.
Constraint: `>=0 & <=10`. | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs | - -### AxisConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | | -| `axisCenteredZero` | boolean | No | | | -| `axisColorMode` | string | No | | TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | | -| `axisLabel` | string | No | | | -| `axisPlacement` | string | No | | TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | | -| `axisSoftMin` | number | No | | | -| `axisWidth` | number | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### ScaleDistributionConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------------|--------|----------|---------|--------------------------------------------------------------------------| -| `type` | string | **Yes** | | TODO docs
Possible values are: `linear`, `log`, `ordinal`, `symlog`. | -| `linearThreshold` | number | No | | | -| `log` | number | No | | | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### Options - -It extends [OptionsWithLegend](#optionswithlegend) and [OptionsWithTooltip](#optionswithtooltip). - -| Property | Type | Required | Default | Description | -|----------------|-----------------------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | *(Inherited from [OptionsWithLegend](#optionswithlegend))*
TODO docs | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | *(Inherited from [OptionsWithTooltip](#optionswithtooltip))*
TODO docs | -| `bucketCount` | integer | No | `30` | Bucket count (approx)
Constraint: `>0 & <=2147483647`. | -| `bucketOffset` | number | No | `0` | Offset buckets by this amount
Constraint: `>=-340282346638528859811704183484516925440 & <=340282346638528859811704183484516925440`. | -| `bucketSize` | integer | No | | Size of each bucket | -| `combine` | boolean | No | | Combines multiple series into a single histogram | - -### OptionsWithLegend - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------|----------|---------|-------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### OptionsWithTooltip - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------------------|----------|---------|-------------| -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - - diff --git a/docs/sources/developers/kinds/composable/logs/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/logs/panelcfg/schema-reference.md deleted file mode 100644 index 6a41deb49d3..00000000000 --- a/docs/sources/developers/kinds/composable/logs/panelcfg/schema-reference.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: LogsPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## LogsPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -| Property | Type | Required | Default | Description | -|------------------------|---------|----------|---------|---------------------------------------------------------------| -| `dedupStrategy` | string | **Yes** | | Possible values are: `none`, `exact`, `numbers`, `signature`. | -| `enableLogDetails` | boolean | **Yes** | | | -| `prettifyLogMessage` | boolean | **Yes** | | | -| `showCommonLabels` | boolean | **Yes** | | | -| `showLabels` | boolean | **Yes** | | | -| `showLogContextToggle` | boolean | **Yes** | | | -| `showTime` | boolean | **Yes** | | | -| `sortOrder` | string | **Yes** | | Possible values are: `Descending`, `Ascending`. | -| `wrapLogMessage` | boolean | **Yes** | | | - - diff --git a/docs/sources/developers/kinds/composable/loki/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/loki/dataquery/schema-reference.md deleted file mode 100644 index d7cfba8b09a..00000000000 --- a/docs/sources/developers/kinds/composable/loki/dataquery/schema-reference.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: LokiDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## LokiDataQuery - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|----------------|---------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `expr` | string | **Yes** | | The LogQL query. | -| `refId` | string | **Yes** | | A unique identifier for the query within the list of targets.
In server side expressions, the refId is used as a variable name to identify results.
By default, the UI will assign A->Z; however setting meaningful names may be useful. | -| `datasource` | | No | | For mixed data sources the selected datasource is on the query level.
For non mixed scenarios this is undefined.
TODO find a better way to do this ^ that's friendly to schema
TODO this shouldn't be unknown but DataSourceRef | null | -| `editorMode` | string | No | | Possible values are: `code`, `builder`. | -| `hide` | boolean | No | | true if query is disabled (ie should not be returned to the dashboard)
Note this does not always imply that the query should not be executed since
the results from a hidden query may be used as the input to other queries (SSE etc) | -| `instant` | boolean | No | | @deprecated, now use queryType. | -| `legendFormat` | string | No | | Used to override the name of the series. | -| `maxLines` | integer | No | | Used to limit the number of log rows returned. | -| `queryType` | string | No | | Specify the query flavor
TODO make this required and give it a default | -| `range` | boolean | No | | @deprecated, now use queryType. | -| `resolution` | integer | No | | @deprecated, now use step. | -| `step` | string | No | | Used to set step value for range queries. | - - diff --git a/docs/sources/developers/kinds/composable/news/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/news/panelcfg/schema-reference.md deleted file mode 100644 index f4290acc9a8..00000000000 --- a/docs/sources/developers/kinds/composable/news/panelcfg/schema-reference.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: NewsPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## NewsPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -| Property | Type | Required | Default | Description | -|-------------|---------|----------|---------|--------------------------------------------| -| `feedUrl` | string | No | | empty/missing will default to grafana blog | -| `showImage` | boolean | No | `true` | | - - diff --git a/docs/sources/developers/kinds/composable/nodegraph/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/nodegraph/panelcfg/schema-reference.md deleted file mode 100644 index 1ac4a3f7a34..00000000000 --- a/docs/sources/developers/kinds/composable/nodegraph/panelcfg/schema-reference.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: NodeGraphPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## NodeGraphPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|---------------|------------------------|----------|---------|-------------| -| `ArcOption` | [object](#arcoption) | **Yes** | | | -| `EdgeOptions` | [object](#edgeoptions) | **Yes** | | | -| `NodeOptions` | [object](#nodeoptions) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | - -### ArcOption - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------------------------------------------| -| `color` | string | No | | The color of the arc. | -| `field` | string | No | | Field from which to get the value. Values should be less than 1, representing fraction of a circle. | - -### EdgeOptions - -| Property | Type | Required | Default | Description | -|---------------------|--------|----------|---------|-----------------------------------------------------------------------------| -| `mainStatUnit` | string | No | | Unit for the main stat to override what ever is set in the data frame. | -| `secondaryStatUnit` | string | No | | Unit for the secondary stat to override what ever is set in the data frame. | - -### NodeOptions - -| Property | Type | Required | Default | Description | -|---------------------|---------------------------|----------|---------|-----------------------------------------------------------------------------------------| -| `arcs` | [ArcOption](#arcoption)[] | No | | Define which fields are shown as part of the node arc (colored circle around the node). | -| `mainStatUnit` | string | No | | Unit for the main stat to override what ever is set in the data frame. | -| `secondaryStatUnit` | string | No | | Unit for the secondary stat to override what ever is set in the data frame. | - -### Options - -| Property | Type | Required | Default | Description | -|----------|-----------------------------|----------|---------|-------------| -| `edges` | [EdgeOptions](#edgeoptions) | No | | | -| `nodes` | [NodeOptions](#nodeoptions) | No | | | - - diff --git a/docs/sources/developers/kinds/composable/parca/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/parca/dataquery/schema-reference.md deleted file mode 100644 index baf0cc6be00..00000000000 --- a/docs/sources/developers/kinds/composable/parca/dataquery/schema-reference.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: ParcaDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## ParcaDataQuery - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------------|---------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `labelSelector` | string | **Yes** | `{}` | Specifies the query label selectors. | -| `profileTypeId` | string | **Yes** | | Specifies the type of profile to query. | -| `refId` | string | **Yes** | | A unique identifier for the query within the list of targets.
In server side expressions, the refId is used as a variable name to identify results.
By default, the UI will assign A->Z; however setting meaningful names may be useful. | -| `datasource` | | No | | For mixed data sources the selected datasource is on the query level.
For non mixed scenarios this is undefined.
TODO find a better way to do this ^ that's friendly to schema
TODO this shouldn't be unknown but DataSourceRef | null | -| `hide` | boolean | No | | true if query is disabled (ie should not be returned to the dashboard)
Note this does not always imply that the query should not be executed since
the results from a hidden query may be used as the input to other queries (SSE etc) | -| `queryType` | string | No | | Specify the query flavor
TODO make this required and give it a default | - - diff --git a/docs/sources/developers/kinds/composable/piechart/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/piechart/panelcfg/schema-reference.md deleted file mode 100644 index 89e7cf0bdf4..00000000000 --- a/docs/sources/developers/kinds/composable/piechart/panelcfg/schema-reference.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: PieChartPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## PieChartPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-------------------------|---------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `FieldConfig` | [HideableFieldConfig](#hideablefieldconfig) | **Yes** | | TODO docs | -| `Options` | [object](#options) | **Yes** | | | -| `PieChartLabels` | string | **Yes** | | Select labels to display on the pie chart.
- Name - The series or field name.
- Percent - The percentage of the whole.
- Value - The raw numerical value.
Possible values are: `name`, `value`, `percent`. | -| `PieChartLegendOptions` | [object](#piechartlegendoptions) | **Yes** | | | -| `PieChartLegendValues` | string | **Yes** | | Select values to display in the legend.
- Percent: The percentage of the whole.
- Value: The raw numerical value.
Possible values are: `value`, `percent`. | -| `PieChartType` | string | **Yes** | | Select the pie chart display style.
Possible values are: `pie`, `donut`. | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### Options - -It extends [OptionsWithTooltip](#optionswithtooltip) and [SingleStatBaseOptions](#singlestatbaseoptions). - -| Property | Type | Required | Default | Description | -|-----------------|-------------------------------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------| -| `displayLabels` | string[] | **Yes** | | | -| `legend` | [PieChartLegendOptions](#piechartlegendoptions) | **Yes** | | | -| `pieType` | string | **Yes** | | Select the pie chart display style.
Possible values are: `pie`, `donut`. | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | *(Inherited from [OptionsWithTooltip](#optionswithtooltip))*
TODO docs | -| `orientation` | string | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs
Possible values are: `auto`, `vertical`, `horizontal`. | -| `reduceOptions` | [ReduceDataOptions](#reducedataoptions) | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs | - -### OptionsWithTooltip - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------------------|----------|---------|-------------| -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - -### PieChartLegendOptions - -It extends [VizLegendOptions](#vizlegendoptions). - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | *(Inherited from [VizLegendOptions](#vizlegendoptions))* | -| `displayMode` | string | **Yes** | | *(Inherited from [VizLegendOptions](#vizlegendoptions))*
TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | *(Inherited from [VizLegendOptions](#vizlegendoptions))*
TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | *(Inherited from [VizLegendOptions](#vizlegendoptions))* | -| `values` | string[] | **Yes** | | | -| `asTable` | boolean | No | | *(Inherited from [VizLegendOptions](#vizlegendoptions))* | -| `isVisible` | boolean | No | | *(Inherited from [VizLegendOptions](#vizlegendoptions))* | -| `sortBy` | string | No | | *(Inherited from [VizLegendOptions](#vizlegendoptions))* | -| `sortDesc` | boolean | No | | *(Inherited from [VizLegendOptions](#vizlegendoptions))* | -| `width` | number | No | | *(Inherited from [VizLegendOptions](#vizlegendoptions))* | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### ReduceDataOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|---------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | When !values, pick one value for the whole field | -| `fields` | string | No | | Which fields to show. By default this is only numeric fields | -| `limit` | number | No | | if showing all values limit | -| `values` | boolean | No | | If true show each row value | - -### SingleStatBaseOptions - -TODO docs - -It extends [OptionsWithTextFormatting](#optionswithtextformatting). - -| Property | Type | Required | Default | Description | -|-----------------|-------------------------------------------------|----------|---------|------------------------------------------------------------------------------------------| -| `orientation` | string | **Yes** | | TODO docs
Possible values are: `auto`, `vertical`, `horizontal`. | -| `reduceOptions` | [ReduceDataOptions](#reducedataoptions) | **Yes** | | TODO docs | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [OptionsWithTextFormatting](#optionswithtextformatting))*
TODO docs | - -### OptionsWithTextFormatting - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------------|----------|---------|-------------| -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | TODO docs | - -### VizTextDisplayOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|--------------------------| -| `titleSize` | number | No | | Explicit title text size | -| `valueSize` | number | No | | Explicit value text size | - - diff --git a/docs/sources/developers/kinds/composable/prometheus/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/prometheus/dataquery/schema-reference.md deleted file mode 100644 index 028dea0ce18..00000000000 --- a/docs/sources/developers/kinds/composable/prometheus/dataquery/schema-reference.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: PrometheusDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## PrometheusDataQuery - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|------------------|------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `expr` | string | **Yes** | | The actual expression/query that will be evaluated by Prometheus | -| `refId` | string | **Yes** | | A unique identifier for the query within the list of targets.
In server side expressions, the refId is used as a variable name to identify results.
By default, the UI will assign A->Z; however setting meaningful names may be useful. | -| `datasource` | | No | | For mixed data sources the selected datasource is on the query level.
For non mixed scenarios this is undefined.
TODO find a better way to do this ^ that's friendly to schema
TODO this shouldn't be unknown but DataSourceRef | null | -| `editorMode` | string | No | | Possible values are: `code`, `builder`. | -| `exemplar` | boolean | No | | Execute an additional query to identify interesting raw samples relevant for the given expr | -| `format` | string | No | | Possible values are: `time_series`, `table`, `heatmap`. | -| `hide` | boolean | No | | true if query is disabled (ie should not be returned to the dashboard)
Note this does not always imply that the query should not be executed since
the results from a hidden query may be used as the input to other queries (SSE etc) | -| `instant` | boolean | No | | Returns only the latest value that Prometheus has scraped for the requested time series | -| `intervalFactor` | number | No | | @deprecated Used to specify how many times to divide max data points by. We use max data points under query options
See https://github.com/grafana/grafana/issues/48081 | -| `legendFormat` | string | No | | Series name override or template. Ex. {{hostname}} will be replaced with label value for hostname | -| `queryType` | string | No | | Specify the query flavor
TODO make this required and give it a default | -| `range` | boolean | No | | Returns a Range vector, comprised of a set of time series containing a range of data points over time for each time series | -| `scope` | [object](#scope) | No | | | - -### Scope - -| Property | Type | Required | Default | Description | -|------------|--------|----------|---------|-------------| -| `matchers` | string | **Yes** | | | - - diff --git a/docs/sources/developers/kinds/composable/stat/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/stat/panelcfg/schema-reference.md deleted file mode 100644 index 51fac3c3120..00000000000 --- a/docs/sources/developers/kinds/composable/stat/panelcfg/schema-reference.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: StatPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## StatPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `Options` | [object](#options) | **Yes** | | | - -### Options - -It extends [SingleStatBaseOptions](#singlestatbaseoptions). - -| Property | Type | Required | Default | Description | -|---------------------|-------------------------------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------| -| `colorMode` | string | **Yes** | | TODO docs
Possible values are: `value`, `background`, `background_solid`, `none`. | -| `graphMode` | string | **Yes** | | TODO docs
Possible values are: `none`, `line`, `area`. | -| `justifyMode` | string | **Yes** | | TODO docs
Possible values are: `auto`, `center`. | -| `showPercentChange` | boolean | **Yes** | `false` | | -| `textMode` | string | **Yes** | | TODO docs
Possible values are: `auto`, `value`, `value_and_name`, `name`, `none`. | -| `wideLayout` | boolean | **Yes** | `true` | | -| `orientation` | string | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs
Possible values are: `auto`, `vertical`, `horizontal`. | -| `reduceOptions` | [ReduceDataOptions](#reducedataoptions) | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [SingleStatBaseOptions](#singlestatbaseoptions))*
TODO docs | - -### ReduceDataOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|---------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | When !values, pick one value for the whole field | -| `fields` | string | No | | Which fields to show. By default this is only numeric fields | -| `limit` | number | No | | if showing all values limit | -| `values` | boolean | No | | If true show each row value | - -### SingleStatBaseOptions - -TODO docs - -It extends [OptionsWithTextFormatting](#optionswithtextformatting). - -| Property | Type | Required | Default | Description | -|-----------------|-------------------------------------------------|----------|---------|------------------------------------------------------------------------------------------| -| `orientation` | string | **Yes** | | TODO docs
Possible values are: `auto`, `vertical`, `horizontal`. | -| `reduceOptions` | [ReduceDataOptions](#reducedataoptions) | **Yes** | | TODO docs | -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | *(Inherited from [OptionsWithTextFormatting](#optionswithtextformatting))*
TODO docs | - -### OptionsWithTextFormatting - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------------|----------|---------|-------------| -| `text` | [VizTextDisplayOptions](#viztextdisplayoptions) | No | | TODO docs | - -### VizTextDisplayOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|--------------------------| -| `titleSize` | number | No | | Explicit title text size | -| `valueSize` | number | No | | Explicit value text size | - - diff --git a/docs/sources/developers/kinds/composable/statetimeline/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/statetimeline/panelcfg/schema-reference.md deleted file mode 100644 index 38750239165..00000000000 --- a/docs/sources/developers/kinds/composable/statetimeline/panelcfg/schema-reference.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: StateTimelinePanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## StateTimelinePanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|---------------|------------------------|----------|---------|-------------| -| `FieldConfig` | [object](#fieldconfig) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | - -### FieldConfig - -It extends [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------|---------------------------------------|----------|---------|------------------------------------------------------------------------------| -| `fillOpacity` | integer | No | `70` | Constraint: `>=0 & <=100`. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `lineWidth` | integer | No | `0` | Constraint: `>=0 & <=10`. | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### Options - -It extends [OptionsWithLegend](#optionswithlegend) and [OptionsWithTooltip](#optionswithtooltip) and [OptionsWithTimezones](#optionswithtimezones). - -| Property | Type | Required | Default | Description | -|---------------|-----------------------------------------|----------|---------|----------------------------------------------------------------------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | *(Inherited from [OptionsWithLegend](#optionswithlegend))*
TODO docs | -| `rowHeight` | number | **Yes** | `0.9` | Controls the row height | -| `showValue` | string | **Yes** | | Show timeline values on chart | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | *(Inherited from [OptionsWithTooltip](#optionswithtooltip))*
TODO docs | -| `alignValue` | string | No | | Controls value alignment on the timelines | -| `mergeValues` | boolean | No | `true` | Merge equal consecutive values | -| `timezone` | string[] | No | | *(Inherited from [OptionsWithTimezones](#optionswithtimezones))* | - -### OptionsWithLegend - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------|----------|---------|-------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### OptionsWithTimezones - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|----------|----------|---------|-------------| -| `timezone` | string[] | No | | | - -### OptionsWithTooltip - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------------------|----------|---------|-------------| -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - - diff --git a/docs/sources/developers/kinds/composable/statushistory/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/statushistory/panelcfg/schema-reference.md deleted file mode 100644 index 63d454b66a8..00000000000 --- a/docs/sources/developers/kinds/composable/statushistory/panelcfg/schema-reference.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: StatusHistoryPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## StatusHistoryPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|---------------|------------------------|----------|---------|-------------| -| `FieldConfig` | [object](#fieldconfig) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | - -### FieldConfig - -It extends [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------|---------------------------------------|----------|---------|------------------------------------------------------------------------------| -| `fillOpacity` | integer | No | `70` | Constraint: `>=0 & <=100`. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `lineWidth` | integer | No | `1` | Constraint: `>=0 & <=10`. | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### Options - -It extends [OptionsWithLegend](#optionswithlegend) and [OptionsWithTooltip](#optionswithtooltip) and [OptionsWithTimezones](#optionswithtimezones). - -| Property | Type | Required | Default | Description | -|-------------|-----------------------------------------|----------|---------|----------------------------------------------------------------------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | *(Inherited from [OptionsWithLegend](#optionswithlegend))*
TODO docs | -| `rowHeight` | number | **Yes** | `0.9` | Set the height of the rows
Constraint: `>=0 & <=1`. | -| `showValue` | string | **Yes** | | Show values on the columns | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | *(Inherited from [OptionsWithTooltip](#optionswithtooltip))*
TODO docs | -| `colWidth` | number | No | `0.9` | Controls the column width | -| `timezone` | string[] | No | | *(Inherited from [OptionsWithTimezones](#optionswithtimezones))* | - -### OptionsWithLegend - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------|----------|---------|-------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### OptionsWithTimezones - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|----------|----------|---------|-------------| -| `timezone` | string[] | No | | | - -### OptionsWithTooltip - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------------------|----------|---------|-------------| -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - - diff --git a/docs/sources/developers/kinds/composable/table/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/table/panelcfg/schema-reference.md deleted file mode 100644 index 802497a6021..00000000000 --- a/docs/sources/developers/kinds/composable/table/panelcfg/schema-reference.md +++ /dev/null @@ -1,340 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: TablePanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## TablePanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|---------------|------------------------|----------|---------|-------------| -| `FieldConfig` | [object](#fieldconfig) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | - -### FieldConfig - -| Property | Type | Required | Default | Description | -|---------------|---------------------------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `align` | string | **Yes** | | TODO -- should not be table specific!
TODO docs
Possible values are: `auto`, `left`, `right`, `center`. | -| `cellOptions` | [TableCellOptions](#tablecelloptions) | **Yes** | | Table cell options. Each cell has a display mode
and other potential options for that display. | -| `inspect` | boolean | **Yes** | `false` | | -| `displayMode` | string | No | | Internally, this is the "type" of cell that's being displayed
in the table such as colored text, JSON, gauge, etc.
The color-background-solid, gradient-gauge, and lcd-gauge
modes are deprecated in favor of new cell subOptions
Possible values are: `auto`, `color-text`, `color-background`, `color-background-solid`, `gradient-gauge`, `lcd-gauge`, `json-view`, `basic`, `image`, `gauge`, `sparkline`, `data-links`, `custom`. | -| `filterable` | boolean | No | | | -| `hidden` | boolean | No | | | -| `hideHeader` | boolean | No | | Hides any header for a column, useful for columns that show some static content or buttons. | -| `minWidth` | number | No | | | -| `width` | number | No | | | - -### TableCellOptions - -Table cell options. Each cell has a display mode -and other potential options for that display. - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------|-------------| -| `object` | Possible types are: [TableAutoCellOptions](#tableautocelloptions), [TableSparklineCellOptions](#tablesparklinecelloptions), [TableBarGaugeCellOptions](#tablebargaugecelloptions), [TableColoredBackgroundCellOptions](#tablecoloredbackgroundcelloptions), [TableColorTextCellOptions](#tablecolortextcelloptions), [TableImageCellOptions](#tableimagecelloptions), [TableDataLinksCellOptions](#tabledatalinkscelloptions), [TableJsonViewCellOptions](#tablejsonviewcelloptions). | | | - -### GraphThresholdsStyleConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `off`, `line`, `dashed`, `area`, `line+area`, `dashed+area`, `series`. | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### LineStyle - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|--------------------------------------------------------| -| `dash` | number[] | No | | | -| `fill` | string | No | | Possible values are: `solid`, `dash`, `dot`, `square`. | - -### ScaleDistributionConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------------|--------|----------|---------|--------------------------------------------------------------------------| -| `type` | string | **Yes** | | TODO docs
Possible values are: `linear`, `log`, `ordinal`, `symlog`. | -| `linearThreshold` | number | No | | | -| `log` | number | No | | | - -### StackingConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------| -| `group` | string | No | | | -| `mode` | string | No | | TODO docs
Possible values are: `none`, `normal`, `percent`. | - -### TableAutoCellOptions - -Auto mode table cell options - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `type` | string | **Yes** | | | - -### TableBarGaugeCellOptions - -Gauge cell options - -| Property | Type | Required | Default | Description | -|--------------------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | | -| `mode` | string | No | | Enum expressing the possible display modes
for the bar gauge component of Grafana UI
Possible values are: `basic`, `lcd`, `gradient`. | -| `valueDisplayMode` | string | No | | Allows for the table cell gauge display type to set the gauge mode.
Possible values are: `color`, `text`, `hidden`. | - -### TableColorTextCellOptions - -Colored text cell options - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `type` | string | **Yes** | | | - -### TableColoredBackgroundCellOptions - -Colored background cell options - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | | -| `mode` | string | No | | Display mode to the "Colored Background" display
mode for table cells. Either displays a solid color (basic mode)
or a gradient.
Possible values are: `basic`, `gradient`. | - -### TableDataLinksCellOptions - -Show data links in the cell - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `type` | string | **Yes** | | | - -### TableImageCellOptions - -Json view cell options - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `type` | string | **Yes** | | | - -### TableJsonViewCellOptions - -Json view cell options - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `type` | string | **Yes** | | | - -### TableSparklineCellOptions - -Sparkline cell options - -It extends [GraphFieldConfig](#graphfieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | | -| `axisBorderShow` | boolean | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `axisLabel` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `axisWidth` | number | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `barAlignment` | integer | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `barWidthFactor` | number | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `drawStyle` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs
Possible values are: `line`, `bars`, `points`. | -| `fillBelowTo` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `fillColor` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `fillOpacity` | number | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `gradientMode` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs
Possible values are: `none`, `opacity`, `hue`, `scheme`. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs | -| `hideValue` | boolean | No | | | -| `lineColor` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `lineInterpolation` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs | -| `lineWidth` | number | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `pointColor` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `pointSize` | number | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `pointSymbol` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))* | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs | -| `showPoints` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs
Possible values are: `auto`, `never`, `always`. | -| `spanNulls` | | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | -| `stacking` | [StackingConfig](#stackingconfig) | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs | -| `thresholdsStyle` | [GraphThresholdsStyleConfig](#graphthresholdsstyleconfig) | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs | -| `transform` | string | No | | *(Inherited from [GraphFieldConfig](#graphfieldconfig))*
TODO docs
Possible values are: `constant`, `negative-Y`. | - -### GraphFieldConfig - -TODO docs - -It extends [LineConfig](#lineconfig) and [FillConfig](#fillconfig) and [PointsConfig](#pointsconfig) and [AxisConfig](#axisconfig) and [BarConfig](#barconfig) and [StackableFieldConfig](#stackablefieldconfig) and [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `barAlignment` | integer | No | | *(Inherited from [BarConfig](#barconfig))*
TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | *(Inherited from [BarConfig](#barconfig))* | -| `barWidthFactor` | number | No | | *(Inherited from [BarConfig](#barconfig))* | -| `drawStyle` | string | No | | TODO docs
Possible values are: `line`, `bars`, `points`. | -| `fillBelowTo` | string | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `fillColor` | string | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `fillOpacity` | number | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `gradientMode` | string | No | | TODO docs
Possible values are: `none`, `opacity`, `hue`, `scheme`. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `lineColor` | string | No | | *(Inherited from [LineConfig](#lineconfig))* | -| `lineInterpolation` | string | No | | *(Inherited from [LineConfig](#lineconfig))*
TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | *(Inherited from [LineConfig](#lineconfig))*
TODO docs | -| `lineWidth` | number | No | | *(Inherited from [LineConfig](#lineconfig))* | -| `pointColor` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `pointSize` | number | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `pointSymbol` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs | -| `showPoints` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))*
TODO docs
Possible values are: `auto`, `never`, `always`. | -| `spanNulls` | | No | | *(Inherited from [LineConfig](#lineconfig))*
Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | -| `stacking` | [StackingConfig](#stackingconfig) | No | | *(Inherited from [StackableFieldConfig](#stackablefieldconfig))*
TODO docs | -| `thresholdsStyle` | [GraphThresholdsStyleConfig](#graphthresholdsstyleconfig) | No | | TODO docs | -| `transform` | string | No | | TODO docs
Possible values are: `constant`, `negative-Y`. | - -### AxisConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | | -| `axisCenteredZero` | boolean | No | | | -| `axisColorMode` | string | No | | TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | | -| `axisLabel` | string | No | | | -| `axisPlacement` | string | No | | TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | | -| `axisSoftMin` | number | No | | | -| `axisWidth` | number | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### BarConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------------|---------|----------|---------|----------------------------------------------------| -| `barAlignment` | integer | No | | TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | | -| `barWidthFactor` | number | No | | | - -### FillConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|-------------| -| `fillBelowTo` | string | No | | | -| `fillColor` | string | No | | | -| `fillOpacity` | number | No | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### LineConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lineColor` | string | No | | | -| `lineInterpolation` | string | No | | TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | TODO docs | -| `lineWidth` | number | No | | | -| `spanNulls` | | No | | Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | - -### PointsConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|---------------------------------------------------------------| -| `pointColor` | string | No | | | -| `pointSize` | number | No | | | -| `pointSymbol` | string | No | | | -| `showPoints` | string | No | | TODO docs
Possible values are: `auto`, `never`, `always`. | - -### StackableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|-----------------------------------|----------|---------|-------------| -| `stacking` | [StackingConfig](#stackingconfig) | No | | TODO docs | - -### Options - -| Property | Type | Required | Default | Description | -|-----------------|---------------------------------------------------|----------|----------------------------------------------|--------------------------------------------------------------------| -| `frameIndex` | number | **Yes** | `0` | Represents the index of the selected frame | -| `showHeader` | boolean | **Yes** | `true` | Controls whether the panel should show the header | -| `cellHeight` | string | No | | Controls the height of the rows | -| `footer` | [object](#footer) | No | `map[countRows:false reducer:[] show:false]` | Controls footer options | -| `showTypeIcons` | boolean | No | `false` | Controls whether the header should show icons for the column types | -| `sortBy` | [TableSortByFieldState](#tablesortbyfieldstate)[] | No | | Used to control row sorting | - -### TableSortByFieldState - -Sort by field state - -| Property | Type | Required | Default | Description | -|---------------|---------|----------|---------|-----------------------------------------------| -| `displayName` | string | **Yes** | | Sets the display name of the field to sort by | -| `desc` | boolean | No | | Flag used to indicate descending sort order | - -### Footer - -Controls footer options - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------|----------|---------|-------------| -| `object` | Possible types are: [](#), [](#). | | | - - diff --git a/docs/sources/developers/kinds/composable/tempo/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/tempo/dataquery/schema-reference.md deleted file mode 100644 index 1b44c7cc98f..00000000000 --- a/docs/sources/developers/kinds/composable/tempo/dataquery/schema-reference.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: TempoDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## TempoDataQuery - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/composable/testdata/dataquery/schema-reference.md b/docs/sources/developers/kinds/composable/testdata/dataquery/schema-reference.md deleted file mode 100644 index bc5da9a3aab..00000000000 --- a/docs/sources/developers/kinds/composable/testdata/dataquery/schema-reference.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: TestDataDataQuery kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## TestDataDataQuery - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-------------------|-------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `refId` | string | **Yes** | | A unique identifier for the query within the list of targets.
In server side expressions, the refId is used as a variable name to identify results.
By default, the UI will assign A->Z; however setting meaningful names may be useful. | -| `alias` | string | No | | | -| `channel` | string | No | | | -| `csvContent` | string | No | | | -| `csvFileName` | string | No | | | -| `csvWave` | [CSVWave](#csvwave)[] | No | | | -| `datasource` | | No | | For mixed data sources the selected datasource is on the query level.
For non mixed scenarios this is undefined.
TODO find a better way to do this ^ that's friendly to schema
TODO this shouldn't be unknown but DataSourceRef | null | -| `dropPercent` | number | No | | Drop percentage (the chance we will lose a point 0-100) | -| `errorType` | string | No | | Possible values are: `server_panic`, `frontend_exception`, `frontend_observable`. | -| `flamegraphDiff` | boolean | No | | | -| `hide` | boolean | No | | true if query is disabled (ie should not be returned to the dashboard)
Note this does not always imply that the query should not be executed since
the results from a hidden query may be used as the input to other queries (SSE etc) | -| `labels` | string | No | | | -| `levelColumn` | boolean | No | | | -| `lines` | integer | No | | | -| `nodes` | [NodesQuery](#nodesquery) | No | | | -| `points` | array[] | No | | | -| `pulseWave` | [PulseWaveQuery](#pulsewavequery) | No | | | -| `queryType` | string | No | | Specify the query flavor
TODO make this required and give it a default | -| `rawFrameContent` | string | No | | | -| `scenarioId` | string | No | | Possible values are: `random_walk`, `slow_query`, `random_walk_with_error`, `random_walk_table`, `exponential_heatmap_bucket_data`, `linear_heatmap_bucket_data`, `no_data_points`, `datapoints_outside_range`, `csv_metric_values`, `predictable_pulse`, `predictable_csv_wave`, `streaming_client`, `simulation`, `usa`, `live`, `grafana_api`, `arrow`, `annotations`, `table_static`, `server_error_500`, `logs`, `node_graph`, `flame_graph`, `raw_frame`, `csv_file`, `csv_content`, `trace`, `manual_entry`, `variables-query`. | -| `seriesCount` | integer | No | | | -| `sim` | [SimulationQuery](#simulationquery) | No | | | -| `spanCount` | integer | No | | | -| `stream` | [StreamingQuery](#streamingquery) | No | | | -| `stringInput` | string | No | | | -| `usa` | [USAQuery](#usaquery) | No | | | - -### CSVWave - -| Property | Type | Required | Default | Description | -|-------------|---------|----------|---------|-------------| -| `labels` | string | No | | | -| `name` | string | No | | | -| `timeStep` | integer | No | | | -| `valuesCSV` | string | No | | | - -### NodesQuery - -| Property | Type | Required | Default | Description | -|----------|---------|----------|---------|-------------------------------------------------------------------------------------| -| `count` | integer | No | | | -| `seed` | integer | No | | | -| `type` | string | No | | Possible values are: `random`, `response_small`, `response_medium`, `random edges`. | - -### PulseWaveQuery - -| Property | Type | Required | Default | Description | -|------------|---------|----------|---------|-------------| -| `offCount` | integer | No | | | -| `offValue` | number | No | | | -| `onCount` | integer | No | | | -| `onValue` | number | No | | | -| `timeStep` | integer | No | | | - -### SimulationQuery - -| Property | Type | Required | Default | Description | -|----------|-------------------|----------|---------|-------------| -| `key` | [object](#key) | **Yes** | | | -| `config` | [object](#config) | No | | | -| `last` | boolean | No | | | -| `stream` | boolean | No | | | - -### Config - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Key - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `tick` | number | **Yes** | | | -| `type` | string | **Yes** | | | -| `uid` | string | No | | | - -### StreamingQuery - -| Property | Type | Required | Default | Description | -|----------|---------|----------|---------|-----------------------------------------------------------| -| `noise` | integer | **Yes** | | | -| `speed` | integer | **Yes** | | | -| `spread` | integer | **Yes** | | | -| `type` | string | **Yes** | | Possible values are: `signal`, `logs`, `fetch`, `traces`. | -| `bands` | integer | No | | | -| `url` | string | No | | | - -### USAQuery - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|-------------| -| `fields` | string[] | No | | | -| `mode` | string | No | | | -| `period` | string | No | | | -| `states` | string[] | No | | | - - diff --git a/docs/sources/developers/kinds/composable/text/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/text/panelcfg/schema-reference.md deleted file mode 100644 index 8b566c2a2ab..00000000000 --- a/docs/sources/developers/kinds/composable/text/panelcfg/schema-reference.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: TextPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## TextPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|----------------|------------------------|----------|-------------|---------------------------------------------------------------------------------------------------------| -| `CodeLanguage` | string | **Yes** | `plaintext` | Possible values are: `plaintext`, `yaml`, `xml`, `typescript`, `sql`, `go`, `markdown`, `html`, `json`. | -| `CodeOptions` | [object](#codeoptions) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | -| `TextMode` | string | **Yes** | | Possible values are: `html`, `markdown`, `code`. | - -### CodeOptions - -| Property | Type | Required | Default | Description | -|-------------------|---------|----------|-------------|---------------------------------------------------------------------------------------------------------| -| `language` | string | **Yes** | `plaintext` | Possible values are: `plaintext`, `yaml`, `xml`, `typescript`, `sql`, `go`, `markdown`, `html`, `json`. | -| `showLineNumbers` | boolean | **Yes** | `false` | | -| `showMiniMap` | boolean | **Yes** | `false` | | - -### Options - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------|----------|--------------------------------------------------------------------------------|--------------------------------------------------| -| `content` | string | **Yes** | `# Title | | -| | | | | | -| | | | For markdown syntax help: [commonmark.org/help](https://commonmark.org/help/)` | | -| `mode` | string | **Yes** | | Possible values are: `html`, `markdown`, `code`. | -| `code` | [CodeOptions](#codeoptions) | No | | | - - diff --git a/docs/sources/developers/kinds/composable/timeseries/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/timeseries/panelcfg/schema-reference.md deleted file mode 100644 index 4f1c350d7c8..00000000000 --- a/docs/sources/developers/kinds/composable/timeseries/panelcfg/schema-reference.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: TimeSeriesPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## TimeSeriesPanelCfg - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|---------------|---------------------------------------|----------|---------|-------------| -| `FieldConfig` | [GraphFieldConfig](#graphfieldconfig) | **Yes** | | TODO docs | -| `Options` | [object](#options) | **Yes** | | | - -### GraphFieldConfig - -TODO docs - -It extends [LineConfig](#lineconfig) and [FillConfig](#fillconfig) and [PointsConfig](#pointsconfig) and [AxisConfig](#axisconfig) and [BarConfig](#barconfig) and [StackableFieldConfig](#stackablefieldconfig) and [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `barAlignment` | integer | No | | *(Inherited from [BarConfig](#barconfig))*
TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | *(Inherited from [BarConfig](#barconfig))* | -| `barWidthFactor` | number | No | | *(Inherited from [BarConfig](#barconfig))* | -| `drawStyle` | string | No | | TODO docs
Possible values are: `line`, `bars`, `points`. | -| `fillBelowTo` | string | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `fillColor` | string | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `fillOpacity` | number | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `gradientMode` | string | No | | TODO docs
Possible values are: `none`, `opacity`, `hue`, `scheme`. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `lineColor` | string | No | | *(Inherited from [LineConfig](#lineconfig))* | -| `lineInterpolation` | string | No | | *(Inherited from [LineConfig](#lineconfig))*
TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | *(Inherited from [LineConfig](#lineconfig))*
TODO docs | -| `lineWidth` | number | No | | *(Inherited from [LineConfig](#lineconfig))* | -| `pointColor` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `pointSize` | number | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `pointSymbol` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs | -| `showPoints` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))*
TODO docs
Possible values are: `auto`, `never`, `always`. | -| `spanNulls` | | No | | *(Inherited from [LineConfig](#lineconfig))*
Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | -| `stacking` | [StackingConfig](#stackingconfig) | No | | *(Inherited from [StackableFieldConfig](#stackablefieldconfig))*
TODO docs | -| `thresholdsStyle` | [GraphThresholdsStyleConfig](#graphthresholdsstyleconfig) | No | | TODO docs | -| `transform` | string | No | | TODO docs
Possible values are: `constant`, `negative-Y`. | - -### AxisConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | | -| `axisCenteredZero` | boolean | No | | | -| `axisColorMode` | string | No | | TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | | -| `axisLabel` | string | No | | | -| `axisPlacement` | string | No | | TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | | -| `axisSoftMin` | number | No | | | -| `axisWidth` | number | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### ScaleDistributionConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------------|--------|----------|---------|--------------------------------------------------------------------------| -| `type` | string | **Yes** | | TODO docs
Possible values are: `linear`, `log`, `ordinal`, `symlog`. | -| `linearThreshold` | number | No | | | -| `log` | number | No | | | - -### BarConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------------|---------|----------|---------|----------------------------------------------------| -| `barAlignment` | integer | No | | TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | | -| `barWidthFactor` | number | No | | | - -### FillConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|-------------| -| `fillBelowTo` | string | No | | | -| `fillColor` | string | No | | | -| `fillOpacity` | number | No | | | - -### GraphThresholdsStyleConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `off`, `line`, `dashed`, `area`, `line+area`, `dashed+area`, `series`. | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### LineConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lineColor` | string | No | | | -| `lineInterpolation` | string | No | | TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | TODO docs | -| `lineWidth` | number | No | | | -| `spanNulls` | | No | | Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | - -### LineStyle - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|--------------------------------------------------------| -| `dash` | number[] | No | | | -| `fill` | string | No | | Possible values are: `solid`, `dash`, `dot`, `square`. | - -### PointsConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|---------------------------------------------------------------| -| `pointColor` | string | No | | | -| `pointSize` | number | No | | | -| `pointSymbol` | string | No | | | -| `showPoints` | string | No | | TODO docs
Possible values are: `auto`, `never`, `always`. | - -### StackableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|-----------------------------------|----------|---------|-------------| -| `stacking` | [StackingConfig](#stackingconfig) | No | | TODO docs | - -### StackingConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------| -| `group` | string | No | | | -| `mode` | string | No | | TODO docs
Possible values are: `none`, `normal`, `percent`. | - -### Options - -It extends [OptionsWithTimezones](#optionswithtimezones). - -| Property | Type | Required | Default | Description | -|------------|-----------------------------------------|----------|---------|------------------------------------------------------------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | -| `timezone` | string[] | No | | *(Inherited from [OptionsWithTimezones](#optionswithtimezones))* | - -### OptionsWithTimezones - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|----------|----------|---------|-------------| -| `timezone` | string[] | No | | | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - - diff --git a/docs/sources/developers/kinds/composable/trend/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/trend/panelcfg/schema-reference.md deleted file mode 100644 index 9bf489e4c0c..00000000000 --- a/docs/sources/developers/kinds/composable/trend/panelcfg/schema-reference.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: TrendPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## TrendPanelCfg - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|---------------|---------------------------------------|----------|---------|----------------------------------------------------------------------| -| `FieldConfig` | [GraphFieldConfig](#graphfieldconfig) | **Yes** | | TODO docs | -| `Options` | [object](#options) | **Yes** | | Identical to timeseries... except it does not have timezone settings | - -### GraphFieldConfig - -TODO docs - -It extends [LineConfig](#lineconfig) and [FillConfig](#fillconfig) and [PointsConfig](#pointsconfig) and [AxisConfig](#axisconfig) and [BarConfig](#barconfig) and [StackableFieldConfig](#stackablefieldconfig) and [HideableFieldConfig](#hideablefieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `barAlignment` | integer | No | | *(Inherited from [BarConfig](#barconfig))*
TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | *(Inherited from [BarConfig](#barconfig))* | -| `barWidthFactor` | number | No | | *(Inherited from [BarConfig](#barconfig))* | -| `drawStyle` | string | No | | TODO docs
Possible values are: `line`, `bars`, `points`. | -| `fillBelowTo` | string | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `fillColor` | string | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `fillOpacity` | number | No | | *(Inherited from [FillConfig](#fillconfig))* | -| `gradientMode` | string | No | | TODO docs
Possible values are: `none`, `opacity`, `hue`, `scheme`. | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `lineColor` | string | No | | *(Inherited from [LineConfig](#lineconfig))* | -| `lineInterpolation` | string | No | | *(Inherited from [LineConfig](#lineconfig))*
TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | *(Inherited from [LineConfig](#lineconfig))*
TODO docs | -| `lineWidth` | number | No | | *(Inherited from [LineConfig](#lineconfig))* | -| `pointColor` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `pointSize` | number | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `pointSymbol` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))* | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs | -| `showPoints` | string | No | | *(Inherited from [PointsConfig](#pointsconfig))*
TODO docs
Possible values are: `auto`, `never`, `always`. | -| `spanNulls` | | No | | *(Inherited from [LineConfig](#lineconfig))*
Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | -| `stacking` | [StackingConfig](#stackingconfig) | No | | *(Inherited from [StackableFieldConfig](#stackablefieldconfig))*
TODO docs | -| `thresholdsStyle` | [GraphThresholdsStyleConfig](#graphthresholdsstyleconfig) | No | | TODO docs | -| `transform` | string | No | | TODO docs
Possible values are: `constant`, `negative-Y`. | - -### AxisConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | | -| `axisCenteredZero` | boolean | No | | | -| `axisColorMode` | string | No | | TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | | -| `axisLabel` | string | No | | | -| `axisPlacement` | string | No | | TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | | -| `axisSoftMin` | number | No | | | -| `axisWidth` | number | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### ScaleDistributionConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------------|--------|----------|---------|--------------------------------------------------------------------------| -| `type` | string | **Yes** | | TODO docs
Possible values are: `linear`, `log`, `ordinal`, `symlog`. | -| `linearThreshold` | number | No | | | -| `log` | number | No | | | - -### BarConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------------|---------|----------|---------|----------------------------------------------------| -| `barAlignment` | integer | No | | TODO docs
Possible values are: `-1`, `0`, `1`. | -| `barMaxWidth` | number | No | | | -| `barWidthFactor` | number | No | | | - -### FillConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|-------------| -| `fillBelowTo` | string | No | | | -| `fillColor` | string | No | | | -| `fillOpacity` | number | No | | | - -### GraphThresholdsStyleConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `off`, `line`, `dashed`, `area`, `line+area`, `dashed+area`, `series`. | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### LineConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lineColor` | string | No | | | -| `lineInterpolation` | string | No | | TODO docs
Possible values are: `linear`, `smooth`, `stepBefore`, `stepAfter`. | -| `lineStyle` | [LineStyle](#linestyle) | No | | TODO docs | -| `lineWidth` | number | No | | | -| `spanNulls` | | No | | Indicate if null values should be treated as gaps or connected.
When the value is a number, it represents the maximum delta in the
X axis that should be considered connected. For timeseries, this is milliseconds | - -### LineStyle - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|--------------------------------------------------------| -| `dash` | number[] | No | | | -| `fill` | string | No | | Possible values are: `solid`, `dash`, `dot`, `square`. | - -### PointsConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|---------------------------------------------------------------| -| `pointColor` | string | No | | | -| `pointSize` | number | No | | | -| `pointSymbol` | string | No | | | -| `showPoints` | string | No | | TODO docs
Possible values are: `auto`, `never`, `always`. | - -### StackableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|-----------------------------------|----------|---------|-------------| -| `stacking` | [StackingConfig](#stackingconfig) | No | | TODO docs | - -### StackingConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------| -| `group` | string | No | | | -| `mode` | string | No | | TODO docs
Possible values are: `none`, `normal`, `percent`. | - -### Options - -Identical to timeseries... except it does not have timezone settings - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------------------|----------|---------|-------------------------------------------------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | -| `xField` | string | No | | Name of the x field to use (defaults to first number) | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - - diff --git a/docs/sources/developers/kinds/composable/xychart/panelcfg/schema-reference.md b/docs/sources/developers/kinds/composable/xychart/panelcfg/schema-reference.md deleted file mode 100644 index 4b7cb0ca767..00000000000 --- a/docs/sources/developers/kinds/composable/xychart/panelcfg/schema-reference.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: XYChartPanelCfg kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## XYChartPanelCfg - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - - - -| Property | Type | Required | Default | Description | -|-----------------------|--------------------------------|----------|---------|----------------------------------------------------------------------| -| `FieldConfig` | [object](#fieldconfig) | **Yes** | | | -| `Options` | [object](#options) | **Yes** | | | -| `ScatterSeriesConfig` | [object](#scatterseriesconfig) | **Yes** | | | -| `ScatterShow` | string | **Yes** | | Possible values are: `points`, `lines`, `points+lines`. | -| `SeriesMapping` | string | **Yes** | | Auto is "table" in the UI
Possible values are: `auto`, `manual`. | -| `XYDimensionConfig` | [object](#xydimensionconfig) | **Yes** | | Configuration for the Table/Auto mode | - -### FieldConfig - -It extends [HideableFieldConfig](#hideablefieldconfig) and [AxisConfig](#axisconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisLabel` | string | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `axisWidth` | number | No | | *(Inherited from [AxisConfig](#axisconfig))* | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [HideableFieldConfig](#hideablefieldconfig))*
TODO docs | -| `labelValue` | [TextDimensionConfig](#textdimensionconfig) | No | | | -| `label` | string | No | | TODO docs
Possible values are: `auto`, `never`, `always`. | -| `lineColor` | [ColorDimensionConfig](#colordimensionconfig) | No | | | -| `lineStyle` | [LineStyle](#linestyle) | No | | TODO docs | -| `lineWidth` | integer | No | | Constraint: `>=0 & <=2147483647`. | -| `pointColor` | [ColorDimensionConfig](#colordimensionconfig) | No | | | -| `pointSize` | [ScaleDimensionConfig](#scaledimensionconfig) | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [AxisConfig](#axisconfig))*
TODO docs | -| `show` | string | No | | Possible values are: `points`, `lines`, `points+lines`. | - -### AxisConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | | -| `axisCenteredZero` | boolean | No | | | -| `axisColorMode` | string | No | | TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | | -| `axisLabel` | string | No | | | -| `axisPlacement` | string | No | | TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | | -| `axisSoftMin` | number | No | | | -| `axisWidth` | number | No | | | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | TODO docs | - -### ScaleDistributionConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------------|--------|----------|---------|--------------------------------------------------------------------------| -| `type` | string | **Yes** | | TODO docs
Possible values are: `linear`, `log`, `ordinal`, `symlog`. | -| `linearThreshold` | number | No | | | -| `log` | number | No | | | - -### ColorDimensionConfig - -It extends [BaseDimensionConfig](#basedimensionconfig). - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------| -| `field` | string | No | | *(Inherited from [BaseDimensionConfig](#basedimensionconfig))*
fixed: T -- will be added by each element | -| `fixed` | string | No | | | - -### BaseDimensionConfig - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------------------------------------| -| `field` | string | No | | fixed: T -- will be added by each element | - -### HideSeriesConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|---------|----------|---------|-------------| -| `legend` | boolean | **Yes** | | | -| `tooltip` | boolean | **Yes** | | | -| `viz` | boolean | **Yes** | | | - -### HideableFieldConfig - -TODO docs - -| Property | Type | Required | Default | Description | -|------------|---------------------------------------|----------|---------|-------------| -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | TODO docs | - -### LineStyle - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|----------|----------|---------|--------------------------------------------------------| -| `dash` | number[] | No | | | -| `fill` | string | No | | Possible values are: `solid`, `dash`, `dot`, `square`. | - -### ScaleDimensionConfig - -It extends [BaseDimensionConfig](#basedimensionconfig). - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------| -| `max` | number | **Yes** | | | -| `min` | number | **Yes** | | | -| `field` | string | No | | *(Inherited from [BaseDimensionConfig](#basedimensionconfig))*
fixed: T -- will be added by each element | -| `fixed` | number | No | | | -| `mode` | string | No | | Possible values are: `linear`, `quad`. | - -### TextDimensionConfig - -It extends [BaseDimensionConfig](#basedimensionconfig). - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | Possible values are: `fixed`, `field`, `template`. | -| `field` | string | No | | *(Inherited from [BaseDimensionConfig](#basedimensionconfig))*
fixed: T -- will be added by each element | -| `fixed` | string | No | | | - -### Options - -It extends [OptionsWithLegend](#optionswithlegend) and [OptionsWithTooltip](#optionswithtooltip). - -| Property | Type | Required | Default | Description | -|-----------------|-----------------------------------------------|----------|---------|----------------------------------------------------------------------------| -| `dims` | [XYDimensionConfig](#xydimensionconfig) | **Yes** | | Configuration for the Table/Auto mode | -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | *(Inherited from [OptionsWithLegend](#optionswithlegend))*
TODO docs | -| `series` | [ScatterSeriesConfig](#scatterseriesconfig)[] | **Yes** | | Manual Mode | -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | *(Inherited from [OptionsWithTooltip](#optionswithtooltip))*
TODO docs | -| `seriesMapping` | string | No | | Auto is "table" in the UI
Possible values are: `auto`, `manual`. | - -### OptionsWithLegend - -TODO docs - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------|----------|---------|-------------| -| `legend` | [VizLegendOptions](#vizlegendoptions) | **Yes** | | TODO docs | - -### VizLegendOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `calcs` | string[] | **Yes** | | | -| `displayMode` | string | **Yes** | | TODO docs
Note: "hidden" needs to remain as an option for plugins compatibility
Possible values are: `list`, `table`, `hidden`. | -| `placement` | string | **Yes** | | TODO docs
Possible values are: `bottom`, `right`. | -| `showLegend` | boolean | **Yes** | | | -| `asTable` | boolean | No | | | -| `isVisible` | boolean | No | | | -| `sortBy` | string | No | | | -| `sortDesc` | boolean | No | | | -| `width` | number | No | | | - -### OptionsWithTooltip - -TODO docs - -| Property | Type | Required | Default | Description | -|-----------|-----------------------------------------|----------|---------|-------------| -| `tooltip` | [VizTooltipOptions](#viztooltipoptions) | **Yes** | | TODO docs | - -### VizTooltipOptions - -TODO docs - -| Property | Type | Required | Default | Description | -|-------------|--------|----------|---------|---------------------------------------------------------------| -| `mode` | string | **Yes** | | TODO docs
Possible values are: `single`, `multi`, `none`. | -| `sort` | string | **Yes** | | TODO docs
Possible values are: `asc`, `desc`, `none`. | -| `maxHeight` | number | No | | | -| `maxWidth` | number | No | | | - -### ScatterSeriesConfig - -It extends [FieldConfig](#fieldconfig). - -| Property | Type | Required | Default | Description | -|---------------------|-----------------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------| -| `axisBorderShow` | boolean | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `axisCenteredZero` | boolean | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `axisColorMode` | string | No | | *(Inherited from [FieldConfig](#fieldconfig))*
TODO docs
Possible values are: `text`, `series`. | -| `axisGridShow` | boolean | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `axisLabel` | string | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `axisPlacement` | string | No | | *(Inherited from [FieldConfig](#fieldconfig))*
TODO docs
Possible values are: `auto`, `top`, `right`, `bottom`, `left`, `hidden`. | -| `axisSoftMax` | number | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `axisSoftMin` | number | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `axisWidth` | number | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `frame` | number | No | | | -| `hideFrom` | [HideSeriesConfig](#hideseriesconfig) | No | | *(Inherited from [FieldConfig](#fieldconfig))*
TODO docs | -| `labelValue` | [TextDimensionConfig](#textdimensionconfig) | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `label` | string | No | | *(Inherited from [FieldConfig](#fieldconfig))*
TODO docs
Possible values are: `auto`, `never`, `always`. | -| `lineColor` | [ColorDimensionConfig](#colordimensionconfig) | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `lineStyle` | [LineStyle](#linestyle) | No | | *(Inherited from [FieldConfig](#fieldconfig))*
TODO docs | -| `lineWidth` | integer | No | | *(Inherited from [FieldConfig](#fieldconfig))*
Constraint: `>=0 & <=2147483647`. | -| `name` | string | No | | | -| `pointColor` | [ColorDimensionConfig](#colordimensionconfig) | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `pointSize` | [ScaleDimensionConfig](#scaledimensionconfig) | No | | *(Inherited from [FieldConfig](#fieldconfig))* | -| `scaleDistribution` | [ScaleDistributionConfig](#scaledistributionconfig) | No | | *(Inherited from [FieldConfig](#fieldconfig))*
TODO docs | -| `show` | string | No | | *(Inherited from [FieldConfig](#fieldconfig))*
Possible values are: `points`, `lines`, `points+lines`. | -| `x` | string | No | | | -| `y` | string | No | | | - -### XYDimensionConfig - -Configuration for the Table/Auto mode - -| Property | Type | Required | Default | Description | -|-----------|----------|----------|---------|-----------------------------------| -| `frame` | integer | **Yes** | | Constraint: `>=0 & <=2147483647`. | -| `exclude` | string[] | No | | | -| `x` | string | No | | | - - diff --git a/docs/sources/developers/kinds/core/_index.md b/docs/sources/developers/kinds/core/_index.md deleted file mode 100644 index f791015d5b4..00000000000 --- a/docs/sources/developers/kinds/core/_index.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -labels: - products: - - enterprise - - oss -title: Core kinds -weight: 200 ---- - -# Grafana core kinds - -Kinds that define Grafana’s core schematized object types - dashboards, datasources, users, etc. - -{{< section >}} diff --git a/docs/sources/developers/kinds/core/accesspolicy/schema-reference.md b/docs/sources/developers/kinds/core/accesspolicy/schema-reference.md deleted file mode 100644 index 0df9b57ef00..00000000000 --- a/docs/sources/developers/kinds/core/accesspolicy/schema-reference.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: AccessPolicy kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## AccessPolicy - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - -Access rules for a scope+role. NOTE there is a unique constraint on role+scope - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -| Property | Type | Required | Default | Description | -|----------|-----------------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------| -| `role` | [RoleRef](#roleref) | **Yes** | | | -| `rules` | [AccessRule](#accessrule)[] | **Yes** | | The set of rules to apply. Note that * is required to modify
access policy rules, and that "none" will reject all actions | -| `scope` | [ResourceRef](#resourceref) | **Yes** | | | - -### AccessRule - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `kind` | string | **Yes** | | The kind this rule applies to (dashboards, alert, etc) | -| `verb` | string | **Yes** | | READ, WRITE, CREATE, DELETE, ...
should move to k8s style verbs like: "get", "list", "watch", "create", "update", "patch", "delete" | -| `target` | string | No | | Specific sub-elements like "alert.rules" or "dashboard.permissions"???? | - -### ResourceRef - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `kind` | string | **Yes** | | | -| `name` | string | **Yes** | | | - -### RoleRef - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `kind` | string | **Yes** | | Policies can apply to roles, teams, or users
Applying policies to individual users is supported, but discouraged
Possible values are: `Role`, `BuiltinRole`, `Team`, `User`. | -| `name` | string | **Yes** | | | -| `xname` | string | **Yes** | | | - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/core/dashboard/schema-reference.md b/docs/sources/developers/kinds/core/dashboard/schema-reference.md deleted file mode 100644 index 0bbf32a8c27..00000000000 --- a/docs/sources/developers/kinds/core/dashboard/schema-reference.md +++ /dev/null @@ -1,677 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: Dashboard kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## Dashboard - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - -A Grafana dashboard. - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -| Property | Type | Required | Default | Description | -|------------------------|---------------------------------------------|----------|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `schemaVersion` | uint16 | **Yes** | `36` | Version of the JSON schema, incremented each time a Grafana update brings
changes to said schema. | -| `annotations` | [AnnotationContainer](#annotationcontainer) | No | | Contains the list of annotations that are associated with the dashboard.
Annotations are used to overlay event markers and overlay event tags on graphs.
Grafana comes with a native annotation store and the ability to add annotation events directly from the graph panel or via the HTTP API.
See https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/annotate-visualizations/ | -| `description` | string | No | | Description of dashboard. | -| `editable` | boolean | No | `true` | Whether a dashboard is editable or not. | -| `fiscalYearStartMonth` | integer | No | `0` | The month that the fiscal year starts on. 0 = January, 11 = December
Constraint: `>=0 & <12`. | -| `gnetId` | string | No | | ID of a dashboard imported from the https://grafana.com/grafana/dashboards/ portal | -| `graphTooltip` | integer | No | `0` | 0 for no shared crosshair or tooltip (default).
1 for shared crosshair.
2 for shared crosshair AND shared tooltip.
Possible values are: `0`, `1`, `2`. | -| `id` | integer or null | No | | Unique numeric identifier for the dashboard.
`id` is internal to a specific Grafana instance. `uid` should be used to identify a dashboard across Grafana instances. | -| `links` | [DashboardLink](#dashboardlink)[] | No | | Links with references to other dashboards or external websites. | -| `liveNow` | boolean | No | | When set to true, the dashboard will redraw panels at an interval matching the pixel width.
This will keep data "moving left" regardless of the query refresh rate. This setting helps
avoid dashboards presenting stale live data | -| `panels` | [object](#panels)[] | No | | List of dashboard panels | -| `refresh` | string | No | | Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d". | -| `revision` | integer | No | | This property should only be used in dashboards defined by plugins. It is a quick check
to see if the version has changed since the last time. | -| `snapshot` | [Snapshot](#snapshot) | No | | A dashboard snapshot shares an interactive dashboard publicly.
It is a read-only version of a dashboard, and is not editable.
It is possible to create a snapshot of a snapshot.
Grafana strips away all sensitive information from the dashboard.
Sensitive information stripped: queries (metric, template,annotation) and panel links. | -| `tags` | string[] | No | | Tags associated with dashboard. | -| `templating` | [object](#templating) | No | | Configured template variables | -| `time` | [object](#time) | No | | Time range for dashboard.
Accepted values are relative time strings like {from: 'now-6h', to: 'now'} or absolute time strings like {from: '2020-07-10T08:00:00.000Z', to: '2020-07-10T14:00:00.000Z'}. | -| `timepicker` | [TimePickerConfig](#timepickerconfig) | No | | Time picker configuration
It defines the default config for the time picker and the refresh picker for the specific dashboard. | -| `timezone` | string | No | `browser` | Timezone of dashboard. Accepted values are IANA TZDB zone ID or "browser" or "utc". | -| `title` | string | No | | Title of dashboard. | -| `uid` | string | No | | Unique dashboard identifier that can be generated by anyone. string (8-40) | -| `version` | uint32 | No | | Version of the dashboard, incremented each time the dashboard is updated. | -| `weekStart` | string | No | | Day when the week starts. Expressed by the name of the day in lowercase, e.g. "monday". | - -### AnnotationContainer - -Contains the list of annotations that are associated with the dashboard. -Annotations are used to overlay event markers and overlay event tags on graphs. -Grafana comes with a native annotation store and the ability to add annotation events directly from the graph panel or via the HTTP API. -See https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/annotate-visualizations/ - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------|----------|---------|---------------------| -| `list` | [AnnotationQuery](#annotationquery)[] | No | | List of annotations | - -### AnnotationQuery - -TODO docs -FROM: AnnotationQuery in grafana-data/src/types/annotations.ts - -| Property | Type | Required | Default | Description | -|--------------|-------------------------------------------------|----------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `datasource` | [DataSourceRef](#datasourceref) | **Yes** | | Ref to a DataSource instance | -| `enable` | boolean | **Yes** | `true` | When enabled the annotation query is issued with every dashboard refresh | -| `iconColor` | string | **Yes** | | Color to use for the annotation event markers | -| `name` | string | **Yes** | | Name of annotation. | -| `builtIn` | number | No | `0` | Set to 1 for the standard annotation query all dashboards have by default. | -| `filter` | [AnnotationPanelFilter](#annotationpanelfilter) | No | | | -| `hide` | boolean | No | `false` | Annotation queries can be toggled on or off at the top of the dashboard.
When hide is true, the toggle is not shown in the dashboard. | -| `target` | [AnnotationTarget](#annotationtarget) | No | | TODO: this should be a regular DataQuery that depends on the selected dashboard
these match the properties of the "grafana" datasouce that is default in most dashboards | -| `type` | string | No | | TODO -- this should not exist here, it is based on the --grafana-- datasource | - -### AnnotationPanelFilter - -| Property | Type | Required | Default | Description | -|-----------|-----------|----------|---------|-----------------------------------------------------| -| `ids` | integer[] | **Yes** | | Panel IDs that should be included or excluded | -| `exclude` | boolean | No | `false` | Should the specified panels be included or excluded | - -### AnnotationTarget - -TODO: this should be a regular DataQuery that depends on the selected dashboard -these match the properties of the "grafana" datasouce that is default in most dashboards - -| Property | Type | Required | Default | Description | -|------------|----------|----------|---------|-------------------------------------------------------------------------------------------------------------------| -| `limit` | integer | **Yes** | | Only required/valid for the grafana datasource...
but code+tests is already depending on it so hard to change | -| `matchAny` | boolean | **Yes** | | Only required/valid for the grafana datasource...
but code+tests is already depending on it so hard to change | -| `tags` | string[] | **Yes** | | Only required/valid for the grafana datasource...
but code+tests is already depending on it so hard to change | -| `type` | string | **Yes** | | Only required/valid for the grafana datasource...
but code+tests is already depending on it so hard to change | - -### DataSourceRef - -Ref to a DataSource instance - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|------------------------------| -| `type` | string | No | | The plugin type-id | -| `uid` | string | No | | Specific datasource instance | - -### DashboardLink - -Links with references to other dashboards or external resources - -| Property | Type | Required | Default | Description | -|---------------|----------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `asDropdown` | boolean | **Yes** | `false` | If true, all dashboards links will be displayed in a dropdown. If false, all dashboards links will be displayed side by side. Only valid if the type is dashboards | -| `icon` | string | **Yes** | | Icon name to be displayed with the link | -| `includeVars` | boolean | **Yes** | `false` | If true, includes current template variables values in the link as query params | -| `keepTime` | boolean | **Yes** | `false` | If true, includes current time range in the link as query params | -| `tags` | string[] | **Yes** | | List of tags to limit the linked dashboards. If empty, all dashboards will be displayed. Only valid if the type is dashboards | -| `targetBlank` | boolean | **Yes** | `false` | If true, the link will be opened in a new tab | -| `title` | string | **Yes** | | Title to display with the link | -| `tooltip` | string | **Yes** | | Tooltip to display when the user hovers their mouse over it | -| `type` | string | **Yes** | | Dashboard Link type. Accepted values are dashboards (to refer to another dashboard) and link (to refer to an external resource)
Possible values are: `link`, `dashboards`. | -| `url` | string | No | | Link URL. Only required/valid if the type is link | - -### Snapshot - -A dashboard snapshot shares an interactive dashboard publicly. -It is a read-only version of a dashboard, and is not editable. -It is possible to create a snapshot of a snapshot. -Grafana strips away all sensitive information from the dashboard. -Sensitive information stripped: queries (metric, template,annotation) and panel links. - -| Property | Type | Required | Default | Description | -|---------------|---------|----------|---------|--------------------------------------------------------------------------------| -| `created` | string | **Yes** | | Time when the snapshot was created | -| `expires` | string | **Yes** | | Time when the snapshot expires, default is never to expire | -| `externalUrl` | string | **Yes** | | external url, if snapshot was shared in external grafana instance | -| `external` | boolean | **Yes** | | Is the snapshot saved in an external grafana instance | -| `id` | uint32 | **Yes** | | Unique identifier of the snapshot | -| `key` | string | **Yes** | | Optional, defined the unique key of the snapshot, required if external is true | -| `name` | string | **Yes** | | Optional, name of the snapshot | -| `orgId` | uint32 | **Yes** | | org id of the snapshot | -| `originalUrl` | string | **Yes** | | original url, url of the dashboard that was snapshotted | -| `updated` | string | **Yes** | | last time when the snapshot was updated | -| `userId` | uint32 | **Yes** | | user id of the snapshot creator | -| `url` | string | No | | url of the snapshot, if snapshot was shared internally | - -### TimePickerConfig - -Time picker configuration -It defines the default config for the time picker and the refresh picker for the specific dashboard. - -| Property | Type | Required | Default | Description | -|---------------------|----------|----------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------| -| `hidden` | boolean | No | `false` | Whether timepicker is visible or not. | -| `nowDelay` | string | No | | Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values. | -| `refresh_intervals` | string[] | No | `[5s 10s 30s 1m 5m 15m 30m 1h 2h 1d]` | Interval options available in the refresh picker dropdown. | -| `time_options` | string[] | No | `[5m 15m 1h 6h 12h 24h 2d 7d 30d]` | Selectable options available in the time picker dropdown. Has no effect on provisioned dashboard. | - -### Panels - -| Property | Type | Required | Default | Description | -|----------|---------------------------------------------------|----------|---------|-------------| -| `object` | Possible types are: [](#), [RowPanel](#rowpanel). | | | - -### DataTransformerConfig - -Transformations allow to manipulate data returned by a query before the system applies a visualization. -Using transformations you can: rename fields, join time series data, perform mathematical operations across queries, -use the output of one transformation as the input to another transformation, etc. - -| Property | Type | Required | Default | Description | -|------------|---------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `id` | string | **Yes** | | Unique identifier of transformer | -| `options` | | **Yes** | | Options to be passed to the transformer
Valid options depend on the transformer id | -| `disabled` | boolean | No | | Disabled transformations are skipped | -| `filter` | [MatcherConfig](#matcherconfig) | No | | Matcher is a predicate configuration. Based on the config a set of field(s) or values is filtered in order to apply override / transformation.
It comes with in id ( to resolve implementation from registry) and a configuration that’s specific to a particular matcher type. | -| `topic` | string | No | | Where to pull DataFrames from as input to transformation
Possible values are: `series`, `annotations`, `alertStates`. | - -### MatcherConfig - -Matcher is a predicate configuration. Based on the config a set of field(s) or values is filtered in order to apply override / transformation. -It comes with in id ( to resolve implementation from registry) and a configuration that’s specific to a particular matcher type. - -| Property | Type | Required | Default | Description | -|-----------|--------|----------|---------|--------------------------------------------------------------------------------| -| `id` | string | **Yes** | `` | The matcher id. This is used to find the matcher implementation from registry. | -| `options` | | No | | The matcher options. This is specific to the matcher implementation. | - -### FieldConfigSource - -The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results. -Each column within this structure is called a field. A field can represent a single time series or table column. -Field options allow you to change how the data is displayed in your visualizations. - -| Property | Type | Required | Default | Description | -|-------------|-----------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `defaults` | [FieldConfig](#fieldconfig) | **Yes** | | The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results.
Each column within this structure is called a field. A field can represent a single time series or table column.
Field options allow you to change how the data is displayed in your visualizations. | -| `overrides` | [object](#overrides)[] | **Yes** | | Overrides are the options applied to specific fields overriding the defaults. | - -### FieldConfig - -The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results. -Each column within this structure is called a field. A field can represent a single time series or table column. -Field options allow you to change how the data is displayed in your visualizations. - -| Property | Type | Required | Default | Description | -|---------------------|---------------------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `color` | [FieldColor](#fieldcolor) | No | | Map a field to a color. | -| `custom` | [object](#custom) | No | | custom is specified by the FieldConfig field
in panel plugin schemas. | -| `decimals` | number | No | | Specify the number of decimals Grafana includes in the rendered value.
If you leave this field blank, Grafana automatically truncates the number of decimals based on the value.
For example 1.1234 will display as 1.12 and 100.456 will display as 100.
To display all decimals, set the unit to `String`. | -| `description` | string | No | | Human readable field metadata | -| `displayNameFromDS` | string | No | | This can be used by data sources that return and explicit naming structure for values and labels
When this property is configured, this value is used rather than the default naming strategy. | -| `displayName` | string | No | | The display value for this field. This supports template variables blank is auto | -| `filterable` | boolean | No | | True if data source field supports ad-hoc filters | -| `links` | | No | | The behavior when clicking on a result | -| `mappings` | [ValueMapping](#valuemapping)[] | No | | Convert input values into a display string | -| `max` | number | No | | The maximum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields. | -| `min` | number | No | | The minimum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields. | -| `noValue` | string | No | | Alternative to empty string | -| `path` | string | No | | An explicit path to the field in the datasource. When the frame meta includes a path,
This will default to `${frame.meta.path}/${field.name}

When defined, this value can be used as an identifier within the datasource scope, and
may be used to update the results | -| `thresholds` | [ThresholdsConfig](#thresholdsconfig) | No | | Thresholds configuration for the panel | -| `unit` | string | No | | Unit a field should use. The unit you select is applied to all fields except time.
You can use the units ID availables in Grafana or a custom unit.
Available units in Grafana: https://github.com/grafana/grafana/blob/main/packages/grafana-data/src/valueFormats/categories.ts
As custom unit, you can use the following formats:
`suffix:` for custom unit that should go after value.
`prefix:` for custom unit that should go before value.
`time:` For custom date time formats type for example `time:YYYY-MM-DD`.
`si:` for custom SI units. For example: `si: mF`. This one is a bit more advanced as you can specify both a unit and the source data scale. So if your source data is represented as milli (thousands of) something prefix the unit with that SI scale character.
`count:` for a custom count unit.
`currency:` for custom a currency unit. | -| `writeable` | boolean | No | | True if data source can write a value to the path. Auth/authz are supported separately | - -### FieldColor - -Map a field to a color. - -| Property | Type | Required | Default | Description | -|--------------|--------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | Color mode for a field. You can specify a single color, or select a continuous (gradient) color schemes, based on a value.
Continuous color interpolates a color using the percentage of a value relative to min and max.
Accepted values are:
`thresholds`: From thresholds. Informs Grafana to take the color from the matching threshold
`palette-classic`: Classic palette. Grafana will assign color by looking up a color in a palette by series index. Useful for Graphs and pie charts and other categorical data visualizations
`palette-classic-by-name`: Classic palette (by name). Grafana will assign color by looking up a color in a palette by series name. Useful for Graphs and pie charts and other categorical data visualizations
`continuous-GrYlRd`: ontinuous Green-Yellow-Red palette mode
`continuous-RdYlGr`: Continuous Red-Yellow-Green palette mode
`continuous-BlYlRd`: Continuous Blue-Yellow-Red palette mode
`continuous-YlRd`: Continuous Yellow-Red palette mode
`continuous-BlPu`: Continuous Blue-Purple palette mode
`continuous-YlBl`: Continuous Yellow-Blue palette mode
`continuous-blues`: Continuous Blue palette mode
`continuous-reds`: Continuous Red palette mode
`continuous-greens`: Continuous Green palette mode
`continuous-purples`: Continuous Purple palette mode
`shades`: Shades of a single color. Specify a single color, useful in an override rule.
`fixed`: Fixed color mode. Specify a single color, useful in an override rule.
Possible values are: `thresholds`, `palette-classic`, `palette-classic-by-name`, `continuous-GrYlRd`, `continuous-RdYlGr`, `continuous-BlYlRd`, `continuous-YlRd`, `continuous-BlPu`, `continuous-YlBl`, `continuous-blues`, `continuous-reds`, `continuous-greens`, `continuous-purples`, `fixed`, `shades`. | -| `fixedColor` | string | No | | The fixed color value for fixed or shades color modes. | -| `seriesBy` | string | No | | Defines how to assign a series color from "by value" color schemes. For example for an aggregated data points like a timeseries, the color can be assigned by the min, max or last value.
Possible values are: `min`, `max`, `last`. | - -### ThresholdsConfig - -Thresholds configuration for the panel - -| Property | Type | Required | Default | Description | -|----------|---------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `mode` | string | **Yes** | | Thresholds can either be `absolute` (specific number) or `percentage` (relative to min or max, it will be values between 0 and 1).
Possible values are: `absolute`, `percentage`. | -| `steps` | [Threshold](#threshold)[] | **Yes** | | Must be sorted by 'value', first value is always -Infinity | - -### Threshold - -User-defined value for a metric that triggers visual changes in a panel when this value is met or exceeded -They are used to conditionally style and color visualizations based on query results , and can be applied to most visualizations. - -| Property | Type | Required | Default | Description | -|----------|----------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `color` | string | **Yes** | | Color represents the color of the visual change that will occur in the dashboard when the threshold value is met or exceeded. | -| `value` | number or null | **Yes** | | Value represents a specified metric for the threshold, which triggers a visual change in the dashboard when this value is met or exceeded.
Nulls currently appear here when serializing -Infinity to JSON. | - -### ValueMapping - -Allow to transform the visual representation of specific data values in a visualization, irrespective of their original units - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------------------------------------------------------------------------------------------|----------|---------|-------------| -| `object` | Possible types are: [ValueMap](#valuemap), [RangeMap](#rangemap), [RegexMap](#regexmap), [SpecialValueMap](#specialvaluemap). | | | - -### RangeMap - -Maps numerical ranges to a display text and color. -For example, if a value is within a certain range, you can configure a range value mapping to display Low or High rather than the number. - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-----------------------------------------------------------------------------------| -| `options` | [object](#options) | **Yes** | | Range to match against and the result to apply when the value is within the range | -| `type` | string | **Yes** | | | - -### Options - -Range to match against and the result to apply when the value is within the range - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------|----------|---------|-----------------------------------------------------------------------| -| `from` | number or null | **Yes** | | Min value of the range. It can be null which means -Infinity | -| `result` | [ValueMappingResult](#valuemappingresult) | **Yes** | | Result used as replacement with text and color when the value matches | -| `to` | number or null | **Yes** | | Max value of the range. It can be null which means +Infinity | - -### ValueMappingResult - -Result used as replacement with text and color when the value matches - -| Property | Type | Required | Default | Description | -|----------|---------|----------|---------|-----------------------------------------------------------------------| -| `color` | string | No | | Text to use when the value matches | -| `icon` | string | No | | Icon to display when the value matches. Only specific visualizations. | -| `index` | integer | No | | Position in the mapping array. Only used internally. | -| `text` | string | No | | Text to display when the value matches | - -### RegexMap - -Maps regular expressions to replacement text and a color. -For example, if a value is www.example.com, you can configure a regex value mapping so that Grafana displays www and truncates the domain. - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|----------------------------------------------------------------------------------------------| -| `options` | [object](#options) | **Yes** | | Regular expression to match against and the result to apply when the value matches the regex | -| `type` | string | **Yes** | | | - -### Options - -Regular expression to match against and the result to apply when the value matches the regex - -| Property | Type | Required | Default | Description | -|-----------|-------------------------------------------|----------|---------|-----------------------------------------------------------------------| -| `pattern` | string | **Yes** | | Regular expression to match against | -| `result` | [ValueMappingResult](#valuemappingresult) | **Yes** | | Result used as replacement with text and color when the value matches | - -### SpecialValueMap - -Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. -See SpecialValueMatch to see the list of special values. -For example, you can configure a special value mapping so that null values appear as N/A. - -| Property | Type | Required | Default | Description | -|-----------|--------------------|----------|---------|-------------| -| `options` | [object](#options) | **Yes** | | | -| `type` | string | **Yes** | | | - -### Options - -| Property | Type | Required | Default | Description | -|----------|-------------------------------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------| -| `match` | string | **Yes** | | Special value types supported by the `SpecialValueMap`
Possible values are: `true`, `false`, `null`, `nan`, `null+nan`, `empty`. | -| `result` | [ValueMappingResult](#valuemappingresult) | **Yes** | | Result used as replacement with text and color when the value matches | - -### ValueMap - -Maps text values to a color or different display text and color. -For example, you can configure a value mapping so that all instances of the value 10 appear as Perfection! rather than the number. - -| Property | Type | Required | Default | Description | -|-----------|------------------------------------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------| -| `options` | map[string][ValueMappingResult](#valuemappingresult) | **Yes** | | Map with : ValueMappingResult. For example: { "10": { text: "Perfection!", color: "green" } } | -| `type` | string | **Yes** | | | - -### Custom - -custom is specified by the FieldConfig field -in panel plugin schemas. - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Overrides - -| Property | Type | Required | Default | Description | -|--------------|---------------------------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `matcher` | [MatcherConfig](#matcherconfig) | **Yes** | | Matcher is a predicate configuration. Based on the config a set of field(s) or values is filtered in order to apply override / transformation.
It comes with in id ( to resolve implementation from registry) and a configuration that’s specific to a particular matcher type. | -| `properties` | [DynamicConfigValue](#dynamicconfigvalue)[] | **Yes** | | | - -### DynamicConfigValue - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|-------------| -| `id` | string | **Yes** | `` | | -| `value` | | No | | | - -### GridPos - -Position and dimensions of a panel in the grid - -| Property | Type | Required | Default | Description | -|----------|---------|----------|---------|-------------------------------------------------------------------------------------------------------------------| -| `h` | uint32 | **Yes** | `9` | Panel height. The height is the number of rows from the top edge of the panel. | -| `w` | integer | **Yes** | `12` | Panel width. The width is the number of columns from the left edge of the panel.
Constraint: `>0 & <=24`. | -| `x` | integer | **Yes** | `0` | Panel x. The x coordinate is the number of columns from the left edge of the grid
Constraint: `>=0 & <24`. | -| `y` | uint32 | **Yes** | `0` | Panel y. The y coordinate is the number of rows from the top edge of the grid | -| `static` | boolean | No | | Whether the panel is fixed within the grid. If true, the panel will not be affected by other panels' interactions | - -### LibraryPanelRef - -A library panel is a reusable panel that you can use in any dashboard. -When you make a change to a library panel, that change propagates to all instances of where the panel is used. -Library panels streamline reuse of panels across multiple dashboards. - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------| -| `name` | string | **Yes** | | Library panel name | -| `uid` | string | **Yes** | | Library panel uid | - -### Panel - -Dashboard panels are the basic visualization building blocks. - -| Property | Type | Required | Default | Description | -|--------------------|---------------------------------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | The panel plugin type id. This is used to find the plugin to display the panel.
Constraint: `length >=1`. | -| `cacheTimeout` | string | No | | Sets panel queries cache timeout. | -| `datasource` | [DataSourceRef](#datasourceref) | No | | Ref to a DataSource instance | -| `description` | string | No | | Panel description. | -| `fieldConfig` | [FieldConfigSource](#fieldconfigsource) | No | | The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results.
Each column within this structure is called a field. A field can represent a single time series or table column.
Field options allow you to change how the data is displayed in your visualizations. | -| `gridPos` | [GridPos](#gridpos) | No | | Position and dimensions of a panel in the grid | -| `hideTimeOverride` | boolean | No | | Controls if the timeFrom or timeShift overrides are shown in the panel header | -| `id` | uint32 | No | | Unique identifier of the panel. Generated by Grafana when creating a new panel. It must be unique within a dashboard, but not globally. | -| `interval` | string | No | | The min time interval setting defines a lower limit for the $__interval and $__interval_ms variables.
This value must be formatted as a number followed by a valid time
identifier like: "40s", "3d", etc.
See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options | -| `libraryPanel` | [LibraryPanelRef](#librarypanelref) | No | | A library panel is a reusable panel that you can use in any dashboard.
When you make a change to a library panel, that change propagates to all instances of where the panel is used.
Library panels streamline reuse of panels across multiple dashboards. | -| `links` | [DashboardLink](#dashboardlink)[] | No | | Panel links. | -| `maxDataPoints` | number | No | | The maximum number of data points that the panel queries are retrieving. | -| `maxPerRow` | number | No | | Option for repeated panels that controls max items per row
Only relevant for horizontally repeated panels | -| `options` | [object](#options) | No | | It depends on the panel plugin. They are specified by the Options field in panel plugin schemas. | -| `pluginVersion` | string | No | | The version of the plugin that is used for this panel. This is used to find the plugin to display the panel and to migrate old panel configs. | -| `queryCachingTTL` | number | No | | Overrides the data source configured time-to-live for a query cache item in milliseconds | -| `repeatDirection` | string | No | `h` | Direction to repeat in if 'repeat' is set.
`h` for horizontal, `v` for vertical.
Possible values are: `h`, `v`. | -| `repeat` | string | No | | Name of template variable to repeat for. | -| `targets` | [Target](#target)[] | No | | Depends on the panel plugin. See the plugin documentation for details. | -| `timeFrom` | string | No | | Overrides the relative time range for individual panels,
which causes them to be different than what is selected in
the dashboard time picker in the top-right corner of the dashboard. You can use this to show metrics from different
time periods or days on the same dashboard.
The value is formatted as time operation like: `now-5m` (Last 5 minutes), `now/d` (the day so far),
`now-5d/d`(Last 5 days), `now/w` (This week so far), `now-2y/y` (Last 2 years).
Note: Panel time overrides have no effect when the dashboard’s time range is absolute.
See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options | -| `timeShift` | string | No | | Overrides the time range for individual panels by shifting its start and end relative to the time picker.
For example, you can shift the time range for the panel to be two hours earlier than the dashboard time picker setting `2h`.
Note: Panel time overrides have no effect when the dashboard’s time range is absolute.
See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options | -| `title` | string | No | | Panel title. | -| `transformations` | [DataTransformerConfig](#datatransformerconfig)[] | No | | List of transformations that are applied to the panel data before rendering.
When there are multiple transformations, Grafana applies them in the order they are listed.
Each transformation creates a result set that then passes on to the next transformation in the processing pipeline. | -| `transparent` | boolean | No | `false` | Whether to display the panel without a background. | - -### Target - -Schema for panel targets is specified by datasource -plugins. We use a placeholder definition, which the Go -schema loader either left open/as-is with the Base -variant of the Dashboard and Panel families, or filled -with types derived from plugins in the Instance variant. -When working directly from CUE, importers can extend this -type directly to achieve the same effect. - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Options - -It depends on the panel plugin. They are specified by the Options field in panel plugin schemas. - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### RowPanel - -Row panel - -| Property | Type | Required | Default | Description | -|--------------|---------------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `collapsed` | boolean | **Yes** | `false` | Whether this row should be collapsed or not. | -| `id` | uint32 | **Yes** | | Unique identifier of the panel. Generated by Grafana when creating a new panel. It must be unique within a dashboard, but not globally. | -| `panels` | [Panel](#panel)[] | **Yes** | | List of panels in the row | -| `type` | string | **Yes** | | The panel type
Possible values are: `row`. | -| `datasource` | [DataSourceRef](#datasourceref) | No | | Ref to a DataSource instance | -| `gridPos` | [GridPos](#gridpos) | No | | Position and dimensions of a panel in the grid | -| `repeat` | string | No | | Name of template variable to repeat for. | -| `title` | string | No | | Row title | - -### Panel - -Dashboard panels are the basic visualization building blocks. - -| Property | Type | Required | Default | Description | -|--------------------|---------------------------------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `type` | string | **Yes** | | The panel plugin type id. This is used to find the plugin to display the panel.
Constraint: `length >=1`. | -| `cacheTimeout` | string | No | | Sets panel queries cache timeout. | -| `datasource` | [DataSourceRef](#datasourceref) | No | | Ref to a DataSource instance | -| `description` | string | No | | Panel description. | -| `fieldConfig` | [FieldConfigSource](#fieldconfigsource) | No | | The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results.
Each column within this structure is called a field. A field can represent a single time series or table column.
Field options allow you to change how the data is displayed in your visualizations. | -| `gridPos` | [GridPos](#gridpos) | No | | Position and dimensions of a panel in the grid | -| `hideTimeOverride` | boolean | No | | Controls if the timeFrom or timeShift overrides are shown in the panel header | -| `id` | uint32 | No | | Unique identifier of the panel. Generated by Grafana when creating a new panel. It must be unique within a dashboard, but not globally. | -| `interval` | string | No | | The min time interval setting defines a lower limit for the $__interval and $__interval_ms variables.
This value must be formatted as a number followed by a valid time
identifier like: "40s", "3d", etc.
See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options | -| `libraryPanel` | [LibraryPanelRef](#librarypanelref) | No | | A library panel is a reusable panel that you can use in any dashboard.
When you make a change to a library panel, that change propagates to all instances of where the panel is used.
Library panels streamline reuse of panels across multiple dashboards. | -| `links` | [DashboardLink](#dashboardlink)[] | No | | Panel links. | -| `maxDataPoints` | number | No | | The maximum number of data points that the panel queries are retrieving. | -| `maxPerRow` | number | No | | Option for repeated panels that controls max items per row
Only relevant for horizontally repeated panels | -| `options` | [options](#options) | No | | It depends on the panel plugin. They are specified by the Options field in panel plugin schemas. | -| `pluginVersion` | string | No | | The version of the plugin that is used for this panel. This is used to find the plugin to display the panel and to migrate old panel configs. | -| `queryCachingTTL` | number | No | | Overrides the data source configured time-to-live for a query cache item in milliseconds | -| `repeatDirection` | string | No | `h` | Direction to repeat in if 'repeat' is set.
`h` for horizontal, `v` for vertical.
Possible values are: `h`, `v`. | -| `repeat` | string | No | | Name of template variable to repeat for. | -| `targets` | [Target](#target)[] | No | | Depends on the panel plugin. See the plugin documentation for details. | -| `timeFrom` | string | No | | Overrides the relative time range for individual panels,
which causes them to be different than what is selected in
the dashboard time picker in the top-right corner of the dashboard. You can use this to show metrics from different
time periods or days on the same dashboard.
The value is formatted as time operation like: `now-5m` (Last 5 minutes), `now/d` (the day so far),
`now-5d/d`(Last 5 days), `now/w` (This week so far), `now-2y/y` (Last 2 years).
Note: Panel time overrides have no effect when the dashboard’s time range is absolute.
See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options | -| `timeShift` | string | No | | Overrides the time range for individual panels by shifting its start and end relative to the time picker.
For example, you can shift the time range for the panel to be two hours earlier than the dashboard time picker setting `2h`.
Note: Panel time overrides have no effect when the dashboard’s time range is absolute.
See: https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/#query-options | -| `title` | string | No | | Panel title. | -| `transformations` | [DataTransformerConfig](#datatransformerconfig)[] | No | | List of transformations that are applied to the panel data before rendering.
When there are multiple transformations, Grafana applies them in the order they are listed.
Each transformation creates a result set that then passes on to the next transformation in the processing pipeline. | -| `transparent` | boolean | No | `false` | Whether to display the panel without a background. | - -### FieldConfigSource - -The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results. -Each column within this structure is called a field. A field can represent a single time series or table column. -Field options allow you to change how the data is displayed in your visualizations. - -| Property | Type | Required | Default | Description | -|-------------|-----------------------------|----------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `defaults` | [FieldConfig](#fieldconfig) | **Yes** | | The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results.
Each column within this structure is called a field. A field can represent a single time series or table column.
Field options allow you to change how the data is displayed in your visualizations. | -| `overrides` | [overrides](#overrides)[] | **Yes** | | Overrides are the options applied to specific fields overriding the defaults. | - -### FieldConfig - -The data model used in Grafana, namely the data frame, is a columnar-oriented table structure that unifies both time series and table query results. -Each column within this structure is called a field. A field can represent a single time series or table column. -Field options allow you to change how the data is displayed in your visualizations. - -| Property | Type | Required | Default | Description | -|---------------------|---------------------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `color` | [FieldColor](#fieldcolor) | No | | Map a field to a color. | -| `custom` | [custom](#custom) | No | | custom is specified by the FieldConfig field
in panel plugin schemas. | -| `decimals` | number | No | | Specify the number of decimals Grafana includes in the rendered value.
If you leave this field blank, Grafana automatically truncates the number of decimals based on the value.
For example 1.1234 will display as 1.12 and 100.456 will display as 100.
To display all decimals, set the unit to `String`. | -| `description` | string | No | | Human readable field metadata | -| `displayNameFromDS` | string | No | | This can be used by data sources that return and explicit naming structure for values and labels
When this property is configured, this value is used rather than the default naming strategy. | -| `displayName` | string | No | | The display value for this field. This supports template variables blank is auto | -| `filterable` | boolean | No | | True if data source field supports ad-hoc filters | -| `links` | | No | | The behavior when clicking on a result | -| `mappings` | [ValueMapping](#valuemapping)[] | No | | Convert input values into a display string | -| `max` | number | No | | The maximum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields. | -| `min` | number | No | | The minimum value used in percentage threshold calculations. Leave blank for auto calculation based on all series and fields. | -| `noValue` | string | No | | Alternative to empty string | -| `path` | string | No | | An explicit path to the field in the datasource. When the frame meta includes a path,
This will default to `${frame.meta.path}/${field.name}

When defined, this value can be used as an identifier within the datasource scope, and
may be used to update the results | -| `thresholds` | [ThresholdsConfig](#thresholdsconfig) | No | | Thresholds configuration for the panel | -| `unit` | string | No | | Unit a field should use. The unit you select is applied to all fields except time.
You can use the units ID availables in Grafana or a custom unit.
Available units in Grafana: https://github.com/grafana/grafana/blob/main/packages/grafana-data/src/valueFormats/categories.ts
As custom unit, you can use the following formats:
`suffix:` for custom unit that should go after value.
`prefix:` for custom unit that should go before value.
`time:` For custom date time formats type for example `time:YYYY-MM-DD`.
`si:` for custom SI units. For example: `si: mF`. This one is a bit more advanced as you can specify both a unit and the source data scale. So if your source data is represented as milli (thousands of) something prefix the unit with that SI scale character.
`count:` for a custom count unit.
`currency:` for custom a currency unit. | -| `writeable` | boolean | No | | True if data source can write a value to the path. Auth/authz are supported separately | - -### RangeMap - -Maps numerical ranges to a display text and color. -For example, if a value is within a certain range, you can configure a range value mapping to display Low or High rather than the number. - -| Property | Type | Required | Default | Description | -|-----------|---------------------|----------|---------|-----------------------------------------------------------------------------------| -| `options` | [options](#options) | **Yes** | | Range to match against and the result to apply when the value is within the range | -| `type` | string | **Yes** | | | - -### RegexMap - -Maps regular expressions to replacement text and a color. -For example, if a value is www.example.com, you can configure a regex value mapping so that Grafana displays www and truncates the domain. - -| Property | Type | Required | Default | Description | -|-----------|---------------------|----------|---------|----------------------------------------------------------------------------------------------| -| `options` | [options](#options) | **Yes** | | Regular expression to match against and the result to apply when the value matches the regex | -| `type` | string | **Yes** | | | - -### SpecialValueMap - -Maps special values like Null, NaN (not a number), and boolean values like true and false to a display text and color. -See SpecialValueMatch to see the list of special values. -For example, you can configure a special value mapping so that null values appear as N/A. - -| Property | Type | Required | Default | Description | -|-----------|---------------------|----------|---------|-------------| -| `options` | [options](#options) | **Yes** | | | -| `type` | string | **Yes** | | | - -### Templating - -Configured template variables - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------|----------|---------|----------------------------------------------------------------------------------------------| -| `list` | [VariableModel](#variablemodel)[] | No | | List of configured template variables with their saved values along with some other metadata | - -### VariableModel - -A variable is a placeholder for a value. You can use variables in metric queries and in panel titles. - -| Property | Type | Required | Default | Description | -|---------------|-------------------------------------|----------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `name` | string | **Yes** | | Name of variable | -| `type` | string | **Yes** | | Dashboard variable type
`query`: Query-generated list of values such as metric names, server names, sensor IDs, data centers, and so on.
`adhoc`: Key/value filters that are automatically added to all metric queries for a data source (Prometheus, Loki, InfluxDB, and Elasticsearch only).
`constant`: Define a hidden constant.
`datasource`: Quickly change the data source for an entire dashboard.
`interval`: Interval variables represent time spans.
`textbox`: Display a free text input field with an optional default value.
`custom`: Define the variable options manually using a comma-separated list.
`system`: Variables defined by Grafana. See: https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables
Possible values are: `query`, `adhoc`, `groupby`, `constant`, `datasource`, `interval`, `textbox`, `custom`, `system`. | -| `allValue` | string | No | | Custom all value | -| `current` | [VariableOption](#variableoption) | No | | Option to be selected in a variable. | -| `datasource` | [DataSourceRef](#datasourceref) | No | | Ref to a DataSource instance | -| `description` | string | No | | Description of variable. It can be defined but `null`. | -| `hide` | integer | No | | Determine if the variable shows on dashboard
Accepted values are 0 (show label and value), 1 (show value only), 2 (show nothing).
Possible values are: `0`, `1`, `2`. | -| `includeAll` | boolean | No | `false` | Whether all value option is available or not | -| `label` | string | No | | Optional display name | -| `multi` | boolean | No | `false` | Whether multiple values can be selected or not from variable value list | -| `options` | [VariableOption](#variableoption)[] | No | | Options that can be selected for a variable. | -| `query` | | No | | Query used to fetch values for a variable | -| `refresh` | integer | No | | Options to config when to refresh a variable
`0`: Never refresh the variable
`1`: Queries the data source every time the dashboard loads.
`2`: Queries the data source when the dashboard time range changes.
Possible values are: `0`, `1`, `2`. | -| `regex` | string | No | | Optional field, if you want to extract part of a series name or metric node segment.
Named capture groups can be used to separate the display text and value. | -| `skipUrlSync` | boolean | No | `false` | Whether the variable value should be managed by URL query params or not | -| `sort` | integer | No | | Sort variable options
Accepted values are:
`0`: No sorting
`1`: Alphabetical ASC
`2`: Alphabetical DESC
`3`: Numerical ASC
`4`: Numerical DESC
`5`: Alphabetical Case Insensitive ASC
`6`: Alphabetical Case Insensitive DESC
`7`: Natural ASC
`8`: Natural DESC
Possible values are: `0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`. | - -### VariableOption - -Option to be selected in a variable. - -| Property | Type | Required | Default | Description | -|------------|---------|----------|---------|---------------------------------------| -| `text` | | **Yes** | | Text to be displayed for the option | -| `value` | | **Yes** | | Value of the option | -| `selected` | boolean | No | | Whether the option is selected or not | - -### Time - -Time range for dashboard. -Accepted values are relative time strings like {from: 'now-6h', to: 'now'} or absolute time strings like {from: '2020-07-10T08:00:00.000Z', to: '2020-07-10T14:00:00.000Z'}. - -| Property | Type | Required | Default | Description | -|----------|--------|----------|----------|-------------| -| `from` | string | **Yes** | `now-6h` | | -| `to` | string | **Yes** | `now` | | - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/core/folder/schema-reference.md b/docs/sources/developers/kinds/core/folder/schema-reference.md deleted file mode 100644 index cbc8f41c417..00000000000 --- a/docs/sources/developers/kinds/core/folder/schema-reference.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: Folder kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## Folder - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - -A folder is a collection of resources that are grouped together and can share permissions. - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | TODO:
common metadata will soon support setting the parent folder in the metadata | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -TODO: -common metadata will soon support setting the parent folder in the metadata - -| Property | Type | Required | Default | Description | -|---------------|--------|----------|---------|--------------------------------------| -| `title` | string | **Yes** | | Folder title | -| `uid` | string | **Yes** | | Unique folder id. (will be k8s name) | -| `description` | string | No | | Description of the folder. | - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/core/librarypanel/schema-reference.md b/docs/sources/developers/kinds/core/librarypanel/schema-reference.md deleted file mode 100644 index eaab5f35448..00000000000 --- a/docs/sources/developers/kinds/core/librarypanel/schema-reference.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: LibraryPanel kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## LibraryPanel - -#### Maturity: [experimental](../../../maturity/#experimental) -#### Version: 0.0 - -A standalone panel - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -| Property | Type | Required | Default | Description | -|-----------------|-------------------------------------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------| -| `model` | [object](#model) | **Yes** | | TODO: should be the same panel schema defined in dashboard
Typescript: Omit; | -| `name` | string | **Yes** | | Panel name (also saved in the model)
Constraint: `length >=1`. | -| `type` | string | **Yes** | | The panel type (from inside the model)
Constraint: `length >=1`. | -| `uid` | string | **Yes** | | Library element UID | -| `version` | integer | **Yes** | | panel version, incremented each time the dashboard is updated. | -| `description` | string | No | | Panel description | -| `folderUid` | string | No | | Folder UID | -| `meta` | [LibraryElementDTOMeta](#libraryelementdtometa) | No | | | -| `schemaVersion` | uint16 | No | | Dashboard version when this was saved (zero if unknown) | - -### LibraryElementDTOMeta - -| Property | Type | Required | Default | Description | -|-----------------------|---------------------------------------------------------|----------|---------|-------------| -| `connectedDashboards` | integer | **Yes** | | | -| `createdBy` | [LibraryElementDTOMetaUser](#libraryelementdtometauser) | **Yes** | | | -| `created` | string | **Yes** | | | -| `folderName` | string | **Yes** | | | -| `folderUid` | string | **Yes** | | | -| `updatedBy` | [LibraryElementDTOMetaUser](#libraryelementdtometauser) | **Yes** | | | -| `updated` | string | **Yes** | | | - -### LibraryElementDTOMetaUser - -| Property | Type | Required | Default | Description | -|-------------|---------|----------|---------|-------------| -| `avatarUrl` | string | **Yes** | | | -| `id` | integer | **Yes** | | | -| `name` | string | **Yes** | | | - -### Model - -TODO: should be the same panel schema defined in dashboard -Typescript: Omit; - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/core/preferences/schema-reference.md b/docs/sources/developers/kinds/core/preferences/schema-reference.md deleted file mode 100644 index e5ac35187cd..00000000000 --- a/docs/sources/developers/kinds/core/preferences/schema-reference.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: Preferences kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## Preferences - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - -The user or team frontend preferences - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | Spec defines user, team or org Grafana preferences
swagger:model Preferences | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -Spec defines user, team or org Grafana preferences -swagger:model Preferences - -| Property | Type | Required | Default | Description | -|---------------------|---------------------------------------------------|----------|---------|---------------------------------------------------------------------------------| -| `cookiePreferences` | [CookiePreferences](#cookiepreferences) | No | | | -| `homeDashboardUID` | string | No | | UID for the home dashboard | -| `language` | string | No | | Selected language (beta) | -| `queryHistory` | [QueryHistoryPreference](#queryhistorypreference) | No | | | -| `theme` | string | No | | light, dark, empty is default | -| `timezone` | string | No | | The timezone selection
TODO: this should use the timezone defined in common | -| `weekStart` | string | No | | day of the week (sunday, monday, etc) | - -### CookiePreferences - -| Property | Type | Required | Default | Description | -|---------------|------------------------|----------|---------|-------------| -| `analytics` | [object](#analytics) | No | | | -| `functional` | [object](#functional) | No | | | -| `performance` | [object](#performance) | No | | | - -### Analytics - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Functional - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Performance - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### QueryHistoryPreference - -| Property | Type | Required | Default | Description | -|-----------|--------|----------|---------|---------------------------------------------| -| `homeTab` | string | No | | one of: '' | 'query' | 'starred'; | - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/core/publicdashboard/schema-reference.md b/docs/sources/developers/kinds/core/publicdashboard/schema-reference.md deleted file mode 100644 index 3f6f3ab223c..00000000000 --- a/docs/sources/developers/kinds/core/publicdashboard/schema-reference.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: PublicDashboard kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## PublicDashboard - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - -Public dashboard configuration - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -| Property | Type | Required | Default | Description | -|------------------------|---------|----------|---------|-----------------------------------------------------------------| -| `annotationsEnabled` | boolean | **Yes** | | Flag that indicates if annotations are enabled | -| `dashboardUid` | string | **Yes** | | Dashboard unique identifier referenced by this public dashboard | -| `isEnabled` | boolean | **Yes** | | Flag that indicates if the public dashboard is enabled | -| `timeSelectionEnabled` | boolean | **Yes** | | Flag that indicates if the time range picker is enabled | -| `uid` | string | **Yes** | | Unique public dashboard identifier | -| `accessToken` | string | No | | Unique public access token | - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/core/role/schema-reference.md b/docs/sources/developers/kinds/core/role/schema-reference.md deleted file mode 100644 index b5d96f79479..00000000000 --- a/docs/sources/developers/kinds/core/role/schema-reference.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: Role kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## Role - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - -Roles represent a set of users+teams that should share similar access - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -| Property | Type | Required | Default | Description | -|---------------|---------|----------|---------|-----------------------------------------------------------| -| `hidden` | boolean | **Yes** | | Do not show this role | -| `name` | string | **Yes** | | The role identifier `managed:builtins:editor:permissions` | -| `description` | string | No | | Role description | -| `displayName` | string | No | | Optional display | -| `groupName` | string | No | | Name of the team. | - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/core/rolebinding/schema-reference.md b/docs/sources/developers/kinds/core/rolebinding/schema-reference.md deleted file mode 100644 index 370a2a82ccf..00000000000 --- a/docs/sources/developers/kinds/core/rolebinding/schema-reference.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: RoleBinding kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## RoleBinding - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - -Role bindings links a user|team to a configured role - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -| Property | Type | Required | Default | Description | -|-----------|-------------------------------------------|----------|---------|----------------------------| -| `role` | [object](#role) | **Yes** | | The role we are discussing | -| `subject` | [RoleBindingSubject](#rolebindingsubject) | **Yes** | | | - -### RoleBindingSubject - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------------------------| -| `kind` | string | **Yes** | | Possible values are: `Team`, `User`. | -| `name` | string | **Yes** | | The team/user identifier name | - -### Role - -The role we are discussing - -| Property | Type | Required | Default | Description | -|----------|-----------------------------------------------------------------------------------------|----------|---------|-------------| -| `object` | Possible types are: [BuiltinRoleRef](#builtinroleref), [CustomRoleRef](#customroleref). | | | - -### BuiltinRoleRef - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|---------------------------------------------------| -| `kind` | string | **Yes** | | Possible values are: `BuiltinRole`. | -| `name` | string | **Yes** | | Possible values are: `viewer`, `editor`, `admin`. | - -### CustomRoleRef - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|------------------------------| -| `kind` | string | **Yes** | | Possible values are: `Role`. | -| `name` | string | **Yes** | | | - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/core/serviceaccount/schema-reference.md b/docs/sources/developers/kinds/core/serviceaccount/schema-reference.md deleted file mode 100644 index 4c609ec6bba..00000000000 --- a/docs/sources/developers/kinds/core/serviceaccount/schema-reference.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -keywords: -- grafana -- schema -labels: - products: - - enterprise - - oss -title: ServiceAccount kind ---- - -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## ServiceAccount - -#### Maturity: [merged](../../../maturity/#merged) - -#### Version: 0.0 - -system account - -| Property | Type | Required | Default | Description | -| ---------- | ------------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [\_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -| ------------------- | ---------------------- | -------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------- | -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | _(Inherited from [\_kubeObjectMetadata](#_kubeobjectmetadata))_ | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | _(Inherited from [\_kubeObjectMetadata](#_kubeobjectmetadata))_ | -| `labels` | map[string]string | **Yes** | | _(Inherited from [\_kubeObjectMetadata](#_kubeobjectmetadata))_ | -| `resourceVersion` | string | **Yes** | | _(Inherited from [\_kubeObjectMetadata](#_kubeobjectmetadata))_ | -| `uid` | string | **Yes** | | _(Inherited from [\_kubeObjectMetadata](#_kubeobjectmetadata))_ | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | _(Inherited from [\_kubeObjectMetadata](#_kubeobjectmetadata))_ | - -### \_kubeObjectMetadata - -\_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -| ------------------- | ----------------- | -------- | ------- | ----------- | -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -| -------- | ---- | -------- | ------- | ----------- | - -### Spec - -| Property | Type | Required | Default | Description | -| --------------- | ------------------ | -------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------- | -| `avatarUrl` | string | **Yes** | | AvatarUrl is the service account's avatar URL. It allows the frontend to display a picture in front
of the service account. | -| `id` | integer | **Yes** | | ID is the unique identifier of the service account in the database. | -| `isDisabled` | boolean | **Yes** | | IsDisabled indicates if the service account is disabled. | -| `login` | string | **Yes** | | Login of the service account. | -| `name` | string | **Yes** | | Name of the service account. | -| `orgId` | integer | **Yes** | | OrgId is the ID of an organisation the service account belongs to. | -| `role` | string | **Yes** | | OrgRole is a Grafana Organization Role which can be 'Viewer', 'Editor', 'Admin'.
Possible values are: `Admin`, `Editor`, `Viewer`. | -| `tokens` | integer | **Yes** | | Tokens is the number of active tokens for the service account.
Tokens are used to authenticate the service account against Grafana. | -| `accessControl` | map[string]boolean | No | | AccessControl metadata associated with a given resource. | -| `teams` | string[] | No | | Teams is a list of teams the service account belongs to. | - -### Status - -| Property | Type | Required | Default | Description | -| ------------------ | ---------------------------------------------------------- | -------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -| -------- | ---- | -------- | ------- | ----------- | - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -| ------------------ | ------------------ | -------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -| -------- | ---- | -------- | ------- | ----------- | diff --git a/docs/sources/developers/kinds/core/team/schema-reference.md b/docs/sources/developers/kinds/core/team/schema-reference.md deleted file mode 100644 index 6f759abf319..00000000000 --- a/docs/sources/developers/kinds/core/team/schema-reference.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -keywords: - - grafana - - schema -labels: - products: - - cloud - - enterprise - - oss -title: Team kind ---- -> Both documentation generation and kinds schemas are in active development and subject to change without prior notice. - -## Team - -#### Maturity: [merged](../../../maturity/#merged) -#### Version: 0.0 - -A team is a named grouping of Grafana users to which access control rules may be assigned. - -| Property | Type | Required | Default | Description | -|------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `metadata` | [object](#metadata) | **Yes** | | metadata contains embedded CommonMetadata and can be extended with custom string fields
TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
without external reference as using the CommonMetadata reference breaks thema codegen. | -| `spec` | [object](#spec) | **Yes** | | | -| `status` | [object](#status) | **Yes** | | | - -### Metadata - -metadata contains embedded CommonMetadata and can be extended with custom string fields -TODO: use CommonMetadata instead of redefining here; currently needs to be defined here -without external reference as using the CommonMetadata reference breaks thema codegen. - -It extends [_kubeObjectMetadata](#_kubeobjectmetadata). - -| Property | Type | Required | Default | Description | -|---------------------|------------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------| -| `createdBy` | string | **Yes** | | | -| `creationTimestamp` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `extraFields` | [object](#extrafields) | **Yes** | | extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata | -| `finalizers` | string[] | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `labels` | map[string]string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `resourceVersion` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `uid` | string | **Yes** | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | -| `updateTimestamp` | string | **Yes** | | | -| `updatedBy` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | *(Inherited from [_kubeObjectMetadata](#_kubeobjectmetadata))* | - -### _kubeObjectMetadata - -_kubeObjectMetadata is metadata found in a kubernetes object's metadata field. -It is not exhaustive and only includes fields which may be relevant to a kind's implementation, -As it is also intended to be generic enough to function with any API Server. - -| Property | Type | Required | Default | Description | -|---------------------|-------------------|----------|---------|-------------| -| `creationTimestamp` | string | **Yes** | | | -| `finalizers` | string[] | **Yes** | | | -| `labels` | map[string]string | **Yes** | | | -| `resourceVersion` | string | **Yes** | | | -| `uid` | string | **Yes** | | | -| `deletionTimestamp` | string | No | | | - -### ExtraFields - -extraFields is reserved for any fields that are pulled from the API server metadata but do not have concrete fields in the CUE metadata - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Spec - -| Property | Type | Required | Default | Description | -|----------|--------|----------|---------|--------------------| -| `name` | string | **Yes** | | Name of the team. | -| `email` | string | No | | Email of the team. | - -### Status - -| Property | Type | Required | Default | Description | -|--------------------|------------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `additionalFields` | [object](#additionalfields) | No | | additionalFields is reserved for future use | -| `operatorStates` | map[string][status.#OperatorState](#status.#operatorstate) | No | | operatorStates is a map of operator ID to operator state evaluations.
Any operator which consumes this kind SHOULD add its state evaluation information to this field. | - -### AdditionalFields - -additionalFields is reserved for future use - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - -### Status.#OperatorState - -| Property | Type | Required | Default | Description | -|--------------------|--------------------|----------|---------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `lastEvaluation` | string | **Yes** | | lastEvaluation is the ResourceVersion last evaluated | -| `state` | string | **Yes** | | state describes the state of the lastEvaluation.
It is limited to three possible states for machine evaluation.
Possible values are: `success`, `in_progress`, `failed`. | -| `descriptiveState` | string | No | | descriptiveState is an optional more descriptive state field which has no requirements on format | -| `details` | [object](#details) | No | | details contains any extra information that is operator-specific | - -### Details - -details contains any extra information that is operator-specific - -| Property | Type | Required | Default | Description | -|----------|------|----------|---------|-------------| - - diff --git a/docs/sources/developers/kinds/maturity.md b/docs/sources/developers/kinds/maturity.md deleted file mode 100644 index e9a6264f2f0..00000000000 --- a/docs/sources/developers/kinds/maturity.md +++ /dev/null @@ -1,298 +0,0 @@ ---- -keywords: -- grafana -- schema -- maturity -labels: - products: - - enterprise - - oss -title: Grafana Kinds - From Zero to Maturity -weight: 300 ---- - -# Grafana Kinds - From Zero to Maturity - -> Grafana’s schema, Kind, and related codegen systems are under intense development. - -Fear of unknown impacts leads to defensive coding, slow PRs, circular arguments, and an overall hesitance to engage. -That friction alone is sufficient to sink a large-scale project. This guide seeks to counteract this friction by -defining an end goal for all schemas: “mature.” This is the word we’re using to refer to the commonsense notion of “this -software reached 1.0.” - -In general, 1.0/mature suggests: “we’ve thought about this thing, done the necessary experimenting, know what it is, and -feel confident about presenting it to the world.” In the context of schemas intended to act as a single source of truth -driving many use cases, we can intuitively phrase maturity as: - -- The schema follows general best practices (e.g. good comments, follows field type rules), and the team owning the - schema believes that the fields described in the schema are accurate. -- Automation propagates the schema as source of truth to every relevant - [domain](https://docs.google.com/document/d/13Rv395_T8WTLBgdL-2rbXKu0fx_TW-Q9yz9x6oBjm6g/edit#heading=h.67pop2k2f8fq) - (for example: types in frontend, backend, as-code; plugins SDK; docs; APIs and storage; search indexing) - -This intuitive definition gets us pointed in the right direction. But we can’t just jump straight there - we have to -approach it methodically. To that end, this doc outlines four (ok five, but really, four) basic maturity milestones that -we expect Kinds and their schemas to progress through: - -- _(Planned - Put a Kind name on the official TODO list)_ -- **Merged** - Get an initial schema written down. Not final. Not perfect. -- **Experimental** - Kind schemas are the source of truth for basic working code. -- **Stable** - Kind schemas are the source of truth for all target domains. -- **Mature** - The operational transition path for the Kind is battle-tested and reliable. - -These milestones have functional definitions, tied to code and enforced in CI. A Kind having reached a particular -milestone corresponds to properties of the code that are enforced in CI; advancing to the next milestone likely has a -direct impact on code generation and runtime behavior. - -Finally, the above definitions imply that maturity for _individual Kinds/schemas_ depends on _the Kind system_ being -mature, as well. This is by design: **Grafana Labs does not intend to publicize any single schema as mature until -[certain schema system milestones are met](https://github.com/orgs/grafana/projects/133/views/8).** - -## Schema Maturity Milestones - -Maturity milestones are a linear progression. Each milestone implies that the conditions of its predecessors continue to -be met. - -Reaching a particular milestone implies that the properties of all prior milestones are still met. - -### (Milestone 0 - Planned) {#planned} - -| **Goal** | Put a Kind name on the official TODO list: [Kind Schematization Progress Tracker](https://docs.google.com/spreadsheets/d/1DL6nZHyX42X013QraWYbKsMmHozLrtXDj8teLKvwYMY/edit#gid=0) | -| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Reached when** | The planned Kind is listed in the relevant sheet of the progress tracker with a link to track / be able to see when exactly it is planned and who is responsible for doing it | -| **Common hurdles** | Existing definitions may not correspond clearly to an object boundary - e.g. playlists are currently in denormalized SQL tables playlist and playlist_item | -| **Public-facing guarantees** | None | -| **customer-facing stage** | None | - -### Milestone 1 - Merged {#merged} - -| **Goal** | Get an initial schema written down. Not final. Not perfect. | -| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Reached when** | A PR introducing the initial version of a schema has been merged. | -| **Common hurdles** | Getting comfortable with Thema and CUE
Figuring out where all the existing definitions of the Kind are
Knowing whether it’s safe to omit possibly-crufty fields from the existing definitions when writing the schema | -| **Public-facing guarantees** | None | -| **User-facing stage** | None | - -### Milestone 2 - Experimental {#experimental} - -| **Goal** | Schemas are the source of truth for basic working code. | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Reached when** | Go and TypeScript types generated from schema are used in all relevant production code, having replaced handwritten type definitions (if any). | -| **Common hurdles** | Compromises on field definitions that seemed fine to reach “committed” start to feel unacceptable
Ergonomics of generated code may start to bite
Aligning with the look and feel of related schemas | -| **Public-facing guarantees** | Kinds are available for as-code usage in [grok](https://github.com/grafana/grok), and in tools downstream of grok, following all of grok’s standard patterns. | -| **Stage comms** | Internal users:- Start using the schema and give feedback internally to help move to the next stage.External users:- Align with the [experimental](https://docs.google.com/document/d/1lqp0hALax2PT7jSObsX52EbQmIDFnLFMqIbBrJ4EYCE/edit#heading=h.ehl5iy7pcjvq) stage in the release definition document.  - Experimental schemas will be discoverable, and from a customer PoV should never be used in production, but they can be explored and we are more than happy to receive feedback | - -## Schema-writing guidelines - -### Avoid anonymous nested structs - -**_Always name your sub-objects._** - -In CUE, nesting structs is like nesting objects in JSON, and just as easy: - -```json -one: { - two: { - three: { - } -} -``` - -While these can be accurately represented in other languages, they aren’t especially friendly to work with: - -```typescript -// TypeScript -export interface One { - two: { - three: string; - }; -} -``` - -```go -// Go -type One struct { - Two struct { - Three string `json:"three"` - } `json:"two"` -} -``` - -Instead, within your schema, prefer to make root-level definitions with the appropriate attributes: - -```cue -// Cue -one: { - two: #Two - #Two: { - three: string - } @cuetsy(kind="interface") -} -``` - -```Typescript -// TypeScript -export interface Two { - three: string; -} -export interface One { - two: Two; -} -``` - -```Go -// Go -type One struct { - Two Two `json:"two"` -} -type Two struct { - Three string `json:"three"` -} -``` - -### Use precise numeric types - -**_Use precise numeric types like `float64` or `uint32`. Never use `number`._** - -Never use `number` for a numeric type in a schema. - -Instead, use a specific, sized type like `int64` or `float32`. This makes your intent precisely clear. -TypeScript will still represent these fields with `number`, but other languages (e.g. Go, Protobuf) can be more precise. - -Unlike in Go, int and uint are not your friends. These correspond to `math/big` types. Use a sized type, -like `uint32` or `int32`, unless the use case specifically requires a huge numeric space. - -### No explicit `null` - -**_Do not use `null` as a type in any schema._** - -This one is tricky to think about, and requires some background. - -Historically, Grafana’s dashboard JSON has often contained fields with the explicit value `null`. -This was problematic, because explicit `null` introduces an ambiguity: is a JSON field being present -with value null meaningfully different from the field being absent? That is, should a program behave differently -if it encounters a null vs. an absent field? - -In almost all cases, the answer is “no.” Thus, the ambiguity: if both explicit null and absence are _accepted_ -by a system, it pushes responsibility onto anyone writing code in that system to decide, case-by-case, -whether the two are _intended to be meaningfully different_, and therefore whether behavior should be different. - -CUE does have a `null` type, and only accepts data containing `nulls` as valid if the schema explicitly allows a `null`. -That means, by default, using CUE for schemas removes the possibility of ambiguity in code that receives data validated -by those schemas, even if the language they’re writing in still allows for ambiguity. (Javascript does, Go doesn’t.) - -As a schema author, this means you’re being unambiguous by default - no `nulls`. That’s good! The only question is -whether it’s worth explicitly allowing a `null` for some particular case: - -```Cue -someField: int32 | null -``` - -The _only_ time this _may_ be a good idea is if your field needs to be able to represent a value -that is not otherwise acceptable within the value space - for example, if `someField` needs to be able to contain -[Infinity](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY). -When such values are serialized to null by default, it can be convenient to accept null in the schema - but even then, -explicit null is unlikely to be the best way to represent such values, because it is so subtle and falsey. - -**Above all, DO NOT accept `null` in a schema simply because current behavior sometimes unintentionally produces a `null`.** -Schematization is an opportunity to get rid of this ambiguity. Fix the accidental null-producing behavior, instead. - -### Issues - -- If a schema has a "kind" field and its set as enum, it generates a Kind alias that conflicts with the generated - Kind struct. -- Byte fields are existing in Go but not in TS, so the generator fails. -- **omitempty** is useful when we return things like json.RawMessage (alias of []byte) because Postgres saves this - information as `nil`, when MySQL and SQLite save it as `{}`. If we found it in the rest of the cases, it isn't necessary - to set `?` in the field in the schema. - -## Schema Attributes - -Grafana’s schema system relies on [CUE attributes](https://cuelang.org/docs/references/spec/#attributes)declared on -properties within schemas to control some aspects of code generation behavior. -In a schema, an attribute is the whole of `@cuetsy(kind=”type”)`: - -```Cue -field: string @cuetsy(kind="type") -``` - -CUE attributes are purely informational - they cannot influence CUE evaluation behavior, including the types being -expressed in a Thema schema. - -CUE attributes have three parts. In `@cuetsy(kind=”type”)`, those are: - -- name - `@cuetsy` -- arg - `kind` -- argval - `“type”` - -Any given attribute may consist of `{name}`, `{name,arg}`, or `{name,arg,argval}`. These three levels form a tree -(meaning of any argval is specific to its arg, which is specific to its name). The following documentation represents -this tree using a header hierarchy. - -### @cuetsy - -These attributes control the behavior of the [cuetsy code generator](https://github.com/grafana/cuetsy), which converts -CUE to TypeScript. We include only the kind arg here for brevity; cuetsy’s README has the canonical documentation on all -supported args and argvals, and their intended usage. - -Notes: - -- Only top-level fields in a Thema schema are scanned for `@cuetsy` attributes. -- Grafana’s code generators hardcode that an interface (`@cuetsy(kind=”interface”)`) is generated to represent the root - schema object, unless it is known to be a [grouped lineage](https://docs.google.com/document/d/13Rv395_T8WTLBgdL-2rbXKu0fx_TW-Q9yz9x6oBjm6g/edit#heading=h.vx7stzpxtw4t). - -#### kind - -Indicates the kind of TypeScript symbol that should be generated for that schema field. - -#### interface - -Generate the schema field as a TS interface. Field must be struct-kinded. - -#### enum - -Generate the schema field as a TS enum. Field must be either int-kinded (numeric enums) or string-kinded (string enums). - -#### type - -Generate the schema field as a TS type alias. - -### @grafana - -These attributes control code generation behaviors that are specific to Grafana core. Some may also be supported -in plugin code generators. - -#### TSVeneer - -Applying a TSVeneer arg to a field in a schema indicates that the schema author wants to enrich the generated type -(for example by adding generic type parameters), so code generation should expect a handwritten -[veneer](https://docs.google.com/document/d/13Rv395_T8WTLBgdL-2rbXKu0fx_TW-Q9yz9x6oBjm6g/edit#heading=h.bmtjq0bb1yxp). - -TSVeneer requires at least one argval, each of which impacts TypeScript code generation in its own way. -Multiple argvals may be given, separated by `|`. - -A TSVeneer arg has no effect if it is applied to a field that is not exported as a standalone TypeScript type -(which usually means a CUE field that also has an `@cuetsy(kind=)` attribute). - -#### type - -A handwritten veneer is needed to refine the raw generated TypeScript type, for example by adding generics. -See [the dashboard types veneer](https://github.com/grafana/grafana/blob/5f93e67419e9587363d1fc1e6f1f4a8044eb54d0/packages/grafana-schema/src/veneer/dashboard.types.ts) -for an example, and [some](https://github.com/grafana/grafana/blob/5f93e67419e9587363d1fc1e6f1f4a8044eb54d0/kinds/dashboard/dashboard_kind.cue#L12) -[corresponding](https://github.com/grafana/grafana/blob/5f93e67419e9587363d1fc1e6f1f4a8044eb54d0/kinds/dashboard/dashboard_kind.cue#L143) -CUE attributes. - -### @grafanamaturity - -These attributes are used to support iterative development of a schema towards maturity. - -Grafana code generators and CI enforce that schemas marked as mature MUST NOT have any `@grafanamaturity` attributes. - -#### NeedsExpertReview - -Indicates that a non-expert on that schema wrote the field, and was not fully confident in its type and/or docs. - -Primarily useful on very large schemas, like the dashboard schema, for getting _something_ written down for a given -field that at least makes validation tests pass, but making clear that the field isn’t necessarily properly correct. - -No argval is accepted. (Use a `//` comment to say more about the attention that’s needed.) diff --git a/docs/sources/developers/plugins/plugin.schema.json b/docs/sources/developers/plugins/plugin.schema.json index 57f14a4f350..4947f96e0f2 100644 --- a/docs/sources/developers/plugins/plugin.schema.json +++ b/docs/sources/developers/plugins/plugin.schema.json @@ -505,32 +505,6 @@ } } } - }, - "impersonation": { - "type": "object", - "description": "Impersonation describes the permissions that the plugin will be restricted to when acting on behalf of the user.", - "properties": { - "groups": { - "type": "boolean", - "description": "Groups allows the service to list the impersonated user's teams." - }, - "permissions": { - "type": "array", - "description": "Permissions are the permissions that the plugin needs when impersonating a user. The intersection of this set with the impersonated user's permission guarantees that the client will not gain more privileges than the impersonated user has.", - "items": { - "type": "object", - "additionalProperties": false, - "properties": { - "action": { - "type": "string" - }, - "scope": { - "type": "string" - } - } - } - } - } } } }, diff --git a/docs/sources/explore/_index.md b/docs/sources/explore/_index.md index 640c9785aa2..eed69a7ba28 100644 --- a/docs/sources/explore/_index.md +++ b/docs/sources/explore/_index.md @@ -25,6 +25,8 @@ If you just want to explore your data and do not want to create a dashboard, the - [Query management in Explore]({{< relref "query-management/" >}}) - [Logs integration in Explore]({{< relref "logs-integration/" >}}) - [Trace integration in Explore]({{< relref "trace-integration/" >}}) +- [Explore metrics]({{< relref "explore-metrics/" >}}) +- [Correlations Editor in Explore]({{< relref "correlations-editor-in-explore/" >}}) - [Inspector in Explore]({{< relref "explore-inspector/" >}}) ## Start exploring diff --git a/docs/sources/explore/logs-integration.md b/docs/sources/explore/logs-integration.md index 703c87829ed..92ffc6eabe7 100644 --- a/docs/sources/explore/logs-integration.md +++ b/docs/sources/explore/logs-integration.md @@ -21,6 +21,7 @@ Explore is a powerful tool for logging and log analysis. It allows you to invest - [Cloudwatch]({{< relref "../datasources/aws-cloudwatch" >}}) - [InfluxDB]({{< relref "../datasources/influxdb" >}}) - [Azure Monitor]({{< relref "../datasources/azure-monitor" >}}) +- [ClickHouse](https://github.com/grafana/clickhouse-datasource) With Explore, you can efficiently monitor, troubleshoot, and respond to incidents by analyzing your logs and identifying the root causes. It also helps you to correlate logs with other telemetry signals such as metrics, traces or profiles, by viewing them side-by-side. diff --git a/docs/sources/explore/trace-integration.md b/docs/sources/explore/trace-integration.md index db4e261fb07..59408b56765 100644 --- a/docs/sources/explore/trace-integration.md +++ b/docs/sources/explore/trace-integration.md @@ -23,6 +23,7 @@ Supported data sources are: - [Zipkin]({{< relref "../datasources/zipkin/" >}}) - [X-Ray](https://grafana.com/grafana/plugins/grafana-x-ray-datasource) - [Azure Monitor Application Insights]({{< relref "../datasources/azure-monitor/" >}}) +- [ClickHouse](https://github.com/grafana/clickhouse-datasource) For information on how to configure queries for the data sources listed above, refer to the documentation for specific data source. @@ -38,6 +39,7 @@ For information on querying each data source, refer to their documentation: - [Jaeger query editor]({{< relref "../datasources/jaeger/#query-the-data-source" >}}) - [Zipkin query editor]({{< relref "../datasources/zipkin/#query-the-data-source" >}}) - [Azure Monitor Application Insights query editor]({{< relref "../datasources/azure-monitor/query-editor/#query-application-insights-traces" >}}) +- [ClickHouse query editor](https://clickhouse.com/docs/en/integrations/grafana/query-builder#traces) ## Trace view diff --git a/docs/sources/getting-started/build-first-dashboard.md b/docs/sources/getting-started/build-first-dashboard.md index fd76142ab5f..6b21909b9a5 100644 --- a/docs/sources/getting-started/build-first-dashboard.md +++ b/docs/sources/getting-started/build-first-dashboard.md @@ -69,9 +69,7 @@ To create your first dashboard using the built-in `-- Grafana --` data source: Alternatively, click **Apply** if you want to see your changes applied to the dashboard first. Then click the save icon in the dashboard header. -1. Add a descriptive title for the dashboard, and then click **Save**. - - Alternatively, Grafana can generate a dashboard title and summary for you using the OpenAI integration. Learn more in the [Set up generative AI features for dashboards documentation](https://grafana.com/docs/grafana//dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards). +1. Add a descriptive title for the dashboard, or have Grafana create one using [generative AI features](https://grafana.com/docs/grafana//dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards), and then click **Save**. Congratulations, you have created your first dashboard and it's displaying results. diff --git a/docs/sources/getting-started/get-started-grafana-ms-sql-server.md b/docs/sources/getting-started/get-started-grafana-ms-sql-server.md index b9f0a95fa47..2ca4dcac2b4 100644 --- a/docs/sources/getting-started/get-started-grafana-ms-sql-server.md +++ b/docs/sources/getting-started/get-started-grafana-ms-sql-server.md @@ -28,18 +28,60 @@ If you are on a Windows host but want to use Grafana and MS SQL data source on a #### Add the MS SQL data source +There are several ways to authenticate in MSSQL. Start by: + 1. Click **Connections** in the left-side menu and filter by `mssql`. 1. Select the **Microsoft SQL Server** option. 1. Click **Create a Microsoft SQL Server data source** in the top right corner to open the configuration page. -1. Enter the information specified in the table below, then click **Save & test**. +1. Select the desired authentication method and fill in the right information as detailed below. +1. Click **Save & test**. + +##### General configuration | Name | Description | | ---------- | --------------------------------------------------------------------------------------------------------------------- | | `Name` | The data source name. This is how you refer to the data source in panels and queries. | | `Host` | The IP address/hostname and optional port of your MS SQL instance. If port is omitted, the default 1433 will be used. | | `Database` | Name of your MS SQL database. | -| `User` | Database user's login/username. | -| `Password` | Database user's password. | + +##### SQL Server Authentication + +| Name | Description | +| ---------- | ------------------------------- | +| `User` | Database user's login/username. | +| `Password` | Database user's password. | + +##### Windows Active Directory (Kerberos) + +Below are the four possible ways to authenticate via Windows Active Directory/Kerberos. + +{{< admonition type="note" >}} +Windows Active Directory (Kerberos) authentication is not supported in Grafana Cloud at the moment. +{{< /admonition >}} + +| Method | Description | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Username + password** | Enter the domain user and password | +| **Keytab file** | Specify the path to a valid keytab file to use that for authentication. | +| **Credential cache** | Log in on the host via `kinit` and pass the path to the credential cache. The cache path can be found by running `klist` on the host in question. | +| **Credential cache file** | This option allows multiple valid configurations to be present and matching is performed on host, database, and user. See the example JSON below this table. | + +```json +[ + { + "user": "grot@GF.LAB", + "database": "dbone", + "address": "mysql1.mydomain.com:3306", + "credentialCache": "/tmp/krb5cc_1000" + }, + { + "user": "grot@GF.LAB", + "database": "dbtwo", + "address": "mysql2.gf.lab", + "credentialCache": "/tmp/krb5cc_1000" + } +] +``` For installations from the [grafana/grafana](https://github.com/grafana/grafana/tree/main) repository, `gdev-mssql` data source is available. Once you add this data source, you can use the `Datasource tests - MSSQL` dashboard with three panels showing metrics generated from a test database. diff --git a/docs/sources/old-alerting/_index.md b/docs/sources/old-alerting/_index.md deleted file mode 100644 index 12dd7a2687f..00000000000 --- a/docs/sources/old-alerting/_index.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -draft: true -labels: - products: - - enterprise - - oss -title: Legacy Grafana alerts -weight: 114 ---- - -# Legacy Grafana alerts - -Grafana Alerting is enabled by default for new OSS installations. For older installations, it is still an [opt-in]({{< relref "../alerting/migrating-alerts/opt-in" >}}) feature. - -{{% admonition type="note" %}} -Legacy dashboard alerts are deprecated and will be removed in Grafana 9. We encourage you to migrate to [Grafana Alerting]({{< relref "../alerting/migrating-alerts" >}}) for all existing installations. -{{% /admonition %}} - -Legacy dashboard alerts have two main components: - -- Alert rule - When the alert is triggered. Alert rules are defined by one or more conditions that are regularly evaluated by Grafana. -- Notification channel - How the alert is delivered. When the conditions of an alert rule are met, the Grafana notifies the channels configured for that alert. - -## Alert tasks - -You can perform the following tasks for alerts: - -- [Create an alert rule]({{< relref "./create-alerts" >}}) -- [View existing alert rules and their current state]({{< relref "./view-alerts" >}}) -- [Test alert rules and troubleshoot]({{< relref "./troubleshoot-alerts" >}}) -- [Add or edit an alert contact point]({{< relref "./notifications" >}}) - -{{< docs/shared lookup="alerts/grafana-managed-alerts.md" source="grafana" version="" >}} diff --git a/docs/sources/old-alerting/add-notification-template.md b/docs/sources/old-alerting/add-notification-template.md deleted file mode 100644 index f2cea0cac27..00000000000 --- a/docs/sources/old-alerting/add-notification-template.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -aliases: - - ../alerting/add-notification-template/ -draft: true -keywords: - - grafana - - documentation - - alerting - - alerts - - notification - - templating -labels: - products: - - enterprise - - oss -title: Alert notification templating -weight: 110 ---- - -# Alert notification templating - -You can provide detailed information to alert notification recipients by injecting alert query data into an alert notification. This topic explains how you can use alert query labels in alert notifications. - -You can use labels generated during an alerting query evaluation to create alert notification messages. For multiple unique values for the same label, the values are comma-separated. - -When an alert fires, the alerting data series indicates the violation. For resolved alerts, all data series are included in the resolved notification. - -This topic explains how you can use alert query labels in alert notifications. - -## Adding alert label data into your alert notification - -1. Navigate to the panel you want to add or edit an alert rule for. -1. Click on the panel title, and then click **Edit**. -1. On the Alert tab, click **Create Alert**. If an alert already exists for this panel, then you can edit the alert directly. -1. Refer to the alert query labels in the alert rule name and/or alert notification message field by using the `${Label}` syntax. -1. Click **Save** in the upper right corner to save the alert rule and the dashboard. - -![Alerting notification template](/static/img/docs/alerting/alert-notification-template-7-4.png) diff --git a/docs/sources/old-alerting/create-alerts.md b/docs/sources/old-alerting/create-alerts.md deleted file mode 100644 index f60f8afebf1..00000000000 --- a/docs/sources/old-alerting/create-alerts.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -aliases: - - ../alerting/create-alerts/ -description: Configure alert rules -draft: true -keywords: - - grafana - - alerting - - guide - - rules -labels: - products: - - enterprise - - oss -title: Create alerts -weight: 200 ---- - -# Create alerts - -Grafana Alerting allows you to attach rules to your dashboard panels. When you save the dashboard, Grafana extracts the alert rules into a separate alert rule storage and schedules them for evaluation. - -![Alerting overview](/static/img/docs/alerting/drag_handles_gif.gif) - -In the Alert tab of the graph panel you can configure how often the alert rule should be evaluated and the conditions that need to be met for the alert to change state and trigger its [notifications]({{< relref "./notifications" >}}). - -Currently only the graph panel supports alert rules. - -## Add or edit an alert rule - -1. Navigate to the panel you want to add or edit an alert rule for, click the title, and then click **Edit**. -1. On the Alert tab, click **Create Alert**. If an alert already exists for this panel, then you can just edit the fields on the Alert tab. -1. Fill out the fields. Descriptions are listed below in [Alert rule fields](#alert-rule-fields). -1. When you have finished writing your rule, click **Save** in the upper right corner to save alert rule and the dashboard. -1. (Optional but recommended) Click **Test rule** to make sure the rule returns the results you expect. - -## Delete an alert - -To delete an alert, scroll to the bottom of the alert and then click **Delete**. - -## Alert rule fields - -This section describes the fields you fill out to create an alert. - -### Rule - -- **Name -** Enter a descriptive name. The name will be displayed in the Alert Rules list. This field supports [templating]({{< relref "./add-notification-template" >}}). -- **Evaluate every -** Specify how often the scheduler should evaluate the alert rule. This is referred to as the _evaluation interval_. -- **For -** Specify how long the query needs to violate the configured thresholds before the alert notification triggers. - -You can set a minimum evaluation interval in the `alerting.min_interval_seconds` configuration field, to set a minimum time between evaluations. Refer to [Configuration]({{< relref "../setup-grafana/configure-grafana#min_interval_seconds" >}}) for more information. - -{{% admonition type="caution" %}} -Do not use `For` with the `If no data or all values are null` setting set to `No Data`. The triggering of `No Data` will trigger instantly and not take `For` into consideration. This may also result in that an OK notification not being sent if alert transitions from `No Data -Pending -OK`. -{{% /admonition %}} - -If an alert rule has a configured `For` and the query violates the configured threshold, then it will first go from `OK` to `Pending`. Going from `OK` to `Pending` Grafana will not send any notifications. Once the alert rule has been firing for more than `For` duration, it will change to `Alerting` and send alert notifications. - -Typically, it's always a good idea to use this setting since it's often worse to get false positive than wait a few minutes before the alert notification triggers. Looking at the `Alert list` or `Alert list panels` you will be able to see alerts in pending state. - -Below you can see an example timeline of an alert using the `For` setting. At ~16:04 the alert state changes to `Pending` and after 4 minutes it changes to `Alerting` which is when alert notifications are sent. Once the series falls back to normal the alert rule goes back to `OK`. -{{< figure class="float-right" src="/static/img/docs/v54/alerting-for-dark-theme.png" caption="Alerting For" >}} - -{{< figure class="float-right" max-width="40%" src="/static/img/docs/v4/alerting_conditions.png" caption="Alerting Conditions" >}} - -### Conditions - -Currently the only condition type that exists is a `Query` condition that allows you to -specify a query letter, time range and an aggregation function. - -#### Query condition example - -```sql -avg() OF query(A, 15m, now) IS BELOW 14 -``` - -- `avg()` Controls how the values for **each** series should be reduced to a value that can be compared against the threshold. Click on the function to change it to another aggregation function. -- `query(A, 15m, now)` The letter defines what query to execute from the **Metrics** tab. The second two parameters define the time range, `15m, now` means 15 minutes ago to now. You can also do `10m, now-2m` to define a time range that will be 10 minutes ago to 2 minutes ago. This is useful if you want to ignore the last 2 minutes of data. -- `IS BELOW 14` Defines the type of threshold and the threshold value. You can click on `IS BELOW` to change the type of threshold. - -The query used in an alert rule cannot contain any template variables. Currently we only support `AND` and `OR` operators between conditions and they are executed serially. -For example, we have 3 conditions in the following order: -_condition:A(evaluates to: TRUE) OR condition:B(evaluates to: FALSE) AND condition:C(evaluates to: TRUE)_ -so the result will be calculated as ((TRUE OR FALSE) AND TRUE) = TRUE. - -We plan to add other condition types in the future, like `Other Alert`, where you can include the state of another alert in your conditions, and `Time Of Day`. - -#### Multiple Series - -If a query returns multiple series, then the aggregation function and threshold check will be evaluated for each series. What Grafana does not do currently is track alert rule state **per series**. This has implications that are detailed in the scenario below. - -- Alert condition with query that returns 2 series: **server1** and **server2** -- **server1** series causes the alert rule to fire and switch to state `Alerting` -- Notifications are sent out with message: _load peaking (server1)_ -- In a subsequent evaluation of the same alert rule, the **server2** series also causes the alert rule to fire -- No new notifications are sent as the alert rule is already in state `Alerting`. - -So, as you can see from the above scenario Grafana will not send out notifications when other series cause the alert to fire if the rule already is in state `Alerting`. To improve support for queries that return multiple series we plan to track state **per series** in a future release. - -> Starting with Grafana v5.3 you can configure reminders to be sent for triggered alerts. This will send additional notifications -> when an alert continues to fire. If other series (like server2 in the example above) also cause the alert rule to fire they will be included in the reminder notification. Depending on what notification channel you're using you may be able to take advantage of this feature for identifying new/existing series causing alert to fire. - -### No Data & Error Handling - -Below are conditions you can configure how the rule evaluation engine should handle queries that return no data or only null values. - -| No Data Option | Description | -| --------------- | ------------------------------------------------------------------------------------------ | -| No Data | Set alert rule state to `NoData` | -| Alerting | Set alert rule state to `Alerting` | -| Keep Last State | Keep the current alert rule state, whatever it is. | -| Ok | Not sure why you would want to send yourself an alert when things are okay, but you could. | - -### Execution errors or timeouts - -Tell Grafana how to handle execution or timeout errors. - -| Error or timeout option | Description | -| ----------------------- | -------------------------------------------------- | -| Alerting | Set alert rule state to `Alerting` | -| Keep Last State | Keep the current alert rule state, whatever it is. | - -If you have an unreliable time series store from which queries sometime timeout or fail randomly you can set this option to `Keep Last State` in order to basically ignore them. - -## Notifications - -In alert tab you can also specify alert rule notifications along with a detailed message about the alert rule. The message can contain anything, information about how you might solve the issue, link to runbook, and so on. - -The actual notifications are configured and shared between multiple alerts. Read -[Alert notifications]({{< relref "./notifications" >}}) for information on how to configure and set up notifications. - -- **Send to -** Select an alert notification channel if you have one set up. -- **Message -** Enter a text message to be sent on the notification channel. Some alert notifiers support transforming the text to HTML or other rich formats. This field supports [templating]({{< relref "./add-notification-template" >}}). -- **Tags -** Specify a list of tags (key/value) to be included in the notification. It is only supported by [some notifiers]({{< relref "./notifications#list-of-supported-notifiers" >}}). - -## Alert state history and annotations - -Alert state changes are recorded in the internal annotation table in Grafana's database. The state changes are visualized as annotations in the alert rule's graph panel. You can also go into the `State history` submenu in the alert tab to view and clear state history. diff --git a/docs/sources/old-alerting/notifications.md b/docs/sources/old-alerting/notifications.md deleted file mode 100644 index 1439ecad37e..00000000000 --- a/docs/sources/old-alerting/notifications.md +++ /dev/null @@ -1,303 +0,0 @@ ---- -aliases: - - ../alerting/notifications/ -description: Alerting notifications guide -draft: true -keywords: - - Grafana - - alerting - - guide - - notifications -labels: - products: - - enterprise - - oss -title: Alert notifications -weight: 100 ---- - -# Alert notifications - -When an alert changes state, it sends out notifications. Each alert rule can have -multiple notifications. In order to add a notification to an alert rule you first need -to add and configure a `notification` channel (can be email, PagerDuty, or other integration). - -This is done from the Notification channels page. - -{{% admonition type="note" %}} -Alerting is only available in Grafana v4.0 and above. -{{% /admonition %}} - -## Add a notification channel - -1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Notification channels**. -1. Click **Add channel**. -1. Fill out the fields or select options described below. - -## New notification channel fields - -### Default (send on all alerts) - -- **Name -** Enter a name for this channel. It will be displayed when users add notifications to alert rules. -- **Type -** Select the channel type. Refer to the [List of supported notifiers](#list-of-supported-notifiers) for details. -- **Default (send on all alerts) -** When selected, this option sends a notification on this channel for all alert rules. -- **Include Image -** See [Enable images in notifications](#enable-images-in-notifications-external-image-store) for details. -- **Disable Resolve Message -** When selected, this option disables the resolve message [OK] that is sent when the alerting state returns to false. -- **Send reminders -** When this option is checked additional notifications (reminders) will be sent for triggered alerts. You can specify how often reminders should be sent using number of seconds (s), minutes (m) or hours (h), for example `30s`, `3m`, `5m` or `1h`. - -**Important:** Alert reminders are sent after rules are evaluated. Therefore a reminder can never be sent more frequently than a configured alert rule evaluation interval. - -These examples show how often and when reminders are sent for a triggered alert. - -| Alert rule evaluation interval | Send reminders every | Reminder sent every (after last alert notification) | -| ------------------------------ | -------------------- | --------------------------------------------------- | -| `30s` | `15s` | ~30 seconds | -| `1m` | `5m` | ~5 minutes | -| `5m` | `15m` | ~15 minutes | -| `6m` | `20m` | ~24 minutes | -| `1h` | `15m` | ~1 hour | -| `1h` | `2h` | ~2 hours | - -
- -## List of supported notifiers - -| Name | Type | Supports images | Supports alert rule tags | -| --------------------------------------------- | ------------------------- | ------------------ | ------------------------ | -| [DingDing](#dingdingdingtalk) | `dingding` | yes, external only | no | -| [Discord](#discord) | `discord` | yes | no | -| [Email](#email) | `email` | yes | no | -| [Google Hangouts Chat](#google-hangouts-chat) | `googlechat` | yes, external only | no | -| Hipchat | `hipchat` | yes, external only | no | -| [Kafka](#kafka) | `kafka` | yes, external only | no | -| Line | `line` | yes, external only | no | -| Microsoft Teams | `teams` | yes, external only | no | -| [Opsgenie](#opsgenie) | `opsgenie` | yes, external only | yes | -| [Pagerduty](#pagerduty) | `pagerduty` | yes, external only | yes | -| Prometheus Alertmanager | `prometheus-alertmanager` | yes, external only | yes | -| [Pushover](#pushover) | `pushover` | yes | no | -| Sensu | `sensu` | yes, external only | no | -| [Sensu Go](#sensu-go) | `sensugo` | yes, external only | no | -| [Slack](#slack) | `slack` | yes | no | -| Telegram | `telegram` | yes | no | -| Threema | `threema` | yes, external only | no | -| VictorOps | `victorops` | yes, external only | yes | -| [Webhook](#webhook) | `webhook` | yes, external only | yes | - -### Email - -To enable email notifications you have to set up [SMTP settings]({{< relref "../setup-grafana/configure-grafana#smtp" >}}) -in the Grafana config. Email notifications will upload an image of the alert graph to an -external image destination if available or fallback to attaching the image to the email. -Be aware that if you use the `local` image storage email servers and clients might not be -able to access the image. - -{{% admonition type="note" %}} -Template variables are not supported in email alerts. -{{% /admonition %}} - -| Setting | Description | -| ------------ | -------------------------------------------------------------------------------------------- | -| Single email | Send a single email to all recipients. Disabled per default. | -| Addresses | Email addresses to recipients. You can enter multiple email addresses using a ";" separator. | - -### Slack - -{{< figure class="float-right" max-width="40%" src="/static/img/docs/v4/slack_notification.png" caption="Alerting Slack Notification" >}} - -To set up Slack, you need to configure an incoming Slack webhook URL. You can follow -[Sending messages using Incoming Webhooks](https://api.slack.com/incoming-webhooks) on how to do that. If you want to include screenshots of the -firing alerts in the Slack messages you have to configure either the [external image destination](#enable-images-in-notifications-external-image-store) -in Grafana or a bot integration via Slack Apps. [Follow Slack's guide to set up a bot integration](https://api.slack.com/bot-users) and use the token -provided, which starts with "xoxb". - -| Setting | Description | -| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Url | Slack incoming webhook URL, or eventually the [chat.postMessage](https://api.slack.com/methods/chat.postMessage) Slack API endpoint. | -| Username | Set the username for the bot's message. | -| Recipient | Allows you to override the Slack recipient. You must either provide a channel Slack ID, a user Slack ID, a username reference (@<user>, all lowercase, no whitespace), or a channel reference (#<channel>, all lowercase, no whitespace). If you use the `chat.postMessage` Slack API endpoint, this is required. | -| Icon emoji | Provide an emoji to use as the icon for the bot's message. Ex :smile: | -| Icon URL | Provide a URL to an image to use as the icon for the bot's message. | -| Mention Users | Optionally mention one or more users in the Slack notification sent by Grafana. You have to refer to users, comma-separated, via their corresponding Slack IDs (which you can find by clicking the overflow button on each user's Slack profile). | -| Mention Groups | Optionally mention one or more groups in the Slack notification sent by Grafana. You have to refer to groups, comma-separated, via their corresponding Slack IDs (which you can get from each group's Slack profile URL). | -| Mention Channel | Optionally mention either all channel members or just active ones. | -| Token | If provided, Grafana will upload the generated image via Slack's file.upload API method, not the external image destination. If you use the `chat.postMessage` Slack API endpoint, this is required. | - -If you are using the token for a slack bot, then you have to invite the bot to the channel you want to send notifications and add the channel to the recipient field. - -### Opsgenie - -To setup Opsgenie you will need an API Key and the Alert API Url. These can be obtained by configuring a new [Grafana Integration](https://docs.opsgenie.com/docs/grafana-integration). - -| Setting | Description | -| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Alert API URL | The API URL for your Opsgenie instance. This will normally be either `https://api.opsgenie.com` or, for EU customers, `https://api.eu.opsgenie.com`. | -| API Key | The API Key as provided by Opsgenie for your configured Grafana integration. | -| Override priority | Configures the alert priority using the `og_priority` tag. The `og_priority` tag must have one of the following values: `P1`, `P2`, `P3`, `P4`, or `P5`. Default is `False`. | -| Send notification tags as | Specify how you would like [Notification Tags]({{< relref "./create-alerts#notifications" >}}) delivered to Opsgenie. They can be delivered as `Tags`, `Extra Properties` or both. Default is Tags. See note below for more information. | - -{{% admonition type="note" %}} -When notification tags are sent as `Tags` they are concatenated into a string with a `key:value` format. If you prefer to receive the notifications tags as key/values under Extra Properties in Opsgenie then change the `Send notification tags as` to either `Extra Properties` or `Tags & Extra Properties`. -{{% /admonition %}} - -### PagerDuty - -To set up PagerDuty, all you have to do is to provide an integration key. - -| Setting | Description | -| ---------------------- | ----------------------------------------------------------------------------------------------- | -| Integration Key | Integration key for PagerDuty. | -| Severity | Level for dynamic notifications, default is `critical` (1) | -| Auto resolve incidents | Resolve incidents in PagerDuty once the alert goes back to ok | -| Message in details | Removes the Alert message from the PD summary field and puts it into custom details instead (2) | - -> **Note:** The tags `Severity`, `Class`, `Group`, `dedup_key`, and `Component` have special meaning in the [Pagerduty Common Event Format - PD-CEF](https://support.pagerduty.com/docs/pd-cef). If an alert panel defines these tag keys, then they are transposed to the root of the event sent to Pagerduty. This means they will be available within the Pagerduty UI and Filtering tools. A Severity tag set on an alert overrides the global Severity set on the notification channel if it's a valid level. - -> Using Message In Details will change the structure of the `custom_details` field in the PagerDuty Event. -> This might break custom event rules in your PagerDuty rules if you rely on the fields in `payload.custom_details`. -> Move any existing rules using `custom_details.myMetric` to `custom_details.queries.myMetric`. -> This behavior will become the default in a future version of Grafana. - -> **Note:** The `dedup_key` tag overrides the Grafana-generated `dedup_key` with a custom key. - -> **Note:** The `state` tag overrides the current alert state inside the `custom_details` payload. - -> **Note:** Grafana uses the `Events API V2` integration. This can be configured for each service. - -### VictorOps - -To configure VictorOps, provide the URL from the Grafana Integration and substitute `$routing_key` with a valid key. - -> **Note:** The tag `Severity` has special meaning in the [VictorOps Incident Fields](https://help.victorops.com/knowledge-base/incident-fields-glossary/). If an alert panel defines this key, then it replaces the `message_type` in the root of the event sent to VictorOps. - -### Pushover - -To set up Pushover, you must provide a user key and an API token. Refer to [What is Pushover and how do I use it](https://support.pushover.net/i7-what-is-pushover-and-how-do-i-use-it) for instructions on how to generate them. - -| Setting | Description | -| -------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -| API Token | Application token | -| User key(s) | A comma-separated list of user keys | -| Device(s) | A comma-separated list of devices | -| Priority | The priority alerting nottifications are sent | -| OK priority | The priority OK notifications are sent; if not set, then OK notifications are sent with the priority set for alerting notifications | -| Retry | How often (in seconds) the Pushover servers send the same notification to the user. (minimum 30 seconds) | -| Expire | How many seconds your notification will continue to be retried for (maximum 86400 seconds) | -| TTL | The number of seconds before a message expires and is deleted automatically. Examples: 10s, 5m30s, 8h. | -| Alerting sound | The sound for alerting notifications | -| OK sound | The sound for OK notifications | - -### Webhook - -The webhook notification is a simple way to send information about a state change over HTTP to a custom endpoint. -Using this notification you could integrate Grafana into a system of your choosing. - -Example json body: - -```json -{ - "dashboardId": 1, - "evalMatches": [ - { - "value": 1, - "metric": "Count", - "tags": {} - } - ], - "imageUrl": "https://grafana.com/static/assets/img/blog/mixed_styles.png", - "message": "Notification Message", - "orgId": 1, - "panelId": 2, - "ruleId": 1, - "ruleName": "Panel Title alert", - "ruleUrl": "http://localhost:3000/d/hZ7BuVbWz/test-dashboard?fullscreen\u0026edit\u0026tab=alert\u0026panelId=2\u0026orgId=1", - "state": "alerting", - "tags": { - "tag name": "tag value" - }, - "title": "[Alerting] Panel Title alert" -} -``` - -- **state** - The possible values for alert state are: `ok`, `paused`, `alerting`, `pending`, `no_data`. - -### DingDing/DingTalk - -DingTalk supports the following "message type": `text`, `link` and `markdown`. Only the `link` message type is supported. Refer to the [configuration instructions](https://developers.dingtalk.com/document/app/custom-robot-access) in Chinese language. - -In DingTalk PC Client: - -1. Click "more" icon on upper right of the panel. - -2. Click "Robot Manage" item in the pop menu, there will be a new panel call "Robot Manage". - -3. In the "Robot Manage" panel, select "customized: customized robot with Webhook". - -4. In the next new panel named "robot detail", click "Add" button. - -5. In "Add Robot" panel, input a nickname for the robot and select a "message group" which the robot will join in. click "next". - -6. There will be a Webhook URL in the panel, looks like this: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxx. Copy this URL to the Grafana DingTalk setting page and then click "finish". - -### Discord - -To set up Discord, you must create a Discord channel webhook. For instructions on how to create the channel, refer to -[Intro to Webhooks](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks). - -| Setting | Description | -| ------------------------------ | ----------------------------------------------------------------------------------------------------- | -| Webhook URL | Discord webhook URL. | -| Message Content | Mention a group using @ or a user using <@ID> when notifying in a channel. | -| Avatar URL | Optionally, provide a URL to an image to use as the avatar for the bot's message. | -| Use Discord's Webhook Username | Use the username configured in Discord's webhook settings. Otherwise, the username will be 'Grafana.' | - -Alternately, use the [Slack](#slack) notifier by appending `/slack` to a Discord webhook URL. - -### Kafka - -Notifications can be sent to a Kafka topic from Grafana using the [Kafka REST Proxy](https://docs.confluent.io/1.0/kafka-rest/docs/index.html). -There are a couple of configuration options which need to be set up in Grafana UI under Kafka Settings: - -1. Kafka REST Proxy endpoint. - -1. Kafka Topic. - -Once these two properties are set, you can send the alerts to Kafka for further processing or throttling. - -### Google Hangouts Chat - -Notifications can be sent by setting up an incoming webhook in Google Hangouts chat. For more information about configuring a webhook, refer to [webhooks](https://developers.google.com/hangouts/chat/how-tos/webhooks). - -### Prometheus Alertmanager - -Alertmanager handles alerts sent by client applications such as Prometheus server or Grafana. It takes care of deduplicating, grouping, and routing them to the correct receiver. Grafana notifications can be sent to Alertmanager via a simple incoming webhook. Refer to the official [Prometheus Alertmanager documentation](https://prometheus.io/docs/alerting/alertmanager) for configuration information. - -{{% admonition type="caution" %}} -In case of a high-availability setup, do not load balance traffic between Grafana and Alertmanagers to keep coherence between all your Alertmanager instances. Instead, point Grafana to a list of all Alertmanagers, by listing their URLs comma-separated in the notification channel configuration. -{{% /admonition %}} - -### Sensu Go - -Grafana alert notifications can be sent to [Sensu](https://sensu.io) Go as events via the API. This operation requires an API key. For information on creating this key, refer to [Sensu Go documentation](https://docs.sensu.io/sensu-go/latest/operations/control-access/use-apikeys/#api-key-authentication). - -## Enable images in notifications {#external-image-store} - -Grafana can render the panel associated with the alert rule as a PNG image and include that in the notification. Read more about the requirements and how to configure -[image rendering]({{< relref "../setup-grafana/image-rendering" >}}). - -You must configure an [external image storage provider]({{< relref "../setup-grafana/configure-grafana#external_image_storage" >}}) in order to receive images in alert notifications. If your notification channel requires that the image be publicly accessible (e.g. Slack, PagerDuty), configure a provider which uploads the image to a remote image store like Amazon S3, Webdav, Google Cloud Storage, or Azure Blob Storage. Otherwise, the local provider can be used to serve the image directly from Grafana. - -Notification services which need public image access are marked as 'external only'. - -## Configure the link back to Grafana from alert notifications - -All alert notifications contain a link back to the triggered alert in the Grafana instance. -This URL is based on the [domain]({{< relref "../setup-grafana/configure-grafana#domain" >}}) setting in Grafana. - -## Notification templating - -{{% admonition type="note" %}} -Alert notification templating is only available in Grafana v7.4 and above. -{{% /admonition %}} - -The alert notification template feature allows you to take the [label]({{< relref "../fundamentals/timeseries-dimensions#labels" >}}) value from an alert query and [inject that into alert notifications]({{< relref "./add-notification-template" >}}). diff --git a/docs/sources/old-alerting/pause-an-alert-rule.md b/docs/sources/old-alerting/pause-an-alert-rule.md deleted file mode 100644 index 8cc675f7d66..00000000000 --- a/docs/sources/old-alerting/pause-an-alert-rule.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -aliases: - - ../alerting/pause-an-alert-rule/ -description: Pause an existing alert rule -draft: true -keywords: - - grafana - - alerting - - guide - - rules - - view -labels: - products: - - enterprise - - oss -title: Pause an alert rule -weight: 400 ---- - -# Pause an alert rule - -Pausing the evaluation of an alert rule can sometimes be useful. For example, during a maintenance window, pausing alert rules can avoid triggering a flood of alerts. - -1. In the Grafana side bar, hover your cursor over the Alerting (bell) icon and then click **Alert Rules**. All configured alert rules are listed, along with their current state. -1. Find your alert in the list, and click the **Pause** icon on the right. The **Pause** icon turns into a **Play** icon. -1. Click the **Play** icon to resume evaluation of your alert. diff --git a/docs/sources/old-alerting/troubleshoot-alerts.md b/docs/sources/old-alerting/troubleshoot-alerts.md deleted file mode 100644 index 053bc34690f..00000000000 --- a/docs/sources/old-alerting/troubleshoot-alerts.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -aliases: - - ../alerting/troubleshoot-alerts/ -description: Troubleshoot alert rules -draft: true -keywords: - - grafana - - alerting - - guide - - rules - - troubleshoot -labels: - products: - - enterprise - - oss -title: Troubleshoot alerts -weight: 500 ---- - -# Troubleshoot alerts - -If alerts are not behaving as you expect, here are some steps you can take to troubleshoot and figure out what is going wrong. - -![Test Rule](/static/img/docs/v4/alert_test_rule.png) - -The first level of troubleshooting you can do is click **Test Rule**. You will get result back that you can expand to the point where you can see the raw data that was returned from your query. - -Further troubleshooting can also be done by inspecting the grafana-server log. If it's not an error or for some reason the log does not say anything you can enable debug logging for some relevant components. This is done in Grafana's ini config file. - -Example showing loggers that could be relevant when troubleshooting alerting. - -```ini -[log] -filters = alerting.scheduler:debug \ - alerting.engine:debug \ - alerting.resultHandler:debug \ - alerting.evalHandler:debug \ - alerting.evalContext:debug \ - alerting.extractor:debug \ - alerting.notifier:debug \ - alerting.notifier.slack:debug \ - alerting.notifier.pagerduty:debug \ - alerting.notifier.email:debug \ - alerting.notifier.webhook:debug \ - tsdb.graphite:debug \ - tsdb.prometheus:debug \ - tsdb.opentsdb:debug \ - tsdb.influxdb:debug \ - tsdb.elasticsearch:debug \ - tsdb.elasticsearch.client:debug \ -``` - -If you want to log raw query sent to your TSDB and raw response in log you also have to set grafana.ini option `app_mode` to `development`. diff --git a/docs/sources/old-alerting/view-alerts.md b/docs/sources/old-alerting/view-alerts.md deleted file mode 100644 index b927715685b..00000000000 --- a/docs/sources/old-alerting/view-alerts.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -aliases: - - ../alerting/view-alerts/ -description: View existing alert rules -draft: true -keywords: - - grafana - - alerting - - guide - - rules - - view -labels: - products: - - enterprise - - oss -menuTitle: View alerts -title: View existing alert rules -weight: 400 ---- - -# View existing alert rules - -Grafana stores individual alert rules in the panels where they are defined, but you can also view a list of all existing alert rules and their current state. - -In the Grafana side bar, hover your cursor over the Alerting (bell) icon and then click **Alert Rules**. All configured alert rules are listed, along with their current state. - -You can do several things while viewing alerts. - -- **Filter alerts by name -** Type an alert name in the **Search alerts** field. -- **Filter alerts by state -** In **States**, select which alert states you want to see. All others will be hidden. -- **Pause or resume an alert -** Click the **Pause** or **Play** icon next to the alert to pause or resume evaluation. See [Pause an alert rule]({{< relref "./pause-an-alert-rule" >}}) for more information. -- **Access alert rule settings -** Click the alert name or the **Edit alert rule** (gear) icon. Grafana opens the Alert tab of the panel where the alert rule is defined. This is helpful when an alert is firing but you don't know which panel it is defined in. diff --git a/docs/sources/panels-visualizations/_index.md b/docs/sources/panels-visualizations/_index.md index dbb1f5d71c7..e0242f212ae 100644 --- a/docs/sources/panels-visualizations/_index.md +++ b/docs/sources/panels-visualizations/_index.md @@ -17,35 +17,55 @@ menuTitle: Panels and visualizations title: Panels and visualizations description: Learn about and configure panels and visualizations weight: 80 +hero: + title: Panels and visualizations + level: 1 + width: 110 + height: 110 + description: >- + Easily collect, correlate, and visualize data so you can make informed decisions in real time. +cards: + title_class: pt-0 lh-1 + items: + - title: Visualizations + href: ./visualizations/ + description: Learn about all the visualizations available in Grafana, including which visualizations are ideal for different datasets and how to configure their options. + height: 24 + - title: Panel overview + href: ./panel-overview/ + description: Learn about the features of the panel. + height: 24 + - title: Panel editor + href: ./panel-editor-overview/ + description: Learn about the features of the panel editor and how to begin editing a panel. + height: 24 + - title: Configure standard options + href: ./configure-standard-options/ + description: Learn about configuring standard options like units, field display names, and and colors. + height: 24 + - title: Query and transform data + href: ./query-transform-data/ + description: Learn about querying and transforming your data to refine your visualizations. + height: 24 --- -# Panels and visualizations +{{< docs/hero-simple key="hero" >}} -The _panel_ is the basic visualization building block in Grafana. -Each panel has a query editor specific to the data source selected in the panel. -The query editor allows you to build a query that returns the data you want to visualize. - -There are a wide variety of styling and formatting options for each panel. -Panels can be dragged, dropped, and resized to rearrange them on the dashboard. +--- -Before you add a panel, ensure that you have configured a data source. +## Overview -- For details about using data sources, refer to [Data sources][]. +Panels are the basic building block in Grafana dashboards, composed of a [query][] and a visualization, a graphical representation of query results. -- For more information about managing data sources as an administrator, refer to [Data source management][]. +Visualizations provide you several different ways to present your data within a panel, depending on what best suits the data and your needs. Grafana’s growing suite of visualizations, ranging from time series graphs to heatmaps to cutting-edge 3D charts, help you decode complex datasets. - {{% admonition type="note" %}} - [Data source management](https://grafana.com/docs/grafana//administration/data-source-management/) is only available in [Grafana Enterprise](https://grafana.com/docs/grafana//introduction/grafana-enterprise/) and [Grafana Cloud](https://grafana.com/docs/grafana-cloud/). - {{% /admonition %}} +Panels offer a wide variety of formatting and styling options from applying colors based on field values to custom units. Each visualization also comes with options specific to it that give you further control over how your data is displayed. With Grafana panels and visualizations, you can easily get the information you need from your data and optimize performance. -This section includes the following sub topics: +## Explore -{{< section >}} +{{< card-grid key="cards" type="simple" >}} {{% docs/reference %}} -[Data source management]: "/docs/grafana/ -> /docs/grafana//administration/data-source-management" -[Data source management]: "/docs/grafana-cloud/ -> /docs/grafana//administration/data-source-management" - -[Data sources]: "/docs/grafana/ -> /docs/grafana//datasources" -[Data sources]: "/docs/grafana-cloud/ -> /docs/grafana//datasources" +[query]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data" +[query]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/configure-data-links/index.md b/docs/sources/panels-visualizations/configure-data-links/index.md index 9996e398e38..be04b938c5c 100644 --- a/docs/sources/panels-visualizations/configure-data-links/index.md +++ b/docs/sources/panels-visualizations/configure-data-links/index.md @@ -26,7 +26,7 @@ weight: 80 # Configure data links -Data links allow you to provide more granular context to your links. You can create links that include the series name or even the value under the cursor. For example, if your visualization shows four servers, you can add a data link to one or two of them. You can also link panels using data links. +Data links allow you to link to other panels, dashboards, and external resources while maintaining the context of the source panel. You can create links that include the series name or even the value under the cursor. For example, if your visualization shows four servers, you can add a data link to one or two of them. The link itself is accessible in different ways depending on the visualization. For the time series visualization you need to click a data point or line: @@ -42,15 +42,14 @@ If there's only one data link in the visualization, clicking anywhere on the vis You can configure data links for the following visualizations: -| | | | -| -------------------------- | ---------------------- | -------------------------------- | -| [Bar chart][bar chart] | [Geomap][geomap] | [State timeline][state timeline] | -| [Bar gauge][bar gauge] | [Heatmap][heatmap] | [Status history][status history] | -| [Candlestick][candlestick] | [Histogram][histogram] | [Table][table] | -| [Canvas][canvas] | [Pie chart][pie chart] | [Time series][time series] | -| [Gauge][gauge] | [Stat][stat] | [Trend][trend] | - - +| | | | +| -------------------------- | -------------------------------- | -------------------------------- | +| [Bar chart][bar chart] | [Heatmap][heatmap] | [Status history][status history] | +| [Bar gauge][bar gauge] | [Histogram][histogram] | [Table][table] | +| [Candlestick][candlestick] | [Pie chart][pie chart] | [Time series][time series] | +| [Canvas][canvas] | [Stat][stat] | [Trend][trend] | +| [Gauge][gauge] | [State timeline][state timeline] | [XY chart][xy chart] | +| [Geomap][geomap] | | | ## Data link variables @@ -199,6 +198,9 @@ If you want to add all of the current dashboard's variables to the URL, then use [trend]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/trend" [trend]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/trend" +[xy chart]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/xy-chart" +[xy chart]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/xy-chart" + [Cloudwatch]: "/docs/grafana/ -> /docs/grafana//datasources/aws-cloudwatch/query-editor#deep-link-grafana-panels-to-the-cloudwatch-console-1" [Cloudwatch]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/connect-externally-hosted/data-sources/aws-cloudwatch/query-editor#deep-link-grafana-panels-to-the-cloudwatch-console-1" diff --git a/docs/sources/panels-visualizations/configure-legend/index.md b/docs/sources/panels-visualizations/configure-legend/index.md index fb261794066..a74d55c9588 100644 --- a/docs/sources/panels-visualizations/configure-legend/index.md +++ b/docs/sources/panels-visualizations/configure-legend/index.md @@ -28,7 +28,7 @@ Legends are supported for the following visualizations: - [Status history][status history] - [Time series][time series] - [Trend][trend] - +- [XY chart][xy chart] [Geomaps][] and [heatmaps][] also have legends, but they only provide the choice to display or not display a legend and don't support other legend options. @@ -151,4 +151,7 @@ This feature is only supported for the following visualizations: bar chart, hist [heatmaps]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/heatmap" [heatmaps]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/heatmap" + +[xy chart]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/xy-chart" +[xy chart]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/xy-chart" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/configure-overrides/index.md b/docs/sources/panels-visualizations/configure-overrides/index.md index 64472b81107..ea02548062d 100644 --- a/docs/sources/panels-visualizations/configure-overrides/index.md +++ b/docs/sources/panels-visualizations/configure-overrides/index.md @@ -35,15 +35,14 @@ After you've set them, your overrides appear in both the **All** and **Overrides You can configure field overrides for the following visualizations: -| | | | -| -------------------------- | ---------------------- | -------------------------------- | -| [Bar chart][bar chart] | [Geomap][geomap] | [State timeline][state timeline] | -| [Bar gauge][bar gauge] | [Heatmap][heatmap] | [Status history][status history] | -| [Candlestick][candlestick] | [Histogram][histogram] | [Table][table] | -| [Canvas][canvas] | [Pie chart][pie chart] | [Time series][time series] | -| [Gauge][gauge] | [Stat][stat] | [Trend][trend] | - - +| | | | +| -------------------------- | -------------------------------- | -------------------------------- | +| [Bar chart][bar chart] | [Heatmap][heatmap] | [Status history][status history] | +| [Bar gauge][bar gauge] | [Histogram][histogram] | [Table][table] | +| [Candlestick][candlestick] | [Pie chart][pie chart] | [Time series][time series] | +| [Canvas][canvas] | [Stat][stat] | [Trend][trend] | +| [Gauge][gauge] | [State timeline][state timeline] | [XY chart][xy chart] | +| [Geomap][geomap] | | | ## Override rules @@ -223,6 +222,9 @@ The changes you make take effect immediately. [trend]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/trend" [trend]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/trend" +[xy chart]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/xy-chart" +[xy chart]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/xy-chart" + [Rename by regex transformation]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/transform-data#rename-by-regex" [Rename by regex transformation]: "/docs/grafana-cloud -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/transform-data#rename-by-regex" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/configure-standard-options/index.md b/docs/sources/panels-visualizations/configure-standard-options/index.md index b8a302e5763..8089a16b387 100644 --- a/docs/sources/panels-visualizations/configure-standard-options/index.md +++ b/docs/sources/panels-visualizations/configure-standard-options/index.md @@ -41,7 +41,7 @@ You can configure standard options for the following visualizations: | [Bar gauge][bar gauge] | [Histogram][histogram] | [Table][table] | | [Candlestick][candlestick] | [Pie chart][pie chart] | [Time series][time series] | | [Canvas][canvas] | [Stat][stat] | [Trend][trend] | -| [Gauge][gauge] | [State timeline][state timeline] | | +| [Gauge][gauge] | [State timeline][state timeline] | [XY chart][xy chart] | ## Standard options @@ -196,6 +196,9 @@ Enter what Grafana should display if the field value is empty or null. The defau [trend]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/trend" [trend]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/trend" +[xy chart]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/xy-chart" +[xy chart]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/xy-chart" + [variables]: "/docs/grafana/ -> /docs/grafana//dashboards/variables" [variables]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/variables" diff --git a/docs/sources/panels-visualizations/configure-tooltips/index.md b/docs/sources/panels-visualizations/configure-tooltips/index.md index 4adfb32f37c..4b2956e7dc9 100644 --- a/docs/sources/panels-visualizations/configure-tooltips/index.md +++ b/docs/sources/panels-visualizations/configure-tooltips/index.md @@ -17,22 +17,19 @@ weight: 75 # Configure tooltips -{{< docs/public-preview product="The new tooltip experience" featureFlag="`newVizTooltips`" >}} - When you hover your cursor over a visualization, Grafana can display tooltips that contain more information about a data point, like the exact time of a result. You can customize tooltips to control how many series they include and the order of those values. You can also copy the content from tooltips to use elsewhere. Learn more about configuring tooltips in [Tooltip options](#tooltip-options). ## Supported visualizations You can configure tooltips for the following visualizations: -| | | -| -------------------------- | -------------------------------- | -| [Bar chart][bar chart] | [State timeline][state timeline] | -| [Candlestick][candlestick] | [Status history][status history] | -| [Heatmap][heatmap] | [Time series][time series] | -| [Pie chart][pie chart] | [Trend][trend] | - - +| | | +| -------------------------------- | -------------------------------- | +| [Bar chart][bar chart] | [Status history][status history] | +| [Candlestick][candlestick] | [Time series][time series] | +| [Heatmap][heatmap] | [Trend][trend] | +| [Pie chart][pie chart] | [XY chart][xy chart] | +| [State timeline][state timeline] | | Some visualizations, for example [candlestick][] and [flame graph][], have tooltips, but they aren't configurable. These visualizations don't have a **Tooltip** section in the panel editor pane. [Geomaps][geomaps] provide you the option to have tooltips triggered upon click or hover under the **Map controls** options in the panel editor pane. @@ -70,6 +67,10 @@ Set the hover proximity (in pixels) to control how close the cursor must be to a ![Adding a hover proximity limit for tooltips](/media/docs/grafana/gif-grafana-10-4-hover-proximity.gif) +### Max height + +Set the maximum height of the tooltip box. The default is 600 pixels. + ### Show histogram (Y axis) For the heatmap visualization only, when you set the **Tooltip mode** to **Single**, the **Show histogram (Y axis)** option is displayed. This option controls whether or not the tooltip includes a histogram representing the y-axis. @@ -111,6 +112,9 @@ For the heatmap visualization only, when you set the **Tooltip mode** to **Singl [trend]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/trend" [trend]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/trend" +[xy chart]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/xy-chart" +[xy chart]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/xy-chart" + [field override]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides" [field override]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/panel-editor-overview/index.md b/docs/sources/panels-visualizations/panel-editor-overview/index.md index 54ddeda2028..7c638b18ef8 100644 --- a/docs/sources/panels-visualizations/panel-editor-overview/index.md +++ b/docs/sources/panels-visualizations/panel-editor-overview/index.md @@ -15,99 +15,54 @@ keywords: - panel - dashboard - dynamic - - rows - add labels: products: - cloud - enterprise - oss -menuTitle: Panel editor overview -title: Panel editor overview +menuTitle: Panel editor +title: Panel editor description: Learn about the features of the panel editor weight: 20 --- -# Panel editor overview +# Panel editor In the panel editor, you can update all the elements of a visualization including the data source, queries, time range, and visualization display options. ![Panel editor](/media/docs/grafana/panels-visualizations/screenshot-panel-editor-view.png) -To add a panel in a new dashboard click **+ Add visualization** in the middle of the dashboard. To add a panel to an existing dashboard, click **Add** in the dashboard header and select **Visualization** in the drop-down: +This following sections describe the areas of the Grafana panel editor. -![Add dropdown](/media/docs/grafana/dashboards/screenshot-add-dropdown-10.0.png) +## Panel header -## Panel menu +The header section lists the dashboard in which the panel appears and the following controls: -To access the panel editor, hover over the top-right corner of any panel. Click the panel menu icon that appears and select **Edit**. The panel menu gives you access to the following actions: +- **Discard:** Discards changes you have made to the panel since you last saved the dashboard. +- **Save:** Saves changes you made to the panel. +- **Apply:** Applies changes you made and closes the panel editor, returning you to the dashboard. You'll have to save the dashboard to persist the applied changes. -- **View**: View the panel in full screen. -- **Edit**: Open the panel editor to edit panel and visualization options. -- **Share**: Share the panel as a link, embed, or library panel. -- **Explore**: Open the panel in **Explore**, where you can focus on your query. -- **Inspect**: Open the **Inspect** drawer, where you can review the panel data, stats, metadata, JSON, and query. - - **Data**: Open the **Inspect** drawer in the **Data** tab. - - **Query**: Open the **Inspect** drawer in the **Query** tab. - - **Panel JSON**: Open the **Inspect** drawer in the **JSON** tab. -- **Extensions**: Access other actions provided by installed applications, such as declaring an incident. Note that this option doesn't appear unless you have app plugins installed which contribute an [extension](https://grafana.com/developers/plugin-tools/ui-extensions/) to the panel menu. -- **More**: Access other panel actions. - - **Duplicate**: Make a copy of the panel. Duplicated panels query data separately from the original panel. You can use the special `Dashboard` data source to [share the same query results across panels][] instead. - - **Copy**: Copy the panel to the clipboard. - - **Create library panel**: Create a panel that can be imported into other dashboards. - - **Create alert**: Open the alert rule configuration page in **Alerting**, where you can [create a Grafana-managed alert] based on the panel queries. - - **Hide legend**: Hide the panel legend. - - **Get help**: Send a snapshot or panel data to Grafana Labs Technical Support. -- **Remove**: Remove the panel from the dashboard. +## Visualization preview -## Panel editor +The visualization preview section contains the following options: -This section describes the areas of the Grafana panel editor. +- **Table view:** Convert any visualization to a table so you can see the data. Table views are helpful for troubleshooting. This view only contains the raw data. It doesn't include transformations you might have applied to the data or the formatting options available in the [Table][] visualization. +- **Fill:** The visualization preview fills the available space. If you change the width of the side pane or height of the bottom pane the visualization changes to fill the available space. +- **Actual:** The visualization preview has the exact size as the size on the dashboard. If not enough space is available, the visualization scales down preserving the aspect ratio. +- **Time range controls:** **Default** is either the browser local timezone or the timezone selected at a higher level. -1. Panel header: The header section lists the dashboard in which the panel appears and the following controls: +## Data section - - **Discard:** Discards changes you have made to the panel since you last saved the dashboard. - - **Save:** Saves changes you made to the panel. - - **Apply:** Applies changes you made and closes the panel editor, returning you to the dashboard. You'll have to save the dashboard to persist the applied changes. +The data section contains tabs where you enter queries, transform your data, and create alert rules (if applicable). -1. Visualization preview: The visualization preview section contains the following options: +- **Query tab:** Select your data source and enter queries here. For more information, refer to [Add a query][]. When you create a new dashboard, you'll be prompted to select a data source before you get to the panel editor. You set or update the data source in existing dashboards using the drop-down in the **Query** tab. +- **Transform tab:** Apply data transformations. For more information, refer to [Transform data][]. +- **Alert tab:** Write alert rules. For more information, refer to [the overview of Grafana Alerting][]. - - **Table view:** Convert any visualization to a table so you can see the data. Table views are helpful for troubleshooting. This view only contains the raw data. It doesn't include transformations you might have applied to the data or the formatting options available in the [Table][] visualization. - - **Fill:** The visualization preview fills the available space. If you change the width of the side pane or height of the bottom pane the visualization changes to fill the available space. - - **Actual:** The visualization preview has the exact size as the size on the dashboard. If not enough space is available, the visualization scales down preserving the aspect ratio. - - **Time range controls:** **Default** is either the browser local timezone or the timezone selected at a higher level. +## Panel display options -1. Data section: The data section contains tabs where you enter queries, transform your data, and create alert rules (if applicable). - - - **Query tab:** Select your data source and enter queries here. For more information, refer to [Add a query][]. When you create a new dashboard, you'll be prompted to select a data source before you get to the panel editor. You set or update the data source in existing dashboards using the drop-down in the **Query** tab. - - **Transform tab:** Apply data transformations. For more information, refer to [Transform data][]. - - **Alert tab:** Write alert rules. For more information, refer to [the overview of Grafana Alerting][]. - -1. Panel display options: The display options section contains tabs where you configure almost every aspect of your data visualization. - -## Panel inspect drawer - -The inspect drawer helps you understand and troubleshoot your panels. You can view the raw data for any panel, export that data to a comma-separated values (CSV) file, view query requests, and export panel and data JSON. - -To access the panel inspect drawer from the edit view, hover over any part of the panel to display the actions menu on the top right corner. Click the menu and select **Inspect**. - -{{% admonition type="note" %}} -Not all panel types include all tabs. For example, dashboard list panels don't have raw data to inspect, so they don't display the Stats, Data, or Query tabs. -{{% /admonition %}} - -The panel inspector consists of the following options: - -1. The panel inspect drawer displays opens a drawer on the right side. Click the arrow in the upper right corner to expand or reduce the drawer pane. - -1. **Data tab -** Shows the raw data returned by the query with transformations applied. Field options such as overrides and value mappings aren't applied by default. - -1. **Stats tab -** Shows how long your query takes and how much it returns. - -1. **JSON tab -** Allows you to view and copy the panel JSON, panel data JSON, and data frame structure JSON. This is useful if you are provisioning or administering Grafana. - -1. **Query tab -** Shows you the requests to the server sent when Grafana queries the data source. - -1. **Error tab -** Shows the error. Only visible when query returns error. +The display options section contains tabs where you configure almost every aspect of your data visualization. {{% docs/reference %}} [Table]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/table" @@ -121,10 +76,4 @@ The panel inspector consists of the following options: [the overview of Grafana Alerting]: "/docs/grafana/ -> /docs/grafana//alerting" [the overview of Grafana Alerting]: "/docs/grafana-cloud/ -> /docs/grafana//alerting" - -[share the same query results across panels]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/share-query" -[share the same query results across panels]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/share-query" - -[create a Grafana-managed alert]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-grafana-managed-rule#create-alerts-from-panels" -[create a Grafana-managed alert]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-grafana-managed-rule#create-alerts-from-panels" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/panel-overview/index.md b/docs/sources/panels-visualizations/panel-overview/index.md new file mode 100644 index 00000000000..bcdbd4f2e02 --- /dev/null +++ b/docs/sources/panels-visualizations/panel-overview/index.md @@ -0,0 +1,161 @@ +--- +keywords: + - transform + - query + - panel + - dashboard + - rows + - dynamic + - add +labels: + products: + - cloud + - enterprise + - oss +menuTitle: Panel overview +title: Panel overview +description: Learn about the features of the panel +weight: 15 +--- + +# Panel overview + +A Grafana panel is a visual representation of data composed of a [query][] and a [visualization][]. Within panels, you can apply [transformations][], which process the results of a query before they're passed on for visualization. You can also further customize a panel by formatting data and configuring visualization options. + +Each panel has a query editor specific to the data source selected in the panel. The query editor allows you to build a query that returns the data you want to visualize. + +Panels offer a wide variety of formatting and styling options, from applying colors based on field values to creating custom units. Each visualization also comes with options specific to it that give you further control over how your data is displayed. Panels can also be dragged, dropped, and resized to rearrange them on the dashboard. + +To get started adding panels, ensure that you have configured a data source: + +- For details about using data sources, refer to [Data sources][]. +- For more information about managing data sources as an administrator, refer to [Data source management][]. + + {{% admonition type="note" %}} + [Data source management](https://grafana.com/docs/grafana//administration/data-source-management/) is only available in [Grafana Enterprise](https://grafana.com/docs/grafana//introduction/grafana-enterprise/) and [Grafana Cloud](https://grafana.com/docs/grafana-cloud/). + {{% /admonition %}} + +## Panel feature overview + +The panel has the following features: + + + + + +- **Panel title** - You can create your own panel titles or have Grafana create them for you using [generative AI features][ai]. +- **Links** - Add [panel links][] to other dashboards, panels, or external sites. +- **Panel menu** - In the [panel menu](#panel-menu), access actions such as **View**, **Edit**, **Inspect**, and **Remove**. +- **Tooltips** - View [tooltips][] to get more information about data points. +- **Legend** - Change series colors, y-axis and series visibility directly from the [legend][]. + +## Panel menu + +To access the panel editor, hover over the top-right corner of any panel. Click the panel menu icon that appears and select **Edit**. The panel menu gives you access to the following actions: + +- **View**: View the panel in full screen. +- **Edit**: Open the panel editor to edit panel and visualization options. +- **Share**: Share the panel as a link, embed, or library panel. +- **Explore**: Open the panel in **Explore**, where you can focus on your query. +- **Inspect**: Open the **Inspect** drawer, where you can review the panel data, stats, metadata, JSON, and query. + - **Data**: Open the **Inspect** drawer in the **Data** tab. + - **Query**: Open the **Inspect** drawer in the **Query** tab. + - **Panel JSON**: Open the **Inspect** drawer in the **JSON** tab. +- **Extensions**: Access other actions provided by installed applications, such as declaring an incident. Note that this option doesn't appear unless you have app plugins installed which contribute an [extension](https://grafana.com/developers/plugin-tools/ui-extensions/) to the panel menu. +- **More**: Access other panel actions. + - **Duplicate**: Make a copy of the panel. Duplicated panels query data separately from the original panel. You can use the special `Dashboard` data source to [share the same query results across panels][share] instead. + - **Copy**: Copy the panel to the clipboard. + - **Create library panel**: Create a panel that can be imported into other dashboards. + - **Create alert**: Open the alert rule configuration page in **Alerting**, where you can [create a Grafana-managed alert][create] based on the panel queries. + - **Hide legend**: Hide the panel legend. + - **Get help**: Send a snapshot or panel data to Grafana Labs Technical Support. +- **Remove**: Remove the panel from the dashboard. + +## Keyboard shortcuts + +Grafana has a number of keyboard shortcuts available specifically for panels. Press `?` on your keyboard to display all keyboard shortcuts available in your version of Grafana. + +By hovering over a panel with the mouse you can use some shortcuts that will target that panel. + +- `e`: Toggle panel edit view +- `v`: Toggle panel fullscreen view +- `ps`: Open Panel Share Modal +- `pd`: Duplicate Panel +- `pr`: Remove Panel +- `pl`: Toggle panel legend + +## Add a panel + +To add a panel in a new dashboard click **+ Add visualization** in the middle of the dashboard: + +![Empty dashboard state](/media/docs/grafana/dashboards/empty-dashboard-10.2.png) + +To add a panel to an existing dashboard, click **Add** in the dashboard header and select **Visualization** in the drop-down: + +![Add dropdown](/media/docs/grafana/dashboards/screenshot-add-dropdown-10.0.png) + +## Panel configuration + +To configure panels, refer to the following subtopics: + +- [Configure panel options][] +- [Configure standard options][] +- [Configure a legend][legend] +- [Configure tooltips][tooltips] +- [Configure data links][] +- [Configure value mappings][] +- [Configure thresholds][] +- [Configure field overrides][] + +{{% docs/reference %}} +[query]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data" +[query]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data" + +[visualization]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations" +[visualization]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations" + +[transformations]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/transform-data" +[transformations]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/transform-data" + +[Data source management]: "/docs/grafana/ -> /docs/grafana//administration/data-source-management" +[Data source management]: "/docs/grafana-cloud/ -> /docs/grafana//administration/data-source-management" + +[Data sources]: "/docs/grafana/ -> /docs/grafana//datasources" +[Data sources]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/connect-externally-hosted/data-sources" + +[ai]: "/docs/grafana/ -> /docs/grafana//dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" +[ai]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" + +[panel links]: "/docs/grafana/ -> /docs/grafana//dashboards/build-dashboards/manage-dashboard-links#panel-links" +[panel links]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/build-dashboards/manage-dashboard-links#panel-links" + +[tooltips]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-tooltips" +[tooltips]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-tooltips" + +[legend]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-legend" +[legend]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-legend" + +[share]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/share-query" +[share]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/share-query" + +[create]: "/docs/grafana/ -> /docs/grafana//alerting/alerting-rules/create-grafana-managed-rule#create-alerts-from-panels" +[create]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-grafana-managed-rule#create-alerts-from-panels" + +[Configure panel options]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-panel-options" +[Configure panel options]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-panel-options" + +[Configure standard options]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options" +[Configure standard options]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options" + +[Configure data links]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-data-links" +[Configure data links]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-data-links" + +[Configure value mappings]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-value-mappings" +[Configure value mappings]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-value-mappings" + +[Configure thresholds]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-thresholds" +[Configure thresholds]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-thresholds" + +[Configure field overrides]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides" +[Configure field overrides]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides" +{{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/query-transform-data/expression-queries/index.md b/docs/sources/panels-visualizations/query-transform-data/expression-queries/index.md index 1019ab3e16a..18f6ef930c1 100644 --- a/docs/sources/panels-visualizations/query-transform-data/expression-queries/index.md +++ b/docs/sources/panels-visualizations/query-transform-data/expression-queries/index.md @@ -104,7 +104,7 @@ So if you have numbers with labels like `{host=web01}` in `$A` and another numbe - An item with no labels will join to anything. - If both `$A` and `$B` each contain only one item (one series, or one number), they will join. - If labels are exact math they will join. -- If labels are a subset of the other, for example and item in `$A` is labeled `{host=A,dc=MIA}` and and item in `$B` is labeled `{host=A}` they will join. +- If labels are a subset of the other, for example and item in `$A` is labeled `{host=A,dc=MIA}` and item in `$B` is labeled `{host=A}` they will join. - Currently, if within a variable such as `$A` there are different tag _keys_ for each item, the join behavior is undefined. The relational and logical operators return 0 for false 1 for true. diff --git a/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md b/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md index 8ed2a3ca47c..7d628524023 100644 --- a/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md +++ b/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md @@ -243,11 +243,11 @@ Config query result: In the field mapping specify: -| Field | Use as | Select | -| ----- | ----------------------- | ---------- | -| Value | Value mappings / Value | All values | -| Text | Value mappings / Text | All values | -| Color | Value mappings / Ciolor | All values | +| Field | Use as | Select | +| ----- | ---------------------- | ---------- | +| Value | Value mappings / Value | All values | +| Text | Value mappings / Text | All values | +| Color | Value mappings / Color | All values | Grafana builds value mappings from your query result and applies them to the real data query results. You should see values being mapped and colored according to the config query results. @@ -403,6 +403,11 @@ The available conditions for all fields are: - **Equal** - Match if the value is equal to the specified value. - **Different** - Match if the value is different than the specified value. +The available conditions for string fields are: + +- **Contains substring** - Match if the value contains the specified substring (case insensitive). +- **Does not contain substring** - Match if the value doesn't contain the specified substring (case insensitive). + The available conditions for number fields are: - **Greater** - Match if the value is greater than the specified value. @@ -629,6 +634,50 @@ We can generate a matrix using the values of 'Server Status' as column names, th Use this transformation to construct a matrix by specifying fields from your query results. The matrix output reflects the relationships between the unique values in these fields. This helps you present complex relationships in a clear and structured matrix format. +### Group to nested table + +Use this transformation to group the data by a specified field (column) value and process calculations on each group. Records are generated that share the same grouped field value, to be displayed in a nested table. + +To calculate a statistic for a field, click the selection box next to it and select the **Calculate** option: + +{{< figure src="/static/img/docs/transformations/nested-table-select-calculation.png" class="docs-image--no-shadow" max-width= "1100px" alt="A select box showing the Group and Calculate options for the transformation." >}} + +Once **Calculate** has been selected, another selection box will appear next to the respective field which will allow statistics to be selected: + +{{< figure src="/static/img/docs/transformations/nested-table-select-stat.png" class="docs-image--no-shadow" max-width= "1100px" alt="A select box showing available statistic calculations once the calculate option for the field has been selected." >}} + +For information about available calculations, refer to [Calculation types][]. + +Here's an example of original data: + +| Time | Server ID | CPU Temperature | Server Status | +| ------------------- | --------- | --------------- | ------------- | +| 2020-07-07 11:34:20 | server 1 | 80 | Shutdown | +| 2020-07-07 11:34:20 | server 3 | 62 | OK | +| 2020-07-07 10:32:20 | server 2 | 90 | Overload | +| 2020-07-07 10:31:22 | server 3 | 55 | OK | +| 2020-07-07 09:30:57 | server 3 | 62 | Rebooting | +| 2020-07-07 09:30:05 | server 2 | 88 | OK | +| 2020-07-07 09:28:06 | server 1 | 80 | OK | +| 2020-07-07 09:25:05 | server 2 | 88 | OK | +| 2020-07-07 09:23:07 | server 1 | 86 | OK | + +This transformation has two steps. First, specify one or more fields by which to group the data. This groups all the same values of those fields together, as if you sorted them. For instance, if you group by the Server ID field, Grafana groups the data this way: + +| Server ID | | +| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| server 1 |
TimeCPU TemperatureServer Status
2020-07-07 11:34:2080Shutdown
2020-07-07 09:28:0680OK
2020-07-07 09:23:0786OK
| +| server 2 |
TimeCPU TemperatureServer Status
2020-07-07 10:32:2090Overload
2020-07-07 09:30:0588OK
2020-07-07 09:25:0588OK
| +| server 3 |
TimeCPU TemperatureServer Status
2020-07-07 11:34:2062OK
2020-07-07 10:31:2255OK
2020-07-07 09:30:5762Rebooting
| + +After choosing the field by which you want to group your data, you can add various calculations on the other fields and apply the calculation to each group of rows. For instance, you might want to calculate the average CPU temperature for each of those servers. To do so, add the **mean calculation** applied on the CPU Temperature field to get the following result: + +| Server ID | CPU Temperatute (mean) | | +| --------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| server 1 | 82 |
TimeServer Status
2020-07-07 11:34:20Shutdown
2020-07-07 09:28:06OK
2020-07-07 09:23:07OK
| +| server 2 | 88.6 |
TimeServer Status
2020-07-07 10:32:20Overload
2020-07-07 09:30:05OK
2020-07-07 09:25:05OK
| +| server 3 | 59.6 |
TimeServer Status
2020-07-07 11:34:20OK
2020-07-07 10:31:22OK
2020-07-07 09:30:57Rebooting
| + ### Create heatmap Use this transformation to prepare histogram data for visualizing trends over time. Similar to the heatmap visualization, this transformation converts histogram metrics into temporal buckets. @@ -1265,9 +1314,13 @@ This transformation allows you to manipulate and analyze geospatial data, enabli ### Time series to table transform -Use this transformation to convert time series results into a table, transforming a time series data frame into a **Trend** field. The **Trend** field can then be rendered using the [sparkline cell type][], generating an inline sparkline for each table row. If there are multiple time series queries, each will result in a separate table data frame. These can be joined using join or merge transforms to produce a single table with multiple sparklines per row. +Use this transformation to convert time series results into a table, transforming a time series data frame into a **Trend** field which can then be used with the [sparkline cell type][]. If there are multiple time series queries, each will result in a separate table data frame. These can be joined using join or merge transforms to produce a single table with multiple sparklines per row. + +{{< figure src="/static/img/docs/transformations/table-sparklines.png" class="docs-image--no-shadow" max-width= "1100px" alt="A table panel showing multiple values and their corresponding sparklines." >}} + +For each generated **Trend** field value, a calculation function can be selected. This value is displayed next to the sparkline and will be used for sorting table rows. -For each generated **Trend** field value, a calculation function can be selected. The default is **Last non-null value**. This value is displayed next to the sparkline and used for sorting table rows. +{{< figure src="/static/img/docs/transformations/timeseries-table-select-stat.png" class="docs-image--no-shadow" max-width= "1100px" alt="A select box showing available statistics that can be calculated." >}} > **Note:** This transformation is available in Grafana 9.5+ as an opt-in beta feature. Modify the Grafana [configuration file][] to use it. diff --git a/docs/sources/panels-visualizations/visualizations/_index.md b/docs/sources/panels-visualizations/visualizations/_index.md index e38f957f6be..8e71d85993b 100644 --- a/docs/sources/panels-visualizations/visualizations/_index.md +++ b/docs/sources/panels-visualizations/visualizations/_index.md @@ -24,7 +24,7 @@ Grafana offers a variety of visualizations to support different use cases. This {{% admonition type="note" %}} If you are unsure which visualization to pick, Grafana can provide visualization suggestions based on the panel query. When you select a visualization, Grafana will show a preview with that visualization applied. -{{% /admonition %}} +{{< /admonition >}} - Graphs & charts - [Time series][] is the default and main Graph visualization. @@ -37,6 +37,7 @@ If you are unsure which visualization to pick, Grafana can provide visualization - [Candlestick][] is typically for financial data where the focus is price/data movement. - [Gauge][] is the traditional rounded visual showing how far a single metric is from a threshold. - [Trend][] for datasets that have a sequential, numeric x that is not time. + - [XY chart][] provides a way to visualize arbitrary x and y values in a graph. - Stats & numbers - [Stat][] for big stats and optional sparkline. - [Bar gauge][] is a horizontal or vertical bar gauge. @@ -120,19 +121,19 @@ A state timeline shows discrete state changes over time. When used with time ser {{% docs/reference %}} [News]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/news" -[News]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/news" +[News]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/news" [Histogram]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/histogram" -[Histogram]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/histogram" +[Histogram]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/histogram" [Text]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/text" -[Text]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/text" +[Text]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/text" [Dashboard list]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/dashboard-list" -[Dashboard list]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/dashboard-list" +[Dashboard list]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/dashboard-list" [Flame graph]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/flame-graph" -[Flame graph]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/flame-graph" +[Flame graph]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/flame-graph" [Canvas]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/canvas" [Canvas]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/canvas" @@ -141,49 +142,49 @@ A state timeline shows discrete state changes over time. When used with time ser [Geomap]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/geomap" [Status history]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/status-history" -[Status history]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/status-history" +[Status history]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/status-history" [Candlestick]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/candlestick" -[Candlestick]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/candlestick" +[Candlestick]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/candlestick" [Gauge]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/gauge" -[Gauge]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/gauge" +[Gauge]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/gauge" [Alert list]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/alert-list" -[Alert list]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/alert-list" +[Alert list]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/alert-list" [Pie chart]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/pie-chart" -[Pie chart]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/pie-chart" +[Pie chart]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/pie-chart" [Bar gauge]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/bar-gauge" -[Bar gauge]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/bar-gauge" +[Bar gauge]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/bar-gauge" [Bar chart]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/bar-chart" -[Bar chart]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/bar-chart" +[Bar chart]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/bar-chart" [Node graph]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/node-graph" -[Node graph]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/node-graph" +[Node graph]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/node-graph" [State timeline]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/state-timeline" -[State timeline]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/state-timeline" +[State timeline]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/state-timeline" [heatmap]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/heatmap" -[heatmap]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/heatmap" +[heatmap]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/heatmap" [Traces]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/traces" -[Traces]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/traces" +[Traces]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/traces" [Logs]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/logs" -[Logs]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/logs" +[Logs]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/logs" [Heatmap]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/heatmap" -[Heatmap]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/heatmap" +[Heatmap]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/heatmap" [Stat]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/stat" -[Stat]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/stat" +[Stat]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/stat" [Table]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/table" -[Table]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/table" +[Table]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/table" [Time series]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/time-series" [Time series]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/time-series" @@ -196,4 +197,7 @@ A state timeline shows discrete state changes over time. When used with time ser [Datagrid]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/datagrid" [Datagrid]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/datagrid" + +[XY chart]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/xy-chart" +[XY chart]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/xy-chart" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/bar-chart/index.md b/docs/sources/panels-visualizations/visualizations/bar-chart/index.md index 918cae3a833..8d75a2685d9 100644 --- a/docs/sources/panels-visualizations/visualizations/bar-chart/index.md +++ b/docs/sources/panels-visualizations/visualizations/bar-chart/index.md @@ -129,15 +129,13 @@ Transparency of the gradient is calculated based on the values on the y-axis. Op Gradient color is generated based on the hue of the line color. -{{< docs/shared lookup="visualizations/tooltip-mode.md" source="grafana" version="" >}} +## Tooltip options -{{< docs/shared lookup="visualizations/legend-mode.md" source="grafana" version="" >}} +{{< docs/shared lookup="visualizations/tooltip-options-1.md" source="grafana" version="" >}} -### Legend calculations +## Legend options -Choose which of the [standard calculations][] to show in the legend. You can have more than one. - -For more information about the legend, refer to [Configure a legend](../configure-legend/). +{{< docs/shared lookup="visualizations/legend-options-1.md" source="grafana" version="" >}} ## Text size @@ -191,15 +189,38 @@ Set a **Soft min** or **soft max** option for better control of Y-axis limits. B You can set standard min/max options to define hard limits of the Y-axis. For more information, refer to [Standard options definitions][]. -{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="" leveloffset="+2" >}} +{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="" leveloffset="+2" >}} + +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-1.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} {{% docs/reference %}} -[Add a field override]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides#add-a-field-override" -[Add a field override]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-overrides#add-a-field-override" +[Add a field override]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides#add-a-field-override" +[Add a field override]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides#add-a-field-override" -[standard calculations]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" +[standard calculations]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" [standard calculations]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/calculation-types" -[Standard options definitions]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#max" -[Standard options definitions]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-standard-options#max" +[Standard options definitions]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#max" +[Standard options definitions]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#max" + +[Configure data links]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-data-links" +[Configure data links]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-data-links" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md b/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md index 263d56c3c11..059f5b3ce11 100644 --- a/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md +++ b/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md @@ -130,7 +130,27 @@ Automatically show y-axis scrollbar when there's a large amount of data. This option only applies when bar size is set to manual. {{% /admonition %}} +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[Calculation types]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" +[Calculation types]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" [Calculation types]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/calculation-types" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/candlestick/index.md b/docs/sources/panels-visualizations/visualizations/candlestick/index.md index 29714790a88..c0a96d09ae6 100644 --- a/docs/sources/panels-visualizations/visualizations/candlestick/index.md +++ b/docs/sources/panels-visualizations/visualizations/candlestick/index.md @@ -110,11 +110,39 @@ If your data can't be mapped to these dimensions for some reason (for example, b ![Open, High, Low, and Close fields in the panel editor](/media/docs/grafana/panels-visualizations/screenshot-olhc-options-10.3.png) -## Additional fields +### Additional fields The candlestick visualization is based on the time series visualization. It can visualize additional data dimensions beyond open, high, low, close, and volume The **Include** and **Ignore** options allow it to visualize other included data such as simple moving averages, Bollinger bands and more, using the same styles and configurations available in the [time series][time series visualization] visualization. +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Legend options + +{{< docs/shared lookup="visualizations/legend-options-1.md" source="grafana" version="" >}} + +## Tooltip options + +{{< docs/shared lookup="visualizations/tooltip-options-2.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-1.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[time series visualization]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/time-series" -[time series visualization]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/time-series" +[time series visualization]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/time-series" +[time series visualization]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/time-series" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/canvas/index.md b/docs/sources/panels-visualizations/visualizations/canvas/index.md index 4b9cd1f3e80..306d88c65be 100644 --- a/docs/sources/panels-visualizations/visualizations/canvas/index.md +++ b/docs/sources/panels-visualizations/visualizations/canvas/index.md @@ -27,6 +27,24 @@ Canvases combine the power of Grafana with the flexibility of custom elements. C ## Elements +Elements are the basic building blocks of a canvas and they help you visualize data with different shapes and options. You can rotate and move elements around the canvas. When you move elements, snapping and alignment guides help you create more precise layouts. + +{{% admonition type="note" %}} +Element snapping and alignment only works when the canvas is not zoomed in. +{{% /admonition %}} + +When you select an element that you've added to a canvas, you can access editing options for it that are dependent on the element type. The following sections describe the different elements available. + +### Basic shapes + +A basic shape element can display text (both fixed and field data) and its background color can be changed based on data thresholds. You can add the following basic shapes to a canvas: + +- Cloud +- Ellipse +- Parallelogram +- Rectangle +- Triangle + ### Metric value The metric value element lets you easily select the data you want to display on a canvas. This element has a unique “edit” mode that can be triggered either through the context menu “Edit” option or by double clicking. When in edit mode you can select which field data that you want to display. @@ -39,14 +57,6 @@ The text element lets you easily add text to the canvas. The element also suppor {{< video-embed src="/static/img/docs/canvas-panel/canvas-text-9-2-0.mp4" max-width="750px" caption="Text element demo" >}} -### Ellipse - -The ellipse element lets you add a basic ellipse to the canvas. An ellipse element can display text (both fixed and field data) and its background color can be changed based on data thresholds. - -### Rectangle - -The rectangle element lets you add a basic rectangle to the canvas. A rectangle element can display text (both fixed and field data) and its background color can be changed based on data thresholds. - ### Icon The icon element lets you add a supported icon to the canvas. Icons can have their color set based on thresholds / value mappings. @@ -69,11 +79,25 @@ A button click will only trigger an API call when [inline editing](#inline-editi ## Connections -When building a canvas, you can connect elements together to create more complex visualizations. Connections are created by dragging from the connection anchor of one element to the connection anchor of another element. You can also create connections to the background of the canvas. Connection anchors are displayed when you hover over an element and inline editing is turned on. To remove a connection, simply click on the connection directly and then press the "Delete" or "Backspace" key. +When building a canvas, you can connect elements together to create more complex visualizations. Connections are created by dragging from the connection anchor of one element to the connection anchor of another element. You can also create connections to the background of the canvas. Connection anchors are displayed when you hover over an element and inline editing is turned on. + +To remove a connection, simply click on the connection directly and then press the "Delete" or "Backspace" key. {{< video-embed src="/media/docs/grafana/canvas-connections-9-4-0.mp4" max-width="750px" caption="Canvas connections demo" >}} -You can set both the size and color of connections based on fixed or field values. To do so, enter into panel edit mode, select the connection, and modify the connection's properties in the panel editor. +### Adjust connectors + +You can adjust connectors, adding angles to them, to fit the canvas you're working in. When you move connected elements, the connector resizes to fit the space. To adjust a connector, click it to display the midpoint controls and move those as needed. To make a connector a straight line again, move the midpoint back until the midpoint controls disappear. + +If you move a connector so that it's almost a right angle or a straight line, the connector snaps into that angle or into a straight line. + + + +{{< video-embed src="/media/docs/grafana/panels-visualizations/gif-canvas-connector-vertex-control-v11.0.mp4" alt="Changing a connector from a straight line to a right angle" >}} + +### Style connectors + +You can set the size, color, direction, and style of connections based on fixed or field values. To do so, enter into panel edit mode, select the connection, and modify the connection's properties in the panel editor. {{< figure src="/media/docs/grafana/screenshot-grafana-10-0-canvas-service-graph.png" max-width="750px" caption="Canvas service graph" >}} @@ -117,16 +141,6 @@ When right clicking an element, you are able to edit, delete, duplicate, and mod {{< figure src="/static/img/docs/canvas-panel/canvas-context-menu-9-2-0.png" max-width="750px" caption="Canvas element context menu" >}} -### Element snapping and alignment - -When you're moving elements around the canvas, snapping and alignment guides help you create more precise layouts. - -{{% admonition type="note" %}} -Currently, element snapping and alignment only works when the canvas is not zoomed in. -{{% /admonition %}} - - - ## Canvas options ### Inline editing @@ -137,7 +151,7 @@ The inline editing toggle lets you lock or unlock the canvas. When turned off th ### Data links -Canvases support [data links](https://grafana.com/docs/grafana/latest/panels-visualizations/configure-data-links/). You can create a data link for a metric-value element and display it for all elements that use the field name by following these steps: +Canvases support [data links][] for all elements except drone and button elements. You can add a data link by following these steps: 1. Set an element to be tied to a field value. 1. Turn off the inline editing toggle. @@ -148,7 +162,7 @@ Canvases support [data links](https://grafana.com/docs/grafana/latest/panels-vis 1. Hover over the element to display the data link tooltip. 1. Click on the element to be able to open the data link. -If multiple elements use the same field name, and you want to control which elements display the data link, you can create a unique field name using the [add field from calculation transform](https://grafana.com/docs/grafana/latest/panels-visualizations/query-transform-data/transform-data/#add-field-from-calculation). The alias you create in the transformation will appear as a field you can use with an element. +If multiple elements use the same field name, and you want to control which elements display the data link, you can create a unique field name using the [add field from calculation transform][]. The alias you create in the transformation will appear as a field you can use with an element. 1. In the panel editor for the canvas, click the **Transform** tab. 1. Select **Add field from calculation** from the list of transformations, or click **+ Add transformation** to display the list first. @@ -158,3 +172,27 @@ If multiple elements use the same field name, and you want to control which elem 1. Reference the new unique field alias to create the element and field override. {{< video-embed src="/media/docs/grafana/canvas-data-links-9-4-0.mp4" max-width="750px" caption="Data links demo" >}} + +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + +{{% docs/reference %}} +[data links]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-data-links" +[data links]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-data-links" + +[add field from calculation transform]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/transform-data#add-field-from-calculation" +[add field from calculation transform]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/transform-data#add-field-from-calculation" +{{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/gauge/index.md b/docs/sources/panels-visualizations/visualizations/gauge/index.md index aa2b3224058..92c6ea9e8f7 100644 --- a/docs/sources/panels-visualizations/visualizations/gauge/index.md +++ b/docs/sources/panels-visualizations/visualizations/gauge/index.md @@ -105,7 +105,27 @@ Adjust the sizes of the gauge text. - **Title -** Enter a numeric value for the gauge title size. - **Value -** Enter a numeric value for the gauge value size. +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[Calculation types]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" +[Calculation types]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" [Calculation types]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/calculation-types" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/geomap/index.md b/docs/sources/panels-visualizations/visualizations/geomap/index.md index 2a1efcfda48..98c92f5af71 100644 --- a/docs/sources/panels-visualizations/visualizations/geomap/index.md +++ b/docs/sources/panels-visualizations/visualizations/geomap/index.md @@ -601,10 +601,30 @@ Displays debug information in the upper right corner. This can be useful for deb - **None** displays tooltips only when a data point is clicked. - **Details** displays tooltips when a mouse pointer hovers over a data point. +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[provisioning docs page]: "/docs/grafana/ -> /docs/grafana//administration/provisioning" -[provisioning docs page]: "/docs/grafana-cloud/ -> /docs/grafana//administration/provisioning" +[provisioning docs page]: "/docs/grafana/ -> /docs/grafana//administration/provisioning" +[provisioning docs page]: "/docs/grafana-cloud/ -> /docs/grafana//administration/provisioning" -[data format supported by the node graph visualization]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/node-graph#data-api" -[data format supported by the node graph visualization]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/node-graph#data-api" +[data format supported by the node graph visualization]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/node-graph#data-api" +[data format supported by the node graph visualization]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/node-graph#data-api" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/heatmap/index.md b/docs/sources/panels-visualizations/visualizations/heatmap/index.md index 17b7cf9b9c1..a43c60ce3d2 100644 --- a/docs/sources/panels-visualizations/visualizations/heatmap/index.md +++ b/docs/sources/panels-visualizations/visualizations/heatmap/index.md @@ -117,7 +117,7 @@ This setting configures the axis value. When selected, the axis appears in reverse order. -{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="" leveloffset="+2" >}} +{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="" leveloffset="+2" >}} ## Colors @@ -150,19 +150,43 @@ Use these settings to refine your visualization. ### Tooltip -- **Show tooltip -** Show heatmap tooltip. -- **Show Histogram -** Show a Y-axis histogram on the tooltip. A histogram represents the distribution of the bucket values for a specific timestamp. -- **Show color scale -** Show a color scale on the tooltip. The color scale represents the mapping between bucket value and color. This option is configurable when you enable the `newVizTooltips` feature flag. +#### Tooltip mode + +When you hover your cursor over the visualization, Grafana can display tooltips. Choose how tooltips behave. + +- **Single -** The hover tooltip shows only a single series, the one that you are hovering over on the visualization. +- **All -** The hover tooltip shows all series in the visualization. Grafana highlights the series that you are hovering over in bold in the series list in the tooltip. +- **Hidden -** Do not display the tooltip when you interact with the visualization. + +Use an override to hide individual series from the tooltip. + +#### Show histogram (Y axis) + +When you set the **Tooltip mode** to **Single**, this option is displayed. This option controls whether or not the tooltip includes a histogram representing the y-axis. + +#### Show color scale + +When you set the **Tooltip mode** to **Single**, this option is displayed. This option controls whether or not the tooltip includes the color scale that's also represented in the legend. When the color scale is included in the tooltip, it shows the hovered value on the scale: + +![Heatmap with a tooltip displayed showing the hovered value reflected in the color scale](/media/docs/grafana/panels-visualizations/screenshot-heatmap-tooltip-color-scale-v11.0.png) ### Legend -Choose whether you want to display the heatmap legend on the visualization. +Choose whether you want to display the heatmap legend on the visualization by toggling the **Show legend** switch. + +### Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +### Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} ### Exemplars Set the color used to show exemplar data. {{% docs/reference %}} -[Introduction to histograms and heatmaps]: "/docs/grafana/ -> /docs/grafana//fundamentals/intro-histograms" -[Introduction to histograms and heatmaps]: "/docs/grafana-cloud/ -> /docs/grafana//fundamentals/intro-histograms" +[Introduction to histograms and heatmaps]: "/docs/grafana/ -> /docs/grafana//fundamentals/intro-histograms" +[Introduction to histograms and heatmaps]: "/docs/grafana-cloud/ -> /docs/grafana//fundamentals/intro-histograms" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/histogram/index.md b/docs/sources/panels-visualizations/visualizations/histogram/index.md index 1c2583154d8..1095200ffa4 100644 --- a/docs/sources/panels-visualizations/visualizations/histogram/index.md +++ b/docs/sources/panels-visualizations/visualizations/histogram/index.md @@ -121,16 +121,34 @@ Transparency of the gradient is calculated based on the values on the Y-axis. Th Gradient color is generated based on the hue of the line color. -{{< docs/shared lookup="visualizations/legend-mode.md" source="grafana" version="" >}} +## Standard options -### Legend calculations +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} -Choose a [standard calculations][] to show in the legend. You can select more than one. +## Legend options + +{{< docs/shared lookup="visualizations/legend-options-1.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} {{% docs/reference %}} -[color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" -[color scheme]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[color scheme]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#color-scheme" -[standard calculations]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" +[standard calculations]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" [standard calculations]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/calculation-types" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/node-graph/index.md b/docs/sources/panels-visualizations/visualizations/node-graph/index.md index 96fe3cb7bfa..eb28da6aeaf 100644 --- a/docs/sources/panels-visualizations/visualizations/node-graph/index.md +++ b/docs/sources/panels-visualizations/visualizations/node-graph/index.md @@ -104,13 +104,21 @@ Required fields: Optional fields: -| Field name | Type | Description | -| ------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| mainstat | string/number | First stat shown in the overlay when hovering over the edge. It can be a string showing the value as is or it can be a number. If it is a number, any unit associated with that field is also shown | -| secondarystat | string/number | Same as mainStat, but shown right under it. | -| detail\_\_\* | string/number | Any field prefixed with `detail__` will be shown in the header of context menu when clicked on the edge. Use `config.displayName` for more human readable label. | -| thickness | number | The thickness of the edge. Default: `1` | -| highlighted | boolean | Sets whether the edge should be highlighted. Useful, for example, to represent a specific path in the graph by highlighting several nodes and edges. Default: `false` | +| Field name | Type | Description | +| --------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| mainstat | string/number | First stat shown in the overlay when hovering over the edge. It can be a string showing the value as is or it can be a number. If it is a number, any unit associated with that field is also shown | +| secondarystat | string/number | Same as mainStat, but shown right under it. | +| detail\_\_\* | string/number | Any field prefixed with `detail__` will be shown in the header of context menu when clicked on the edge. Use `config.displayName` for more human readable label. | +| thickness | number | The thickness of the edge. Default: `1` | +| highlighted | boolean | Sets whether the edge should be highlighted. Useful, for example, to represent a specific path in the graph by highlighting several nodes and edges. Default: `false` | +| color | string | Sets the default color of the edge. It can be an acceptable HTML color string. Default: `#999` | +| strokeDasharray | string | Sets the pattern of dashes and gaps used to render the edge. If unset, a solid line is used as edge. For more information and examples, refer to the [`stroke-dasharray` MDN documentation](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray). | + +{{< admonition type="caution" >}} +Starting with 10.5, `highlighted` is deprecated. +It will be removed in a future release. +Use `color` to indicate a highlighted edge state instead. +{{< /admonition >}} ### Nodes data frame structure diff --git a/docs/sources/panels-visualizations/visualizations/pie-chart/index.md b/docs/sources/panels-visualizations/visualizations/pie-chart/index.md index ffb8f272911..d37bdacbd44 100644 --- a/docs/sources/panels-visualizations/visualizations/pie-chart/index.md +++ b/docs/sources/panels-visualizations/visualizations/pie-chart/index.md @@ -80,38 +80,56 @@ The following example shows a pie chart with **Name** and **Percent** labels dis ![Pie chart labels](/static/img/docs/pie-chart-panel/pie-chart-labels-7-5.png) -{{< docs/shared lookup="visualizations/tooltip-mode.md" source="grafana" version="" >}} +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Tooltip options + +{{< docs/shared lookup="visualizations/tooltip-options-1.md" source="grafana" version="" >}} ## Legend options Use these settings to define how the legend appears in your visualization. For more information about the legend, refer to [Configure a legend]({{< relref "../../configure-legend" >}}). -### Legend visibility +### Visibility -Use the **Visibility** switch to show or hide the legend. +Toggle the switch to turn the legend on or off. -### Legend mode +### Mode -Set the display mode of the legend: +Use these settings to define how the legend appears in your visualization. - **List -** Displays the legend as a list. This is a default display mode of the legend. - **Table -** Displays the legend as a table. -### Legend placement +### Placement Choose where to display the legend. - **Bottom -** Below the graph. - **Right -** To the right of the graph. -### Legend values +#### Width + +Control how wide the legend is when placed on the right side of the visualization. This option is only displayed if you set the legend placement to **Right**. + +### Values Select values to display in the legend. You can select more than one. - **Percent:** The percentage of the whole. - **Value:** The raw numerical value. +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[Calculation types]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" +[Calculation types]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" [Calculation types]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/calculation-types" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/stat/index.md b/docs/sources/panels-visualizations/visualizations/stat/index.md index 87e74088d0b..b4a04bc7db4 100644 --- a/docs/sources/panels-visualizations/visualizations/stat/index.md +++ b/docs/sources/panels-visualizations/visualizations/stat/index.md @@ -189,7 +189,27 @@ Adjust the sizes of the gauge text. - **Title -** Enter a numeric value for the gauge title size. - **Value -** Enter a numeric value for the gauge value size. +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[Calculation types]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" +[Calculation types]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" [Calculation types]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/calculation-types" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/state-timeline/index.md b/docs/sources/panels-visualizations/visualizations/state-timeline/index.md index ff8ede7aeb5..5106f1de5fb 100644 --- a/docs/sources/panels-visualizations/visualizations/state-timeline/index.md +++ b/docs/sources/panels-visualizations/visualizations/state-timeline/index.md @@ -114,15 +114,9 @@ Controls line width of state regions. Controls the opacity of state regions. -{{< docs/shared lookup="visualizations/connect-null-values.md" source="grafana" version="" >}} +{{< docs/shared lookup="visualizations/connect-null-values.md" source="grafana" version="" >}} -{{< docs/shared lookup="visualizations/disconnect-values.md" source="grafana" version="" >}} - -## Value mappings - -To assign colors to boolean or string values, you can use [Value mappings][]. - -{{< figure src="/static/img/docs/v8/value_mappings_side_editor.png" max-width="300px" caption="Value mappings side editor" >}} +{{< docs/shared lookup="visualizations/disconnect-values.md" source="grafana" version="" >}} ## Time series data with thresholds @@ -130,16 +124,40 @@ The visualization can be used with time series data as well. In this case, the t {{< figure src="/static/img/docs/v8/state_timeline_time_series.png" max-width="1025px" caption="state timeline with time series" >}} +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + ## Legend options -When the legend option is enabled it can show either the value mappings or the threshold brackets. To show the value mappings in the legend, it's important that the `Color scheme` as referenced in [Color scheme][] is set to `Single color` or `Classic palette`. To see the threshold brackets in the legend set the `Color scheme` to `From thresholds`. +{{< docs/shared lookup="visualizations/legend-options-2.md" source="grafana" version="" >}} + +## Tooltip options + +{{< docs/shared lookup="visualizations/tooltip-options-1.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +{{< figure src="/static/img/docs/v8/value_mappings_side_editor.png" max-width="300px" caption="Value mappings side editor" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} + +## Field overrides -{{< docs/shared lookup="visualizations/legend-mode.md" source="grafana" version="" >}} +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} {{% docs/reference %}} -[Color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" -[Color scheme]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[Color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[Color scheme]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#color-scheme" -[Value mappings]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-value-mappings" -[Value mappings]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-value-mappings" +[Value mappings]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-value-mappings" +[Value mappings]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-value-mappings" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/status-history/index.md b/docs/sources/panels-visualizations/visualizations/status-history/index.md index e73cf0b3281..02d16c7e20f 100644 --- a/docs/sources/panels-visualizations/visualizations/status-history/index.md +++ b/docs/sources/panels-visualizations/visualizations/status-history/index.md @@ -104,22 +104,40 @@ Controls line width of state regions. Controls the opacity of state regions. +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Legend options + +{{< docs/shared lookup="visualizations/legend-options-2.md" source="grafana" version="" >}} + +## Tooltip options + +{{< docs/shared lookup="visualizations/tooltip-options-1.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + ## Value mappings -To assign colors to boolean or string values, use the [Value mappings][]. +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} {{< figure src="/static/img/docs/v8/value_mappings_side_editor.png" max-width="300px" caption="Value mappings side editor" >}} -## Legend options +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} -When the legend option is enabled it can show either the value mappings or the threshold brackets. To show the value mappings in the legend, it's important that the `Color scheme` as referenced in [Color scheme][] is set to `Single color` or `Classic palette`. To see the threshold brackets in the legend set the `Color scheme` to `From thresholds`. +## Field overrides -{{< docs/shared lookup="visualizations/legend-mode.md" source="grafana" version="" >}} +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} {{% docs/reference %}} -[Value mappings]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-value-mappings" -[Value mappings]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-value-mappings" +[Value mappings]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-value-mappings" +[Value mappings]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-value-mappings" -[Color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" -[Color scheme]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[Color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[Color scheme]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#color-scheme" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/table/index.md b/docs/sources/panels-visualizations/visualizations/table/index.md index 678c1d87e5d..d12c0d58258 100644 --- a/docs/sources/panels-visualizations/visualizations/table/index.md +++ b/docs/sources/panels-visualizations/visualizations/table/index.md @@ -27,7 +27,7 @@ weight: 100 # Table -Tables are very flexible, supporting multiple modes for time series and for tables, annotation, and raw JSON data. This visualization also provides date formatting, value formatting, and coloring options. +Tables are very flexible, supporting multiple modes for time series and for tables, annotation, and raw JSON data. This visualization also provides date formatting, value formatting, and coloring options. In addition to formatting and coloring options, Grafana also provides a variety of _Cell types_ which you can use to display gauges, sparklines, and other rich data displays. {{< figure src="/static/img/docs/tables/table_visualization.png" max-width="1200px" lightbox="true" caption="Table visualization" >}} @@ -100,6 +100,10 @@ If thresholds are set, then the field background is displayed in the appropriate {{< figure src="/static/img/docs/tables/color-background.png" max-width="500px" caption="Color background" class="docs-image--no-shadow" >}} +Toggle the **Apply to entire row** switch, to apply the background color that's configured for the cell to the whole row. + +{{< figure src="/static/img/docs/tables/colored-rows.png" max-width="500px" alt="Colored row background" class="docs-image--no-shadow" >}} + ### Gauge Cells can be displayed as a graphical gauge, with several different presentation types. @@ -158,10 +162,12 @@ If you have a field value that is an image URL or a base64 encoded image you can ### Sparkline -Shows value rendered as a sparkline. Requires [time series to table][] data transform. +Shows values rendered as a sparkline. You can show sparklines using the [Time series to table transformation][] on data with multiple time series to process it into a format the table can show. {{< figure src="/static/img/docs/tables/sparkline2.png" max-width="500px" caption="Sparkline" class="docs-image--no-shadow" >}} +You can be customize sparklines with many of the same options as the [Time series panel][] including line width, fill opacity, and more. You can also change the color of the sparkline by updating the [color scheme][] in the _Standard options_ section of the panel configuration. + ## Cell value inspect Enables value inspection from table cell. The raw value is presented in a modal window. @@ -232,13 +238,39 @@ The system applies the calculation to all numeric fields if you do not select a If you want to show the number of rows in the dataset instead of the number of values in the selected fields, select the **Count** calculation and enable **Count rows**. +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[calculations]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" +[calculations]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/calculation-types" [calculations]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/calculation-types" -[time series to table]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/transform-data#time-series-to-table-transform" -[time series to table]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/query-transform-data/transform-data#time-series-to-table-transform" +[Time series to table transformation]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/query-transform-data/transform-data#time-series-to-table-transform" +[Time series to table transformation]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/transform-data#time-series-to-table-transform" + +[Time series panel]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/time-series" +[Time series panel]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/time-series" + +[color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[color scheme]: "/docs/grafana-cloud -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#color-scheme" -[configuration file]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-grafana#configuration-file-location" -[configuration file]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-grafana#configuration-file-location" +[configuration file]: "/docs/grafana/ -> /docs/grafana//setup-grafana/configure-grafana#configuration-file-location" +[configuration file]: "/docs/grafana-cloud/ -> /docs/grafana//setup-grafana/configure-grafana#configuration-file-location" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/time-series/index.md b/docs/sources/panels-visualizations/visualizations/time-series/index.md index 1846d877077..a4a10cfd94a 100644 --- a/docs/sources/panels-visualizations/visualizations/time-series/index.md +++ b/docs/sources/panels-visualizations/visualizations/time-series/index.md @@ -52,19 +52,11 @@ The following video guides you through the creation steps and common customizati ## Tooltip options -Tooltip options control the information overlay that appears when you hover over data points in the graph. - -{{< docs/shared lookup="visualizations/tooltip-mode.md" source="grafana" version="" >}} - -### Hover proximity - -This option controls how close your cursor must be to a data point before the tooltip appears. Values are in pixels. +{{< docs/shared lookup="visualizations/tooltip-options-2.md" source="grafana" version="" >}} ## Legend options -Legend options control the series names and statistics that appear under or to the right of the graph. - -{{< docs/shared lookup="visualizations/legend-mode.md" source="grafana" version="" >}} +{{< docs/shared lookup="visualizations/legend-options-1.md" source="grafana" version="" >}} ## Graph styles @@ -147,9 +139,9 @@ Set the style of the line. To change the color, use the standard [color scheme][ ![Line styles examples](/static/img/docs/time-series-panel/line-styles-examples-v9.png) -{{< docs/shared lookup="visualizations/connect-null-values.md" source="grafana" version="" >}} +{{< docs/shared lookup="visualizations/connect-null-values.md" source="grafana" version="" >}} -{{< docs/shared lookup="visualizations/disconnect-values.md" source="grafana" version="" >}} +{{< docs/shared lookup="visualizations/disconnect-values.md" source="grafana" version="" >}} ### Stack series @@ -266,7 +258,7 @@ Use this option to transform the series values without affecting the values show The transform option is only available as an override. {{% /admonition %}} -{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="" leveloffset="+2" >}} +{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="" leveloffset="+2" >}} ## Color options @@ -309,19 +301,39 @@ The following image shows a bar chart with the **Green-Yellow-Red (by value)** c {{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_bars.png" max-width="1200px" caption="Color scheme: Green-Yellow-Red" >}} +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-1.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[Color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" -[Color scheme]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[Color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[Color scheme]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#color-scheme" -[Add a field override]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides#add-a-field-override" -[Add a field override]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-overrides#add-a-field-override" +[Add a field override]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides#add-a-field-override" +[Add a field override]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides#add-a-field-override" -[Configure standard options]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#max" -[Configure standard options]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-standard-options#max" +[Configure standard options]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#max" +[Configure standard options]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#max" -[color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" -[color scheme]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[color scheme]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#color-scheme" -[Configure field overrides]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides" -[Configure field overrides]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/configure-overrides" +[Configure field overrides]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides" +[Configure field overrides]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/traces/index.md b/docs/sources/panels-visualizations/visualizations/traces/index.md index fa2ecb90989..dafc23d1657 100644 --- a/docs/sources/panels-visualizations/visualizations/traces/index.md +++ b/docs/sources/panels-visualizations/visualizations/traces/index.md @@ -56,7 +56,7 @@ This procedure uses dashboard variables and templates to allow you to enter trac 1. Select **Add visualization** from a new dashboard or select **Add Panel** on an existing dashboard. 1. Search for and select the appropriate tracing data source. 1. In the top-right of the panel editor, select the **Visualizations** tab, search for, and select **Traces**. -1. Under the **Panel options**, enter a **Title** for your trace panel. For more information on the panel editor, refer to the [Configure panel options documentation][]. +1. Under the **Panel options**, enter a **Title** for your trace panel or have Grafana create one using [generative AI features][]. For more information on the panel editor, refer to the [Configure panel options documentation][]. 1. In the query editor, select the **TraceQL** query type tab. 1. Enter `${traceId}` in the TraceQL query field to create a dashboard variable. This variable is used as the template query. @@ -80,7 +80,7 @@ It’s more useful to instead be able to use TraceQL queries to search for speci 1. Select the same trace data source you used in the previous section. 1. In the top-right of the panel editor, select the **Visualizations** tab, search for, and select **Table**. 1. In the query editor, select the **TraceQL** tab. -1. Under the **Panel options**, enter a **Title** for your trace panel. +1. Under the **Panel options**, enter a **Title** for your trace panel or have Grafana create one using [generative AI features][]. 1. Add an appropriate TraceQL query to search for traces that you would like to visualize in the dashboard. This example uses a simple, static query. You can write the TraceQL query as a template query to take advantage of other dashboard variables, if they exist. This lets you create dynamic queries based on these variables. {{< figure src="/static/img/docs/panels/traces/screenshot-traces-dynamic-query.png" caption="Create a dynamic query" >}} @@ -134,4 +134,7 @@ You should now see a list of matching traces in the table visualization. While s [Tempo data source]: "/docs/grafana/ -> /docs/grafana//datasources/tempo" [Tempo data source]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/connect-externally-hosted/data-sources/tempo" + +[generative AI features]: "/docs/grafana/ -> /docs/grafana//dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" +[generative AI features]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/dashboards/manage-dashboards#set-up-generative-ai-features-for-dashboards" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/trend/index.md b/docs/sources/panels-visualizations/visualizations/trend/index.md index c7ae5cef5e4..85268c1f1e4 100644 --- a/docs/sources/panels-visualizations/visualizations/trend/index.md +++ b/docs/sources/panels-visualizations/visualizations/trend/index.md @@ -38,7 +38,35 @@ For example, you could represent engine power and torque versus speed where spee {{< figure src="/media/docs/grafana/screenshot-grafana-10-0-trend-panel-new-colors.png" max-width="750px" caption="Trend engine power and torque curves" >}} +## Standard options + +{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}} + +## Legend options + +{{< docs/shared lookup="visualizations/legend-options-1.md" source="grafana" version="" >}} + +## Tooltip options + +{{< docs/shared lookup="visualizations/tooltip-options-2.md" source="grafana" version="" >}} + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Thresholds + +{{< docs/shared lookup="visualizations/thresholds-options-1.md" source="grafana" version="" >}} + +## Value mappings + +{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + {{% docs/reference %}} -[Time series visualization]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/time-series" -[Time series visualization]: "/docs/grafana-cloud/ -> /docs/grafana//panels-visualizations/visualizations/time-series" +[Time series visualization]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/visualizations/time-series" +[Time series visualization]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/time-series" {{% /docs/reference %}} diff --git a/docs/sources/panels-visualizations/visualizations/xy-chart/index.md b/docs/sources/panels-visualizations/visualizations/xy-chart/index.md new file mode 100644 index 00000000000..39731ae2a4f --- /dev/null +++ b/docs/sources/panels-visualizations/visualizations/xy-chart/index.md @@ -0,0 +1,282 @@ +--- +canonical: https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/xy-chart/ +keywords: + - grafana + - chart + - xy chart + - documentation + - guide + - graph +labels: + products: + - cloud + - enterprise + - oss +description: Configure options for Grafana's xy chart +title: XY chart +weight: 100 +--- + +# XY chart + +XY charts provide a way to visualize arbitrary x and y values in a graph so that you can easily show the relationship between two variables. XY charts are typically used to create scatter plots. You can also use them to create bubble charts where field values determine the size of each bubble: + +![An xy chart showing height weight distribution](/media/docs/grafana/panels-visualizations/screenshot-xy-charts-v11.0.png) + +## Supported data formats + +You can use any type of tabular data with at least two numeric fields in an xy chart. This type of visualization doesn't require time data. + +## XY chart options + +### Series mapping + +Set how series data is mapped in the chart. + +- [Auto](#auto-series-mapping-options) - Automatically generates series from all available data frames (or datasets). You can filter to select only one frame. +- [Manual](#manual-series-mapping-options) - Explicitly define the series by selecting from available data frames. + +Depending on your series mapping selection, the **Frame**, **X-field**, and **Y-field** options differ. The [Auto](#auto-series-mapping-options) and [Manual](#manual-series-mapping-options) series mapping sections describe these different options. + +#### Auto series mapping options + +When you select **Auto** as your series mapping mode, the following options are preconfigured, but you can also define them yourself: + +- [Frame](#frame) +- [X-field](#x-field) +- [Y-field](#y-field) + +##### Frame + +By default, an xy chart displays all data frames. You can filter to select only one frame. + +##### X-field + +Select which field or fields x represents. By default, this is the first number field in each data frame. For example, you enter the following CSV content: + +| a | b | c | +| --- | --- | --- | +| 0 | 0 | 0 | +| 1 | 1 | 9 | +| 2 | 2 | 4 | + +In the resulting chart, the x-field is generated from the values in column "a" unless you define it differently. + +##### Y-field + +After the x-field is set, by default, all the remaining number fields in the data frame are designated as the y-fields. You can use this option to explicitly choose which fields to use for y. + +The series of the chart are generated from the y-fields. To make changes to a series in an xy chart, make [overrides][Configure field overrides] to the y-field. + +{{< admonition type=note >}} +Any field you use in the [Size field](#size-field) or [Color field](#color-field) doesn't generate a series. +{{< /admonition >}} + +You can also use [overrides][Configure field overrides] to exclude y-fields individually. To do so, add an override with the following properties for each y-field you want removed: + +- Override type: **Fields with name** +- Override property: **Series > Hide in area** +- Area: **Viz** + +#### Manual series mapping options + +When you select **Manual** as your series mode, you can add, edit, and delete series. To manage a series, click the **Series** field; to rename the series, click the series name. + +In **Manual** mode, you must set the following options: + +- **Frame** - Select your data frame or dataset. You can add as many frames as you want. +- **X-field** - Select which field x represents. +- **Y-field** - Select which field y represents. + +### Size field + +Use this option to set which field's values control the size of the points in the chart. This value is relative to the min and max of all the values in the data frame. + +When you select this option, you can then set the [Min point size](#minmax-point-size) and [Max point size](#minmax-point-size) options. + +### Color field + +Use this option to set which field's values control the color of the points in the chart. To use the color value options under the **Standard options**, you must set this field. + +Typically, this option is used when you only have one series displayed in the chart. + +### Show + +Set how values are represented in the visualization. + +- **Points** - Display values as points. When you select this option, the [Point size](#point-size) option is also displayed. +- **Lines** - Add a line between values. When you select this option, the [Line style](#line-style) and [Line width](#line-width) options are also displayed. +- **Both** - Display both points and lines. + +### Point size + +Set the size of all points in the chart, from one to one hundred pixels in diameter. The default size is five pixels. You can set an [override][Configure field overrides] to set the pixel size by series (y-field). + +### Min/Max point size + +Use these options to control the minimum or maximum point size when you've set the **Size field** option. You can [override][Configure field overrides] these options for specific series. + +### Line style + +Set the style of the line. To change the color, use the standard [Color scheme][] field option. + +![Line style option](/static/img/docs/time-series-panel/line-style-option-v9.png) + +- **Solid:** Display a solid line. This is the default setting. +- **Dash:** Display a dashed line. When you choose this option, a drop-down list is displayed where you can select the length and gap setting for the line dashes. By default, the length and gap are set to `10, 10`. +- **Dots:** Display dotted lines. When you choose this option, a drop-down list is displayed where you can select dot spacing. By default, the dot spacing is set to `0, 10` (the first number represents dot length, which is always zero). + +### Line width + +Set the width of the lines in pixels. + +## Tooltip options + +Tooltip options control the information overlay that appears when you hover over data points in the visualization. + +### Tooltip mode + +When you hover your cursor over the visualization, Grafana can display tooltips. Choose how tooltips behave. + +- **Single -** The hover tooltip shows only a single series, the one that you are hovering over on the visualization. +- **Hidden -** Do not display the tooltip when you interact with the visualization. + +Use an override to hide individual series from the tooltip. + +### Max height + +Set the maximum height of the tooltip box. The default is 600 pixels. + +## Legend options + +{{< docs/shared lookup="visualizations/legend-options-1.md" source="grafana" version="" >}} + +## Axis options + +Options under the axis category change how the x- and y-axes are rendered. Some options don't take effect until you click outside of the field option box you are editing. You can also or press `Enter`. + +### Placement (y-axis) + +Select the placement of the y-axis. + +- **Auto:** Automatically assigns the y-axis to the series. When there are two or more series with different units, Grafana assigns the left axis to the first unit and the right axis to the units that follow. +- **Left:** Display all y-axes on the left side. +- **Right:** Display all y-axes on the right side. +- **Hidden:** Hide all axes. + +To selectively hide axes, [Add a field override][] that targets specific fields. + +### Label + +Set a y-axis text label. If you have more than one y-axis, then you can assign different labels using an override. + +### Width + +Set a fixed width of the axis. By default, Grafana dynamically calculates the width of an axis. + +By setting the width of the axis, data with different axes types can share the same display proportions. This setting makes it easier for you to compare more than one graph’s worth of data because the axes are not shifted or stretched within visual proximity to each other. + +### Show grid lines + +Set the axis grid line visibility. + +- **Auto:** Automatically show grid lines based on the density of the data. +- **On:** Always show grid lines. +- **Off:** Never show grid lines. + +### Color + +Set the color of the axis. + +- **Text:** Set the color based on theme text color. +- **Series:** Set the color based on the series color. + +### Show border + +Set the axis border visibility. + +### Scale + +Set the y-axis values scale. + +- **Linear:** Divides the scale into equal parts. +- **Logarithmic:** Use a logarithmic scale. When you select this option, a list appears for you to choose a binary (base 2) or common (base 10) logarithmic scale. +- **Symlog:** Use a symmetrical logarithmic scale. When you select this option, a list appears for you to choose a binary (base 2) or common (base 10) logarithmic scale. The linear threshold option allows you to set the threshold at which the scale changes from linear to logarithmic. + +### Centered zero + +Set the y-axis to be centered on zero. + +### Soft min and soft max + +Set a **Soft min** or **soft max** option for better control of y-axis limits. By default, Grafana sets the range for the y-axis automatically based on the dataset. + +**Soft min** and **soft max** settings can prevent small variations in the data from being magnified when it's mostly flat. In contrast, hard min and max values help prevent obscuring useful detail in the data by clipping intermittent spikes past a specific point. + +To define hard limits of the y-axis, set standard min/max options. For more information, refer to [Configure standard options][]. + +![Label example](/static/img/docs/time-series-panel/axis-soft-min-max-7-4.png) + +### Transform + +Use this option to transform the series values without affecting the values shown in the tooltip, context menu, or legend. + +- **Negative Y transform:** Flip the results to negative values on the Y axis. +- **Constant:** Show the first value as a constant line. + +{{% admonition type="note" %}} +The transform option is only available as an override. +{{% /admonition %}} + +{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="" leveloffset="+2" >}} + +## Standard options + +**Standard options** in the panel editor pane let you change how field data is displayed in your visualizations. When you set a standard option, the change is applied to all fields or series. For more granular control over the display of fields, refer to [Configure field overrides][]. + +You can customize the following standard options: + +- **Field min/max** - Enable **Field min/max** to have Grafana calculate the min or max of each field individually, based on the minimum or maximum value of the field. +- **Color scheme** - Set single or multiple colors for your entire visualization. + +To learn more, refer to [Configure standard options][]. + +## Data links + +{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}} + +## Field overrides + +{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}} + +## Other visualization options + +### Panel options + +Learn about [panel options][] that you can set for a visualization. + +{{% docs/reference %}} +[Color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[Color scheme]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#color-scheme" + +[Add a field override]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides#add-a-field-override" +[Add a field override]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides#add-a-field-override" + +[Configure standard options]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#max" +[Configure standard options]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#max" + +[color scheme]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options#color-scheme" +[color scheme]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options#color-scheme" + +[Configure field overrides]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-overrides" +[Configure field overrides]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides" + +[panel options]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-panel-options" +[panel options]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-panel-options" + +[standard options]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-standard-options" +[standard options]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options" + +[data links]: "/docs/grafana/ -> /docs/grafana//panels-visualizations/configure-data-links" +[data links]: "/docs/grafana-cloud/ -> /docs/grafana-cloud/visualizations/panels-visualizations/configure-data-links" +{{% /docs/reference %}} diff --git a/docs/sources/release-notes/release-notes-7-4-0.md b/docs/sources/release-notes/release-notes-7-4-0.md index 57e16aca6f5..7f40ad03dbe 100644 --- a/docs/sources/release-notes/release-notes-7-4-0.md +++ b/docs/sources/release-notes/release-notes-7-4-0.md @@ -163,7 +163,7 @@ Issue [#29407](https://github.com/grafana/grafana/issues/29407) We have upgraded AngularJS from version 1.6.6 to 1.8.2. Due to this upgrade some old angular plugins might stop working and will require a small update. This is due to the deprecation and removal of pre-assigned bindings. So if your custom angular controllers expect component bindings in the controller constructor you need to move this code to an `$onInit` function. For more details on how to migrate AngularJS code open the [migration guide](https://docs.angularjs.org/guide/migration) and search for **pre-assigning bindings**. -In order not to break all angular panel plugins and data sources we have some custom [angular inject behavior](https://github.com/grafana/grafana/blob/master/public/app/core/injectorMonkeyPatch.ts) that makes sure that bindings for these controllers are still set before constructor is called so many old angular panels and data source plugins will still work. Issue [#28736](https://github.com/grafana/grafana/issues/28736) +In order not to break all angular panel plugins and data sources we have some custom [angular inject behavior](https://github.com/grafana/grafana/blob/main/public/app/core/injectorMonkeyPatch.ts) that makes sure that bindings for these controllers are still set before constructor is called so many old angular panels and data source plugins will still work. Issue [#28736](https://github.com/grafana/grafana/issues/28736) ### Deprecations diff --git a/docs/sources/release-notes/release-notes-8-0-0-beta1.md b/docs/sources/release-notes/release-notes-8-0-0-beta1.md index a1f3d5fd385..1f4e450c626 100644 --- a/docs/sources/release-notes/release-notes-8-0-0-beta1.md +++ b/docs/sources/release-notes/release-notes-8-0-0-beta1.md @@ -131,7 +131,7 @@ Issue [#33352](https://github.com/grafana/grafana/issues/33352) ### Plugin development fixes & changes - **Button**: Introduce buttonStyle prop. [#33384](https://github.com/grafana/grafana/pull/33384), [@jackw](https://github.com/jackw) -- **DataQueryRequest**: Remove deprecated props showingGraph and showingTabel and exploreMode. [#31876](https://github.com/grafana/grafana/pull/31876), [@torkelo](https://github.com/torkelo) +- **DataQueryRequest**: Remove deprecated props showingGraph and showingTable and exploreMode. [#31876](https://github.com/grafana/grafana/pull/31876), [@torkelo](https://github.com/torkelo) - **grafana/ui**: Update React Hook Form to v7. [#33328](https://github.com/grafana/grafana/pull/33328), [@Clarity-89](https://github.com/Clarity-89) - **IconButton**: Introduce variant for red and blue icon buttons. [#33479](https://github.com/grafana/grafana/pull/33479), [@jackw](https://github.com/jackw) - **Plugins**: Expose the `getTimeZone` function to be able to get the current selected timeZone. [#31900](https://github.com/grafana/grafana/pull/31900), [@mckn](https://github.com/mckn) diff --git a/docs/sources/release-notes/release-notes-8-2-0.md b/docs/sources/release-notes/release-notes-8-2-0.md index 25d61e450ea..e03b005aa18 100644 --- a/docs/sources/release-notes/release-notes-8-2-0.md +++ b/docs/sources/release-notes/release-notes-8-2-0.md @@ -34,7 +34,7 @@ title: Release notes for Grafana 8.2.0 #### Potential failure to start in Ubuntu 18.04 / Debian 9 / CentOS -- In Grafana v8.2.0, this change can prevent the `grafana-server` service from starting on older versions of systemd, present on Ubuntu 18.04 and slightly older versions of Debian. If running one of those versions, please wait until v8.2.1 is released before upgrading. If you still want to upgrade or have already ugpraded, a simple fix is available here: https://github.com/grafana/grafana/issues/40162#issuecomment-938060240 Issue [#38109](https://github.com/grafana/grafana/issues/38109) +- In Grafana v8.2.0, this change can prevent the `grafana-server` service from starting on older versions of systemd, present on Ubuntu 18.04 and slightly older versions of Debian. If running one of those versions, please wait until v8.2.1 is released before upgrading. If you still want to upgrade or have already upgraded, a simple fix is available here: https://github.com/grafana/grafana/issues/40162#issuecomment-938060240 Issue [#38109](https://github.com/grafana/grafana/issues/38109) ### Plugin development fixes & changes diff --git a/docs/sources/release-notes/release-notes-9-0-4.md b/docs/sources/release-notes/release-notes-9-0-4.md index 8e8f4f68c4e..2fa37b35bbe 100644 --- a/docs/sources/release-notes/release-notes-9-0-4.md +++ b/docs/sources/release-notes/release-notes-9-0-4.md @@ -18,7 +18,7 @@ title: Release notes for Grafana 9.0.4 - **Browse/Search:** Make browser back work properly when visiting Browse or search. [#52271](https://github.com/grafana/grafana/pull/52271), [@torkelo](https://github.com/torkelo) - **Logs:** Improve getLogRowContext API. [#52130](https://github.com/grafana/grafana/pull/52130), [@gabor](https://github.com/gabor) - **Loki:** Improve handling of empty responses. [#52397](https://github.com/grafana/grafana/pull/52397), [@gabor](https://github.com/gabor) -- **Plugins:** Always validate root URL if specified in signature manfiest. [#52332](https://github.com/grafana/grafana/pull/52332), [@wbrowne](https://github.com/wbrowne) +- **Plugins:** Always validate root URL if specified in signature manifest. [#52332](https://github.com/grafana/grafana/pull/52332), [@wbrowne](https://github.com/wbrowne) - **Preferences:** Get home dashboard from teams. [#52225](https://github.com/grafana/grafana/pull/52225), [@sakjur](https://github.com/sakjur) - **SQLStore:** Support Upserting multiple rows. [#52228](https://github.com/grafana/grafana/pull/52228), [@joeblubaugh](https://github.com/joeblubaugh) - **Traces:** Add more template variables in Tempo & Zipkin. [#52306](https://github.com/grafana/grafana/pull/52306), [@joey-grafana](https://github.com/joey-grafana) diff --git a/docs/sources/setup-grafana/configure-grafana/_index.md b/docs/sources/setup-grafana/configure-grafana/_index.md index ebabb5a122e..d26b77ead9f 100644 --- a/docs/sources/setup-grafana/configure-grafana/_index.md +++ b/docs/sources/setup-grafana/configure-grafana/_index.md @@ -148,20 +148,6 @@ Options are `production` and `development`. Default is `production`. _Do not_ ch Set the name of the grafana-server instance. Used in logging, internal metrics, and clustering info. Defaults to: `${HOSTNAME}`, which will be replaced with environment variable `HOSTNAME`, if that is empty or does not exist Grafana will try to use system calls to get the machine name. -## force_migration - -{{% admonition type="note" %}} -This option is deprecated - [See `clean_upgrade` option]({{< relref "#clean_upgrade" >}}) instead. -{{% /admonition %}} - -When you restart Grafana to rollback from Grafana Alerting to legacy alerting, delete any existing Grafana Alerting data, such as alert rules, contact points, and notification policies. Default is `false`. - -If `false` or unset, existing Grafana Alerting data is not changed or deleted when rolling back to legacy alerting. - -{{% admonition type="note" %}} -It should be kept false or unset when not needed, as it may cause unintended data loss if left enabled. -{{% /admonition %}} -
## [paths] @@ -286,6 +272,17 @@ Path to the certificate file (if `protocol` is set to `https` or `h2`). Path to the certificate key file (if `protocol` is set to `https` or `h2`). +### certs_watch_interval + +Controls whether `cert_key` and `cert_file` are periodically watched for changes. +Disabled, by default. When enabled, `cert_key` and `cert_file` +are watched for changes. If there is change, the new certificates are loaded automatically. + +{{% admonition type="warning" %}} +After the new certificates are loaded, connections with old certificates +will not work. You must reload the connections to the old certs for them to work. +{{% /admonition %}} + ### socket_gid GID where the socket should be set when `protocol=socket`. @@ -375,9 +372,13 @@ The maximum number of open connections to the database. For MYSQL, configure thi Sets the maximum amount of time a connection may be reused. The default is 14400 (which means 14400 seconds or 4 hours). For MySQL, this setting should be shorter than the [`wait_timeout`](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_wait_timeout) variable. +### migration_locking + +Set to `false` to disable database locking during the migrations. Default is true. + ### locking_attempt_timeout_sec -For "mysql", if the `migrationLocking` feature toggle is set, specify the time (in seconds) to wait before failing to lock the database for the migrations. Default is 0. +For "mysql" and "postgres" only. Specify the time (in seconds) to wait before failing to lock the database for the migrations. Default is 0. ### log_queries @@ -711,7 +712,6 @@ The core features that depend on angular are: - Old graph panel - Old table panel -- Legacy alerting edit rule UI These features each have supported alternatives, and we recommend using them. @@ -837,7 +837,11 @@ The available options are `Viewer` (default), `Admin`, `Editor`, and `None`. For ### verify_email_enabled -Require email validation before sign up completes. Default is `false`. +Require email validation before sign up completes or when updating a user email address. Default is `false`. + +### login_default_org_id + +Set the default organization for users when they sign in. The default is `-1`. ### login_hint @@ -882,6 +886,12 @@ The duration in time a user invitation remains valid before expiring. This setting should be expressed as a duration. Examples: 6h (hours), 2d (days), 1w (week). Default is `24h` (24 hours). The minimum supported duration is `15m` (15 minutes). +### verification_email_max_lifetime_duration + +The duration in time a verification email, used to update the email address of a user, remains valid before expiring. +This setting should be expressed as a duration. Examples: 6h (hours), 2d (days), 1w (week). +Default is 1h (1 hour). + ### hidden_users This is a comma-separated list of usernames. Users specified here are hidden in the Grafana UI. They are still visible to Grafana administrators and to themselves. @@ -943,10 +953,10 @@ Administrators can increase this if they experience OAuth login state mismatch e ### oauth_skip_org_role_update_sync {{% admonition type="note" %}} -This option is deprecated in favor of OAuth provider specific `skip_org_role_sync` settings. The following sections explain settings for each provider. +This option is removed from G11 in favor of OAuth provider specific `skip_org_role_sync` settings. The following sections explain settings for each provider. {{% /admonition %}} -If you want to change the `oauth_skip_org_role_update_sync` setting to `false`, then for each provider you have set up, use the `skip_org_role_sync` setting to specify whether you want to skip the synchronization. +If you want to change the `oauth_skip_org_role_update_sync` setting from `true` to `false`, then each provider you have set up, use the `skip_org_role_sync` setting to specify whether you want to skip the synchronization. {{% admonition type="warning" %}} Currently if no organization role mapping is found for a user, Grafana doesn't update the user's organization role. @@ -1207,6 +1217,12 @@ Specifies whether user identity authentication (on behalf of currently signed-in Disabled by default, needs to be explicitly enabled. +### user_identity_fallback_credentials_enabled + +Specifies whether user identity authentication fallback credentials should be enabled in data sources. Enabling this allows data source creators to provide fallback credentials for backend-initiated requests, such as alerting, recorded queries, and so on. + +It is by default and needs to be explicitly disabled. It will not have any effect if user identity authentication is disabled. + ### user_identity_token_url Override token URL for Azure Active Directory. @@ -1518,9 +1534,9 @@ For more information about the Grafana alerts, refer to [About Grafana Alerting] ### enabled -Enable or disable Grafana Alerting. If disabled, all your legacy alerting data will be available again. The default value is `true`. +Enable or disable Grafana Alerting. The default value is `true`. -Alerting Rules migrated from dashboards and panels will include a link back via the `annotations`. +Alerting rules migrated from dashboards and panels will include a link back via the `annotations`. ### disabled_orgs @@ -1606,11 +1622,11 @@ The interval string is a possibly signed sequence of decimal numbers, followed b ### execute_alerts -Enable or disable alerting rule execution. The default value is `true`. The alerting UI remains visible. This option has a [legacy version in the alerting section]({{< relref "#execute_alerts-1" >}}) that takes precedence. +Enable or disable alerting rule execution. The default value is `true`. The alerting UI remains visible. ### evaluation_timeout -Sets the alert evaluation timeout when fetching data from the data source. The default value is `30s`. This option has a [legacy version in the alerting section]({{< relref "#evaluation_timeout_seconds" >}}) that takes precedence. +Sets the alert evaluation timeout when fetching data from the data source. The default value is `30s`. The timeout string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m. @@ -1620,7 +1636,7 @@ Sets a maximum number of times we'll attempt to evaluate an alert rule before gi ### min_interval -Sets the minimum interval to enforce between rule evaluations. The default value is `10s` which equals the scheduler interval. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. This option has [a legacy version in the alerting section]({{< relref "#min_interval_seconds" >}}) that takes precedence. +Sets the minimum interval to enforce between rule evaluations. The default value is `10s` which equals the scheduler interval. Rules will be adjusted if they are less than this value or if they are not multiple of the scheduler interval (10s). Higher values can help with resource management as we'll schedule fewer evaluations over time. The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. 30s or 1m. @@ -1630,12 +1646,17 @@ The interval string is a possibly signed sequence of decimal numbers, followed b ## [unified_alerting.screenshots] -For more information about screenshots, refer to [Images in notifications]({{< relref "../../alerting/manage-notifications/images-in-notifications" >}}). +For more information about screenshots, refer to [Images in notifications]({{< relref "../../alerting/configure-notifications/template-notifications/images-in-notifications" >}}). ### capture Enable screenshots in notifications. This option requires a remote HTTP image rendering service. Please see `[rendering]` for further configuration options. +### capture_timeout + +The timeout for capturing screenshots. If a screenshot cannot be captured within the timeout then the notification is sent without a screenshot. +The maximum duration is 30 seconds. This timeout should be less than the minimum Interval of all Evaluation Groups to avoid back pressure on alert rule evaluation. + ### max_concurrent_screenshots The maximum number of screenshots that can be taken at the same time. This option is different from `concurrent_render_request_limit` as `max_concurrent_screenshots` sets the number of concurrent screenshots that can be taken at the same time for all firing alerts where as concurrent_render_request_limit sets the total number of concurrent screenshots across all Grafana services. @@ -1658,71 +1679,15 @@ For example: `disabled_labels=grafana_folder`
-## [unified_alerting.upgrade] - -For more information about upgrading to Grafana Alerting, refer to [Upgrade Alerting](/docs/grafana/next/alerting/set-up/migrating-alerts/). - -### clean_upgrade - -When you restart Grafana to upgrade from legacy alerting to Grafana Alerting, delete any existing Grafana Alerting data from a previous upgrade, such as alert rules, contact points, and notification policies. Default is `false`. - -If `false` or unset, existing Grafana Alerting data is not changed or deleted when you switch between legacy and Unified Alerting. - -{{% admonition type="note" %}} -It should be kept false when not needed, as it may cause unintended data loss if left enabled. -{{% /admonition %}} - -
- -## [alerting] - -For more information about the legacy dashboard alerting feature in Grafana, refer to [the legacy Grafana alerts](/docs/grafana/v8.5/alerting/old-alerting/). - -### enabled - -Set to `true` to [enable legacy dashboard alerting]({{< relref "#unified_alerting" >}}). The default value is `false`. - -### execute_alerts - -Turns off alert rule execution, but alerting is still visible in the Grafana UI. - -### error_or_timeout - -Default setting for new alert rules. Defaults to categorize error and timeouts as alerting. (alerting, keep_state) - -### nodata_or_nullvalues - -Defines how Grafana handles nodata or null values in alerting. Options are `alerting`, `no_data`, `keep_state`, and `ok`. Default is `no_data`. - -### concurrent_render_limit - -Alert notifications can include images, but rendering many images at the same time can overload the server. -This limit protects the server from render overloading and ensures notifications are sent out quickly. Default value is `5`. - -### evaluation_timeout_seconds - -Sets the alert calculation timeout. Default value is `30`. +## [unified_alerting.state_history.annotations] -### notification_timeout_seconds +This section controls retention of annotations automatically created while evaluating alert rules when alerting state history backend is configured to be annotations (see setting [unified_alerting.state_history].backend) -Sets the alert notification timeout. Default value is `30`. - -### max_attempts - -Sets a maximum limit on attempts to sending alert notifications. Default value is `3`. - -### min_interval_seconds - -Sets the minimum interval between rule evaluations. Default value is `1`. - -> **Note.** This setting has precedence over each individual rule frequency. If a rule frequency is lower than this value, then this value is enforced. +### max_age -### max_annotation_age = +Configures for how long alert annotations are stored. Default is 0, which keeps them forever. This setting should be expressed as an duration. Ex 6h (hours), 10d (days), 2w (weeks), 1M (month). -Configures for how long alert annotations are stored. Default is 0, which keeps them forever. -This setting should be expressed as a duration. Examples: 6h (hours), 10d (days), 2w (weeks), 1M (month). - -### max_annotations_to_keep = +### max_annotations_to_keep Configures max number of alert annotations that Grafana stores. Default value is 0, which keeps all alert annotations. @@ -2172,6 +2137,18 @@ If the remote HTTP image renderer service runs on a different server than the Gr Concurrent render request limit affects when the /render HTTP endpoint is used. Rendering many images at the same time can overload the server, which this setting can help protect against by only allowing a certain number of concurrent requests. Default is `30`. +### default_image_width + +Configures the width of the rendered image. The default width is `1000`. + +### default_image_height + +Configures the height of the rendered image. The default height is `500`. + +### default_image_scale + +Configures the scale of the rendered image. The default scale is `1`. + ## [panels] ### enable_alpha diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index 6e80b789cb9..dcae0bca0e2 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -19,86 +19,86 @@ This page contains a list of available feature toggles. To learn how to turn on Some features are enabled by default. You can disable these feature by setting the feature flag to "false" in the configuration. -| Feature toggle name | Description | Enabled by default | -| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | | -| `publicDashboards` | [Deprecated] Public dashboards are now enabled by default; to disable them, use the configuration setting. This feature toggle will be removed in the next major version. | Yes | -| `featureHighlights` | Highlight Grafana Enterprise features | | -| `correlations` | Correlations page | | -| `exploreContentOutline` | Content outline sidebar | Yes | -| `dataConnectionsConsole` | Enables a new top-level page called Connections. This page is an experiment that provides a better experience when you install and configure data sources and other plugins. | Yes | -| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes | -| `redshiftAsyncQueryDataSupport` | Enable async query data support for Redshift | Yes | -| `athenaAsyncQueryDataSupport` | Enable async query data support for Athena | Yes | -| `nestedFolderPicker` | Enables the new folder picker to work with nested folders. Requires the nestedFolders feature toggle | Yes | -| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes | -| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes | -| `prometheusMetricEncyclopedia` | Adds the metrics explorer component to the Prometheus query builder as an option in metric select | Yes | -| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes | -| `prometheusDataplane` | Changes responses to from Prometheus to be compliant with the dataplane specification. In particular, when this feature toggle is active, the numeric `Field.Name` is set from 'Value' to the value of the `__name__` label. | Yes | -| `lokiMetricDataplane` | Changes metric responses from Loki to be compliant with the dataplane specification. | Yes | -| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes | -| `enableElasticsearchBackendQuerying` | Enable the processing of queries and responses in the Elasticsearch data source through backend | Yes | -| `cloudWatchLogsMonacoEditor` | Enables the Monaco editor for CloudWatch Logs queries | Yes | -| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes | -| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes | -| `transformationsRedesign` | Enables the transformations redesign | Yes | -| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes | -| `prometheusConfigOverhaulAuth` | Update the Prometheus configuration page with the new auth component | Yes | -| `influxdbSqlSupport` | Enable InfluxDB SQL query language support with new querying UI | Yes | -| `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes | -| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | -| `alertingInsights` | Show the new alerting insights landing page | Yes | -| `cloudWatchWildCardDimensionValues` | Fetches dimension values from CloudWatch to correctly label wildcard dimensions | Yes | -| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes | -| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | Yes | -| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes | -| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | -| `displayAnonymousStats` | Enables anonymous stats to be shown in the UI for Grafana | Yes | -| `lokiQueryHints` | Enables query hints for Loki | Yes | -| `alertingPreviewUpgrade` | Show Unified Alerting preview and upgrade page in legacy alerting | Yes | -| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | -| `alertingUpgradeDryrunOnStart` | When activated in legacy alerting mode, this initiates a dry-run of the Unified Alerting upgrade during each startup. It logs any issues detected without implementing any actual changes. | Yes | +| Feature toggle name | Description | Enabled by default | +| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | +| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | | +| `publicDashboards` | [Deprecated] Public dashboards are now enabled by default; to disable them, use the configuration setting. This feature toggle will be removed in the next major version. | Yes | +| `featureHighlights` | Highlight Grafana Enterprise features | | +| `correlations` | Correlations page | | +| `exploreContentOutline` | Content outline sidebar | Yes | +| `returnToPrevious` | Enables the return to previous context functionality | Yes | +| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes | +| `nestedFolders` | Enable folder nesting | Yes | +| `nestedFolderPicker` | Enables the new folder picker to work with nested folders. Requires the nestedFolders feature toggle | Yes | +| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes | +| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes | +| `prometheusMetricEncyclopedia` | Adds the metrics explorer component to the Prometheus query builder as an option in metric select | Yes | +| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes | +| `prometheusDataplane` | Changes responses to from Prometheus to be compliant with the dataplane specification. In particular, when this feature toggle is active, the numeric `Field.Name` is set from 'Value' to the value of the `__name__` label. | Yes | +| `lokiMetricDataplane` | Changes metric responses from Loki to be compliant with the dataplane specification. | Yes | +| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes | +| `enableElasticsearchBackendQuerying` | Enable the processing of queries and responses in the Elasticsearch data source through backend | Yes | +| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes | +| `pluginsDynamicAngularDetectionPatterns` | Enables fetching Angular detection patterns for plugins from GCOM and fallback to hardcoded ones | Yes | +| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes | +| `transformationsRedesign` | Enables the transformations redesign | Yes | +| `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | | +| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes | +| `prometheusConfigOverhaulAuth` | Update the Prometheus configuration page with the new auth component | Yes | +| `influxdbSqlSupport` | Enable InfluxDB SQL query language support with new querying UI | Yes | +| `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes | +| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | +| `dashgpt` | Enable AI powered features in dashboards | Yes | +| `alertingInsights` | Show the new alerting insights landing page | Yes | +| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes | +| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | Yes | +| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes | +| `managedPluginsInstall` | Install managed plugins directly from plugins catalog | Yes | +| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes | +| `exploreMetrics` | Enables the new Explore Metrics core app | Yes | +| `alertingSimplifiedRouting` | Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule | Yes | +| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | +| `lokiQueryHints` | Enables query hints for Loki | Yes | +| `enablePluginsTracingByDefault` | Enable plugin tracing for all external plugins | Yes | +| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | +| `betterPageScrolling` | Removes CustomScrollbar from the UI, relying on native browser scrollbars | Yes | ## Preview feature toggles | Feature toggle name | Description | | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `panelTitleSearch` | Search for dashboards using panel title | -| `migrationLocking` | Lock database during migrations | | `autoMigrateOldPanels` | Migrate old angular panels to supported versions (graph, table-old, worldmap, etc) | | `autoMigrateGraphPanel` | Migrate old graph panel to supported time series panel - broken out from autoMigrateOldPanels to enable granular tracking | | `autoMigrateTablePanel` | Migrate old table panel to supported table panel - broken out from autoMigrateOldPanels to enable granular tracking | | `autoMigratePiechartPanel` | Migrate old piechart panel to supported piechart panel - broken out from autoMigrateOldPanels to enable granular tracking | | `autoMigrateWorldmapPanel` | Migrate old worldmap panel to supported geomap panel - broken out from autoMigrateOldPanels to enable granular tracking | | `autoMigrateStatPanel` | Migrate old stat panel to supported stat panel - broken out from autoMigrateOldPanels to enable granular tracking | +| `autoMigrateXYChartPanel` | Migrate old XYChart panel to new XYChart2 model | | `disableAngular` | Dynamic flag to disable angular at runtime. The preferred method is to set `angular_support_enabled` to `false` in the [security] settings, which allows you to change the state at runtime. | | `newVizTooltips` | New visualizations tooltips UX | -| `returnToPrevious` | Enables the return to previous context functionality | | `grpcServer` | Run the GRPC server | | `accessControlOnCall` | Access control primitives for OnCall | -| `nestedFolders` | Enable folder nesting | | `alertingNoNormalState` | Stop maintaining state of alerts that are not firing | | `renderAuthJWT` | Uses JWT-based auth for rendering instead of relying on remote cache | | `refactorVariablesTimeRange` | Refactor time range variables flow to reduce number of API calls made when query variables are chained | | `faroDatasourceSelector` | Enable the data source selector within the Frontend Apps section of the Frontend Observability | | `enableDatagridEditing` | Enables the edit functionality in the datagrid panel | | `sqlDatasourceDatabaseSelection` | Enables previous SQL data source dataset dropdown behavior | -| `dashgpt` | Enable AI powered features in dashboards | | `reportingRetries` | Enables rendering retries for the reporting feature | | `externalServiceAccounts` | Automatic service account and token setup for plugins | | `formatString` | Enable format string transformer | | `transformationsVariableSupport` | Allows using variables in transformations | | `cloudWatchBatchQueries` | Runs CloudWatch metrics queries as separate batches | +| `teamHttpHeaders` | Enables Team LBAC for datasources to apply team headers to the client requests | | `awsDatasourcesNewFormStyling` | Applies new form styling for configuration and query editors in AWS plugins | -| `managedPluginsInstall` | Install managed plugins directly from plugins catalog | | `addFieldFromCalculationStatFunctions` | Add cumulative and window functions to the add field from calculation transformation | | `pdfTables` | Enables generating table data as PDF in reporting | | `ssoSettingsApi` | Enables the SSO settings API and the OAuth configuration UIs in Grafana | | `canvasPanelPanZoom` | Allow pan and zoom in canvas panel | -| `alertingSimplifiedRouting` | Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule | | `regressionTransformation` | Enables regression analysis transformation | | `groupToNestedTableTransformation` | Enables the group to nested table transformation | +| `newPDFRendering` | New implementation for the dashboard-to-PDF rendering | ## Experimental feature toggles @@ -109,10 +109,10 @@ Experimental features might be changed or removed without prior notice. | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `live-service-web-worker` | This will use a webworker thread to processes events rather than the main thread | | `queryOverLive` | Use Grafana Live WebSocket to execute backend queries | +| `publicDashboardsScene` | Enables public dashboard rendering using scenes | | `lokiExperimentalStreaming` | Support new streaming approach for loki (prototype, needs special loki build) | | `storage` | Configurable storage for dashboards, datasources, and resources | | `datasourceQueryMultiStatus` | Introduce HTTP 207 Multi Status for api/ds/query | -| `traceToMetrics` | Enable trace to metrics links | | `canvasPanelNesting` | Allow elements nesting | | `scenes` | Experimental framework to build interactive dashboards | | `disableSecretsCompatibility` | Disable duplicated secret storage in legacy tables | @@ -136,16 +136,14 @@ Experimental features might be changed or removed without prior notice. | `dashboardEmbed` | Allow embedding dashboard for external use in Code editors | | `frontendSandboxMonitorOnly` | Enables monitor only in the plugin frontend sandbox (if enabled) | | `lokiFormatQuery` | Enables the ability to format Loki queries | -| `exploreScrollableLogsContainer` | Improves the scrolling behavior of logs in Explore | -| `pluginsDynamicAngularDetectionPatterns` | Enables fetching Angular detection patterns for plugins from GCOM and fallback to hardcoded ones | | `vizAndWidgetSplit` | Split panels between visualizations and widgets | | `prometheusIncrementalQueryInstrumentation` | Adds RudderStack events to incremental queries | | `awsDatasourcesTempCredentials` | Support temporary security credentials in AWS plugins for Grafana Cloud customers | | `mlExpressions` | Enable support for Machine Learning in server-side expressions | -| `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | | `metricsSummary` | Enables metrics summary queries in the Tempo data source | | `featureToggleAdminPage` | Enable admin page for managing feature toggles from the Grafana front-end | | `permissionsFilterRemoveSubquery` | Alternative permission filter implementation that does not use subqueries for fetching the dashboard folder | +| `aiGeneratedDashboardChanges` | Enable AI powered features for dashboards to auto-summary changes when saving | | `sseGroupByDatasource` | Send query to the same datasource in a single request when using server side expressions. The `cloudWatchBatchQueries` feature toggle should be enabled if this used with CloudWatch. | | `libraryPanelRBAC` | Enables RBAC support for library panels | | `wargamesTesting` | Placeholder feature flag for internal testing | @@ -155,14 +153,11 @@ Experimental features might be changed or removed without prior notice. | `enableNativeHTTPHistogram` | Enables native HTTP Histograms | | `kubernetesPlaylists` | Use the kubernetes API in the frontend for playlists, and route /api/playlist requests to k8s | | `kubernetesSnapshots` | Routes snapshot requests from /api to the /apis endpoint | -| `teamHttpHeaders` | Enables datasources to apply team headers to the client requests | | `cachingOptimizeSerializationMemoryUsage` | If enabled, the caching backend gradually serializes query responses for the cache, comparing against the configured `[caching]max_value_mb` value as it goes. This can can help prevent Grafana from running out of memory while attempting to cache very large query responses. | -| `pluginsInstrumentationStatusSource` | Include a status source label for plugin request metrics and logs | | `prometheusPromQAIL` | Prometheus and AI/ML to assist users in creating a query | | `alertmanagerRemoteSecondary` | Enable Grafana to sync configuration and state with a remote Alertmanager. | | `alertmanagerRemotePrimary` | Enable Grafana to have a remote Alertmanager instance as the primary Alertmanager. | | `alertmanagerRemoteOnly` | Disable the internal Alertmanager and only use the external one defined. | -| `annotationPermissionUpdate` | Separate annotation permissions from dashboard permissions to allow for more granular control. | | `extractFieldsNameDeduplication` | Make sure extracted field names are unique in the dataframe | | `dashboardSceneForViewers` | Enables dashboard rendering using Scenes for viewer roles | | `dashboardSceneSolo` | Enables rendering dashboards using scenes for solo panels | @@ -172,13 +167,14 @@ Experimental features might be changed or removed without prior notice. | `pluginsSkipHostEnvVars` | Disables passing host environment variable to plugin processes | | `tableSharedCrosshair` | Enables shared crosshair in table panel | | `kubernetesFeatureToggles` | Use the kubernetes API for feature toggle management in the frontend | -| `enablePluginsTracingByDefault` | Enable plugin tracing for all external plugins | | `newFolderPicker` | Enables the nested folder picker without having nested folders enabled | | `onPremToCloudMigrations` | In-development feature that will allow users to easily migrate their on-prem Grafana instances to Grafana Cloud. | | `promQLScope` | In-development feature that will allow injection of labels into prometheus queries. | +| `sqlExpressions` | Enables using SQL and DuckDB functions as Expressions. | | `nodeGraphDotLayout` | Changed the layout algorithm for the node graph | -| `newPDFRendering` | New implementation for the dashboard to PDF rendering | | `kubernetesAggregator` | Enable grafana aggregator | +| `expressionParser` | Enable new expression parser | +| `usePrometheusFrontendPackage` | Use the @grafana/prometheus frontend package in core Prometheus. | ## Development feature toggles @@ -187,7 +183,6 @@ The following toggles require explicitly setting Grafana's [app mode]({{< relref | Feature toggle name | Description | | -------------------------------------- | -------------------------------------------------------------- | | `unifiedStorage` | SQL-based k8s storage | -| `externalServiceAuth` | Starts an OAuth2 authentication provider for external services | | `grafanaAPIServerWithExperimentalAPIs` | Register experimental APIs with the k8s API server | | `grafanaAPIServerEnsureKubectlAccess` | Start an additional https handler and write kubectl options | | `kubernetesQueryServiceRewrite` | Rewrite requests targeting /ds/query to the query service | diff --git a/docs/sources/setup-grafana/configure-security/audit-grafana.md b/docs/sources/setup-grafana/configure-security/audit-grafana.md index 26a4bb8d53c..051d4258c25 100644 --- a/docs/sources/setup-grafana/configure-security/audit-grafana.md +++ b/docs/sources/setup-grafana/configure-security/audit-grafana.md @@ -265,41 +265,6 @@ external group. \* `resources` may also contain a third item with `"type":` set to `"user"` or `"team"`. -#### Alerts and notification channels management - -| Action | Distinguishing fields | -| --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | -| Save alert manager configuration | `{"action": "update", "requestUri": "/api/alertmanager/RECIPIENT/config/api/v1/alerts"}` | -| Reset alert manager configuration | `{"action": "delete", "requestUri": "/api/alertmanager/RECIPIENT/config/api/v1/alerts"}` | -| Create silence | `{"action": "create", "requestUri": "/api/alertmanager/RECIPIENT/api/v2/silences"}` | -| Delete silence | `{"action": "delete", "requestUri": "/api/alertmanager/RECIPIENT/api/v2/silences/SILENCE-ID"}` | -| Create alert | `{"action": "create", "requestUri": "/api/ruler/RECIPIENT/api/v2/alerts"}` | -| Create or update rule group | `{"action": "create-update", "requestUri": "/api/ruler/RECIPIENT/api/v1/rules/NAMESPACE"}` | -| Delete rule group | `{"action": "delete", "requestUri": "/api/ruler/RECIPIENT/api/v1/rules/NAMESPACE/GROUP-NAME"}` | -| Delete namespace | `{"action": "delete", "requestUri": "/api/ruler/RECIPIENT/api/v1/rules/NAMESPACE"}` | -| Test Grafana managed receivers | `{"action": "test", "requestUri": "/api/alertmanager/RECIPIENT/config/api/v1/receivers/test"}` | -| Create or update the NGalert configuration of the user's organization | `{"action": "create-update", "requestUri": "/api/v1/ngalert/admin_config"}` | -| Delete the NGalert configuration of the user's organization | `{"action": "delete", "requestUri": "/api/v1/ngalert/admin_config"}` | - -Where the following: - -- `RECIPIENT` is `grafana` for requests handled by Grafana or the data source UID for requests forwarded to a data source. -- `NAMESPACE` is the string identifier for the rules namespace. -- `GROUP-NAME` is the string identifier for the rules group. -- `SILENCE-ID` is the ID of the affected silence. - -The following legacy alerting actions are still supported: - -| Action | Distinguishing fields | -| --------------------------------- | --------------------------------------------------------------------- | -| Test alert rule | `{"action": "test", "resources": [{"type": "panel"}]}` | -| Pause alert | `{"action": "pause", "resources": [{"type": "alert"}]}` | -| Pause all alerts | `{"action": "pause-all"}` | -| Test alert notification channel | `{"action": "test", "resources": [{"type": "alert-notification"}]}` | -| Create alert notification channel | `{"action": "create", "resources": [{"type": "alert-notification"}]}` | -| Update alert notification channel | `{"action": "update", "resources": [{"type": "alert-notification"}]}` | -| Delete alert notification channel | `{"action": "delete", "resources": [{"type": "alert-notification"}]}` | - #### Reporting | Action | Distinguishing fields | @@ -334,7 +299,6 @@ The following legacy alerting actions are still supported: | Reload provisioned dashboards | `{"action": "provisioning-dashboards"}` | | Reload provisioned datasources | `{"action": "provisioning-datasources"}` | | Reload provisioned plugins | `{"action": "provisioning-plugins"}` | -| Reload provisioned notifications | `{"action": "provisioning-notifications"}` | | Reload provisioned alerts | `{"action": "provisioning-alerts"}` | | Reload provisioned access control | `{"action": "provisioning-accesscontrol"}` | diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/_index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/_index.md index 12bd0bc7fd9..0a495fb49a0 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/_index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/_index.md @@ -19,19 +19,19 @@ Grafana provides many ways to authenticate users. Some authentication integratio The following table shows all supported authentication providers and the features available for them. [Team sync]({{< relref "../configure-team-sync" >}}) and [active sync]({{< relref "./enhanced-ldap#active-ldap-synchronization" >}}) are only available in Grafana Enterprise. -| Provider | Multi Org Mapping | Enforce Sync | Role Mapping | Grafana Admin Mapping | Team Sync | Allowed groups | Active Sync | Skip OrgRole mapping | Auto Login | Single Logout | -| :-------------------------------------------------- | :---------------- | :----------- | :----------- | :-------------------- | :-------- | :------------- | :---------- | :------------------- | :--------- | :------------ | -| [Auth Proxy]({{< relref "./auth-proxy" >}}) | no | yes | yes | no | yes | no | N/A | no | N/A | N/A | -| [Azure AD OAuth]({{< relref "./azuread" >}}) | no | yes | yes | yes | yes | yes | N/A | yes | yes | yes | -| [Generic OAuth]({{< relref "./generic-oauth" >}}) | no | yes | yes | yes | yes | no | N/A | yes | yes | yes | -| [GitHub OAuth]({{< relref "./github" >}}) | no | yes | yes | yes | yes | yes | N/A | yes | yes | yes | -| [GitLab OAuth]({{< relref "./gitlab" >}}) | no | yes | yes | yes | yes | yes | N/A | yes | yes | yes | -| [Google OAuth]({{< relref "./google" >}}) | no | no | no | no | yes | no | N/A | no | yes | yes | -| [Grafana.com OAuth]({{< relref "./grafana-com" >}}) | no | no | yes | no | N/A | N/A | N/A | yes | yes | yes | -| [Okta OAuth]({{< relref "./okta" >}}) | no | yes | yes | yes | yes | yes | N/A | yes | yes | yes | -| [SAML]({{< relref "./saml" >}}) (Enterprise only) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes | -| [LDAP]({{< relref "./ldap" >}}) | yes | yes | yes | yes | yes | yes | yes | no | N/A | N/A | -| [JWT Proxy]({{< relref "./jwt" >}}) | no | yes | yes | yes | no | no | N/A | no | N/A | N/A | +| Provider | Multi Org Mapping | Enforce Sync | Role Mapping | Grafana Admin Mapping | Team Sync | Allowed groups | Active Sync | Skip OrgRole mapping | Auto Login | Single Logout | +| :---------------------------------------------------- | :---------------- | :----------- | :----------- | :-------------------- | :-------- | :------------- | :---------- | :------------------- | :--------- | :------------ | +| [Auth Proxy]({{< relref "./auth-proxy" >}}) | no | yes | yes | no | yes | no | N/A | no | N/A | N/A | +| [Azure AD OAuth]({{< relref "./azuread" >}}) | no | yes | yes | yes | yes | yes | N/A | yes | yes | yes | +| [Generic OAuth]({{< relref "./generic-oauth" >}}) | no | yes | yes | yes | yes | no | N/A | yes | yes | yes | +| [GitHub OAuth]({{< relref "./github" >}}) | no | yes | yes | yes | yes | yes | N/A | yes | yes | yes | +| [GitLab OAuth]({{< relref "./gitlab" >}}) | no | yes | yes | yes | yes | yes | N/A | yes | yes | yes | +| [Google OAuth]({{< relref "./google" >}}) | no | no | no | no | yes | no | N/A | no | yes | yes | +| [Grafana.com OAuth]({{< relref "./grafana-cloud" >}}) | no | no | yes | no | N/A | N/A | N/A | yes | yes | yes | +| [Okta OAuth]({{< relref "./okta" >}}) | no | yes | yes | yes | yes | yes | N/A | yes | yes | yes | +| [SAML]({{< relref "./saml" >}}) (Enterprise only) | yes | yes | yes | yes | yes | yes | N/A | yes | yes | yes | +| [LDAP]({{< relref "./ldap" >}}) | yes | yes | yes | yes | yes | yes | yes | no | N/A | N/A | +| [JWT Proxy]({{< relref "./jwt" >}}) | no | yes | yes | yes | no | no | N/A | no | N/A | N/A | N/A = Not applicable diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/auth-proxy/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/auth-proxy/index.md index 287d146bf69..5ed036bb6ed 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/auth-proxy/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/auth-proxy/index.md @@ -36,7 +36,8 @@ header_property = username auto_sign_up = true # Define cache time to live in minutes # If combined with Grafana LDAP integration it is also the sync interval -sync_ttl = 60 +# Set to 0 to always fetch and sync the latest user data +sync_ttl = 15 # Limit where auth proxy requests come from by configuring a list of IP addresses. # This can be used to prevent users spoofing the X-WEBAUTH-USER header. # Example `whitelist = 192.168.1.1, 192.168.1.0/24, 2001::23, 2001::0/120` @@ -231,6 +232,10 @@ ProxyPassReverse / http://grafana:3000/ With our Grafana and Apache containers running, you can now connect to http://localhost/ and log in using the username/password we created in the htpasswd file. +{{% admonition type="note" %}} +If the user is deleted from Grafana, the user will be not be able to login and resync until after the `sync_ttl` has expired. +{{% /admonition %}} + ### Team Sync (Enterprise only) > Only available in Grafana Enterprise v6.3+ diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md index 8d0b79451e7..9dbda4334f9 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md @@ -49,7 +49,7 @@ To enable the Azure AD OAuth2, register your application with Azure AD. 1. Click **Certificates & secrets**, then add a new entry under **Client secrets** with the following configuration. - Description: Grafana OAuth - - Expires: Never + - Expires: Select an expiration period 1. Click **Add** then copy the key value. This is the OAuth client secret. diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md index 628ce6ca832..35e881c3a15 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md @@ -27,7 +27,7 @@ Grafana provides OAuth2 integrations for the following auth providers: - [GitHub OAuth]({{< relref "../github" >}}) - [GitLab OAuth]({{< relref "../gitlab" >}}) - [Google OAuth]({{< relref "../google" >}}) -- [Grafana Com OAuth]({{< relref "../grafana-com" >}}) +- [Grafana Com OAuth]({{< relref "../grafana-cloud" >}}) - [Keycloak OAuth]({{< relref "../keycloak" >}}) - [Okta OAuth]({{< relref "../okta" >}}) @@ -43,6 +43,10 @@ To follow this guide: - Ensure your identity provider returns OpenID UserInfo compatible information such as the `sub` claim. - If you are using refresh tokens, ensure you know how to set them up with your OAuth2 provider. Consult the documentation of your OAuth2 provider for more information. +{{% admonition type="note" %}} +If Users use the same email address in Azure AD that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information. +{{% /admonition %}} + ## Configure generic OAuth authentication client using the Grafana UI {{% admonition type="note" %}} @@ -512,3 +516,42 @@ To set up generic OAuth2 authentication with OneLogin, follow these steps: team_ids = allowed_organizations = ``` + +### Set up OAuth2 with Dex + +To set up generic OAuth2 authentication with [Dex IdP](https://dexidp.io/), follow these +steps: + +1. Add Grafana as a client in the Dex config YAML file: + + ```yaml + staticClients: + - id: + name: Grafana + secret: + redirectURIs: + - 'https:///login/generic_oauth' + ``` + + {{% admonition type="note" %}} + Unlike many other OAuth2 providers, Dex doesn't provide ``. + Instead, a secret can be generated with for example `openssl rand -hex 20`. + {{% /admonition %}} + +2. Update the `[auth.generic_oauth]` section of the Grafana configuration: + + ```bash + [auth.generic_oauth] + name = Dex + enabled = true + client_id = + client_secret = + scopes = openid email profile groups offline_access + auth_url = https:///auth + token_url = https:///token + api_url = https:///userinfo + ``` + + `` corresponds to the `issuer: ` configuration in Dex (e.g. the Dex + domain possibly including a path such as e.g. `/dex`). The `offline_access` scope is + needed when using [refresh tokens]({{< relref "#configure-a-refresh-token" >}}). diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/github/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/github/index.md index 60ee8762290..4ca721eaf62 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/github/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/github/index.md @@ -23,6 +23,10 @@ weight: 900 This topic describes how to configure GitHub OAuth2 authentication. +{{% admonition type="note" %}} +If Users use the same email address in GitHub that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information. +{{% /admonition %}} + ## Before you begin Ensure you know how to create a GitHub OAuth app. Consult GitHub's documentation on [creating an OAuth app](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) for more information. diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/gitlab/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/gitlab/index.md index 517951479e4..0541095257e 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/gitlab/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/gitlab/index.md @@ -23,6 +23,10 @@ weight: 1000 This topic describes how to configure GitLab OAuth2 authentication. +{{% admonition type="note" %}} +If Users use the same email address in GitLab that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information. +{{% /admonition %}} + ## Before you begin Ensure you know how to create a GitLab OAuth application. Consult GitLab's documentation on [creating a GitLab OAuth application](https://docs.gitlab.com/ee/integration/oauth_provider.html) for more information. diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/google/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/google/index.md index 58746d2824e..eca7ab7253a 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/google/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/google/index.md @@ -16,6 +16,10 @@ weight: 1100 To enable Google OAuth2 you must register your application with Google. Google will generate a client ID and secret key for you to use. +{{% admonition type="note" %}} +If Users use the same email address in Google that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information. +{{% /admonition %}} + ## Create Google OAuth keys First, you need to create a Google OAuth Client: @@ -112,11 +116,11 @@ You may specify a domain to be passed as `hd` query parameter accepted by Google OAuth 2.0 authentication API. Refer to Google's OAuth [documentation](https://developers.google.com/identity/openid-connect/openid-connect#hd-param). {{% admonition type="note" %}} -The `hd` parameter retrieved from Google ID token is also used to determine the user's hosted domain. The Google Oauth `allowed_domains` configuration option is used to restrict access to users from a specific domain. If the `allowed_domains` configuration option is set, the `hd` parameter from the Google ID token must match the `allowed_domains` configuration option. If the `hd` parameter from the Google ID token does not match the `allowed_domains` configuration option, the user is denied access. +Since Grafana 10.3.0, the `hd` parameter retrieved from Google ID token is also used to determine the user's hosted domain. The Google Oauth `allowed_domains` configuration option is used to restrict access to users from a specific domain. If the `allowed_domains` configuration option is set, the `hd` parameter from the Google ID token must match the `allowed_domains` configuration option. If the `hd` parameter from the Google ID token does not match the `allowed_domains` configuration option, the user is denied access. -When an account does not belong to a Google Workspace, the `hd` claim is not be available. +When an account does not belong to a google workspace, the hd claim will not be available. -This validation will be enabled by default with Grafana 11.0. To disable this validation, set the `validate_hd` configuration option to `false`. The `allowed_domains` configuration option will use the email claim to validate the domain. +This validation is enabled by default. To disable this validation, set the `validate_hd` configuration option to `false`. The `allowed_domains` configuration option will use the email claim to validate the domain. {{% /admonition %}} #### PKCE diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/grafana-cloud/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/grafana-cloud/index.md new file mode 100644 index 00000000000..c2b2e25eb0b --- /dev/null +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/grafana-cloud/index.md @@ -0,0 +1,60 @@ +--- +aliases: + - ../../../auth/grafana-cloud/ +description: Grafana Cloud Authentication +labels: + products: + - cloud +menuTitle: Grafana Cloud OAuth2 +title: Configure Grafana Cloud authentication +weight: 1200 +--- + +# Configure Grafana Cloud authentication + +To enable Grafana Cloud as the Identity Provider for a Grafana instance, generate a client ID and client secret and apply the configuration to Grafana. + +## Create Grafana Cloud OAuth Client Credentials + +To use Grafana Cloud authentication: + +1. Log in to [Grafana Cloud](/). +1. To create an OAuth client, locate your organization and click **OAuth Clients**. +1. Click **Add OAuth Client Application**. +1. Add the name and URL of your running Grafana instance. +1. Click **Add OAuth Client**. +1. Copy the client ID and client secret or the configuration that has been generated. + +The following snippet shows an example configuration: + +```ini +[auth.grafana_com] +enabled = true +allow_sign_up = true +auto_login = false +client_id = 450bc21c10dc2194879d +client_secret = eyJ0Ijoib2F1dGgyYyIhlmlkIjoiNzUwYmMzM2MxMGRjMjE6NDh3OWQiLCJ2IjoiZmI1YzVlYmIwYzFmN2ZhYzZmNjIwOGI1NmVkYTRlNWYxMzgwM2NkMiJ9 +scopes = user:email +allowed_organizations = sampleorganization +enabled = true +``` + +### Configure automatic login + +Set `auto_login` option to true to attempt login automatically, skipping the login screen. +This setting is ignored if multiple auth providers are configured to use auto login. + +``` +auto_login = true +``` + +## Skip organization role sync + +If a user signs in with their Grafana Cloud credentials, their assigned org role overrides the role defined in the Grafana instance. To prevent Grafana Cloud roles from synchronizing, set `skip_org_role_sync` to `true`. This is useful if you want to manage the organization roles for your users from within Grafana. + +```ini +[auth.grafana_com] +# .. +# prevents the sync of org roles from Grafana.com +skip_org_role_sync = true +``` diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/grafana-com/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/grafana-com/index.md deleted file mode 100644 index 19a15256d91..00000000000 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/grafana-com/index.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -aliases: - - ../../../auth/grafana-com/ -description: Grafana Com Authentication -labels: - products: - - cloud -menuTitle: Grafana Com OAuth2 -title: Configure Grafana Com authentication -weight: 1200 ---- - -# Configure Grafana Com authentication - -To enable GrafanaCom as your authentication provider, you configure it to generate a client ID and a secret key. - -## Create GrafanaCom OAuth keys - -To use GrafanaCom authentication: - -1. Log in to [GrafanaCom](/). -1. To create an OAuth client, locate your organization and click **OAuth Clients**. -1. Click **Add OAuth Client Application**. -1. Add the name and URL of your running Grafana instance. -1. Click **Add OAuth Client**. -1. Copy the client ID and secret key or the configuration that has been generated. - -The following snippet shows an example configuration: - -```ini -[auth.grafana_com] -enabled = true -allow_sign_up = true -auto_login = false -client_id = 450bc21c10dc2194879d -client_secret = eyJ0Ijoib2F1dGgyYyIhlmlkIjoiNzUwYmMzM2MxMGRjMjE6NDh3OWQiLCJ2IjoiZmI1YzVlYmIwYzFmN2ZhYzZmNjIwOGI1NmVkYTRlNWYxMzgwM2NkMiJ9 -scopes = user:email -allowed_organizations = sampleorganization -enabled = true -``` - -### Configure automatic login - -Set `auto_login` option to true to attempt login automatically, skipping the login screen. -This setting is ignored if multiple auth providers are configured to use auto login. - -``` -auto_login = true -``` - -## Skip organization role sync - -If a user signs in with their Grafana.com credentials, their assigned org role overrides the role defined in the Grafana instance. To prevent Grafana.com roles from synchronizing, set `skip_org_role_sync` to `true`. This is useful if you want to manage the organization roles for your users from within Grafana. - -```ini -[auth.grafana_com] -# .. -# prevents the sync of org roles from Grafana.com -skip_org_role_sync = true -``` diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/grafana/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/grafana/index.md index 05db6153133..2b912ce8f8d 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/grafana/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/grafana/index.md @@ -112,6 +112,27 @@ To disable basic auth: enabled = false ``` +### Strong password policy + +By default, the password policy for all basic auth users is set to a minimum of four characters. You can enable a stronger password policy with the `password_policy` configuration option. + +With the `password_policy` option enabled, new and updated passwords must meet the following criteria: + +- At least 12 characters +- At least one uppercase letter +- At least one lowercase letter +- At least one number +- At least one special character + +```bash +[auth.basic] +password_policy = true +``` + +{{% admonition type="note" %}} +Existing passwords that don't comply with the new password policy will not be impacted until the user updates their password. +{{% /admonition %}} + ### Disable login form You can hide the Grafana login form using the below configuration settings. diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/jwt/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/jwt/index.md index b182ba873e2..ba7e325475c 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/jwt/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/jwt/index.md @@ -62,6 +62,32 @@ email_claim = sub If `auto_sign_up` is enabled, then the `sub` claim is used as the "external Auth ID". The `name` claim is used as the user's full name if it is present. +Additionally, if the login username or the email claims are nested inside the JWT structure, you can specify the path to the attributes using the `username_attribute_path` and `email_attribute_path` configuration options using the JMESPath syntax. + +JWT structure example. + +```json +{ + "user": { + "UID": "1234567890", + "name": "John Doe", + "username": "johndoe", + "emails": ["personal@email.com", "professional@email.com"] + } +} +``` + +```ini +# [auth.jwt] +# ... + +# Specify a nested attribute to use as a username to sign in. +username_attribute_path = user.username # user's login is johndoe + +# Specify a nested attribute to use as an email to sign in. +email_attribute_path = user.emails[1] # user's email is professional@email.com +``` + ## Iframe Embedding If you want to embed Grafana in an iframe while maintaining user identity and role checks, diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md index 3f1178b0790..6f2dbea11ab 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md @@ -24,6 +24,10 @@ Keycloak OAuth2 authentication allows users to log in to Grafana using their Key Refer to [Generic OAuth authentication]({{< relref "../generic-oauth" >}}) for extra configuration options available for this provider. +{{% admonition type="note" %}} +If Users use the same email address in Keycloak that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information. +{{% /admonition %}} + You may have to set the `root_url` option of `[server]` for the callback URL to be correct. For example in case you are serving Grafana behind a proxy. diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/okta/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/okta/index.md index 9501898f534..9cc47511f53 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/okta/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/okta/index.md @@ -16,6 +16,10 @@ weight: 1400 {{< docs/shared lookup="auth/intro.md" source="grafana" version="" >}} +{{% admonition type="note" %}} +If Users use the same email address in Okta that they use with other authentication providers (such as Grafana.com), you need to do additional configuration to ensure that the users are matched correctly. Please refer to the [Using the same email address to login with different identity providers]({{< relref "../../configure-authentication#using-the-same-email-address-to-login-with-different-identity-providers" >}}) documentation for more information. +{{% /admonition %}} + ## Before you begin To follow this guide, ensure you have permissions in your Okta workspace to create an OIDC app. diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md index 78669d9cbd1..f043a4bf711 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md @@ -69,7 +69,7 @@ By default, SP-initiated requests are enabled. For instructions on how to enable - [`assertion_attribute_email`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_email" >}}) - [`assertion_attribute_name`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_name" >}}) - [`assertion_attribute_groups`]({{< relref "../../../configure-grafana/enterprise-configuration#assertion_attribute_groups" >}}) -1. Save the configuration file and and then restart the Grafana server. +1. Save the configuration file and then restart the Grafana server. When you are finished, the Grafana configuration might look like this example: diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-aws-kms/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-aws-kms/index.md index 32e1c77a279..f27851f1bd4 100644 --- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-aws-kms/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-aws-kms/index.md @@ -73,8 +73,6 @@ You can use an encryption key from AWS Key Management Service to encrypt secrets available_encryption_providers = awskms.example-encryption-key ``` - **> Note:** The encryption key that is stored in the `secret_key` field is still used by Grafana’s legacy alerting system to encrypt secrets, for decrypting existing secrets, or it is used as the default provider when external providers are not configured. Do not change or remove that value when adding a new KMS provider. - 7. [Restart Grafana](/docs/grafana/latest/installation/restart-grafana/). 8. (Optional) From the command line and the root directory of Grafana, re-encrypt all of the secrets within the Grafana database with the new key using the following command: @@ -83,6 +81,6 @@ You can use an encryption key from AWS Key Management Service to encrypt secrets If you do not re-encrypt existing secrets, then they will remain encrypted by the previous encryption key. Users will still be able to access them. - **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources or alert notification channels) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. + **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. - **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources, alert notification channels, or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. + **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-azure-key-vault/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-azure-key-vault/index.md index 7a6b8736c02..e90f81bc6d0 100644 --- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-azure-key-vault/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-azure-key-vault/index.md @@ -71,8 +71,6 @@ You can use an encryption key from Azure Key Vault to encrypt secrets in the Gra available_encryption_providers = azurekv.example-encryption-key ``` - **> Note:** The encryption key stored in the `secret_key` field is still used by Grafana’s legacy alerting system to encrypt secrets. Do not change or remove that value. - 9. [Restart Grafana](/docs/grafana/latest/installation/restart-grafana/). 10. (Optional) From the command line and the root directory of Grafana Enterprise, re-encrypt all of the secrets within the Grafana database with the new key using the following command: @@ -81,6 +79,6 @@ You can use an encryption key from Azure Key Vault to encrypt secrets in the Gra If you do not re-encrypt existing secrets, then they will remain encrypted by the previous encryption key. Users will still be able to access them. - **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources or alert notification channels) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. + **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. - **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources, alert notification channels, or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. + **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-google-cloud-kms/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-google-cloud-kms/index.md index 95433c423f5..240836fa303 100644 --- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-google-cloud-kms/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-google-cloud-kms/index.md @@ -60,8 +60,6 @@ You can use an encryption key from Google Cloud Key Management Service to encryp available_encryption_providers = googlekms.example-encryption-key ``` - **> Note:** The encryption key stored in the `secret_key` field is still used by Grafana’s legacy alerting system to encrypt secrets. Do not change or remove that value. - 8. [Restart Grafana](/docs/grafana/latest/installation/restart-grafana/). 9. (Optional) From the command line and the root directory of Grafana Enterprise, re-encrypt all of the secrets within the Grafana database with the new key using the following command: @@ -70,6 +68,6 @@ You can use an encryption key from Google Cloud Key Management Service to encryp If you do not re-encrypt existing secrets, then they will remain encrypted by the previous encryption key. Users will still be able to access them. - **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources or alert notification channels) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. + **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. - **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources, alert notification channels, or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. + **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. diff --git a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/index.md b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/index.md index b7626e5d603..76bfd46686a 100644 --- a/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-database-encryption/encrypt-secrets-using-hashicorp-key-vault/index.md @@ -67,8 +67,6 @@ You can use an encryption key from Hashicorp Vault to encrypt secrets in the Gra available_encryption_providers = hashicorpvault.example-encryption-key ``` - **> Note:** The encryption key stored in the `secret_key` field is still used by Grafana’s legacy alerting system to encrypt secrets. Do not change or remove that value. - 7. [Restart Grafana](/docs/grafana/latest/installation/restart-grafana/). 8. (Optional) From the command line and the root directory of Grafana Enterprise, re-encrypt all of the secrets within the Grafana database with the new key using the following command: @@ -77,6 +75,6 @@ You can use an encryption key from Hashicorp Vault to encrypt secrets in the Gra If you do not re-encrypt existing secrets, then they will remain encrypted by the previous encryption key. Users will still be able to access them. - **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources or alert notification channels) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. + **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. - **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources, alert notification channels, or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. + **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. diff --git a/docs/sources/setup-grafana/configure-security/configure-security-hardening/index.md b/docs/sources/setup-grafana/configure-security/configure-security-hardening/index.md index fd68b7cc40a..bc0dae58b4a 100644 --- a/docs/sources/setup-grafana/configure-security/configure-security-hardening/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-security-hardening/index.md @@ -101,7 +101,7 @@ To enable trusted types in report mode, where inputs that have not been sanitize - Enable `content_security_policy_report_only` in the configuration. - Add `require-trusted-types-for 'script'` to the `content_security_policy_report_only_template` in the configuration. -As this is a feature currently in development, things may break. If they do, or if you have any other feedback, feel free to [leave a comment](https://github.com/grafana/grafana/discussions/66823). +As this is a feature currently in development, things may break. If they do, or if you have any other feedback, feel free to [open an issue](https://github.com/grafana/grafana/issues/new/choose). ## Additional security hardening diff --git a/docs/sources/setup-grafana/image-rendering/_index.md b/docs/sources/setup-grafana/image-rendering/_index.md index 7c386d95530..d9438fa0142 100644 --- a/docs/sources/setup-grafana/image-rendering/_index.md +++ b/docs/sources/setup-grafana/image-rendering/_index.md @@ -30,7 +30,7 @@ You can also render a PNG by hovering over the panel to display the actions menu ## Alerting and render limits -Alert notifications can include images, but rendering many images at the same time can overload the server where the renderer is running. For instructions of how to configure this, see [concurrent_render_limit]({{< relref "../configure-grafana#concurrent_render_limit" >}}). +Alert notifications can include images, but rendering many images at the same time can overload the server where the renderer is running. For instructions of how to configure this, see [max_concurrent_screenshots]({{< relref "../configure-grafana#max_concurrent_screenshots" >}}). ## Install Grafana Image Renderer plugin diff --git a/docs/sources/setup-grafana/installation/kubernetes/index.md b/docs/sources/setup-grafana/installation/kubernetes/index.md index 5db13ecea67..d6ca75911bb 100644 --- a/docs/sources/setup-grafana/installation/kubernetes/index.md +++ b/docs/sources/setup-grafana/installation/kubernetes/index.md @@ -499,6 +499,98 @@ By default, Kubernetes deployment rollout history remains in the system so that If you need to go back to any other `REVISION`, just repeat the steps above and use the correct revision number in the `--to-revision` parameter. +## Provision Grafana resources using configuration files + +Provisioning can add, update, or delete resources specified in your configuration files when Grafana starts. For detailed information, refer to [Grafana Provisioning](/docs/grafana//administration/provisioning). + +This section outlines general instructions for provisioning Grafana resources within Kubernetes, using a persistent volume to supply the configuration files to the Grafana pod. + +1. Add a new `PersistentVolumeClaim` to the `grafana.yaml` file. + + ```yaml + --- + apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: grafana-provisioning-pvc + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Mi + ``` + +1. In the `grafana.yaml` file, mount the persistent volume into `/etc/grafana/provisioning` as follows. + + ```yaml + ... + volumeMounts: + - mountPath: /etc/grafana/provisioning + name: grafana-provisioning-pv + ... + volumes: + - name: grafana-provisioning-pv + persistentVolumeClaim: + claimName: grafana-provisioning-pvc + ... + ``` + +1. Find or create the provision resources you want to add. For instance, create a `alerting.yaml` file adding a mute timing (alerting resource). + + ```yaml + apiVersion: 1 + muteTimes: + - orgId: 1 + name: MuteWeekends + time_intervals: + - weekdays: [saturday, sunday] + ``` + +1. By default, configuration files for alerting resources need to be placed in the `provisioning/alerting` directory. + + Save the `alerting.yaml` file in a directory named `alerting`, as we will next supply this `alerting` directory to the `/etc/grafana/provisioning` folder of the Grafana pod. + +1. Verify first the content of the provisioning directory in the running Grafana pod. + + ```bash + kubectl exec -n my-grafana -- ls /etc/grafana/provisioning/ + ``` + + ```bash + kubectl exec -n my-grafana -- ls /etc/grafana/provisioning/alerting + ``` + + Because the `alerting` folder is not available yet, the last command should output a `No such file or directory` error. + +1. Copy the local `alerting` directory to `/etc/grafana/provisioning/` in the Grafana pod. + + ```bash + kubectl cp alerting my-grafana/:/etc/grafana/provisioning/ + ``` + + You can follow the same process to provision additional Grafana resources by supplying the following folders: + + - `provisioning/dashboards` + - `provisioning/datasources` + - `provisioning/plugins` + +1. Verify the `alerting` directory in the running Grafana pod includes the `alerting.yaml` file. + + ```bash + kubectl exec -n my-grafana -- ls /etc/grafana/provisioning/alerting + ``` + +1. Restart the Grafana pod to provision the resources. + + ```bash + kubectl rollout restart -n my-grafana deployment --selector=app=grafana + ``` + + Note that `rollout restart` kills the previous pod and scales a new pod. When the old pod terminates, you may have to enable port-forwarding in the new pod. For instructions, refer to the previous sections about port forwarding in this guide. + +1. Verify the Grafana resources are properly provisioned within the Grafana instance. + ## Troubleshooting This section includes troubleshooting tips you might find helpful when deploying Grafana on Kubernetes. diff --git a/docs/sources/setup-grafana/set-up-for-high-availability.md b/docs/sources/setup-grafana/set-up-for-high-availability.md index 9d9b184d3ad..b36b64f1dd8 100644 --- a/docs/sources/setup-grafana/set-up-for-high-availability.md +++ b/docs/sources/setup-grafana/set-up-for-high-availability.md @@ -41,11 +41,9 @@ Once you have a Postgres or MySQL database available, you can configure your mul ## Alerting high availability -Grafana Alerting provides a [high availability mode]({{< relref "../alerting/fundamentals/high-availability" >}}). +Grafana Alerting provides a high availability mode. It preserves the semantics of legacy dashboard alerting by executing all alerts on every server and by sending notifications only once per alert. Load distribution between servers is not supported at this time. -It preserves the semantics of legacy dashboard alerting by executing all alerts on every server and by sending notifications only once per alert. Load distribution between servers is not supported at this time. - -For instructions on setting up alerting high availability, refer to [Enable alerting high availability]({{< relref "../alerting/set-up/configure-high-availability" >}}). +For further information and instructions on setting up alerting high availability, refer to [Enable alerting high availability]({{< relref "../alerting/set-up/configure-high-availability" >}}). **Legacy dashboard alerts** diff --git a/docs/sources/shared/alerts/alerting_provisioning.md b/docs/sources/shared/alerts/alerting_provisioning.md index cfaca0ffcb8..c377aacbc66 100644 --- a/docs/sources/shared/alerts/alerting_provisioning.md +++ b/docs/sources/shared/alerts/alerting_provisioning.md @@ -337,7 +337,9 @@ GET /api/v1/provisioning/alert-rules/:uid/export - application/json - application/yaml +- application/terraform+hcl - text/yaml +- text/hcl #### Parameters @@ -416,16 +418,18 @@ GET /api/v1/provisioning/folder/:folderUid/rule-groups/:group/export - application/json - application/yaml +- application/terraform+hcl - text/yaml +- text/hcl #### Parameters -| Name | Source | Type | Go type | Separator | Required | Default | Description | -| --------- | ------- | ------- | -------- | --------- | :------: | -------- | --------------------------------------------------------------------------------------------------------------------------------- | -| FolderUID | `path` | string | `string` | | ✓ | | | -| Group | `path` | string | `string` | | ✓ | | | -| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | -| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence. | +| Name | Source | Type | Go type | Separator | Required | Default | Description | +| --------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| FolderUID | `path` | string | `string` | | ✓ | | | +| Group | `path` | string | `string` | | ✓ | | | +| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | +| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | #### All responses @@ -478,12 +482,20 @@ Status: OK GET /api/v1/provisioning/alert-rules/export ``` +#### Produces + +- application/json +- application/yaml +- application/terraform+hcl +- text/yaml +- text/hcl + #### Parameters -| Name | Source | Type | Go type | Separator | Required | Default | Description | -| -------- | ------- | ------- | -------- | --------- | :------: | -------- | --------------------------------------------------------------------------------------------------------------------------------- | -| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | -| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence. | +| Name | Source | Type | Go type | Separator | Required | Default | Description | +| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | +| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | #### All responses @@ -542,13 +554,21 @@ Status: OK GET /api/v1/provisioning/contact-points/export ``` +#### Produces + +- application/json +- application/yaml +- application/terraform+hcl +- text/yaml +- text/hcl + #### Parameters | Name | Source | Type | Go type | Separator | Required | Default | Description | | -------- | ------- | ------- | -------- | --------- | :------: | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | decrypt | `query` | boolean | `bool` | | | | Whether any contained secure settings should be decrypted or left redacted. Redacted settings will contain RedactedValue instead. Currently, only org admin can view decrypted secure settings. | | download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | -| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence. | +| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | | name | `query` | string | `string` | | | | Filter by name | #### All responses @@ -639,12 +659,20 @@ Status: OK GET /api/v1/provisioning/mute-timings/export ``` +#### Produces + +- application/json +- application/yaml +- application/terraform+hcl +- text/yaml +- text/hcl + #### Parameters -| Name | Source | Type | Go type | Separator | Required | Default | Description | -| -------- | ------- | ------- | -------- | --------- | :------: | -------- | --------------------------------------------------------------------------------------------------------------------------------- | -| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | -| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence. | +| Name | Source | Type | Go type | Separator | Required | Default | Description | +| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | +| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | #### All responses @@ -677,13 +705,21 @@ Status: Forbidden GET /api/v1/provisioning/mute-timings/:name/export ``` +#### Produces + +- application/json +- application/yaml +- application/terraform+hcl +- text/yaml +- text/hcl + #### Parameters -| Name | Source | Type | Go type | Separator | Required | Default | Description | -| -------- | ------- | ------- | -------- | --------- | :------: | -------- | --------------------------------------------------------------------------------------------------------------------------------- | -| name | `path` | string | `string` | | ✓ | | Mute timing name. | -| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | -| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence. | +| Name | Source | Type | Go type | Separator | Required | Default | Description | +| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| name | `path` | string | `string` | | ✓ | | Mute timing name. | +| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | +| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | #### All responses @@ -738,6 +774,21 @@ Status: OK GET /api/v1/provisioning/policies/export ``` +#### Produces + +- application/json +- application/yaml +- application/terraform+hcl +- text/yaml +- text/hcl + +#### Parameters + +| Name | Source | Type | Go type | Separator | Required | Default | Description | +| -------- | ------- | ------- | -------- | --------- | :------: | -------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| download | `query` | boolean | `bool` | | | | Whether to initiate a download of the file or not. | +| format | `query` | string | `string` | | | `"yaml"` | Format of the downloaded file, either yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence. | + #### All responses | Code | Status | Description | Has headers | Schema | diff --git a/docs/sources/shared/datasources/tempo-traces-to-profiles.md b/docs/sources/shared/datasources/tempo-traces-to-profiles.md index 3c6612c4d92..b433c4b4d79 100644 --- a/docs/sources/shared/datasources/tempo-traces-to-profiles.md +++ b/docs/sources/shared/datasources/tempo-traces-to-profiles.md @@ -64,8 +64,11 @@ The following table describes options for configuring your Trace to profiles set To use a basic configuration, follow these steps: -1. Select a Pyroscope data source from the **Data source** drop-down. -1. Optional: Choose any tags to use in the query. If left blank, the default values of `service.name` and `service.namespace` are used. +1. In the left menu, select **Connections** > **Data sources**. +1. Select your configured Tempo data source from the **Data source** list. +1. Scroll down to the **Traces to profiles** section. +1. Select a Pyroscope data source in the **Data source** drop-down. +1. Optional: Add one or more tags to use in the query. If left blank, the default values of `service.name` and `service.namespace` are used. The tags you configure must be present in the spans attributes or resources for a trace-to-profiles span link to appear. @@ -76,33 +79,24 @@ To use a basic configuration, follow these steps: The profile type or app must be selected for the query to be valid. Grafana doesn't show any data if the profile type or app isn’t selected when a query runs. ![Traces to profile configuration options in the Tempo data source](/media/docs/tempo/profiles/Tempo-data-source-profiles-Settings.png) -1. Do not select **Use custom query**. 1. Select **Save and Test**. -If you have configured a Pyroscope data source and no profile data is available or the **Profiles for this span** button and the embedded flame graph is not visible, verify that the `pyroscope.profile.id` key-value pair exists in your span tags. +If you have configured a Pyroscope data source and no profile data is available or the **Profiles for this span** +button and the embedded flame graph isn't visible, verify that the `pyroscope.profile.id` key-value pair exists in your span tags. ## Configure a custom query To use a custom query with the configuration, follow these steps: -1. Select a Pyroscope data source from the **Data source** drop-down. -1. Optional: Choose any tags to use in the query. If left blank, the default values of `service.name` and `service.namespace` are used. +1. In the left menu, select **Connections** > **Data sources**. +1. Select a configured Tempo data source from the **Data source** list. +1. Scroll down to the **Traces to profiles** section. +1. Select a Pyroscope data source in the **Data source** drop-down. +1. Optional: Choose any tags to use in the query. If left blank, the default values of `service.name` and `service.namespace` are used. - These tags can be used in the custom query with `${__tags}` variable. This variable interpolates the mapped tags as list in an appropriate syntax for the data source. Only the tags that were present in the span are included; tags that aren't present are omitted. You can also configure a new name for the tag. This is useful in cases where the tag has dots in the name and the target data source doesn't allow using dots in labels. For example, you can remap `service.name` to `service_name`. If you don’t map any tags here, you can still use any tag in the query, for example: `method="${__span.tags.method}"`. You can learn more about custom query variables [here](/docs/grafana//datasources/tempo/configure-tempo-data-source/#custom-query-variables). + These tags can be used in the custom query with `${__tags}` variable. This variable interpolates the mapped tags as list in an appropriate syntax for the data source. Only the tags that were present in the span are included; tags that aren't present are omitted. You can also configure a new name for the tag. This is useful in cases where the tag has dots in the name and the target data source doesn't allow using dots in labels. For example, you can remap `service.name` to `service_name`. If you don’t map any tags here, you can still use any tag in the query, for example: `method="${__span.tags.method}"`. You can learn more about custom query variables [here](/docs/grafana//datasources/tempo/configure-tempo-data-source/#custom-query-variables). -1. Select one or more profile types to use in the query. Select the drop-down and choose options from the menu. -1. Switch on **Use custom query** to enter a custom query. -1. Specify a custom query to be used to query profile data. You can use various variables to make that query relevant for current span. The link is shown only if all the variables are interpolated with non-empty values to prevent creating an invalid query. You can interpolate the configured tags using the `$__tags` keyword. -1. Select **Save and Test**. - -## Configure trace to profiles - -The following table describes options for configuring your trace to profiles settings: - -| Setting name | Description | -| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Data source** | Defines the target data source. You can currently select a Pyroscope \[profiling\] data source. | -| **Tags** | Defines the tags to use in the profile query. Default: `cluster`, `hostname`, `namespace`, `pod`, `service.name`, `service.namespace`. You can change the tag name for example to remove dots from the name if they are not allowed in the target data source. For example, map `http.status` to `http_status`. | -| **Profile type** | Defines the profile type that will be used in the query. | -| **Use custom query** | Toggles use of custom query with interpolation. | -| **Query** | Input to write custom query. Use variable interpolation to customize it with variables from span. | +1. Select one or more profile types to use in the query. Select the drop-down and choose options from the menu. +1. Switch on **Use custom query** to enter a custom query. +1. Specify a custom query to be used to query profile data. You can use various variables to make that query relevant for current span. The link is shown only if all the variables are interpolated with non-empty values to prevent creating an invalid query. You can interpolate the configured tags using the `$__tags` keyword. +1. Select **Save and Test**. diff --git a/docs/sources/shared/visualizations/datalink-options.md b/docs/sources/shared/visualizations/datalink-options.md new file mode 100644 index 00000000000..e3d77551cf5 --- /dev/null +++ b/docs/sources/shared/visualizations/datalink-options.md @@ -0,0 +1,15 @@ +--- +title: Data link options +comments: | + This file is used in the following visualizations: bar chart, bar gauge, candlestick, gauge, geomap, heatmap, histogram, stat, state timeline, status history, table, time series, trend, xy chart +--- + +Data links allow you to link to other panels, dashboards, and external resources while maintaining the context of the source panel. You can create links that include the series name or even the value under the cursor. + +For each data link, set the following options: + +- **Title** +- **URL** +- **Open in new tab** + +To learn more, refer to [Configure data links](../../configure-data-links/). diff --git a/docs/sources/shared/visualizations/legend-mode.md b/docs/sources/shared/visualizations/legend-mode.md deleted file mode 100644 index df8d1a50ec2..00000000000 --- a/docs/sources/shared/visualizations/legend-mode.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Legend mode and legend placement ---- - -### Legend mode - -Use these settings to define how the legend appears in your visualization. For more information about the legend, refer to [Configure a legend](../configure-legend/). - -- **List -** Displays the legend as a list. This is a default display mode of the legend. -- **Table -** Displays the legend as a table. -- **Hidden -** Hides the legend. - -### Legend placement - -Choose where to display the legend. - -- **Bottom -** Below the graph. -- **Right -** To the right of the graph. - -### Legend values - -Choose which of the [standard calculations]({{< relref "../../panels-visualizations/query-transform-data/calculation-types/" >}}) to show in the legend. You can have more than one. diff --git a/docs/sources/shared/visualizations/legend-options-1.md b/docs/sources/shared/visualizations/legend-options-1.md new file mode 100644 index 00000000000..8c101980d70 --- /dev/null +++ b/docs/sources/shared/visualizations/legend-options-1.md @@ -0,0 +1,35 @@ +--- +title: Legend options +comments: | + There are two legend shared files to cover the most common combinations of options. + Using two shared files ensures that content remains consistent across visualizations that share the same options and users don't have to figure out which options apply to a specific visualization when reading that content. + This file is used in the following visualizations: bar chart, candlestick, histogram, time series, trend, xy chart +--- + +Legend options control the series names and statistics that appear under or to the right of the graph. For more information about the legend, refer to [Configure a legend](../configure-legend/). + +### Visibility + +Toggle the switch to turn the legend on or off. + +### Mode + +Use these settings to define how the legend appears in your visualization. + +- **List -** Displays the legend as a list. This is a default display mode of the legend. +- **Table -** Displays the legend as a table. + +### Placement + +Choose where to display the legend. + +- **Bottom -** Below the graph. +- **Right -** To the right of the graph. + +#### Width + +Control how wide the legend is when placed on the right side of the visualization. This option is only displayed if you set the legend placement to **Right**. + +### Values + +Choose which of the [standard calculations](../../query-transform-data/calculation-types/) to show in the legend. You can have more than one. diff --git a/docs/sources/shared/visualizations/legend-options-2.md b/docs/sources/shared/visualizations/legend-options-2.md new file mode 100644 index 00000000000..9abfe0adfc7 --- /dev/null +++ b/docs/sources/shared/visualizations/legend-options-2.md @@ -0,0 +1,33 @@ +--- +title: Legend mode and legend placement +comments: | + There are two legend shared files to cover the most common combinations of options. + Using two shared files ensures that content remains consistent across visualizations that share the same options and users don't have to figure out which options apply to a specific visualization when reading that content. + This file is used in the following visualizations: state timeline, status history +--- + +When the legend option is enabled it can show either the value mappings or the threshold brackets. To show the value mappings in the legend, it's important that the **Color scheme** as referenced in [Color scheme](../../configure-standard-options#color-scheme) is set to **Single color** or **Classic palette**. To see the threshold brackets in the legend set the **Color scheme** to **From thresholds**. + +For more information about the legend, refer to [Configure a legend](../configure-legend/). + +### Visibility + +Toggle the switch to turn the legend on or off. + +### Mode + +Use these settings to define how the legend appears in your visualization. + +- **List -** Displays the legend as a list. This is a default display mode of the legend. +- **Table -** Displays the legend as a table. + +### Placement + +Choose where to display the legend. + +- **Bottom -** Below the graph. +- **Right -** To the right of the graph. + +#### Width + +Control how wide the legend is when placed on the right side of the visualization. This option is only displayed if you set the legend placement to **Right**. diff --git a/docs/sources/shared/visualizations/overrides-options.md b/docs/sources/shared/visualizations/overrides-options.md new file mode 100644 index 00000000000..ef50b1759c1 --- /dev/null +++ b/docs/sources/shared/visualizations/overrides-options.md @@ -0,0 +1,17 @@ +--- +title: Field overrides options +comments: | + This file is used in the following visualizations: bar chart, bar gauge, candlestick, canvas, gauge, geomap, heatmap, histogram, pie chart, stat, state timeline, status history, table, time series, trend, xy chart +--- + +Overrides allow you to customize visualization settings for specific fields or series. When you add an override rule, it targets a particular set of fields and lets you define multiple options for how that field is displayed. + +Choose from one the following override options: + +- **Fields with name** - Select a field from the list of all available fields. +- **Fields with name matching regex** - Specify fields to override with a regular expression. +- **Fields with type** - Select fields by type, such as string, numeric, or time. +- **Fields returned by query** - Select all fields returned by a specific query, such as A, B, or C. +- **Fields with values** - Select all fields returned by your defined reducer condition, such as **Min**, **Max**, **Count**, **Total**. + +To learn more, refer to [Configure field overrides](../../configure-overrides/). diff --git a/docs/sources/shared/visualizations/standard-options.md b/docs/sources/shared/visualizations/standard-options.md new file mode 100644 index 00000000000..1601ce8324e --- /dev/null +++ b/docs/sources/shared/visualizations/standard-options.md @@ -0,0 +1,19 @@ +--- +title: Standard options +comments: | + This file is used in the following visualizations: bar chart, bar gauge, candlestick, canvas, gauge, geomap, histogram, pie chart, stat, state timeline, status history, table, time series, trend +--- + +**Standard options** in the panel editor pane let you change how field data is displayed in your visualizations. When you set a standard option, the change is applied to all fields or series. For more granular control over the display of fields, refer to [Configure overrides](../../configure-overrides/). + +You can customize the following standard options: + +- **Unit** - Choose which unit a field should use. +- **Min**/**Max** - Set the minimum and maximum values used in percentage threshold calculations or leave these field empty for them to be calculated automatically. +- **Field min/max** - Enable **Field min/max** to have Grafana calculate the min or max of each field individually, based on the minimum or maximum value of the field. +- **Decimals** - Specify the number of decimals Grafana includes in the rendered value. +- **Display name** - Set the display title of all fields. You can use variables in the field title. +- **Color scheme** - Set single or multiple colors for your entire visualization. +- **No value** - Enter what Grafana should display if the field value is empty or null. The default value is a hyphen (-). + +To learn more, refer to [Configure standard options](../../configure-standard-options/). diff --git a/docs/sources/shared/visualizations/thresholds-options-1.md b/docs/sources/shared/visualizations/thresholds-options-1.md new file mode 100644 index 00000000000..72327be25a7 --- /dev/null +++ b/docs/sources/shared/visualizations/thresholds-options-1.md @@ -0,0 +1,19 @@ +--- +title: Thresholds options +comments: | + There are two thresholds shared files, thresholds-options-1.md and thresholds-options-2.md, to cover the most common combinations of options. + Using two shared files ensures that content remains consistent across visualizations that share the same options and users don't have to figure out which options apply to a specific visualization when reading that content. + This file is used in the following visualizations: bar chart, candlestick, time series, trend +--- + +A threshold is a value or limit you set for a metric that’s reflected visually when it’s met or exceeded. Thresholds are one way you can conditionally style and color your visualizations based on query results. + +Set the following options: + +- **Value** - Set the value for each threshold. +- **Thresholds mode** - Choose from: + - **Absolute** + - **Percentage** +- **Show thresholds** - Choose from a variety of display options including not displaying thresholds at all. + +To learn more, refer to [Configure thresholds](../../configure-thresholds/). diff --git a/docs/sources/shared/visualizations/thresholds-options-2.md b/docs/sources/shared/visualizations/thresholds-options-2.md new file mode 100644 index 00000000000..d2ea9c2a44a --- /dev/null +++ b/docs/sources/shared/visualizations/thresholds-options-2.md @@ -0,0 +1,18 @@ +--- +title: Thresholds options +comments: | + There are two thresholds shared files, thresholds-options-1.md and thresholds-options-2.md, to cover the most common combinations of options. + Using two shared files ensures that content remains consistent across visualizations that share the same options and users don't have to figure out which options apply to a specific visualization when reading that content. + This file is used in the following visualizations: bar gauge, canvas, gauge, geomap, histogram, stat, state timeline, status history, table +--- + +A threshold is a value or limit you set for a metric that’s reflected visually when it’s met or exceeded. Thresholds are one way you can conditionally style and color your visualizations based on query results. + +Set the following options: + +- **Value** - Set the value for each threshold. +- **Thresholds mode** - Choose from: + - **Absolute** + - **Percentage** + +To learn more, refer to [Configure thresholds](../../configure-thresholds/). diff --git a/docs/sources/shared/visualizations/tooltip-mode.md b/docs/sources/shared/visualizations/tooltip-mode.md deleted file mode 100644 index 75c2c4d2358..00000000000 --- a/docs/sources/shared/visualizations/tooltip-mode.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Tooltip mode ---- - -### Tooltip mode - -When you hover your cursor over the visualization, Grafana can display tooltips. Choose how tooltips behave. - -- **Single -** The hover tooltip shows only a single series, the one that you are hovering over on the visualization. -- **All -** The hover tooltip shows all series in the visualization. Grafana highlights the series that you are hovering over in bold in the series list in the tooltip. -- **Hidden -** Do not display the tooltip when you interact with the visualization. - -Use an override to hide individual series from the tooltip. diff --git a/docs/sources/shared/visualizations/tooltip-options-1.md b/docs/sources/shared/visualizations/tooltip-options-1.md new file mode 100644 index 00000000000..31f35524625 --- /dev/null +++ b/docs/sources/shared/visualizations/tooltip-options-1.md @@ -0,0 +1,31 @@ +--- +title: Tooltip options +comments: | + There are two tooltip shared files, tooltip-options-1.md and tooltip-options-2.md, to cover the most common combinations of options. + Using two shared files ensures that content remains consistent across visualizations that share the same options and users don't have to figure out which options apply to a specific visualization when reading that content. + This file is used in the following visualizations: bar chart, pie chart, state timeline, status history +--- + +Tooltip options control the information overlay that appears when you hover over data points in the visualization. + +### Tooltip mode + +When you hover your cursor over the visualization, Grafana can display tooltips. Choose how tooltips behave. + +- **Single -** The hover tooltip shows only a single series, the one that you are hovering over on the visualization. +- **All -** The hover tooltip shows all series in the visualization. Grafana highlights the series that you are hovering over in bold in the series list in the tooltip. +- **Hidden -** Do not display the tooltip when you interact with the visualization. + +Use an override to hide individual series from the tooltip. + +### Values sort order + +When you set the **Tooltip mode** to **All**, the **Values sort order** option is displayed. This option controls the order in which values are listed in a tooltip. Choose from the following: + +- **None** - Grafana automatically sorts the values displayed in a tooltip. +- **Ascending** - Values in the tooltip are listed from smallest to largest. +- **Descending** - Values in the tooltip are listed from largest to smallest. + +### Max height + +Set the maximum height of the tooltip box. The default is 600 pixels. diff --git a/docs/sources/shared/visualizations/tooltip-options-2.md b/docs/sources/shared/visualizations/tooltip-options-2.md new file mode 100644 index 00000000000..2a5d35e2bd0 --- /dev/null +++ b/docs/sources/shared/visualizations/tooltip-options-2.md @@ -0,0 +1,37 @@ +--- +title: Tooltip options +comments: | + There are two tooltip shared files, tooltip-options-1.md and tooltip-options-2.md, to cover the most common combinations of options. + Using two shared files ensures that content remains consistent across visualizations that share the same options and users don't have to figure out which options apply to a specific visualization when reading that content. + This file is used in the following visualizations: candlestick, time series, trend +--- + +Tooltip options control the information overlay that appears when you hover over data points in the visualization. + +### Tooltip mode + +When you hover your cursor over the visualization, Grafana can display tooltips. Choose how tooltips behave. + +- **Single -** The hover tooltip shows only a single series, the one that you are hovering over on the visualization. +- **All -** The hover tooltip shows all series in the visualization. Grafana highlights the series that you are hovering over in bold in the series list in the tooltip. +- **Hidden -** Do not display the tooltip when you interact with the visualization. + +Use an override to hide individual series from the tooltip. + +### Values sort order + +When you set the **Tooltip mode** to **All**, the **Values sort order** option is displayed. This option controls the order in which values are listed in a tooltip. Choose from the following: + +- **None** - Grafana automatically sorts the values displayed in a tooltip. +- **Ascending** - Values in the tooltip are listed from smallest to largest. +- **Descending** - Values in the tooltip are listed from largest to smallest. + +### Hover proximity + +Set the hover proximity (in pixels) to control how close the cursor must be to a data point to trigger the tooltip to display. + +![Adding a hover proximity limit for tooltips](/media/docs/grafana/gif-grafana-10-4-hover-proximity.gif) + +### Max height + +Set the maximum height of the tooltip box. The default is 600 pixels. diff --git a/docs/sources/shared/visualizations/value-mappings-options.md b/docs/sources/shared/visualizations/value-mappings-options.md new file mode 100644 index 00000000000..937801addec --- /dev/null +++ b/docs/sources/shared/visualizations/value-mappings-options.md @@ -0,0 +1,20 @@ +--- +title: Value mappings options +comments: | + This file is used in the following visualizations: bar chart, bar gauge, candlestick, canvas, gauge, geomap, histogram, pie chart, stat, state timeline, status history, table, time series, trend +--- + +Value mapping is a technique you can use to change how data appears in a visualization. + +For each value mapping, set the following options: + +- **Condition** - Choose what's mapped to the display text and (optionally) color: + - **Value** - Specific values + - **Range** - Numerical ranges + - **Regex** - Regular expressions + - **Special** - Special values like `Null`, `NaN` (not a number), or boolean values like `true` and `false` +- **Display text** +- **Color** (Optional) +- **Icon** (Canvas only) + +To learn more, refer to [Configure value mappings](../../configure-value-mappings/). diff --git a/docs/sources/tutorials/alerting-get-started/index.md b/docs/sources/tutorials/alerting-get-started/index.md index 09e11fb79b7..a3fde21a0ae 100644 --- a/docs/sources/tutorials/alerting-get-started/index.md +++ b/docs/sources/tutorials/alerting-get-started/index.md @@ -1,7 +1,7 @@ --- Feedback Link: https://github.com/grafana/tutorials/issues/new authors: - - antonio-calero-merello + - Antonio Calero categories: - alerting description: Get started with Grafana Alerting by creating your first alert in just a few minutes. Learn how to set up an alert, send alert notifications to a public webhook, and generate sample data to observe your alert in action. @@ -41,19 +41,19 @@ Download the files to your local machine. 1. Clone the [tutorial environment repository](https://github.com/grafana/tutorial-environment). - ``` + ```promql git clone https://github.com/grafana/tutorial-environment.git ``` 1. Change to the directory where you cloned the repository: - ``` + ```promql cd tutorial-environment ``` 1. Make sure Docker is running: - ``` + ```promql docker --version ``` @@ -61,19 +61,19 @@ Download the files to your local machine. 1. Start the sample application: - ``` + ```promql docker compose up -d ``` The first time you run `docker compose up -d`, Docker downloads all the necessary resources for the tutorial. This might take a few minutes, depending on your internet connection. {{< admonition type="note" >}} - If you already have Grafana, Loki, or Prometheus running on your system, you might see errors, because the Docker image is trying to use ports that your local installations are already using. If this is the case, stop the services, then run the command again. + If you already have Grafana, Loki, or Prometheus running on your system, you might see errors, because the Docker image is trying to use ports that your local installations are already using. . If this is the case, stop the services, then run the command again. {{< /admonition >}} 1. Ensure all services are up-and-running: - ``` + ```promql docker compose ps ``` @@ -107,7 +107,7 @@ In this step, we'll set up a new contact point. This contact point will use the You should get logged in automatically. 1. In another window, go to [requestbin.com](https://requestbin.com). 1. Under the **Create Request Bin** button, click the link to create a **public bin** instead. -1. From Request Bin, **copy the endpoint URL**. +1. From Request Bin, copy the endpoint URL. Your Request Bin is now waiting for the first request. @@ -118,11 +118,12 @@ Next, let's configure a Contact Point in Grafana's Alerting UI to send notificat 1. In **Name**, write **RequestBin**. 1. In **Integration**, choose **Webhook**. 1. In **URL**, paste the endpoint to your request bin. + 1. Click **Test**, and then click **Send test notification** to send a test alert to your request bin. 1. Navigate back to the Request Bin you created earlier. On the left side, there's now a `POST /` entry. Click it to see what information Grafana sent. 1. Return to Grafana and click **Save contact point**. -We have created a dummy webhook endpoint and created a new Alerting Contact Point in Grafana. Now, we can create an alert rule and link it to this new channel. +We have now created a dummy webhook endpoint and created a new Alerting Contact Point in Grafana. Now we can create an alert rule and link it to this new channel. ## Create an alert @@ -179,8 +180,12 @@ An evaluation group defines an evaluation interval - how often a rule is checked Add labels to ease searching or route notifications to a policy. -1. Add a label.Add `app` as the label key, and `grafana-news` as the value. -1. Add a notification recipient. Under **Contact point**, select **RequestBin** from the drop-down menu. +1. Add a label. + Add `app` as the label key, and `grafana-news` as the value. + +1. Add a notification recipient. + Under **Contact point**, select **RequestBin** from the drop-down menu. + 1. Add an annotation (optional). To provide more context on the alert, you can link a dashboard and panel to our Alert. To do this, click **Link Dashboard and panel** button. @@ -207,7 +212,7 @@ In this tutorial, you have learned how to set up an alert, send alert notificati Check out the links below to continue your learning journey with Grafana's LGTM stack. -- [Prometheus](/docs/grafana//features/datasources/prometheus/) -- [Alerting Overview](/docs/grafana//alerting/) -- [Alert rules](/docs/grafana//alerting/create-alerts/) -- [Contact Points](/docs/grafana//alerting/notifications/) +- [Prometheus](/docs/grafana/latest/features/datasources/prometheus/) +- [Alerting Overview](/docs/grafana/latest/alerting/) +- [Alert rules](/docs/grafana/latest/alerting/create-alerts/) +- [Contact points](/docs/grafana/latest/alerting/fundamentals/contact-points/) diff --git a/docs/sources/tutorials/create-alerts-with-logs/index.md b/docs/sources/tutorials/create-alerts-with-logs/index.md index c2293fbba7f..87eaf7bb994 100644 --- a/docs/sources/tutorials/create-alerts-with-logs/index.md +++ b/docs/sources/tutorials/create-alerts-with-logs/index.md @@ -31,7 +31,6 @@ In this tutorial, you'll: ## Before you begin -- Ensure you’re on Grafana 8 or later with [Grafana Alerting](https://grafana.com/docs/grafana/latest/alerting/set-up/migrating-alerts/) enabled. - Ensure you’ve [configured a Loki datasource](https://grafana.com/docs/grafana/latest/datasources/loki/#configure-the-data-source) in Grafana. - If you already have logs to work with, you can skip the optional sections and go straight to [create an alert](#create-an-alert). - If you want to use a log-generating sample script to create the logs demonstrated in this tutorial, refer to the optional steps: diff --git a/docs/sources/tutorials/grafana-fundamentals/index.md b/docs/sources/tutorials/grafana-fundamentals/index.md index 1aa2197e4ee..7db66adb4c7 100644 --- a/docs/sources/tutorials/grafana-fundamentals/index.md +++ b/docs/sources/tutorials/grafana-fundamentals/index.md @@ -27,6 +27,13 @@ In this tutorial, you'll learn how to use Grafana to set up a monitoring solutio - Annotate dashboards - Set up alerts +Alternatively, you can also watch our Grafana for Beginners series where we discuss fundamental concepts to help you get started with Grafana. + +
+ +
+ {{% class "prerequisite-section" %}} ### Prerequisites @@ -34,13 +41,20 @@ In this tutorial, you'll learn how to use Grafana to set up a monitoring solutio - [Docker](https://docs.docker.com/install/) - [Docker Compose](https://docs.docker.com/compose/) (included in Docker for Desktop for macOS and Windows) - [Git](https://git-scm.com/) - {{% /class %}} + +### KillerCoda sandbox environment (Alternative) + +If you would prefer to follow along with this tutorial without needing to set up a local environment, you can use the [KillerCoda sandbox environment](https://killercoda.com/grafana-labs/course/full-stack/tutorial-enviroment). + +{{% /class %}} ## Set up the sample application This tutorial uses a sample application to demonstrate some of the features in Grafana. To complete the exercises in this tutorial, you need to download the files to your local machine. -In this step, you'll set up the sample application, as well as supporting services, such as [Prometheus](https://prometheus.io/) and [Loki](/oss/loki/). +In this step, you'll set up the sample application, as well as supporting services, such as [Loki](/oss/loki/). + +> **Note:** [Prometheus](https://prometheus.io/), a popular time series database (TSDB), has already been configured as a data source as part of this tutorial. 1. Clone the [github.com/grafana/tutorial-environment](https://github.com/grafana/tutorial-environment) repository. @@ -96,47 +110,13 @@ To add a link: To vote for a link, click the triangle icon next to the name of the link. -## Log in to Grafana - -Grafana is an open-source platform for monitoring and observability that lets you visualize and explore the state of your systems. - -1. Open a new tab. -1. Browse to [localhost:3000](http://localhost:3000). -1. In **email or username**, enter **admin**. -1. In **password**, enter **admin**. -1. Click **Log In**. - - The first time you log in, you're asked to change your password: - -1. In **New password**, enter your new password. -1. In **Confirm new password**, enter the same password. -1. Click **Save**. - -The first thing you see is the Home dashboard, which helps you get started. - -In the top left corner, you can see the menu icon. Clicking it will open the _sidebar_, the main menu for navigating Grafana. - -## Add a metrics data source - -The sample application exposes metrics which are stored in [Prometheus](https://prometheus.io/), a popular time series database (TSDB). - -To be able to visualize the metrics from Prometheus, you first need to add it as a data source in Grafana. - -1. In the sidebar, click **Connections** and then **Data sources**. -1. Click **Add data source**. -1. In the list of data sources, click **Prometheus**. -1. In the URL box, enter **http\://prometheus:9090**. -1. Scroll to the bottom of the page and click **Save & test**. - - Prometheus is now available as a data source in Grafana. - ## Explore your metrics Grafana Explore is a workflow for troubleshooting and data exploration. In this step, you'll be using Explore to create ad-hoc queries to understand the metrics exposed by the sample application. > Ad-hoc queries are queries that are made interactively, with the purpose of exploring data. An ad-hoc query is commonly followed by another, more specific query. -1. Click the menu icon and, in the sidebar, click **Explore**. The Prometheus data source that you added will already be selected. +1. Click the menu icon and, in the sidebar, click **Explore**. A dropdown menu for the list of available data sources is on the upper-left side. The Prometheus data source will already be selected. If not, choose Prometheus. 1. Confirm that you're in code mode by checking the **Builder/Code** toggle at the top right corner of the query panel. 1. In the query editor, where it says _Enter a PromQL query…_, enter `tns_request_duration_seconds_count` and then press Shift + Enter. A graph appears. @@ -166,7 +146,7 @@ Grafana Explore is a workflow for troubleshooting and data exploration. In this 1. Back in Grafana, in the upper-right corner, click the _time picker_, and select **Last 5 minutes**. By zooming in on the last few minutes, it's easier to see when you receive new data. -Depending on your use case, you might want to group on other labels. Try grouping by other labels, such as `status_code`, by changing the `by(route)` part of the query. +Depending on your use case, you might want to group on other labels. Try grouping by other labels, such as `status_code`, by changing the `by(route)` part of the query to `by(status_code)`. ## Add a logging data source @@ -178,7 +158,7 @@ Grafana supports log data sources, like [Loki](/oss/loki/). Just like for metric 1. In the URL box, enter [http://loki:3100](http://loki:3100). 1. Scroll to the bottom of the page and click **Save & Test** to save your changes. -Loki is now available as a data source in Grafana. +You should see the message "Data source successfully connected." Loki is now available as a data source in Grafana. ## Explore your logs @@ -237,6 +217,10 @@ Every panel consists of a _query_ and a _visualization_. The query defines _what 1. Click the **Save dashboard** (disk) icon at the top of the dashboard to save your dashboard. 1. Enter a name in the **Dashboard name** field and then click **Save**. + You should now have a panel added to your dashboard. + + {{< figure src="/media/tutorials/grafana-fundamentals-dashboard.png" alt="A panel in a Grafana dashboard" caption="A panel in a Grafana dashboard" >}} + ## Annotate events When things go bad, it often helps if you understand the context in which the failure occurred. Time of last deploy, system changes, or database migration can offer insight into what might have caused an outage. Annotations allow you to represent such events directly on your graphs. @@ -254,11 +238,13 @@ Grafana also lets you annotate a time interval, with _region annotations_. Add a region annotation: -1. Press Ctrl (or Cmd on macOS), then click and drag across the graph to select an area. +1. Press Ctrl (or Cmd on macOS) and hold, then click and drag across the graph to select an area. 1. In **Description**, enter **Performed load tests**. 1. In **Tags**, enter **testing**. 1. Click **Save**. +### Using annotations to correlate logs with metrics + Manually annotating your dashboard is fine for those single events. For regularly occurring events, such as deploying a new release, Grafana supports querying annotations from one of your data sources. Let's create an annotation using the Loki data source we added earlier. 1. At the top of the dashboard, click the **Dashboard settings** (gear) icon. @@ -274,9 +260,13 @@ Manually annotating your dashboard is fine for those single events. For regularl 1. Click **Apply**. Grafana displays the Annotations list, with your new annotation. 1. Click on your dashboard name to return to your dashboard. 1. At the top of your dashboard, there is now a toggle to display the results of the newly created annotation query. Press it if it's not already enabled. +1. Click the **Save dashboard** icon to save the changes. +1. To test the changes, go back to the [sample application](http://localhost:8081), post a new link without a URL to generate an error in your browser that says `empty url`. The log lines returned by your query are now displayed as annotations in the graph. +{{< figure src="/media/tutorials/annotations-grafana-dashboard.png" alt="A panel in a Grafana dashboard with log queries from Loki displayed as annotations" caption="Displaying log queries from Loki as annotations" >}} + Being able to combine data from multiple data sources in one graph allows you to correlate information from both Prometheus and Loki. Annotations also work very well alongside alerts. In the next and final section, we will set up an alert for our app `grafana.news` and then we will trigger it. This will provide a quick intro to our new Alerting platform. @@ -289,7 +279,16 @@ Grafana's new alerting platform debuted with Grafana 8. A year later, with Grafa The most basic alert consists of two parts: -1. A _Contact point_ - A Contact point defines how Grafana delivers an alert. When the conditions of an _alert rule_ are met, Grafana notifies the contact points, or channels, configured for that alert. Some popular channels include email, webhooks, Slack notifications, and PagerDuty notifications. +1. A _Contact point_ - A Contact point defines how Grafana delivers an alert. When the conditions of an _alert rule_ are met, Grafana notifies the contact points, or channels, configured for that alert. + + Some popular channels include: + + - Email + - [Webhooks](#create-a-contact-point-for-grafana-managed-alerts) + - [Telegram](https://grafana.com/blog/2023/12/28/how-to-integrate-grafana-alerting-and-telegram/) + - [Slack](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/manage-contact-points/integrations/configure-slack/) + - PagerDuty + 1. An _Alert rule_ - An Alert rule defines one or more _conditions_ that Grafana regularly evaluates. When these evaluations meet the rule's criteria, the alert is triggered. To begin, let's set up a webhook contact point. Once we have a usable endpoint, we'll write an alert rule and trigger a notification. @@ -299,12 +298,10 @@ To begin, let's set up a webhook contact point. Once we have a usable endpoint, In this step, we'll set up a new contact point. This contact point will use the _webhooks_ channel. In order to make this work, we also need an endpoint for our webhook channel to receive the alert. We will use [requestbin.com](https://requestbin.com) to quickly set up that test endpoint. This way we can make sure that our alert is actually sending a notification somewhere. 1. Browse to [requestbin.com](https://requestbin.com). -1. Under the **Create Request Bin** button -1. From RequestBin, Copy the endpoint URL. - -Your request bin is now waiting for the first request. +1. Under the **Create Request Bin** button, click the link to create a **public bin** instead. +1. From Request Bin, copy the endpoint URL. - +Your Request Bin is now waiting for the first request. Next, let's configure a Contact Point in Grafana's Alerting UI to send notifications to our Request Bin. @@ -314,8 +311,8 @@ Next, let's configure a Contact Point in Grafana's Alerting UI to send notificat 1. In **Integration**, choose **Webhook**. 1. In **URL**, paste the endpoint to your request bin. -1. Click **Test** to send a test alert to your request bin. -1. Navigate back to the request bin you created earlier. On the left side, there's now a `POST /` entry. Click it to see what information Grafana sent. +1. Click **Test**, and then click **Send test notification** to send a test alert to your request bin. +1. Navigate back to the Request Bin you created earlier. On the left side, there's now a `POST /` entry. Click it to see what information Grafana sent. 1. Return to Grafana and click **Save contact point**. We have now created a dummy webhook endpoint and created a new Alerting Contact Point in Grafana. Now we can create an alert rule and link it to this new channel. @@ -329,17 +326,24 @@ Now that Grafana knows how to notify us, it's time to set up an alert rule: 1. For **Section 1**, name the rule `fundamentals-test`. 1. For **Section 2**, Find the **query A** box. Choose your Prometheus datasource. Note that the rule type should automatically switch to Grafana-managed alert. 1. Switch to code mode by checking the Builder/Code toggle. -1. Enter the same query that we used in our earlier panel `sum(rate(tns_request_duration_seconds_count[5m])) by(route)` +1. Enter the same Prometheus query that we used in our earlier panel: + + ``` + sum(rate(tns_request_duration_seconds_count[5m])) by(route) + ``` + 1. Press **Preview**. You should see some data returned. -1. Keep expressions “B” and "C" as they are. These expressions (Reduce and Threshold, respectively) come by default when creating a new rule. Expression "B", selects the last value of our query “A”, while the Threshold expression "C" will check if the last value from expression "B" is above a specific value. In addition, the Threshold expression is the alert condition by default. Enter `0.2` as threshold value [You can read more about queries and conditions here](https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/queries-conditions/#expression-queries). -1. In **Section 3**, in Folder, create a new folder, by typing a name for the folder. This folder will contain our alerts. For example: `fundamentals`. Then, click + add new or hit enter twice. +1. Keep expressions “B” and "C" as they are. These expressions (Reduce and Threshold, respectively) come by default when creating a new rule. Expression "B", selects the last value of our query “A”, while the Threshold expression "C" will check if the last value from expression "B" is above a specific value. In addition, the Threshold expression is the alert condition by default. Enter `0.2` as threshold value. [You can read more about queries and conditions here](/docs/grafana/latest/alerting/fundamentals/alert-rules/queries-conditions/#expression-queries). +1. In **Section 3**, in Folder, create a new folder, by clicking `New folder` and typing a name for the folder. This folder will contain our alerts. For example: `fundamentals`. Then, click `create`. 1. In the Evaluation group, repeat the above step to create a new one. We will name it `fundamentals` too. -1. Choose an Evaluation interval (how often the alert will be evaluated). For example, every `30s` (30 seconds). -1. Set the pending period . This is the time that a condition has to be met until the alert enters in Firing state and a notification is sent. Enter `0s`. For the purposes of this tutorial, the evaluation interval is intentionally short. This makes it easier to test. This setting makes Grafana wait until an alert has fired for a given time before Grafana sends the notification. +1. Choose an Evaluation interval (how often the alert will be evaluated). For example, every `10s` (10 seconds). +1. Set the pending period. This is the time that a condition has to be met until the alert enters in Firing state and a notification is sent. Enter `0s`. For the purposes of this tutorial, the evaluation interval is intentionally short. This makes it easier to test. This setting makes Grafana wait until an alert has fired for a given time before Grafana sends the notification. 1. In **Section 4**, you can optionally add some sample text to your summary message. [Read more about message templating here](/docs/grafana/latest/alerting/unified-alerting/message-templating/). 1. Click **Save rule and exit** at the top of the page. 1. In Grafana's sidebar, navigate to **Notification policies**. -1. Under **Default policy**, select **...** › **Edit** and change the **Default contact point** to **RequestBin**. +1. Under **Default policy**, select **...** › **Edit** and change the **Default contact point** from **grafana-default-email** to **RequestBin**. +1. Expand the **Timing options** dropdown and under **Group wait** and **Group interval** update the value to `30s` for testing purposes. Group wait is the time Grafana waits before sending the first notification for a new group of alerts. In contrast, group interval is the time Grafana waits before sending notifications about changes to the group. +1. Click **Update default policy**. As a system grows, admins can use the **Notification policies** setting to organize and match alert rules to specific contact points. @@ -349,10 +353,30 @@ Now that Grafana knows how to notify us, it's time to set up an alert rule: We have now configured an alert rule and a contact point. Now let's see if we can trigger a Grafana Managed Alert by generating some traffic on our sample application. 1. Browse to [localhost:8081](http://localhost:8081). -1. Repeatedly click the vote button or refresh the page to generate a traffic spike. +1. Add a new title and URL, repeatedly click the vote button, or refresh the page to generate a traffic spike. Once the query `sum(rate(tns_request_duration_seconds_count[5m])) by(route)` returns a value greater than `0.2` Grafana will trigger our alert. Browse to the Request Bin we created earlier and find the sent Grafana alert notification with details and metadata. +### Display Grafana Alerts to your dashboard + +In most cases, it's also valuable to display Grafana Alerts as annotations to your dashboard. Check out the video tutorial below to learn how to display alerting to your dashboard. + +{{< youtube id="ClLp-iSoaSY" >}} + +Let's see how we can configure this. + +1. In Grafana's sidebar, hover over the **Alerting** (bell) icon and then click **Alert rules**. +1. Expand the `fundamentals > fundamentals` folder to view our created alert rule. +1. Click the **Edit** icon and scroll down to **Section 4**. +1. Click the **Link dashboard and panel** button and select the dashboard and panel to which you want the alert to be added as an annotation. +1. Click **Confirm** and **Save rule and exit** to save all the changes. +1. In Grafana's sidebar, navigate to the dashboard by clicking **Dashboards** and selecting the dashboard you created. +1. To test the changes, follow the steps listed to [trigger a Grafana Managed Alert](#trigger-a-grafana-managed-alert). + + You should now see a red, broken heart icon beside the panel name, signifying that the alert has been triggered. An annotation for the alert, represented as a vertical red line, is also displayed. + + {{< figure src="/media/tutorials/grafana-alert-on-dashboard.png" alt="A panel in a Grafana dashboard with alerting and annotations configured" caption="Displaying Grafana Alerts on a dashboard" >}} + ## Summary In this tutorial you learned about fundamental features of Grafana. To do so, we ran several Docker containers on your local machine. When you are ready to clean up this local tutorial environment, run the following command: @@ -361,13 +385,17 @@ In this tutorial you learned about fundamental features of Grafana. To do so, we docker-compose down -v ``` +### KillerCoda sandbox environment (completed tutorial) + +Do you want to see the finished result? Check out our [completed KillerCoda sandbox environment](https://killercoda.com/grafana-labs/course/full-stack/tutorial-enviroment-completed) containing the entire demo with dashboards, checks, and data sources configured. + ### Learn more Check out the links below to continue your learning journey with Grafana's LGTM stack. - [Prometheus](/docs/grafana/latest/features/datasources/prometheus/) - [Loki](/docs/grafana/latest/features/datasources/loki/) -- [Explore](/docs/grafana/latest/features/explore/) +- [Explore](/docs/grafana/latest/explore/) - [Alerting Overview](/docs/grafana/latest/alerting/) - [Alert rules](/docs/grafana/latest/alerting/create-alerts/) -- [Contact Points](/docs/grafana/latest/alerting/notifications/) +- [Contact points](/docs/grafana/latest/alerting/fundamentals/contact-points/) diff --git a/docs/sources/tutorials/provision-dashboards-and-data-sources/index.md b/docs/sources/tutorials/provision-dashboards-and-data-sources/index.md index 89de23a0556..5e03387a8dd 100644 --- a/docs/sources/tutorials/provision-dashboards-and-data-sources/index.md +++ b/docs/sources/tutorials/provision-dashboards-and-data-sources/index.md @@ -44,7 +44,6 @@ Grafana supports configuration as code through _provisioning_. The resources tha - [Dashboards](/docs/grafana/latest/administration/provisioning/#dashboards) - [Data sources](/docs/grafana/latest/administration/provisioning/#datasources) -- [Alert notification channels](/docs/grafana/latest/administration/provisioning/#alert-notification-channels) ## Set the provisioning directory @@ -69,8 +68,6 @@ provisioning/ dashboards/ - notifiers/ - ``` Next, we'll look at how to provision a data source. diff --git a/docs/sources/tutorials/run-grafana-behind-a-proxy/index.md b/docs/sources/tutorials/run-grafana-behind-a-proxy/index.md index a9ca71db3c0..38da801e93a 100644 --- a/docs/sources/tutorials/run-grafana-behind-a-proxy/index.md +++ b/docs/sources/tutorials/run-grafana-behind-a-proxy/index.md @@ -1,5 +1,4 @@ --- -Feedback Link: https://github.com/grafana/tutorials/issues/new aliases: - /docs/grafana/latest/installation/behind_proxy/ authors: @@ -32,32 +31,18 @@ When running Grafana behind a proxy, you need to configure the domain name to le domain = example.com ``` -- Restart Grafana for the new changes to take effect. +- Restart Grafana for the changes to take effect. -You can also serve Grafana behind a _sub path_, such as `http://example.com/grafana`. +## Configure reverse proxy -To serve Grafana behind a sub path: +### Configure nginx -1. Include the sub path at the end of the `root_url`. -1. Set `serve_from_sub_path` to `true`. Or, let proxy rewrite the path for you (refer to examples below). - -```bash -[server] -domain = example.com -root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/ -serve_from_sub_path = true -``` - -Next, you need to configure your reverse proxy. - -## Configure NGINX - -[NGINX](https://www.nginx.com) is a high performance load balancer, web server, and reverse proxy. +[nginx](https://www.nginx.com) is a high performance load balancer, web server, and reverse proxy. -- In your NGINX configuration file inside `http` section, add the following: +- In your nginx configuration file inside the `http` section, add the following: ```nginx -# this is required to proxy Grafana Live WebSocket connections. +# This is required to proxy Grafana Live WebSocket connections. map $http_upgrade $connection_upgrade { default upgrade; '' close; @@ -73,32 +58,35 @@ server { index index.html index.htm; location / { - proxy_set_header Host $http_host; + proxy_set_header Host $host; proxy_pass http://grafana; } -# Proxy Grafana Live WebSocket connections. + # Proxy Grafana Live WebSocket connections. location /api/live/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $http_host; + proxy_set_header Host $host; proxy_pass http://grafana; } } ``` -- Reload the NGINX configuration. -- Navigate to port 80 on the machine NGINX is running on. You're greeted by the Grafana login page. +- Reload the nginx configuration. +- Navigate to port 80 on the machine nginx is running on. + You're greeted by the Grafana login page. -For Grafana Live which uses WebSocket connections you may have to raise Nginx [worker_connections](https://nginx.org/en/docs/ngx_core_module.html#worker_connections) option which is 512 by default – which limits the number of possible concurrent connections with Grafana Live. +For Grafana Live which uses WebSocket connections you may have to raise the nginx value for [`worker_connections`](https://nginx.org/en/docs/ngx_core_module.html#worker_connections) option which is `512` by default. The default value limits the number of possible concurrent connections with Grafana Live. -Also, be aware that the above configuration will work only when the `proxy_pass` value for `location /` is a literal string. If you are using a variable here, [read this GitHub issue](https://github.com/grafana/grafana/issues/18299). You will need to add [an appropriate NGINX rewrite rule](https://www.nginx.com/blog/creating-nginx-rewrite-rules/). +Also, be aware that the preceding configuration only works when the `proxy_pass` value for `location /` is a literal string. +If you want to use a variable here, you must instead use [a rewrite rule](https://www.nginx.com/blog/creating-nginx-rewrite-rules/). +For more information, refer to [the GitHub issue #18299](https://github.com/grafana/grafana/issues/18299). -To configure NGINX to serve Grafana under a _sub path_, update the `location` block: +To configure nginx to serve Grafana under a _sub path_, update the `location` block: ```nginx -# this is required to proxy Grafana Live WebSocket connections. +# This is required to proxy Grafana Live WebSocket connections. map $http_upgrade $connection_upgrade { default upgrade; '' close; @@ -114,7 +102,7 @@ server { index index.html index.htm; location /grafana/ { - proxy_set_header Host $http_host; + proxy_set_header Host $host; proxy_pass http://grafana; } @@ -123,23 +111,25 @@ server { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $http_host; + proxy_set_header Host $host; proxy_pass http://grafana; } } ``` -If your Grafana configuration does not set `serve_from_sub_path` to true then you need to add a rewrite rule to each location block: +Add a rewrite rule to each location block: ``` rewrite ^/grafana/(.*) /$1 break; ``` -{{% admonition type="note" %}} -If Grafana is being served from behind a NGINX proxy with TLS termination enabled, then the `root_url` should be set accordingly. For example, if Grafana is being served from `https://example.com/grafana` then the `root_url` should be set to `https://example.com/grafana/` or `https://%(domain)s/grafana/` (and the corresponding `domain` should be set to `example.com`) in the `server` section of the Grafana configuration file. The `protocol` setting should be set to `http`, because the TLS handshake is being handled by NGINX. -{{% /admonition %}} +{{< admonition type="note" >}} +If nginx is performing TLS termination, then you must set the `root_url` and `protocol` configuration accordingly. +If you're serving Grafana from `https://example.com/grafana/` then the `root_url` is `https://example.com/grafana/` or `https://%(domain)s/grafana/` with the corresponding `domain` configuration value set to `example.com` in the `server` section of the Grafana configuration file. +Set `protocol` to `http`. +{{< /admonition >}} -## Configure HAProxy +### Configure HAProxy To configure HAProxy to serve Grafana under a _sub path_: @@ -150,26 +140,21 @@ frontend http-in backend grafana_backend server grafana localhost:3000 -``` - -If your Grafana configuration doesn't set `server.serve_from_sub_path` to `true`, then you must add a rewrite rule to the `backend grafana_backend` block: - -```diff -backend grafana_backend -+ # Requires haproxy >= 1.6 -+ http-request set-path %[path,regsub(^/grafana/?,/)] - -+ # Works for haproxy < 1.6 -+ # reqrep ^([^\ ]*\ /)grafana[/]?(.*) \1\2 + # Requires haproxy >= 1.6 + http-request set-path %[path,regsub(^/grafana/?,/)] + # Works for haproxy < 1.6 + # reqrep ^([^\ ]*\ /)grafana[/]?(.*) \1\2 server grafana localhost:3000 ``` -## Configure IIS +### Configure IIS -> IIS requires that the URL Rewrite module is installed. +{{< admonition type="note" >}} +To use IIS, you must have the URL Rewrite module installed. +{{< /admonition >}} -To configure IIS to serve Grafana under a _sub path_, create an Inbound Rule for the parent website in IIS Manager with the following settings: +To configure IIS to serve Grafana under a _sub path_, create an `Inbound Rule` for the parent website in **IIS Manager** with the following settings: - pattern: `grafana(/)?(.*)` - check the `Ignore case` checkbox @@ -177,7 +162,7 @@ To configure IIS to serve Grafana under a _sub path_, create an Inbound Rule for - check the `Append query string` checkbox - check the `Stop processing of subsequent rules` checkbox -This is the rewrite rule that is generated in the `web.config`: +This is the rewrite rule that's generated in the `web.config`: ```xml @@ -190,13 +175,13 @@ This is the rewrite rule that is generated in the `web.config`: ``` -See the [tutorial on IIS URL Rewrites](/tutorials/iis/) for more in-depth instructions. +For more detailed instruction, refer to the [tutorial on IIS URL Rewrites](/tutorials/iis/). -## Configure Traefik +### Configure Traefik -[Traefik](https://traefik.io/traefik/) Cloud Native Reverse Proxy / Load Balancer / Edge Router +[Traefik](https://traefik.io/traefik/) Cloud Native application proxy. -Using the docker provider the following labels will configure the router and service for a domain or subdomain routing. +Using the Docker provider and the following labels configures the router and service for a domain or subdomain routing. ```yaml labels: @@ -204,7 +189,7 @@ labels: traefik.http.services.grafana.loadbalancer.server.port: 3000 ``` -To deploy on a _sub path_ +To deploy on a _sub path_: ```yaml labels: @@ -240,6 +225,20 @@ http: - url: http://192.168.30.10:3000 ``` -## Summary +## Alternative for serving Grafana under a sub path + +{{< admonition type="note" >}} +You only need this if you don't handle the sub path serving via your reverse proxy configuration. +{{< /admonition >}} + +If you don't want or can't use the reverse proxy to handle serving Grafana from a _sub path_, you can set the configuration variable `server_from_sub_path` to `true`. + +1. Include the sub path at the end of the `root_url`. +1. Set `serve_from_sub_path` to `true`: -In this tutorial you learned how to run Grafana behind a reverse proxy. +```bash +[server] +domain = example.com +root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/ +serve_from_sub_path = true +``` diff --git a/docs/sources/whatsnew/whats-new-in-v10-0.md b/docs/sources/whatsnew/whats-new-in-v10-0.md index 8fd36a5bca3..df622eac402 100644 --- a/docs/sources/whatsnew/whats-new-in-v10-0.md +++ b/docs/sources/whatsnew/whats-new-in-v10-0.md @@ -19,7 +19,7 @@ weight: -37 Welcome to Grafana 10.0! Read on to learn about changes to search and navigation, dashboards and visualizations, and security and authentication. -For even more detail about all the changes in this release, refer to the [changelog](https://github.com/grafana/grafana/blob/master/CHANGELOG.md). For the specific steps we recommend when you upgrade to v10.0, check out our [Upgrade Guide]({{< relref "../upgrade-guide/upgrade-v10.0/index.md" >}}). +For even more detail about all the changes in this release, refer to the [changelog](https://github.com/grafana/grafana/blob/main/CHANGELOG.md). For the specific steps we recommend when you upgrade to v10.0, check out our [Upgrade Guide]({{< relref "../upgrade-guide/upgrade-v10.0/index.md" >}}). + + + + + + + {{ Subject .Subject .TemplateData "Verify your email - {{.Name}}" }} + + + + + + + + + + +

Hi {{ .Name }},

+
+ + Please click the following link to verify your email within {{ .VerificationEmailLifetimeHours }} hour(s). + + + Verify Email + + + You can also copy and paste this link into your browser directly: + + + {{ .AppUrl }}user/email/update?code={{ .Code }} + +
+
+ + + +
+ diff --git a/emails/templates/verify_email.txt b/emails/templates/verify_email.txt new file mode 100644 index 00000000000..8af1d2c1935 --- /dev/null +++ b/emails/templates/verify_email.txt @@ -0,0 +1,6 @@ +[[HiddenSubject .Subject "Verify your email - [[.Name]]"]] + +Hi [[.Name]], + +Copy and paste the following link directly in your browser to verify your email within [[.VerificationEmailLifetimeHours]] hour(s). +[[.AppUrl]]user/email/update?code=[[.Code]] diff --git a/emails/templates/verify_email_update.mjml b/emails/templates/verify_email_update.mjml deleted file mode 100644 index 75d4add8164..00000000000 --- a/emails/templates/verify_email_update.mjml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - {{ Subject .Subject .TemplateData "Verify your new email - {{.Name}}" }} - - - - - - - - - - -

Hi {{ .Name }},

-
- - Please click the following link to verify your email within {{ .VerificationEmailLifetimeHours }} hour(s). - - - Verify Email - - - You can also copy and paste this link into your browser directly: - - - {{ .AppUrl }}user/email/update?code={{ .Code }} - -
-
- - - -
-
diff --git a/emails/templates/verify_email_update.txt b/emails/templates/verify_email_update.txt deleted file mode 100644 index ae0d29e314e..00000000000 --- a/emails/templates/verify_email_update.txt +++ /dev/null @@ -1,6 +0,0 @@ -[[HiddenSubject .Subject "Verify your new email - [[.Name]]"]] - -Hi [[.Name]], - -Copy and paste the following link directly in your browser to verify your email within [[.VerificationEmailLifetimeHours]] hour(s). -[[.AppUrl]]user/email/update?code=[[.Code]] diff --git a/embed.go b/embed.go index 570415e0034..b968d1ca455 100644 --- a/embed.go +++ b/embed.go @@ -6,5 +6,5 @@ import ( // CueSchemaFS embeds all schema-related CUE files in the Grafana project. // -//go:embed cue.mod/module.cue kinds/*.cue kinds/*/*.cue packages/grafana-schema/src/common/*.cue public/app/plugins/*/*/*.cue public/app/plugins/*/*/plugin.json pkg/plugins/*/*.cue +//go:embed cue.mod/module.cue var CueSchemaFS embed.FS diff --git a/go.mod b/go.mod index 2987d7ee48c..93dde9cc798 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,7 @@ module github.com/grafana/grafana // +scalingo goVersion go1.21.10 -// +scalingo install ./pkg/cmd/grafana ./pkg/cmd/grafana-server ./pkg/cmd/grafana-cli +// +scalingo install ./pkg/cmd/grafana go 1.21.10 @@ -13,23 +13,11 @@ replace github.com/docker/docker => github.com/moby/moby v23.0.4+incompatible // contains openapi encoder fixes. remove ASAP replace cuelang.org/go => github.com/grafana/cue v0.0.0-20230926092038-971951014e3f // @grafana/grafana-as-code -// TODO: following otel replaces to pin the libraries so k8s.io/apiserver doesn't downgrade us inadvertantly -// will need bumps as we upgrade otel in Grafana -replace ( - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp => go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // @grafana/backend-platform - go.opentelemetry.io/otel => go.opentelemetry.io/otel v1.22.0 // @grafana/backend-platform - go.opentelemetry.io/otel/metric => go.opentelemetry.io/otel/metric v1.22.0 // @grafana/backend-platform - go.opentelemetry.io/otel/trace => go.opentelemetry.io/otel/trace v1.22.0 // @grafana/backend-platform -) - // Override Prometheus version because Prometheus v2.X is tagged as v0.X for Go modules purposes and Go assumes // that v1.Y is higher than v0.X, so when we resolve dependencies if any dependency imports v1.Y we'd // import that instead of v0.X even though v0.X is newer. replace github.com/prometheus/prometheus => github.com/prometheus/prometheus v0.49.0 -// The v0.120.0 is needed for now to be compatible with grafana/thema. -replace github.com/getkin/kin-openapi => github.com/getkin/kin-openapi v0.120.0 - require ( cloud.google.com/go/storage v1.36.0 // @grafana/backend-platform cuelang.org/go v0.6.0-0.dev // @grafana/grafana-as-code @@ -62,13 +50,13 @@ require ( github.com/google/uuid v1.6.0 // @grafana/backend-platform github.com/google/wire v0.5.0 // @grafana/backend-platform github.com/gorilla/websocket v1.5.0 // @grafana/grafana-app-platform-squad - github.com/grafana/alerting v0.0.0-20240213130827-92f64f0f2a12 // @grafana/alerting-squad-backend + github.com/grafana/alerting v0.0.0-20240322221449-89ae4e299bf8 // @grafana/alerting-squad-backend github.com/grafana/cuetsy v0.1.11 // @grafana/grafana-as-code github.com/grafana/grafana-aws-sdk v0.25.1 // @grafana/aws-datasources - github.com/grafana/grafana-azure-sdk-go v1.12.0 // @grafana/partner-datasources - github.com/grafana/grafana-plugin-sdk-go v0.218.0 // @grafana/plugins-platform-backend + github.com/grafana/grafana-azure-sdk-go/v2 v2.0.1 // @grafana/partner-datasources + github.com/grafana/grafana-plugin-sdk-go v0.222.0 // @grafana/plugins-platform-backend github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // @grafana/backend-platform - github.com/hashicorp/go-hclog v1.6.2 // @grafana/plugins-platform-backend + github.com/hashicorp/go-hclog v1.6.3 // @grafana/plugins-platform-backend github.com/hashicorp/go-plugin v1.6.0 // @grafana/plugins-platform-backend github.com/hashicorp/go-version v1.6.0 // @grafana/backend-platform github.com/hashicorp/hcl/v2 v2.17.0 // @grafana/alerting-squad-backend @@ -93,24 +81,33 @@ require ( github.com/prometheus/client_model v0.5.0 // @grafana/backend-platform github.com/prometheus/common v0.46.0 // @grafana/alerting-squad-backend github.com/prometheus/prometheus v1.8.2-0.20221021121301-51a44e6657c3 // @grafana/alerting-squad-backend - github.com/robfig/cron/v3 v3.0.1 // @grafana/backend-platform - github.com/russellhaering/goxmldsig v1.4.0 // @grafana/backend-platform + github.com/redis/go-redis/v9 v9.1.0 // @grafana/alerting-squad-backend + github.com/robfig/cron/v3 v3.0.1 // @grafana/grafana-backend-group + github.com/russellhaering/goxmldsig v1.4.0 // @grafana/grafana-backend-group + github.com/scottlepp/go-duck v0.0.20 // @grafana/grafana-app-platform-squad + github.com/spf13/cobra v1.8.0 // @grafana/grafana-app-platform-squad + github.com/spf13/pflag v1.0.5 // @grafana-app-platform-squad + github.com/spyzhov/ajson v0.9.0 // @grafana/grafana-app-platform-squad github.com/stretchr/testify v1.9.0 // @grafana/backend-platform github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf // @grafana/backend-platform github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f // @grafana/backend-platform github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect + github.com/urfave/cli v1.22.14 // @grafana/grafana-backend-group github.com/urfave/cli/v2 v2.25.0 // @grafana/backend-platform github.com/vectordotdev/go-datemath v0.1.1-0.20220323213446-f3954d0b18ae // @grafana/backend-platform - github.com/yalue/merged_fs v1.2.2 // @grafana/grafana-as-code + github.com/wk8/go-ordered-map v1.0.0 // @grafana/grafana-backend-group + github.com/xlab/treeprint v1.2.0 // @grafana/observability-traces-and-profiling + github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 // @grafana/grafana-app-platform-squad github.com/yudai/gojsondiff v1.0.0 // @grafana/backend-platform - go.opentelemetry.io/collector/pdata v1.0.1 // @grafana/backend-platform + go.opentelemetry.io/collector/pdata v1.5.0 // @grafana/backend-platform + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // @grafana/plugins-platform-backend go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 // @grafana/grafana-operator-experience-squad go.opentelemetry.io/otel/exporters/jaeger v1.10.0 // @grafana/backend-platform go.opentelemetry.io/otel/sdk v1.24.0 // @grafana/backend-platform go.opentelemetry.io/otel/trace v1.24.0 // @grafana/backend-platform - golang.org/x/crypto v0.23.0 // @grafana/backend-platform + golang.org/x/crypto v0.21.0 // @grafana/backend-platform golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb // @grafana/alerting-squad-backend - golang.org/x/net v0.25.0 // @grafana/oss-big-tent @grafana/partner-datasources + golang.org/x/net v0.23.0 // @grafana/oss-big-tent @grafana/partner-datasources golang.org/x/oauth2 v0.18.0 // @grafana/grafana-authnz-team golang.org/x/sync v0.6.0 // @grafana/alerting-squad-backend golang.org/x/time v0.5.0 // @grafana/backend-platform @@ -130,7 +127,7 @@ require ( ) require ( - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect @@ -146,7 +143,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cheekybits/genny v1.0.0 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect - github.com/deepmap/oapi-codegen v1.12.4 // indirect + github.com/deepmap/oapi-codegen v1.13.0 // @grafana/grafana-as-code github.com/dennwc/varint v1.0.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/docker/go-units v0.5.0 // indirect @@ -171,14 +168,13 @@ require ( github.com/google/btree v1.1.2 // indirect github.com/google/flatbuffers v23.5.26+incompatible // indirect github.com/googleapis/gax-go/v2 v2.12.0 // @grafana/backend-platform - github.com/gorilla/mux v1.8.0 // @grafana/backend-platform + github.com/gorilla/mux v1.8.1 // @grafana/backend-platform github.com/grafana/grafana-google-sdk-go v0.1.0 // @grafana/partner-datasources github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect; @grafana/alerting-squad github.com/hashicorp/go-sockaddr v1.0.6 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/igm/sockjs-go/v3 v3.0.2 // indirect github.com/jessevdk/go-flags v1.5.0 // indirect @@ -188,7 +184,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/mattetti/filebuffer v1.0.1 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/miekg/dns v1.1.57 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -208,7 +204,6 @@ require ( github.com/sergi/go-diff v1.3.1 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -217,9 +212,9 @@ require ( go.opencensus.io v0.24.0 // indirect go.uber.org/atomic v1.11.0 // @grafana/alerting-squad-backend go.uber.org/goleak v1.3.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // @grafana/backend-platform - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // @grafana/backend-platform + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect; @grafana/backend-platform ) @@ -236,7 +231,6 @@ require ( github.com/bufbuild/connect-go v1.10.0 // @grafana/observability-traces-and-profiling github.com/dlmiddlecote/sqlstats v1.0.2 // @grafana/backend-platform github.com/drone/drone-cli v1.6.1 // @grafana/grafana-release-guild - github.com/getkin/kin-openapi v0.120.0 // @grafana/grafana-operator-experience-squad github.com/golang-migrate/migrate/v4 v4.7.0 // @grafana/backend-platform github.com/google/go-github v17.0.0+incompatible // @grafana/grafana-release-guild github.com/google/go-github/v45 v45.2.0 // @grafana/grafana-release-guild @@ -245,8 +239,6 @@ require ( github.com/huandu/xstrings v1.3.2 // @grafana/partner-datasources github.com/jmoiron/sqlx v1.3.5 // @grafana/backend-platform github.com/matryer/is v1.4.0 // @grafana/grafana-as-code - github.com/urfave/cli v1.22.14 // @grafana/backend-platform - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // @grafana/plugins-platform-backend go.opentelemetry.io/contrib/propagators/jaeger v1.22.0 // @grafana/backend-platform go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // @grafana/backend-platform go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 // @grafana/backend-platform @@ -262,28 +254,21 @@ require ( github.com/go-jose/go-jose/v3 v3.0.3 // @grafana/grafana-authnz-team github.com/grafana/dataplane/examples v0.0.1 // @grafana/observability-metrics github.com/grafana/dataplane/sdata v0.0.7 // @grafana/observability-metrics - github.com/grafana/kindsys v0.0.0-20230508162304-452481b63482 // @grafana/grafana-as-code github.com/grafana/tempo v1.5.1-0.20230524121406-1dc1bfe7085b // @grafana/observability-traces-and-profiling - github.com/grafana/thema v0.0.0-20230712153715-375c1b45f3ed // @grafana/grafana-as-code github.com/microsoft/go-mssqldb v1.6.1-0.20240214161942-b65008136246 // @grafana/grafana-bi-squad - github.com/ory/fosite v0.44.1-0.20230317114349-45a6785cc54f // @grafana/grafana-authnz-team - github.com/redis/go-redis/v9 v9.0.2 // @grafana/alerting-squad-backend - github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // @grafana/grafana-as-code go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0 // @grafana/backend-platform golang.org/x/mod v0.14.0 // @grafana/backend-platform - gopkg.in/square/go-jose.v2 v2.6.0 // @grafana/grafana-authnz-team k8s.io/utils v0.0.0-20230726121419-3b25d923346b // @grafana/partner-datasources ) require ( - github.com/spf13/cobra v1.8.0 // @grafana/grafana-app-platform-squad go.opentelemetry.io/otel v1.24.0 // @grafana/backend-platform - k8s.io/api v0.29.0 // @grafana/grafana-app-platform-squad - k8s.io/apimachinery v0.29.0 // @grafana/grafana-app-platform-squad - k8s.io/apiserver v0.29.0 // @grafana/grafana-app-platform-squad - k8s.io/client-go v0.29.0 // @grafana/grafana-app-platform-squad - k8s.io/component-base v0.29.0 // @grafana/grafana-app-platform-squad - k8s.io/klog/v2 v2.110.1 // @grafana/grafana-app-platform-squad + k8s.io/api v0.29.2 // @grafana/grafana-app-platform-squad + k8s.io/apimachinery v0.29.2 // @grafana/grafana-app-platform-squad + k8s.io/apiserver v0.29.2 // @grafana/grafana-app-platform-squad + k8s.io/client-go v0.29.2 // @grafana/grafana-app-platform-squad + k8s.io/component-base v0.29.2 // @grafana/grafana-app-platform-squad + k8s.io/klog/v2 v2.120.1 // @grafana/grafana-app-platform-squad k8s.io/kube-aggregator v0.29.0 // @grafana/grafana-app-platform-squad k8s.io/kube-openapi v0.0.0-20240220201932-37d671a357a5 // @grafana/grafana-app-platform-squad ) @@ -294,7 +279,7 @@ require github.com/grafana/pyroscope/api v0.3.0 // @grafana/observability-traces require github.com/grafana/pyroscope-go/godeltaprof v0.1.6 // @grafana/observability-traces-and-profiling -require github.com/apache/arrow/go/v15 v15.0.0 // @grafana/observability-metrics +require github.com/apache/arrow/go/v15 v15.0.2 // @grafana/observability-metrics require ( cloud.google.com/go v0.112.0 // indirect @@ -313,16 +298,9 @@ require ( github.com/bwmarrin/snowflake v0.3.0 // @grafan/grafana-app-platform-squad github.com/centrifugal/protocol v0.10.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f // indirect - github.com/cockroachdb/redact v1.1.3 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect - github.com/cristalhq/jwt/v4 v4.0.2 // indirect - github.com/dave/jennifer v1.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect - github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/drone-runners/drone-runner-docker v1.8.2 // indirect @@ -330,12 +308,10 @@ require ( github.com/drone/envsubst v1.0.3 // indirect github.com/drone/runner-go v1.12.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/ecordell/optgen v0.0.6 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/getsentry/sentry-go v0.12.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/gogo/googleapis v1.4.1 // indirect @@ -347,50 +323,33 @@ require ( github.com/google/s2a-go v0.1.7 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect; @grafana/alerting-squad-backend github.com/hashicorp/memberlist v0.5.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/yaml v0.2.0 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-ieproxy v0.0.3 // indirect - github.com/mattn/goveralls v0.0.6 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 //@grafana/grafana-authnz-team github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // @grafana/alerting-squad-backend github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.3-0.20220512140940-7b36cea86235 // indirect github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect - github.com/ory/go-acc v0.2.6 // indirect - github.com/ory/go-convenience v0.1.0 // indirect - github.com/ory/viper v1.7.5 // indirect - github.com/ory/x v0.0.214 // indirect - github.com/pborman/uuid v1.2.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/redis/rueidis v1.0.16 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.3.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/shopspring/decimal v1.2.0 // indirect - github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // @grafana-app-platform-squad github.com/stoewer/go-strcase v1.3.0 // indirect - github.com/subosito/gotenv v1.4.1 // indirect github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect github.com/unknwon/com v1.0.1 // indirect github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3 // indirect @@ -406,13 +365,13 @@ require ( go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/term v0.20.0 // indirect + golang.org/x/term v0.18.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - k8s.io/kms v0.29.0 // indirect + k8s.io/kms v0.29.2 // indirect lukechampine.com/uint128 v1.3.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect @@ -433,7 +392,7 @@ require ( cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/iam v1.1.5 // indirect filippo.io/age v1.1.1 // @grafana/grafana-authnz-team - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect github.com/Masterminds/sprig/v3 v3.2.2 // @grafana/backend-platform @@ -458,25 +417,21 @@ require ( github.com/go-logr/logr v1.4.1 // @grafana/grafana-app-platform-squad github.com/go-logr/stdr v1.2.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect - github.com/hmarr/codeowners v1.1.2 // @grafana/grafana-as-code github.com/imdario/mergo v0.3.16 // indirect github.com/klauspost/compress v1.17.4 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/labstack/echo/v4 v4.10.2 // indirect + github.com/labstack/echo/v4 v4.11.1 // indirect github.com/labstack/gommon v0.4.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mschoch/smat v0.2.0 // indirect github.com/pierrec/lz4/v4 v4.1.18 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/wk8/go-ordered-map v1.0.0 // @grafana/backend-platform - github.com/xlab/treeprint v1.2.0 // @grafana/observability-traces-and-profiling go.opentelemetry.io/proto/otlp v1.1.0 // indirect ) require ( github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect - github.com/go-errors/errors v1.4.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 // @grafana/backend-platform github.com/moby/spdystream v0.2.0 // indirect @@ -485,14 +440,29 @@ require ( require k8s.io/code-generator v0.29.1 // @grafana/grafana-app-platform-squad -require github.com/spyzhov/ajson v0.9.0 // @grafana/grafana-app-platform-squad - require github.com/fullstorydev/grpchan v1.1.1 // @grafana/backend-platform +// This needs to be here for other projects that import grafana/grafana +// For local development grafana/grafana will always use the local files +// Check go.work file for details +require github.com/grafana/grafana/pkg/promlib v0.0.4 // @grafana/observability-metrics + +require ( + github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect + github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 // indirect + github.com/apache/thrift v0.18.1 // indirect + github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240226124929-648abdbd0ea4 // @grafana/grafana-app-platform-squad + github.com/grafana/grafana/pkg/apiserver v0.0.0-20240226124929-648abdbd0ea4 // @grafana/grafana-app-platform-squad +) + require ( github.com/bufbuild/protocompile v0.4.0 // indirect github.com/grafana/sqlds/v3 v3.2.0 // indirect github.com/jhump/protoreflect v1.15.1 // indirect + github.com/klauspost/asmfmt v1.3.2 // indirect + github.com/krasun/gosqlparser v1.0.5 // @grafana/grafana-app-platform-squad + github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect + github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mithrandie/csvq v1.17.10 // indirect github.com/mithrandie/csvq-driver v1.6.8 // indirect @@ -501,6 +471,39 @@ require ( github.com/mithrandie/ternary v1.1.1 // indirect ) +require github.com/getkin/kin-openapi v0.120.0 // @grafana/grafana-as-code + +require github.com/grafana/authlib v0.0.0-20240319083410-9d4a6e3861e5 // @grafana/grafana-app-platform-squad + +require ( + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/bytedance/sonic v1.9.1 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.9.1 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.14.0 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/invopop/jsonschema v0.12.0 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/goidentity/v6 v6.0.1 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + github.com/yudai/pp v2.0.1+incompatible // indirect + golang.org/x/arch v0.3.0 // indirect +) + // Use fork of crewjam/saml with fixes for some issues until changes get merged into upstream replace github.com/crewjam/saml => github.com/grafana/saml v0.4.15-0.20231025143828-a6c0e9b86a4c @@ -511,15 +514,11 @@ replace github.com/crewjam/saml => github.com/grafana/saml v0.4.15-0.20231025143 // No harm to Thema because it's only a dependency in its main package. replace github.com/hashicorp/go-hclog => github.com/hashicorp/go-hclog v0.16.1 -// This is a patched v0.8.2 intended to fix session.Find (and others) silently ignoring SQLITE_BUSY errors. This could -// happen, for example, during a read when the sqlite db is under heavy write load. -// This patch cherry picks compatible fixes from upstream xorm PR#1998 and can be reverted on upgrade to xorm v1.2.0+. -// This has also been patched to support the azuresql driver that is a thin wrapper for the mssql driver with azure authentication support. -//replace xorm.io/xorm => github.com/grafana/xorm v0.8.3-0.20230627081928-d04aa38aa209 -replace xorm.io/xorm => ./pkg/util/xorm - // Use our fork of the upstream alertmanagers. // This is required in order to get notification delivery errors from the receivers API. replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20240208102907-e82436ce63e6 exclude github.com/mattn/go-sqlite3 v2.0.3+incompatible + +// Use our fork xorm. go.work currently overrides this and points to the local ./pkg/util/xorm directory. +replace xorm.io/xorm => github.com/grafana/grafana/pkg/util/xorm v0.0.1 diff --git a/go.sum b/go.sum index 9df4f2dfcba..2e51b7e84c2 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.28.1-20221127060915-a1ecdc58eccd.4/go.mod h1:92ejKVTiuvnKoAtRlpJpIxKfloI935DDqhs0NCRx+KM= buf.build/gen/go/parca-dev/parca/bufbuild/connect-go v1.4.1-20221222094228-8b1d3d0f62e6.1 h1:wQ75SnlaD0X30PnrmA+07A/5fnQWrAHy1mzv+CPB5Oo= buf.build/gen/go/parca-dev/parca/bufbuild/connect-go v1.4.1-20221222094228-8b1d3d0f62e6.1/go.mod h1:VYzBTKhjl92cl3sv+xznQcJHCezU7qnI0FhBAUb4n8c= @@ -8,7 +7,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.41.0/go.mod h1:OauMR7DV8fzvZIl2qg6rkaIhD/vmgk4iwEw/h6ercmg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= @@ -1183,7 +1181,6 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d/go.mod h1:3cARGAK9CfW3HoxCy1a0G4TKrdiKke8ftOMEOHyySYs= github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e/go.mod h1:Xa6lInWHNQnuWoF0YPSsx+INFA9qk7/7pTjwb3PInkY= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= github.com/Azure/azure-amqp-common-go/v3 v3.2.2/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= @@ -1197,8 +1194,8 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+Q github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.0/go.mod h1:NBanQUfSWiWn3QEpWDTCU0IjBECKOYvl2R8xdRtMtiM= @@ -1211,8 +1208,8 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLC github.com/Azure/azure-sdk-for-go/sdk/internal v1.2.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.9.0 h1:TOFrNxfjslms5nLLIMjW7N0+zSALX4KiGsptmpb16AA= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.9.0/go.mod h1:EAyXOW1F6BTJPiK2pDvmnvxOHPxoTYWoqBeIlql+QhI= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.0 h1:Lg6BW0VPmCwcMlvOviL3ruHFO+H9tZNqscK0AeuFjGM= @@ -1280,35 +1277,28 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/datadog-go v4.0.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/FZambia/eagle v0.1.0 h1:9gyX6x+xjoIfglgyPTcYm7dvY7FJ93us1QY5De4CyXA= github.com/FZambia/eagle v0.1.0/go.mod h1:YjGSPVkQTNcVLfzEUQJNgW9ScPR0K4u/Ky0yeFa4oDA= github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -1318,7 +1308,6 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= @@ -1327,7 +1316,6 @@ github.com/RoaringBitmap/real-roaring-datasets v0.0.0-20190726190000-eb7c87156f7 github.com/RoaringBitmap/roaring v0.9.1/go.mod h1:h1B7iIUOmnAeb5ytYMvnHJwxMc6LUrwBnzXWRuqTQUc= github.com/RoaringBitmap/roaring v0.9.4 h1:ckvZSX5gwCRaJYBNe7syNawCU5oruY9gQmjXlp4riwo= github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -1336,8 +1324,6 @@ github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f/go.mod h1:f3H github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -1364,18 +1350,24 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/apache/arrow/go/arrow v0.0.0-20210223225224-5bea62493d91/go.mod h1:c9sxoIT3YgLxH4UhLOCKaBlEojuMhVYpk4Ntv3opUTQ= +github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 h1:q4dksr6ICHXqG5hm0ZW5IHyeEJXoIJSOZeBLmWPNeIQ= +github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/arrow/go/v15 v15.0.0 h1:1zZACWf85oEZY5/kd9dsQS7i+2G5zVQcbKTHgslqHNA= -github.com/apache/arrow/go/v15 v15.0.0/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= +github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE= +github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/apache/thrift v0.18.1 h1:lNhK/1nqjbwbiOPDBPFJVKxgDEGSepKuTh6OLiXW8kg= +github.com/apache/thrift v0.18.1/go.mod h1:rdQn/dCcDKEWjjylUeueum4vQEjG2v8v2PqriUnbr+I= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -1389,17 +1381,13 @@ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgI github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.23.19/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= @@ -1448,13 +1436,13 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.11.3 h1:frW4ikGcxfAEDfmQqWgMLp+F1n4n github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU= github.com/aws/aws-sdk-go-v2/service/sts v1.16.3 h1:cJGRyzCSVwZC7zZZ1xbx9m32UnrKydRYhOvcD1NYP9Q= github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8= -github.com/aws/aws-xray-sdk-go v0.9.4/go.mod h1:XtMKdBQfpVut+tJEwI7+dJFRxxRdxHDyVNp2tHXRq04= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.11.2 h1:eG/N+CcUMAvsdffgMvjMKwfyDzIkjM6pfxMJ8Mzc6mE= github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/axiomhq/hyperloglog v0.0.0-20191112132149-a4c4c47bc57f h1:y06x6vGnFYfXUoVMbrcP1Uzpj4JG01eB5vRps9G8agM= github.com/axiomhq/hyperloglog v0.0.0-20191112132149-a4c4c47bc57f/go.mod h1:2stgcRjl6QmW+gU2h5E7BQXg4HU0gzxKWDuT5HviN9s= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/beevik/etree v1.2.0 h1:l7WETslUG/T+xOPs47dtd6jov2Ii/8/OjCldk5fYfQw= github.com/beevik/etree v1.2.0/go.mod h1:aiPf89g/1k3AShMVAzriilpcE4R/Vuor90y83zVZWFc= @@ -1493,32 +1481,34 @@ github.com/blugelabs/ice v1.0.0 h1:um7wf9e6jbkTVCrOyQq3tKK43fBMOvLUYxbj3Qtc4eo= github.com/blugelabs/ice v1.0.0/go.mod h1:gNfFPk5zM+yxJROhthxhVQYjpBO9amuxWXJQ2Lo+IbQ= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/bmatcuk/doublestar/v2 v2.0.3/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b h1:L/QXpzIa3pOvUGt1D1lA5KjYhPBAN/3iWdP7xeFS9F0= github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= -github.com/bsm/ginkgo/v2 v2.5.0 h1:aOAnND1T40wEdAtkGSkvSICWeQ8L3UASX7YVCqQx+eQ= -github.com/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= -github.com/bsm/gomega v1.20.0 h1:JhAwLmtRzXFTx2AkALSLa8ijZafntmhSoU63Ok18Uq8= -github.com/bsm/gomega v1.20.0/go.mod h1:JifAceMQ4crZIWYUKrlGcmbN3bqHogVTADMD2ATsbwk= +github.com/bsm/ginkgo/v2 v2.9.5 h1:rtVBYPs3+TC5iLUVOis1B9tjLTup7Cj5IfzosKtvTJ0= +github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= +github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/bufbuild/connect-go v1.10.0 h1:QAJ3G9A1OYQW2Jbk3DeoJbkCxuKArrvZgDt47mjdTbg= github.com/bufbuild/connect-go v1.10.0/go.mod h1:CAIePUgkDR5pAFaylSMtNK45ANQjp9JvpluG20rhpV8= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/buildkite/yaml v2.1.0+incompatible h1:xirI+ql5GzfikVNDmt+yeiXpf/v1Gt03qXTtT5WXdr8= github.com/buildkite/yaml v2.1.0+incompatible/go.mod h1:UoU8vbcwu1+vjZq01+KrpSeLBgQQIjL/H7Y6KwikUrI= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/caio/go-tdigest v3.1.0+incompatible h1:uoVMJ3Q5lXmVLCCqaMGHLBWnbGoN6Lpu7OAUPR60cds= github.com/caio/go-tdigest v3.1.0+incompatible/go.mod h1:sHQM/ubZStBUmF1WbB8FAm8q9GjDajLC5T7ydxE3JHI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= @@ -1536,6 +1526,9 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= @@ -1546,7 +1539,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= @@ -1576,26 +1568,10 @@ github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMe github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= -github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= -github.com/cockroachdb/cockroach-go v0.0.0-20200312223839-f565e4789405/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f h1:6jduT9Hfc0njg5jJ1DdKCFPdMBrp/mdZfCpa5h+WM74= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -1609,19 +1585,14 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cristalhq/jwt/v4 v4.0.2 h1:g/AD3h0VicDamtlM70GWGElp8kssQEv+5wYd7L9WOhU= -github.com/cristalhq/jwt/v4 v4.0.2/go.mod h1:HnYraSNKDRag1DZP92rYHyrjyQHnVEHPNqesmzs+miQ= -github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8= github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg= github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= @@ -1632,45 +1603,28 @@ github.com/cznic/ql v1.2.0/go.mod h1:FbpzhyZrqr0PVlK6ury+PoW3T0ODUV22OeWIxcaOrSE github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc/go.mod h1:Y1SNZ4dRUOKXshKUbwUapqNncRrho4mkjQebgEHZLj8= -github.com/dave/astrid v0.0.0-20170323122508-8c2895878b14/go.mod h1:Sth2QfxfATb/nW4EsrSi2KyJmbcniZ8TgTaji17D6ms= -github.com/dave/brenda v1.1.0/go.mod h1:4wCUr6gSlu5/1Tk7akE5X7UorwiQ8Rij0SKH3/BGMOM= -github.com/dave/courtney v0.3.0/go.mod h1:BAv3hA06AYfNUjfjQr+5gc6vxeBVOupLqrColj+QSD8= github.com/dave/dst v0.27.2 h1:4Y5VFTkhGLC1oddtNwuxxe36pnyLxMFXT51FOzH8Ekc= github.com/dave/dst v0.27.2/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= -github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= -github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/dave/jennifer v1.5.0 h1:HmgPN93bVDpkQyYbqhCHj5QlgvUkvEOzMyEvKLgCRrg= github.com/dave/jennifer v1.5.0/go.mod h1:4MnyiFIlZS3l5tSDn8VnzE6ffAhYBMB2SZntBsZGUok= -github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= -github.com/dave/patsy v0.0.0-20210517141501-957256f50cba/go.mod h1:qfR88CgEGLoiqDaE+xxDCi5QA5v4vUoW0UCX2Nd5Tlc= -github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4= -github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= -github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= +github.com/deepmap/oapi-codegen v1.13.0 h1:cnFHelhsRQbYvanCUAbRSn/ZpkUb1HPRlQcu8YqSORQ= +github.com/deepmap/oapi-codegen v1.13.0/go.mod h1:Amy7tbubKY9qkZOXqymI3Z6xSbndmu+atMJheLdyg44= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140 h1:y7y0Oa6UawqTFPCDw9JG6pdKt4F9pAhHv0B7FMGaGD0= github.com/dgryski/go-metro v0.0.0-20211217172704-adc40b04c140/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc= github.com/digitalocean/godo v1.106.0 h1:m5iErwl3xHovGFlawd50n54ntgXHt1BLsvU6BXsVxEU= github.com/digitalocean/godo v1.106.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= @@ -1706,23 +1660,16 @@ github.com/drone/runner-go v1.12.0 h1:zUjDj9ylsJ4n4Mvy4znddq/Z4EBzcUXzTltpzokKtg github.com/drone/runner-go v1.12.0/go.mod h1:vu4pPPYDoeN6vdYQAY01GGGsAIW4aLganJNaa8Fx8zE= github.com/drone/signal v1.0.0/go.mod h1:S8t92eFT0g4WUgEc/LxG+LCuiskpMNsG0ajAMGnyZpc= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v0.0.0-20180713052910-9f541cc9db5d/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/ecordell/optgen v0.0.6 h1:aSknPe6ZUBrjwHGp2+6XfmfCGYGD6W0ZDfCmmsrS7s4= -github.com/ecordell/optgen v0.0.6/go.mod h1:bAPkLVWcBlTX5EkXW0UTPRj3+yjq2I6VLgH8OasuQEM= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= -github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elazarl/goproxy v0.0.0-20181003060214-f58a169a71a5/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20230731152917-f99041a5c027 h1:1L0aalTpPz7YlMxETKpmQoWMBkeiuorElZIXoNmgiPE= github.com/elazarl/goproxy v0.0.0-20230731152917-f99041a5c027/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= @@ -1760,11 +1707,9 @@ github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87K github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= @@ -1773,8 +1718,6 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -1796,30 +1739,23 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= github.com/fullstorydev/grpchan v1.1.1 h1:heQqIJlAv5Cnks9a70GRL2EJke6QQoUB25VGR6TZQas= github.com/fullstorydev/grpchan v1.1.1/go.mod h1:f4HpiV8V6htfY/K44GWV1ESQzHBTq7DinhzqQ95lpgc= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gchaincl/sqlhooks v1.3.0 h1:yKPXxW9a5CjXaVf2HkQn6wn7TZARvbAOAelr3H8vK2Y= github.com/gchaincl/sqlhooks v1.3.0/go.mod h1:9BypXnereMT0+Ys8WGWHqzgkkOfHIhyeUCqXC24ra34= github.com/getkin/kin-openapi v0.120.0 h1:MqJcNJFrMDFNc07iwE8iFC5eT2k/NPUFDIpNeiZv8Jg= github.com/getkin/kin-openapi v0.120.0/go.mod h1:PCWw/lfBrJY4HcdqE3jj+QFkaFK8ABoqo7PvqVhXXqw= -github.com/getsentry/sentry-go v0.12.0 h1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.7.3/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= @@ -1862,35 +1798,18 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= github.com/go-openapi/analysis v0.21.5/go.mod h1:25YcZosX9Lwz2wBsrFrrsL8bmjjXdlyP6zsr2AMy29M= github.com/go-openapi/analysis v0.22.0/go.mod h1:acDnkkCI2QxIo8sSIPgmp1wUlRohV7vfGtAIVae73b0= github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.0/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.20.4/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= @@ -1898,10 +1817,6 @@ github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwn github.com/go-openapi/jsonpointer v0.20.1/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= @@ -1909,30 +1824,13 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/jsonreference v0.20.3/go.mod h1:FviDZ46i9ivh810gqzFLl5NttD5q3tSlMLqLr6okedM= github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= -github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= github.com/go-openapi/loads v0.21.3/go.mod h1:Y3aMR24iHbKHppOj91nQ/SHc0cuPbAr4ndY4a02xydc= github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= -github.com/go-openapi/runtime v0.19.26/go.mod h1:BvrQtn6iVb2QmiVXRsFAm6ZCAZBpbVKFfN6QWCp582M= github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= @@ -1940,13 +1838,6 @@ github.com/go-openapi/spec v0.20.12/go.mod h1:iSCgnBcwbMW9SfzJb8iYynXvcY6C/QFrI7 github.com/go-openapi/spec v0.20.13/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= @@ -1954,12 +1845,7 @@ github.com/go-openapi/strfmt v0.21.9/go.mod h1:0k3v301mglEaZRJdDDGSlN6Npq4VMVU69 github.com/go-openapi/strfmt v0.21.10/go.mod h1:vNDMwbilnl7xKiO/Ve/8H8Bb2JIInBnH+lqiw6QWgis= github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI= github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= @@ -1968,10 +1854,6 @@ github.com/go-openapi/swag v0.22.5/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmrid github.com/go-openapi/swag v0.22.6/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= -github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-openapi/validate v0.22.4/go.mod h1:qm6O8ZIcPVdSY5219468Jv7kBdGvkiZLPOmqnqTUZ2A= github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= @@ -1979,10 +1861,18 @@ github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSa github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.9.1/go.mod h1:4/GYJVjh9nhkhGR6AUNW3XhpDYNUr+Uvy9gV/VGZIy4= @@ -1992,7 +1882,6 @@ github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyL github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= @@ -2010,253 +1899,29 @@ github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/attrs v0.1.0/go.mod h1:fmNpaWyHM0tRm8gCZWKx8yY9fvaNLo2PyzBNSrBZ5Hw= -github.com/gobuffalo/buffalo v0.12.8-0.20181004233540-fac9bb505aa8/go.mod h1:sLyT7/dceRXJUxSsE813JTQtA3Eb1vjxWfo/N//vXIY= -github.com/gobuffalo/buffalo v0.13.0/go.mod h1:Mjn1Ba9wpIbpbrD+lIDMy99pQ0H0LiddMIIDGse7qT4= -github.com/gobuffalo/buffalo-plugins v1.0.2/go.mod h1:pOp/uF7X3IShFHyobahTkTLZaeUXwb0GrUTb9ngJWTs= -github.com/gobuffalo/buffalo-plugins v1.0.4/go.mod h1:pWS1vjtQ6uD17MVFWf7i3zfThrEKWlI5+PYLw/NaDB4= -github.com/gobuffalo/buffalo-plugins v1.4.3/go.mod h1:uCzTY0woez4nDMdQjkcOYKanngeUVRO2HZi7ezmAjWY= -github.com/gobuffalo/buffalo-plugins v1.5.1/go.mod h1:jbmwSZK5+PiAP9cC09VQOrGMZFCa/P0UMlIS3O12r5w= -github.com/gobuffalo/buffalo-plugins v1.6.4/go.mod h1:/+N1aophkA2jZ1ifB2O3Y9yGwu6gKOVMtUmJnbg+OZI= -github.com/gobuffalo/buffalo-plugins v1.6.5/go.mod h1:0HVkbgrVs/MnPZ/FOseDMVanCTm2RNcdM0PuXcL1NNI= -github.com/gobuffalo/buffalo-plugins v1.6.7/go.mod h1:ZGZRkzz2PiKWHs0z7QsPBOTo2EpcGRArMEym6ghKYgk= -github.com/gobuffalo/buffalo-plugins v1.6.9/go.mod h1:yYlYTrPdMCz+6/+UaXg5Jm4gN3xhsvsQ2ygVatZV5vw= -github.com/gobuffalo/buffalo-plugins v1.6.11/go.mod h1:eAA6xJIL8OuynJZ8amXjRmHND6YiusVAaJdHDN1Lu8Q= -github.com/gobuffalo/buffalo-plugins v1.8.2/go.mod h1:9te6/VjEQ7pKp7lXlDIMqzxgGpjlKoAcAANdCgoR960= -github.com/gobuffalo/buffalo-plugins v1.8.3/go.mod h1:IAWq6vjZJVXebIq2qGTLOdlXzmpyTZ5iJG5b59fza5U= -github.com/gobuffalo/buffalo-plugins v1.9.4/go.mod h1:grCV6DGsQlVzQwk6XdgcL3ZPgLm9BVxlBmXPMF8oBHI= -github.com/gobuffalo/buffalo-plugins v1.10.0/go.mod h1:4osg8d9s60txLuGwXnqH+RCjPHj9K466cDFRl3PErHI= -github.com/gobuffalo/buffalo-plugins v1.11.0/go.mod h1:rtIvAYRjYibgmWhnjKmo7OadtnxuMG5ZQLr25ozAzjg= -github.com/gobuffalo/buffalo-plugins v1.15.0/go.mod h1:BqSx01nwgKUQr/MArXzFkSD0QvdJidiky1OKgyfgrK8= -github.com/gobuffalo/buffalo-pop v1.0.5/go.mod h1:Fw/LfFDnSmB/vvQXPvcXEjzP98Tc+AudyNWUBWKCwQ8= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.4/go.mod h1:Abh+Jfw475/NWtYMEt+hnJWRiC8INKWibIMyNt1w2Mc= -github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= -github.com/gobuffalo/envy v1.6.6/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= -github.com/gobuffalo/envy v1.6.7/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= -github.com/gobuffalo/envy v1.6.8/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= -github.com/gobuffalo/envy v1.6.9/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= -github.com/gobuffalo/envy v1.6.10/go.mod h1:X0CFllQjTV5ogsnUrg+Oks2yTI+PU2dGYBJOEI2D1Uo= -github.com/gobuffalo/envy v1.6.11/go.mod h1:Fiq52W7nrHGDggFPhn2ZCcHw4u/rqXkqo+i7FB6EAcg= -github.com/gobuffalo/envy v1.6.12/go.mod h1:qJNrJhKkZpEW0glh5xP2syQHH5kgdmgsKss2Kk8PTP0= github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/envy v1.8.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/envy v1.9.0/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/events v1.0.3/go.mod h1:Txo8WmqScapa7zimEQIwgiJBvMECMe9gJjsKNPN3uZw= -github.com/gobuffalo/events v1.0.7/go.mod h1:z8txf6H9jWhQ5Scr7YPLWg/cgXBRj8Q4uYI+rsVCCSQ= -github.com/gobuffalo/events v1.0.8/go.mod h1:A5KyqT1sA+3GJiBE4QKZibse9mtOcI9nw8gGrDdqYGs= -github.com/gobuffalo/events v1.1.3/go.mod h1:9yPGWYv11GENtzrIRApwQRMYSbUgCsZ1w6R503fCfrk= -github.com/gobuffalo/events v1.1.4/go.mod h1:09/YRRgZHEOts5Isov+g9X2xajxdvOAcUuAHIX/O//A= -github.com/gobuffalo/events v1.1.5/go.mod h1:3YUSzgHfYctSjEjLCWbkXP6djH2M+MLaVRzb4ymbAK0= -github.com/gobuffalo/events v1.1.7/go.mod h1:6fGqxH2ing5XMb3EYRq9LEkVlyPGs4oO/eLzh+S8CxY= -github.com/gobuffalo/events v1.1.8/go.mod h1:UFy+W6X6VbCWS8k2iT81HYX65dMtiuVycMy04cplt/8= -github.com/gobuffalo/events v1.1.9/go.mod h1:/0nf8lMtP5TkgNbzYxR6Bl4GzBy5s5TebgNTdRfRbPM= -github.com/gobuffalo/events v1.3.1/go.mod h1:9JOkQVoyRtailYVE/JJ2ZQ/6i4gTjM5t2HsZK4C1cSA= -github.com/gobuffalo/events v1.4.1/go.mod h1:SjXgWKpeSuvQDvGhgMz5IXx3Czu+IbL+XPLR41NvVQY= -github.com/gobuffalo/fizz v1.0.12/go.mod h1:C0sltPxpYK8Ftvf64kbsQa2yiCZY4RZviurNxXdAKwc= -github.com/gobuffalo/fizz v1.9.8/go.mod h1:w1FEn1yKNVCc49KnADGyYGRPH7jFON3ak4Bj1yUudHo= -github.com/gobuffalo/fizz v1.10.0/go.mod h1:J2XGPO0AfJ1zKw7+2BA+6FEGAkyEsdCOLvN93WCT2WI= -github.com/gobuffalo/flect v0.0.0-20180907193754-dc14d8acaf9f/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= -github.com/gobuffalo/flect v0.0.0-20181002182613-4571df4b1daf/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= -github.com/gobuffalo/flect v0.0.0-20181007231023-ae7ed6bfe683/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= -github.com/gobuffalo/flect v0.0.0-20181018182602-fd24a256709f/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= -github.com/gobuffalo/flect v0.0.0-20181019110701-3d6f0b585514/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= -github.com/gobuffalo/flect v0.0.0-20181024204909-8f6be1a8c6c2/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= -github.com/gobuffalo/flect v0.0.0-20181104133451-1f6e9779237a/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= -github.com/gobuffalo/flect v0.0.0-20181114183036-47375f6d8328/go.mod h1:0HvNbHdfh+WOvDSIASqJOSxTOWSxCCUF++k/Y53v9rI= -github.com/gobuffalo/flect v0.0.0-20181210151238-24a2b68e0316/go.mod h1:en58vff74S9b99Eg42Dr+/9yPu437QjlNsO/hBYPuOk= -github.com/gobuffalo/flect v0.0.0-20190104192022-4af577e09bf2/go.mod h1:en58vff74S9b99Eg42Dr+/9yPu437QjlNsO/hBYPuOk= -github.com/gobuffalo/flect v0.0.0-20190117212819-a62e61d96794/go.mod h1:397QT6v05LkZkn07oJXXT6y9FCfwC8Pug0WA2/2mE9k= github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.1/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= -github.com/gobuffalo/genny v0.0.0-20180924032338-7af3a40f2252/go.mod h1:tUTQOogrr7tAQnhajMSH6rv1BVev34H2sa1xNHMy94g= -github.com/gobuffalo/genny v0.0.0-20181003150629-3786a0744c5d/go.mod h1:WAd8HmjMVrnkAZbmfgH5dLBUchsZfqzp/WS5sQz+uTM= -github.com/gobuffalo/genny v0.0.0-20181005145118-318a41a134cc/go.mod h1:WAd8HmjMVrnkAZbmfgH5dLBUchsZfqzp/WS5sQz+uTM= -github.com/gobuffalo/genny v0.0.0-20181007153042-b8de7d566757/go.mod h1:+oG5Ljrw04czAHbPXREwaFojJbpUvcIy4DiOnbEJFTA= -github.com/gobuffalo/genny v0.0.0-20181012161047-33e5f43d83a6/go.mod h1:+oG5Ljrw04czAHbPXREwaFojJbpUvcIy4DiOnbEJFTA= -github.com/gobuffalo/genny v0.0.0-20181017160347-90a774534246/go.mod h1:+oG5Ljrw04czAHbPXREwaFojJbpUvcIy4DiOnbEJFTA= -github.com/gobuffalo/genny v0.0.0-20181024195656-51392254bf53/go.mod h1:o9GEH5gn5sCKLVB5rHFC4tq40rQ3VRUzmx6WwmaqISE= -github.com/gobuffalo/genny v0.0.0-20181025145300-af3f81d526b8/go.mod h1:uZ1fFYvdcP8mu0B/Ynarf6dsGvp7QFIpk/QACUuFUVI= -github.com/gobuffalo/genny v0.0.0-20181027191429-94d6cfb5c7fc/go.mod h1:x7SkrQQBx204Y+O9EwRXeszLJDTaWN0GnEasxgLrQTA= -github.com/gobuffalo/genny v0.0.0-20181027195209-3887b7171c4f/go.mod h1:JbKx8HSWICu5zyqWOa0dVV1pbbXOHusrSzQUprW6g+w= -github.com/gobuffalo/genny v0.0.0-20181106193839-7dcb0924caf1/go.mod h1:x61yHxvbDCgQ/7cOAbJCacZQuHgB0KMSzoYcw5debjU= -github.com/gobuffalo/genny v0.0.0-20181107223128-f18346459dbe/go.mod h1:utQD3aKKEsdb03oR+Vi/6ztQb1j7pO10N3OBoowRcSU= -github.com/gobuffalo/genny v0.0.0-20181114215459-0a4decd77f5d/go.mod h1:kN2KZ8VgXF9VIIOj/GM0Eo7YK+un4Q3tTreKOf0q1ng= -github.com/gobuffalo/genny v0.0.0-20181119162812-e8ff4adce8bb/go.mod h1:BA9htSe4bZwBDJLe8CUkoqkypq3hn3+CkoHqVOW718E= -github.com/gobuffalo/genny v0.0.0-20181127225641-2d959acc795b/go.mod h1:l54xLXNkteX/PdZ+HlgPk1qtcrgeOr3XUBBPDbH+7CQ= -github.com/gobuffalo/genny v0.0.0-20181128191930-77e34f71ba2a/go.mod h1:FW/D9p7cEEOqxYA71/hnrkOWm62JZ5ZNxcNIVJEaWBU= -github.com/gobuffalo/genny v0.0.0-20181203165245-fda8bcce96b1/go.mod h1:wpNSANu9UErftfiaAlz1pDZclrYzLtO5lALifODyjuM= -github.com/gobuffalo/genny v0.0.0-20181203201232-849d2c9534ea/go.mod h1:wpNSANu9UErftfiaAlz1pDZclrYzLtO5lALifODyjuM= -github.com/gobuffalo/genny v0.0.0-20181206121324-d6fb8a0dbe36/go.mod h1:wpNSANu9UErftfiaAlz1pDZclrYzLtO5lALifODyjuM= -github.com/gobuffalo/genny v0.0.0-20181207164119-84844398a37d/go.mod h1:y0ysCHGGQf2T3vOhCrGHheYN54Y/REj0ayd0Suf4C/8= -github.com/gobuffalo/genny v0.0.0-20181211165820-e26c8466f14d/go.mod h1:sHnK+ZSU4e2feXP3PA29ouij6PUEiN+RCwECjCTB3yM= -github.com/gobuffalo/genny v0.0.0-20190104222617-a71664fc38e7/go.mod h1:QPsQ1FnhEsiU8f+O0qKWXz2RE4TiDqLVChWkBuh1WaY= -github.com/gobuffalo/genny v0.0.0-20190112155932-f31a84fcacf5/go.mod h1:CIaHCrSIuJ4il6ka3Hub4DR4adDrGoXGEEt2FbBxoIo= github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/genny v0.2.0/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.3.0/go.mod h1:ywJ2CoXrTZj7rbS8HTbzv7uybnLKlsNSBhEQ+yFI3E8= -github.com/gobuffalo/genny v0.6.0/go.mod h1:Vigx9VDiNscYpa/LwrURqGXLSIbzTfapt9+K6gF1kTA= -github.com/gobuffalo/genny/v2 v2.0.5/go.mod h1:kRkJuAw9mdI37AiEYjV4Dl+TgkBDYf8HZVjLkqe5eBg= github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/github_flavored_markdown v1.0.4/go.mod h1:uRowCdK+q8d/RF0Kt3/DSalaIXbb0De/dmTqMQdkQ4I= -github.com/gobuffalo/github_flavored_markdown v1.0.5/go.mod h1:U0643QShPF+OF2tJvYNiYDLDGDuQmJZXsf/bHOJPsMY= -github.com/gobuffalo/github_flavored_markdown v1.0.7/go.mod h1:w93Pd9Lz6LvyQXEG6DktTPHkOtCbr+arAD5mkwMzXLI= -github.com/gobuffalo/github_flavored_markdown v1.1.0/go.mod h1:TSpTKWcRTI0+v7W3x8dkSKMLJSUpuVitlptCkpeY8ic= github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/gogen v0.2.0/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/helpers v0.2.2/go.mod h1:xYbzUdCUpVzLwLnqV8HIjT6hmG0Cs7YIBCJkNM597jw= -github.com/gobuffalo/helpers v0.2.4/go.mod h1:NX7v27yxPDOPTgUFYmJ5ow37EbxdoLraucOGvMNawyk= -github.com/gobuffalo/helpers v0.5.0/go.mod h1:stpgxJ2C7T99NLyAxGUnYMM2zAtBk5NKQR0SIbd05j4= -github.com/gobuffalo/helpers v0.6.0/go.mod h1:pncVrer7x/KRvnL5aJABLAuT/RhKRR9klL6dkUOhyv8= -github.com/gobuffalo/helpers v0.6.1/go.mod h1:wInbDi0vTJKZBviURTLRMFLE4+nF2uRuuL2fnlYo7w4= -github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= -github.com/gobuffalo/httptest v1.0.2/go.mod h1:7T1IbSrg60ankme0aDLVnEY0h056g9M1/ZvpVThtB7E= -github.com/gobuffalo/licenser v0.0.0-20180924033006-eae28e638a42/go.mod h1:Ubo90Np8gpsSZqNScZZkVXXAo5DGhTb+WYFIjlnog8w= -github.com/gobuffalo/licenser v0.0.0-20181025145548-437d89de4f75/go.mod h1:x3lEpYxkRG/XtGCUNkio+6RZ/dlOvLzTI9M1auIwFcw= -github.com/gobuffalo/licenser v0.0.0-20181027200154-58051a75da95/go.mod h1:BzhaaxGd1tq1+OLKObzgdCV9kqVhbTulxOpYbvMQWS0= -github.com/gobuffalo/licenser v0.0.0-20181109171355-91a2a7aac9a7/go.mod h1:m+Ygox92pi9bdg+gVaycvqE8RVSjZp7mWw75+K5NPHk= -github.com/gobuffalo/licenser v0.0.0-20181128165715-cc7305f8abed/go.mod h1:oU9F9UCE+AzI/MueCKZamsezGOOHfSirltllOVeRTAE= -github.com/gobuffalo/licenser v0.0.0-20181203160806-fe900bbede07/go.mod h1:ph6VDNvOzt1CdfaWC+9XwcBnlSTBz2j49PBwum6RFaU= -github.com/gobuffalo/licenser v0.0.0-20181211173111-f8a311c51159/go.mod h1:ve/Ue99DRuvnTaLq2zKa6F4KtHiYf7W046tDjuGYPfM= -github.com/gobuffalo/licenser v1.1.0/go.mod h1:ZVWE6uKUE3rGf7sedUHWVjNWrEgxaUQLVFL+pQiWpfY= -github.com/gobuffalo/logger v0.0.0-20181022175615-46cfb361fc27/go.mod h1:8sQkgyhWipz1mIctHF4jTxmJh1Vxhp7mP8IqbljgJZo= -github.com/gobuffalo/logger v0.0.0-20181027144941-73d08d2bb969/go.mod h1:7uGg2duHKpWnN4+YmyKBdLXfhopkAdVM6H3nKbyFbz8= -github.com/gobuffalo/logger v0.0.0-20181027193913-9cf4dd0efe46/go.mod h1:7uGg2duHKpWnN4+YmyKBdLXfhopkAdVM6H3nKbyFbz8= -github.com/gobuffalo/logger v0.0.0-20181109185836-3feeab578c17/go.mod h1:oNErH0xLe+utO+OW8ptXMSA5DkiSEDW1u3zGIt8F9Ew= -github.com/gobuffalo/logger v0.0.0-20181117211126-8e9b89b7c264/go.mod h1:5etB91IE0uBlw9k756fVKZJdS+7M7ejVhmpXXiSFj0I= -github.com/gobuffalo/logger v0.0.0-20181127160119-5b956e21995c/go.mod h1:+HxKANrR9VGw9yN3aOAppJKvhO05ctDi63w4mDnKv2U= github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= -github.com/gobuffalo/makr v1.1.5/go.mod h1:Y+o0btAH1kYAMDJW/TX3+oAXEu0bmSLLoC9mIFxtzOw= -github.com/gobuffalo/mapi v1.0.0/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.1.0/go.mod h1:pqQ1XAqvpy/JYtRwoieNps2yU8MFiMxBUpAm2FBtQ50= -github.com/gobuffalo/mapi v1.2.1/go.mod h1:giGJ2AUESRepOFYAzWpq8Gf/s/QDryxoEHisQtFN3cY= -github.com/gobuffalo/meta v0.0.0-20181018155829-df62557efcd3/go.mod h1:XTTOhwMNryif3x9LkTTBO/Llrveezd71u3quLd0u7CM= -github.com/gobuffalo/meta v0.0.0-20181018192820-8c6cef77dab3/go.mod h1:E94EPzx9NERGCY69UWlcj6Hipf2uK/vnfrF4QD0plVE= -github.com/gobuffalo/meta v0.0.0-20181025145500-3a985a084b0a/go.mod h1:YDAKBud2FP7NZdruCSlmTmDOZbVSa6bpK7LJ/A/nlKg= -github.com/gobuffalo/meta v0.0.0-20181114191255-b130ebedd2f7/go.mod h1:K6cRZ29ozr4Btvsqkjvg5nDFTLOgTqf03KA70Ks0ypE= -github.com/gobuffalo/meta v0.0.0-20181127070345-0d7e59dd540b/go.mod h1:RLO7tMvE0IAKAM8wny1aN12pvEKn7EtkBLkUZR00Qf8= -github.com/gobuffalo/meta v0.0.0-20190120163247-50bbb1fa260d/go.mod h1:KKsH44nIK2gA8p0PJmRT9GvWJUdphkDUA8AJEvFWiqM= -github.com/gobuffalo/meta v0.0.0-20190329152330-e161e8a93e3b/go.mod h1:mCRSy5F47tjK8yaIDcJad4oe9fXxY5gLrx3Xx2spK+0= -github.com/gobuffalo/meta v0.3.0/go.mod h1:cpr6mrUX5H/B4wEP86Gdq568TK4+dKUD8oRPl698RUw= -github.com/gobuffalo/mw-basicauth v1.0.3/go.mod h1:dg7+ilMZOKnQFHDefUzUHufNyTswVUviCBgF244C1+0= -github.com/gobuffalo/mw-contenttype v0.0.0-20180802152300-74f5a47f4d56/go.mod h1:7EvcmzBbeCvFtQm5GqF9ys6QnCxz2UM1x0moiWLq1No= -github.com/gobuffalo/mw-csrf v0.0.0-20180802151833-446ff26e108b/go.mod h1:sbGtb8DmDZuDUQoxjr8hG1ZbLtZboD9xsn6p77ppcHo= -github.com/gobuffalo/mw-forcessl v0.0.0-20180802152810-73921ae7a130/go.mod h1:JvNHRj7bYNAMUr/5XMkZaDcw3jZhUZpsmzhd//FFWmQ= -github.com/gobuffalo/mw-i18n v0.0.0-20180802152014-e3060b7e13d6/go.mod h1:91AQfukc52A6hdfIfkxzyr+kpVYDodgAeT5cjX1UIj4= -github.com/gobuffalo/mw-paramlogger v0.0.0-20181005191442-d6ee392ec72e/go.mod h1:6OJr6VwSzgJMqWMj7TYmRUqzNe2LXu/W1rRW4MAz/ME= -github.com/gobuffalo/mw-tokenauth v0.0.0-20181001105134-8545f626c189/go.mod h1:UqBF00IfKvd39ni5+yI5MLMjAf4gX7cDKN/26zDOD6c= -github.com/gobuffalo/nulls v0.2.0/go.mod h1:w4q8RoSCEt87Q0K0sRIZWYeIxkxog5mh3eN3C/n+dUc= -github.com/gobuffalo/nulls v0.3.0/go.mod h1:UP49vd/k+bcaz6m0cHMyuk8oQ7XgLnkfxeiVoPAvBSs= -github.com/gobuffalo/packd v0.0.0-20181027182251-01ad393492c8/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= -github.com/gobuffalo/packd v0.0.0-20181027190505-aafc0d02c411/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= -github.com/gobuffalo/packd v0.0.0-20181027194105-7ae579e6d213/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= -github.com/gobuffalo/packd v0.0.0-20181031195726-c82734870264/go.mod h1:Yf2toFaISlyQrr5TfO3h6DB9pl9mZRmyvBGQb/aQ/pI= -github.com/gobuffalo/packd v0.0.0-20181104210303-d376b15f8e96/go.mod h1:Yf2toFaISlyQrr5TfO3h6DB9pl9mZRmyvBGQb/aQ/pI= -github.com/gobuffalo/packd v0.0.0-20181111195323-b2e760a5f0ff/go.mod h1:Yf2toFaISlyQrr5TfO3h6DB9pl9mZRmyvBGQb/aQ/pI= -github.com/gobuffalo/packd v0.0.0-20181114190715-f25c5d2471d7/go.mod h1:Yf2toFaISlyQrr5TfO3h6DB9pl9mZRmyvBGQb/aQ/pI= -github.com/gobuffalo/packd v0.0.0-20181124090624-311c6248e5fb/go.mod h1:Foenia9ZvITEvG05ab6XpiD5EfBHPL8A6hush8SJ0o8= -github.com/gobuffalo/packd v0.0.0-20181207120301-c49825f8f6f4/go.mod h1:LYc0TGKFBBFTRC9dg2pcRcMqGCTMD7T2BIMP7OBuQAA= -github.com/gobuffalo/packd v0.0.0-20181212173646-eca3b8fd6687/go.mod h1:LYc0TGKFBBFTRC9dg2pcRcMqGCTMD7T2BIMP7OBuQAA= github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.2.0/go.mod h1:k2CkHP3bjbqL2GwxwhxUy1DgnlbW644hkLC9iIUvZwY= -github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= -github.com/gobuffalo/packr v1.13.7/go.mod h1:KkinLIn/n6+3tVXMwg6KkNvWwVsrRAz4ph+jgpk3Z24= -github.com/gobuffalo/packr v1.15.0/go.mod h1:t5gXzEhIviQwVlNx/+3SfS07GS+cZ2hn76WLzPp6MGI= -github.com/gobuffalo/packr v1.15.1/go.mod h1:IeqicJ7jm8182yrVmNbM6PR4g79SjN9tZLH8KduZZwE= -github.com/gobuffalo/packr v1.19.0/go.mod h1:MstrNkfCQhd5o+Ct4IJ0skWlxN8emOq8DsoT1G98VIU= -github.com/gobuffalo/packr v1.20.0/go.mod h1:JDytk1t2gP+my1ig7iI4NcVaXr886+N0ecUga6884zw= -github.com/gobuffalo/packr v1.21.0/go.mod h1:H00jGfj1qFKxscFJSw8wcL4hpQtPe1PfU2wa6sg/SR0= -github.com/gobuffalo/packr v1.22.0/go.mod h1:Qr3Wtxr3+HuQEwWqlLnNW4t1oTvK+7Gc/Rnoi/lDFvA= -github.com/gobuffalo/packr/v2 v2.0.0-rc.8/go.mod h1:y60QCdzwuMwO2R49fdQhsjCPv7tLQFR0ayzxxla9zes= -github.com/gobuffalo/packr/v2 v2.0.0-rc.9/go.mod h1:fQqADRfZpEsgkc7c/K7aMew3n4aF1Kji7+lIZeR98Fc= -github.com/gobuffalo/packr/v2 v2.0.0-rc.10/go.mod h1:4CWWn4I5T3v4c1OsJ55HbHlUEKNWMITG5iIkdr4Px4w= -github.com/gobuffalo/packr/v2 v2.0.0-rc.11/go.mod h1:JoieH/3h3U4UmatmV93QmqyPUdf4wVM9HELaHEu+3fk= -github.com/gobuffalo/packr/v2 v2.0.0-rc.12/go.mod h1:FV1zZTsVFi1DSCboO36Xgs4pzCZBjB/tDV9Cz/lSaR8= -github.com/gobuffalo/packr/v2 v2.0.0-rc.13/go.mod h1:2Mp7GhBFMdJlOK8vGfl7SYtfMP3+5roE39ejlfjw0rA= -github.com/gobuffalo/packr/v2 v2.0.0-rc.14/go.mod h1:06otbrNvDKO1eNQ3b8hst+1010UooI2MFg+B2Ze4MV8= -github.com/gobuffalo/packr/v2 v2.0.0-rc.15/go.mod h1:IMe7H2nJvcKXSF90y4X1rjYIRlNMJYCxEhssBXNZwWs= github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/packr/v2 v2.4.0/go.mod h1:ra341gygw9/61nSjAbfwcwh8IrYL4WmR4IsPkPBhQiY= -github.com/gobuffalo/packr/v2 v2.5.2/go.mod h1:sgEE1xNZ6G0FNN5xn9pevVu4nywaxHvgup67xisti08= -github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= -github.com/gobuffalo/packr/v2 v2.8.0/go.mod h1:PDk2k3vGevNE3SwVyVRgQCCXETC9SaONCNSXT1Q8M1g= -github.com/gobuffalo/plush v3.7.16+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.7.20+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.7.21+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.7.22+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.7.23+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.7.30+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.7.31+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.7.32+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.8.2+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush v3.8.3+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush/v4 v4.0.0/go.mod h1:ErFS3UxKqEb8fpFJT7lYErfN/Nw6vHGiDMTjxpk5bQ0= -github.com/gobuffalo/plushgen v0.0.0-20181128164830-d29dcb966cb2/go.mod h1:r9QwptTFnuvSaSRjpSp4S2/4e2D3tJhARYbvEBcKSb4= -github.com/gobuffalo/plushgen v0.0.0-20181203163832-9fc4964505c2/go.mod h1:opEdT33AA2HdrIwK1aibqnTJDVVKXC02Bar/GT1YRVs= -github.com/gobuffalo/plushgen v0.0.0-20181207152837-eedb135bd51b/go.mod h1:Lcw7HQbEVm09sAQrCLzIxuhFbB3nAgp4c55E+UlynR0= -github.com/gobuffalo/plushgen v0.0.0-20190104222512-177cd2b872b3/go.mod h1:tYxCozi8X62bpZyKXYHw1ncx2ZtT2nFvG42kuLwYjoc= -github.com/gobuffalo/plushgen v0.1.2/go.mod h1:3U71v6HWZpVER1nInTXeAwdoRNsRd4W8aeIa1Lyp+Bk= -github.com/gobuffalo/pop v4.8.2+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= -github.com/gobuffalo/pop v4.8.3+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= -github.com/gobuffalo/pop v4.8.4+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= -github.com/gobuffalo/pop v4.13.1+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= -github.com/gobuffalo/pop/v5 v5.0.11/go.mod h1:mZJHJbA3cy2V18abXYuVop2ldEJ8UZ2DK6qOekC5u5g= -github.com/gobuffalo/pop/v5 v5.3.1/go.mod h1:vcEDhh6cJ3WVENqJDFt/6z7zNb7lLnlN8vj3n5G9rYA= -github.com/gobuffalo/release v1.0.35/go.mod h1:VtHFAKs61vO3wboCec5xr9JPTjYyWYcvaM3lclkc4x4= -github.com/gobuffalo/release v1.0.38/go.mod h1:VtHFAKs61vO3wboCec5xr9JPTjYyWYcvaM3lclkc4x4= -github.com/gobuffalo/release v1.0.42/go.mod h1:RPs7EtafH4oylgetOJpGP0yCZZUiO4vqHfTHJjSdpug= -github.com/gobuffalo/release v1.0.52/go.mod h1:RPs7EtafH4oylgetOJpGP0yCZZUiO4vqHfTHJjSdpug= -github.com/gobuffalo/release v1.0.53/go.mod h1:FdF257nd8rqhNaqtDWFGhxdJ/Ig4J7VcS3KL7n/a+aA= -github.com/gobuffalo/release v1.0.54/go.mod h1:Pe5/RxRa/BE8whDpGfRqSI7D1a0evGK1T4JDm339tJc= -github.com/gobuffalo/release v1.0.61/go.mod h1:mfIO38ujUNVDlBziIYqXquYfBF+8FDHUjKZgYC1Hj24= -github.com/gobuffalo/release v1.0.72/go.mod h1:NP5NXgg/IX3M5XmHmWR99D687/3Dt9qZtTK/Lbwc1hU= -github.com/gobuffalo/release v1.1.1/go.mod h1:Sluak1Xd6kcp6snkluR1jeXAogdJZpFFRzTYRs/2uwg= -github.com/gobuffalo/release v1.1.3/go.mod h1:CuXc5/m+4zuq8idoDt1l4va0AXAn/OSs08uHOfMVr8E= -github.com/gobuffalo/release v1.1.6/go.mod h1:18naWa3kBsqO0cItXZNJuefCKOENpbbUIqRL1g+p6z0= -github.com/gobuffalo/release v1.7.0/go.mod h1:xH2NjAueVSY89XgC4qx24ojEQ4zQ9XCGVs5eXwJTkEs= -github.com/gobuffalo/shoulders v1.0.1/go.mod h1:V33CcVmaQ4gRUmHKwq1fiTXuf8Gp/qjQBUL5tHPmvbA= -github.com/gobuffalo/shoulders v1.0.4/go.mod h1:LqMcHhKRuBPMAYElqOe3POHiZ1x7Ry0BE8ZZ84Bx+k4= -github.com/gobuffalo/syncx v0.0.0-20181120191700-98333ab04150/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobuffalo/syncx v0.0.0-20181120194010-558ac7de985f/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobuffalo/syncx v0.1.0/go.mod h1:Mg/s+5pv7IgxEp6sA+NFpqS4o2x+R9dQNwbwT0iuOGQ= -github.com/gobuffalo/tags v2.0.11+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= -github.com/gobuffalo/tags v2.0.14+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= -github.com/gobuffalo/tags v2.0.15+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= -github.com/gobuffalo/tags v2.1.0+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= -github.com/gobuffalo/tags v2.1.7+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= -github.com/gobuffalo/tags/v3 v3.0.2/go.mod h1:ZQeN6TCTiwAFnS0dNcbDtSgZDwNKSpqajvVtt6mlYpA= -github.com/gobuffalo/tags/v3 v3.1.0/go.mod h1:ZQeN6TCTiwAFnS0dNcbDtSgZDwNKSpqajvVtt6mlYpA= -github.com/gobuffalo/uuid v2.0.3+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= -github.com/gobuffalo/uuid v2.0.4+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= -github.com/gobuffalo/uuid v2.0.5+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= -github.com/gobuffalo/validate v2.0.3+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM= -github.com/gobuffalo/validate v2.0.4+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM= -github.com/gobuffalo/validate/v3 v3.0.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= -github.com/gobuffalo/validate/v3 v3.1.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= -github.com/gobuffalo/validate/v3 v3.2.0/go.mod h1:PrhDOdDHxtN8KUgMvF3TDL0r1YZXV4sQnyFX/EmeETY= -github.com/gobuffalo/x v0.0.0-20181003152136-452098b06085/go.mod h1:WevpGD+5YOreDJznWevcn8NTmQEW5STSBgIkpkjzqXc= -github.com/gobuffalo/x v0.0.0-20181007152206-913e47c59ca7/go.mod h1:9rDPXaB3kXdKWzMc4odGQQdG2e2DIEmANy5aSJ9yesY= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= @@ -2271,12 +1936,9 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid/v3 v3.1.2/go.mod h1:xPwMqoocQ1L5G6pXX5BcE7N5jlzn2o19oqAKxwZW/kI= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= @@ -2287,11 +1949,9 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -2299,8 +1959,8 @@ github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-migrate/migrate/v4 v4.7.0 h1:gONcHxHApDTKXDyLH/H97gEHmpu1zcnnbAaq2zgrPrs= github.com/golang-migrate/migrate/v4 v4.7.0/go.mod h1:Qvut3N4xKWjoH3sokBccML6WyHSnggXm/DvMMnTsQIc= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= @@ -2310,8 +1970,6 @@ github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+ github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/gddo v0.0.0-20180828051604-96d2a289f41e/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= -github.com/golang/gddo v0.0.0-20190904175337-72a348e765d2/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= @@ -2319,7 +1977,6 @@ github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/ github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -2335,7 +1992,6 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -2363,7 +2019,6 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= @@ -2372,6 +2027,7 @@ github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl76 github.com/google/cel-go v0.17.7 h1:6ebJFzu1xO2n7TLtN+UBqShGBhlD85bhvglh5DpcfqQ= github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= @@ -2398,7 +2054,6 @@ github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4r github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-jsonnet v0.16.0/go.mod h1:sOcuej3UW1vpPTZOr8L7RQimqai1a57bt5j22LzGZCw= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -2445,7 +2100,6 @@ github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -2486,32 +2140,29 @@ github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+ github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -github.com/gopherjs/gopherjs v0.0.0-20181004151105-1babbf986f6f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.1.2/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= -github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gotestyourself/gotestyourself v1.3.0/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/grafana/alerting v0.0.0-20240213130827-92f64f0f2a12 h1:QepaY7wUP3U1hFiU1Lnv+tymnovzK21KQ/evMDpYsEw= -github.com/grafana/alerting v0.0.0-20240213130827-92f64f0f2a12/go.mod h1:brTFeACal/cSZAR8XO/4LPKs7rzNfS86okl6QjSP1eY= +github.com/grafana/alerting v0.0.0-20240322221449-89ae4e299bf8 h1:ndBSFAHmJRWqln2uNys7lV0+9U8tlW6ZuNz8ETW60Us= +github.com/grafana/alerting v0.0.0-20240322221449-89ae4e299bf8/go.mod h1:0nHKO0w8OTemvZ3eh7+s1EqGGhgbs0kvkTeLU1FrbTw= +github.com/grafana/authlib v0.0.0-20240319083410-9d4a6e3861e5 h1:A13Z8Hy60BfIduM819kpk0njrRKjbAVbVRhE+R+AF/8= +github.com/grafana/authlib v0.0.0-20240319083410-9d4a6e3861e5/go.mod h1:86rRD5P6u2JPWtNWTMOlqlU+YMv2fUvVz/DomA6L7w4= github.com/grafana/codejen v0.0.3 h1:tAWxoTUuhgmEqxJPOLtJoxlPBbMULFwKFOcRsPRPXDw= github.com/grafana/codejen v0.0.3/go.mod h1:zmwwM/DRyQB7pfuBjTWII3CWtxcXh8LTwAYGfDfpR6s= github.com/grafana/cue v0.0.0-20230926092038-971951014e3f h1:TmYAMnqg3d5KYEAaT6PtTguL2GjLfvr6wnAX8Azw6tQ= @@ -2528,17 +2179,23 @@ github.com/grafana/gofpdf v0.0.0-20231002120153-857cc45be447 h1:jxJJ5z0GxqhWFbQU github.com/grafana/gofpdf v0.0.0-20231002120153-857cc45be447/go.mod h1:IxsY6mns6Q5sAnWcrptrgUrSglTZJXH/kXr9nbpb/9I= github.com/grafana/grafana-aws-sdk v0.25.1 h1:waJERJueqB1GldclAh5+tBcY9Ju9AOO9xYSJEnOAuf4= github.com/grafana/grafana-aws-sdk v0.25.1/go.mod h1:3zghFF6edrxn0d6k6X9HpGZXDH+VfA+MwD2Pc/9X0ec= -github.com/grafana/grafana-azure-sdk-go v1.12.0 h1:q71M2QxMlBqRZOXc5mFAycJWuZqQ3hPTzVEo1r3CUTY= -github.com/grafana/grafana-azure-sdk-go v1.12.0/go.mod h1:SAlwLdEuox4vw8ZaeQwnepYXnhznnQQdstJbcw8LH68= +github.com/grafana/grafana-azure-sdk-go/v2 v2.0.1 h1:a/zb8uX7EvmS2YAFbYPyGEnZP8jMp7WppAm05Qtunok= +github.com/grafana/grafana-azure-sdk-go/v2 v2.0.1/go.mod h1:nW7pr7POOGafhyOrq8V0ouXBcXTmpRCer3sDAfeSV+Y= github.com/grafana/grafana-google-sdk-go v0.1.0 h1:LKGY8z2DSxKjYfr2flZsWgTRTZ6HGQbTqewE3JvRaNA= github.com/grafana/grafana-google-sdk-go v0.1.0/go.mod h1:Vo2TKWfDVmNTELBUM+3lkrZvFtBws0qSZdXhQxRdJrE= github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 h1:r+mU5bGMzcXCRVAuOrTn54S80qbfVkvTdUJZfSfTNbs= github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79/go.mod h1:wc6Hbh3K2TgCUSfBC/BOzabItujtHMESZeFk5ZhdxhQ= github.com/grafana/grafana-plugin-sdk-go v0.114.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= -github.com/grafana/grafana-plugin-sdk-go v0.218.0 h1:hKu6ziTgHHfdc/7UpIcWtBoP44/a7VkAJIBnECoRqTg= -github.com/grafana/grafana-plugin-sdk-go v0.218.0/go.mod h1:Cu+ezYbFY+IYDhIbPhkYegE3wl9VKrntSBkuVuJr+ZE= -github.com/grafana/kindsys v0.0.0-20230508162304-452481b63482 h1:1YNoeIhii4UIIQpCPU+EXidnqf449d0C3ZntAEt4KSo= -github.com/grafana/kindsys v0.0.0-20230508162304-452481b63482/go.mod h1:GNcfpy5+SY6RVbNGQW264gC0r336Dm+0zgQ5vt6+M8Y= +github.com/grafana/grafana-plugin-sdk-go v0.222.0 h1:bWK35de9Kl9+lRGyh+41zW2X8MkQ4959aqUsi08/8ig= +github.com/grafana/grafana-plugin-sdk-go v0.222.0/go.mod h1:0lYONo3rJrjIoJNOQP0h2NXmOaF5rFIuH/rwSVSeIrQ= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240226124929-648abdbd0ea4 h1:hpyusz8c3yRFoJPlA0o34rWnsLbaOOBZleqRhFBi5Lg= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240226124929-648abdbd0ea4/go.mod h1:vrRQJuNprTWqwm6JPxHf3BoTJhvO15QMEjQ7Q/YUOnI= +github.com/grafana/grafana/pkg/apiserver v0.0.0-20240226124929-648abdbd0ea4 h1:tIbI5zgos92vwJ8lV3zwHwuxkV03GR3FGLkFW9V5LxY= +github.com/grafana/grafana/pkg/apiserver v0.0.0-20240226124929-648abdbd0ea4/go.mod h1:vpYI6DHvFO595rpQGooUjcyicjt9rOevldDdW79peV0= +github.com/grafana/grafana/pkg/promlib v0.0.4 h1:9jAW19WABIAp6NlpZsAERQ+s5ayQYDFfryDFjjn1r6g= +github.com/grafana/grafana/pkg/promlib v0.0.4/go.mod h1:621zjsCaFtP7mqqaiMJRN9h3SXrywAMaIPkeHvq3jsk= +github.com/grafana/grafana/pkg/util/xorm v0.0.1 h1:72QZjxWIWpSeOF8ob4aMV058kfgZyeetkAB8dmeti2o= +github.com/grafana/grafana/pkg/util/xorm v0.0.1/go.mod h1:eNfbB9f2jM8o9RfwqwjY8SYm5tvowJ8Ly+iE4P9rXII= github.com/grafana/prometheus-alertmanager v0.25.1-0.20240208102907-e82436ce63e6 h1:CBm0rwLCPDyarg9/bHJ50rBLYmyMDoyCWpgRMITZhdA= github.com/grafana/prometheus-alertmanager v0.25.1-0.20240208102907-e82436ce63e6/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= github.com/grafana/pyroscope-go/godeltaprof v0.1.6 h1:nEdZ8louGAplSvIJi1HVp7kWvFvdiiYg3COLlTwJiFo= @@ -2554,10 +2211,7 @@ github.com/grafana/sqlds/v3 v3.2.0 h1:WXuYEaFfiCvgm8kK2ixx44/zAEjFzCylA2+RF3GBqZ github.com/grafana/sqlds/v3 v3.2.0/go.mod h1:kH0WuHUR3j0Q7IEymbm2JiaPckUhRCbqjV9ajaBAnmM= github.com/grafana/tempo v1.5.1-0.20230524121406-1dc1bfe7085b h1:mDlkqgTEJuK7vjPG44f3ZMtId5AAYLWHvBVbiGqIOOQ= github.com/grafana/tempo v1.5.1-0.20230524121406-1dc1bfe7085b/go.mod h1:UK7kTP5llPeRcGBOe5mm4QTNTd0k/mAqTVSOFdDH6AU= -github.com/grafana/thema v0.0.0-20230712153715-375c1b45f3ed h1:TMtHc+B0SSNw2in6Ro1dAiBYSPRp4NzKgndFDfupt18= -github.com/grafana/thema v0.0.0-20230712153715-375c1b45f3ed/go.mod h1:3zLJnssFRPCnebCBRlq53t5LgYv9P1mbj0XMozZMTww= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -2565,7 +2219,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vb github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 h1:uGoIog/wiQHI9GAxXO5TJbT0wWKH3O9HhOJW1F9c3fY= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -2610,7 +2263,6 @@ github.com/hashicorp/go-plugin v1.2.2/go.mod h1:F9eH4LrE/ZsRdbwhfjs9k9HoDUwAHnYt github.com/hashicorp/go-plugin v1.6.0 h1:wgd4KxHJTVGGqWBq4QPB1i5BZNEx9BR8+OFmHDmTk8A= github.com/hashicorp/go-plugin v1.6.0/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= @@ -2624,6 +2276,7 @@ github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3ly github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -2638,7 +2291,6 @@ github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl/v2 v2.17.0 h1:z1XvSUyXd1HP10U4lrLg5e0JMVz6CPaJvAgxM0KNZVY= github.com/hashicorp/hcl/v2 v2.17.0/go.mod h1:gJyW2PTShkJqQBKpAmPO3yxMxIuoXkOF2TpqXzrQyx4= @@ -2665,15 +2317,12 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= -github.com/hmarr/codeowners v1.1.2 h1:CdmLJ0e2s2aaH21+3HW1HXJyJqz+OCEiMBfD9iZb3n8= -github.com/hmarr/codeowners v1.1.2/go.mod h1:+ez+YARvfVhzL1MzY0f2+D/VusjODs4iRj3tO/IxBMw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -2684,7 +2333,6 @@ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -2695,16 +2343,12 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/inhies/go-bytesize v0.0.0-20201103132853-d0aed0d254f8/go.mod h1:KrtyD5PFj++GKkFS/7/RRrfnRhAMGQwy75GLCHWrCNs= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/ionos-cloud/sdk-go/v6 v6.1.10 h1:3815Q2Hw/wc4cJ8wD7bwfsmDsdfIEp80B7BQMj0YP2w= github.com/ionos-cloud/sdk-go/v6 v6.1.10/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -2712,9 +2356,6 @@ github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80s github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= -github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.6.0/go.mod h1:yeseQo4xhQbgyJs2c87RAXOH2i624N0Fh1KSPJya7qo= github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= @@ -2729,37 +2370,38 @@ github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= -github.com/jackc/pgtype v1.3.0/go.mod h1:b0JqxHvPmljG+HQ5IsvQ0yqeSi4nGcDTVjFoiLDb0Ik= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= -github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.4.1/go.mod h1:6iSW+JznC0YT+SgBn7rNxoEBsBgSmnC5FwyCekOGUiE= -github.com/jackc/pgx/v4 v4.6.0/go.mod h1:vPh43ZzxijXUVJ+t/EmXBtFmbFVO72cuneCT9oAlxAg= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jandelgado/gcov2lcov v1.0.4-0.20210120124023-b83752c6dc08/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss= github.com/jarcoal/httpmock v1.3.0/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= @@ -2775,12 +2417,8 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v0.0.0-20180614180643-0dae4fefe7c0/go.mod h1:IiEW3SEiiErVyFdH8NTuWjSifiEQKUoyK3LNqr2kCHU= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/joho/godotenv v1.2.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= @@ -2808,35 +2446,19 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= -github.com/karrick/godirwalk v1.7.7/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= -github.com/karrick/godirwalk v1.7.8/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/karrick/godirwalk v1.10.9/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/karrick/godirwalk v1.15.3/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/karrick/godirwalk v1.15.5/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -2844,14 +2466,11 @@ github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHU github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knadh/koanf v0.14.1-0.20201201075439-e0853799f9ec/go.mod h1:H5mEFsTeWizwFXHKtsITL5ipsLTuAMQoGuQpp+1JL9U= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= -github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -2864,31 +2483,29 @@ github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NB github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/krasun/gosqlparser v1.0.5 h1:sHaexkxGb9NrAcjZ3mUs6u33iJ9qhR2fH7XrpZekMt8= +github.com/krasun/gosqlparser v1.0.5/go.mod h1:aXCTW1xnPl4qAaNROeqESauGJ8sqhoB4OFEIOVIDYI4= github.com/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= -github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= +github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353 h1:X/79QL0b4YJVO5+OsPH9rF2u428CIrGL/jLmPsoOQQ4= github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353/go.mod h1:N0SVk0uhy+E1PZ3C9ctsPRlvOPAFPkCNlcPBDkt0N3U= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -2899,9 +2516,6 @@ github.com/linkedin/goavro/v2 v2.10.0 h1:eTBIRoInBM88gITGXYtUSqqxLTFXfOsJBiX8ZMW github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= github.com/linode/linodego v1.25.0 h1:zYMz0lTasD503jBu3tSRhzEmXHQN1zptCw5o71ibyyU= github.com/linode/linodego v1.25.0/go.mod h1:BMZI0pMM/YGjBis7pIXDPbcgYfCZLH0/UvzqtsGtG1c= -github.com/luna-duclos/instrumentedsql v0.0.0-20181127104832-b7d587d28109/go.mod h1:PWUIzhtavmOR965zfawVsHXbEuU1G29BPZ/CB3C7jXk= -github.com/luna-duclos/instrumentedsql v1.1.2/go.mod h1:4LGbEqDnopzNAiyxPPDXhLspyunZxgPTMJBKtC6U0BQ= -github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= @@ -2913,39 +2527,14 @@ github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXq github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/markbates/deplist v1.0.4/go.mod h1:gRRbPbbuA8TmMiRvaOzUlRfzfjeCCBqX2A6arxN01MM= -github.com/markbates/deplist v1.0.5/go.mod h1:gRRbPbbuA8TmMiRvaOzUlRfzfjeCCBqX2A6arxN01MM= -github.com/markbates/deplist v1.1.3/go.mod h1:BF7ioVzAJYEtzQN/os4rt8H8Ti3h0T7EoN+7eyALktE= -github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= -github.com/markbates/going v1.0.2/go.mod h1:UWCk3zm0UKefHZ7l8BNqi26UyiEMniznk8naLdTcy6c= -github.com/markbates/grift v1.0.4/go.mod h1:wbmtW74veyx+cgfwFhlnnMWqhoz55rnHR47oMXzsyVs= -github.com/markbates/hmax v1.0.0/go.mod h1:cOkR9dktiESxIMu+65oc/r/bdY4bE8zZw3OLhLx0X2c= -github.com/markbates/inflect v1.0.0/go.mod h1:oTeZL2KHA7CUX6X+fovmK9OvIOFuqu0TwdQrZjLTh88= -github.com/markbates/inflect v1.0.1/go.mod h1:uv3UVNBe5qBIfCm8O8Q+DW+S1EopeyINj+Ikhc7rnCk= -github.com/markbates/inflect v1.0.3/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= -github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= -github.com/markbates/oncer v0.0.0-20180924031910-e862a676800b/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/oncer v0.0.0-20180924034138-723ad0170a46/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/oncer v0.0.0-20181014194634-05fccaae8fc4/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= -github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= -github.com/markbates/refresh v1.4.10/go.mod h1:NDPHvotuZmTmesXxr95C9bjlw1/0frJwtME2dzcVKhc= -github.com/markbates/safe v1.0.0/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/markbates/sigtx v1.0.0/go.mod h1:QF1Hv6Ic6Ca6W+T+DL0Y/ypborFKyvUY9HmuCD4VeTc= -github.com/markbates/willie v1.0.9/go.mod h1:fsrFVWl91+gXpx/6dv715j7i11fYPfZ9ZGfH0DQzY7w= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU= @@ -2954,7 +2543,6 @@ github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PT github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -2971,7 +2559,6 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -2982,27 +2569,19 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/mattn/goveralls v0.0.6 h1:cr8Y0VMo/MnEZBjxNN/vh6G90SZ7IMb6lms1dzMoO+Y= -github.com/mattn/goveralls v0.0.6/go.mod h1:h8b4ow6FxSPMQHF6o2ve3qsclnffZjYTNEKmLesRwqw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microsoft/go-mssqldb v1.6.1-0.20240214161942-b65008136246 h1:KT4vTYcHqj5C5hMK5kSpyAk7MnFqfHVWLL4VqMq66S8= github.com/microsoft/go-mssqldb v1.6.1-0.20240214161942-b65008136246/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -3011,7 +2590,9 @@ github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJys github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= @@ -3034,10 +2615,7 @@ github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTS github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -3061,7 +2639,6 @@ github.com/moby/moby v23.0.4+incompatible h1:A/pe8vi9KIKhNbzR0G3wW4ACKDsMgXILBve github.com/moby/moby v23.0.4+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= @@ -3075,15 +2652,12 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/monoculum/formam v0.0.0-20180901015400-4e68be1d79ba/go.mod h1:RKgILGEJq24YyJ2ban8EO0RUVSJlF1pGsEvoLEACr/Q= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/moul/http2curl v0.0.0-20170919181001-9ac6cf4d929b/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9ZPiLVHXz3UFw2+psEX+gYcto= github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY= github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= @@ -3111,7 +2685,6 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -3122,18 +2695,11 @@ github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w= -github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM= -github.com/oleiade/reflections v1.0.1/go.mod h1:rdFxbxq4QXVZWj0F+e9jqjDkc7dbp97vkRixKo2JR60= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -3153,12 +2719,7 @@ github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxe github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= @@ -3184,8 +2745,6 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20220512140940-7b36cea86235 h1:DxS3bbeUSCpMQr3mTez5PIDrS+yBeBsoDsftOhqB1Fg= github.com/opencontainers/image-spec v1.0.3-0.20220512140940-7b36cea86235/go.mod h1:K/JAU0m27RFhDRX4PcFdIKntROP6y5Ed6O91aZYDQfs= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= @@ -3200,72 +2759,36 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= -github.com/ory/analytics-go/v4 v4.0.0/go.mod h1:FMx9cLRD9xN+XevPvZ5FDMfignpmcqPP6FUKnJ9/MmE= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/ory/dockertest/v3 v3.5.4/go.mod h1:J8ZUbNB2FOhm1cFZW9xBpDsODqsSWcyYgtJYVPcnF70= -github.com/ory/dockertest/v3 v3.6.3/go.mod h1:EFLcVUOl8qCwp9NyDAcCDtq/QviLtYswW/VbWzUnTNE= -github.com/ory/fosite v0.29.0/go.mod h1:0atSZmXO7CAcs6NPMI/Qtot8tmZYj04Nddoold4S2h0= -github.com/ory/fosite v0.44.1-0.20230317114349-45a6785cc54f h1:OFA3y3TJ2qsBXCBMXUNvTzHNBS8/kXdk4cHpJGzBKO4= -github.com/ory/fosite v0.44.1-0.20230317114349-45a6785cc54f/go.mod h1:N0WZtyPBAuXedTpwzbKl4tSYU8wpjlMQoxnKcL2m8dU= -github.com/ory/go-acc v0.0.0-20181118080137-ddc355013f90/go.mod h1:sxnvPCxChFuSmTJGj8FdMupeq1BezCiEpDjTUXQ4hf4= -github.com/ory/go-acc v0.2.6 h1:YfI+L9dxI7QCtWn2RbawqO0vXhiThdXu/RgizJBbaq0= -github.com/ory/go-acc v0.2.6/go.mod h1:4Kb/UnPcT8qRAk3IAxta+hvVapdxTLWtrr7bFLlEgpw= -github.com/ory/go-convenience v0.1.0 h1:zouLKfF2GoSGnJwGq+PE/nJAE6dj2Zj5QlTgmMTsTS8= -github.com/ory/go-convenience v0.1.0/go.mod h1:uEY/a60PL5c12nYz4V5cHY03IBmwIAEm8TWB0yn9KNs= -github.com/ory/gojsonreference v0.0.0-20190720135523-6b606c2d8ee8/go.mod h1:wsH1C4nIeeQClDtD5AH7kF1uTS6zWyqfjVDTmB0Em7A= -github.com/ory/gojsonschema v1.1.1-0.20190919112458-f254ca73d5e9/go.mod h1:BNZpdJgB74KOLSsWFvzw6roXg1I6O51WO8roMmW+T7Y= -github.com/ory/herodot v0.6.2/go.mod h1:3BOneqcyBsVybCPAJoi92KN2BpJHcmDqAMcAAaJiJow= -github.com/ory/herodot v0.7.0/go.mod h1:YXKOfAXYdQojDP5sD8m0ajowq3+QXNdtxA+QiUXBwn0= -github.com/ory/herodot v0.8.3/go.mod h1:rvLjxOAlU5omtmgjCfazQX2N82EpMfl3BytBWc1jjsk= -github.com/ory/herodot v0.9.2/go.mod h1:Da2HXR8mpwPbPrH+Gv9qV8mM5gI3v+PoJ69BA4l2RAk= -github.com/ory/jsonschema/v3 v3.0.1/go.mod h1:jgLHekkFk0uiGdEWGleC+tOm6JSSP8cbf17PnBuGXlw= -github.com/ory/viper v1.5.6/go.mod h1:TYmpFpKLxjQwvT4f0QPpkOn4sDXU1kDgAwJpgLYiQ28= -github.com/ory/viper v1.7.4/go.mod h1:T6sodNZKNGPpashUOk7EtXz2isovz8oCd57GNVkkNmE= -github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= -github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= -github.com/ory/x v0.0.84/go.mod h1:RXLPBG7B+hAViONVg0sHwK+U/ie1Y/NeXrq1JcARfoE= -github.com/ory/x v0.0.93/go.mod h1:lfcTaGXpTZs7IEQAW00r9EtTCOxD//SiP5uWtNiz31g= -github.com/ory/x v0.0.110/go.mod h1:DJfkE3GdakhshNhw4zlKoRaL/ozg/lcTahA9OCih2BE= -github.com/ory/x v0.0.127/go.mod h1:FwUujfFuCj5d+xgLn4fGMYPnzriR5bdAIulFXMtnK0M= -github.com/ory/x v0.0.214 h1:nz5ijvm5MVhYxWsQSuUrW1hj9F5QLZvPn/nLo5s06T4= -github.com/ory/x v0.0.214/go.mod h1:aRl57gzyD4GF0HQCekovXhv0xTZgAgiht3o8eVhsm9Q= github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/parnurzeal/gorequest v0.2.15/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.7/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= @@ -3273,7 +2796,6 @@ github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmd github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -3289,7 +2811,6 @@ github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -3314,10 +2835,8 @@ github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJ github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= @@ -3343,10 +2862,7 @@ github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrP github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= @@ -3358,19 +2874,16 @@ github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/prometheus v0.49.0 h1:i0CEhreJo3ZcZNeK7ulISinCac0MgL0krVOGgNmfFRY= github.com/prometheus/prometheus v0.49.0/go.mod h1:aDogiyqmv3aBIWDb5z5Sdcxuuf2BOfiJwOIm9JGpMnI= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b h1:zd/2RNzIRkoGGMjE+YIsZ85CnDIz672JK2F3Zl4vux4= github.com/protocolbuffers/txtpbfmt v0.0.0-20220428173112-74888fd59c2b/go.mod h1:KjY0wibdYKc4DYkerHSbguaf3JeIPGhNJBp2BNiFH78= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.0.2 h1:BA426Zqe/7r56kCcvxYLWe1mkaz71LKF77GwgFzSxfE= -github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= +github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY= +github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= github.com/redis/rueidis v1.0.16 h1:ieB3AqZe9GcuTWZL8PFu1Mfn+pfqjBZAJEZh7zOcwSI= github.com/redis/rueidis v1.0.16/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo= -github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rhnvrm/simples3 v0.5.0/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.3.4 h1:3Z3Eu6FGHZWSfNKJTOUiPatWwfc7DzJRU04jFUqJODw= github.com/rivo/uniseg v0.3.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -3379,27 +2892,20 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzG github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= -github.com/rogpeppe/go-internal v1.0.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rubenv/sql-migrate v0.0.0-20190212093014-1007f53448d7/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY= github.com/russellhaering/goxmldsig v1.4.0 h1:8UcDh/xGyQiyrW+Fq5t8f+l2DLB1+zlhYzkPUJ7Qhys= github.com/russellhaering/goxmldsig v1.4.0/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -3414,58 +2920,34 @@ github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFo github.com/ryanuber/columnize v2.1.2+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= -github.com/santhosh-tekuri/jsonschema/v2 v2.1.0/go.mod h1:yzJzKUGV4RbWqWIBBP4wSOBqavX5saE02yirLS0OTyg= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/scottlepp/go-duck v0.0.20 h1:SrDrLuwouDh50QB2eaEEhfWvRpdAbnejgqn/3aHBspY= +github.com/scottlepp/go-duck v0.0.20/go.mod h1:GL+hHuKdueJRrFCduwBc7A7TQk+Tetc5BPXPVtduihY= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210219220335-367fa274be2c/go.mod h1:/THDZYi7F/BsVEcYzYPqdcWFQ+1C2InkawTKfLOAnzg= -github.com/segmentio/analytics-go v3.0.1+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= -github.com/segmentio/analytics-go v3.1.0+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/segmentio/backo-go v0.0.0-20160424052352-204274ad699c/go.mod h1:kJ9mm9YmoWSkk+oQ+5Cj8DEoRCX2JT6As4kEtIIOp1M= -github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= -github.com/segmentio/conf v1.2.0/go.mod h1:Y3B9O/PqqWqjyxyWWseyj/quPEtMu1zDp/kVbSWWaB0= github.com/segmentio/encoding v0.3.6 h1:E6lVLyDPseWEulBmCmAKPanDd3jiyGDo5gMcugCRwZQ= github.com/segmentio/encoding v0.3.6/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM= -github.com/segmentio/go-snakecase v1.1.0/go.mod h1:jk1miR5MS7Na32PZUykG89Arm+1BUSYhuGR6b7+hJto= -github.com/segmentio/objconv v1.0.1/go.mod h1:auayaH5k3137Cl4SoXTgrzQcuQDmvuVtZgS0fb1Ahys= -github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/shoenig/test v0.6.6/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20170515013102-78fb10f4a5f8/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs= github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= -github.com/shurcooL/octicon v0.0.0-20180602230221-c42b0e3b24d9/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 h1:pXY9qYc/MP5zdvqWEUH6SjNiu7VhSjuVFTFiTcphaLU= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.1.0/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= -github.com/sirupsen/logrus v1.1.1/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= @@ -3474,7 +2956,6 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -3482,50 +2963,32 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.0/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.2-0.20200723214538-8d17101741c8/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI= -github.com/spf13/viper v1.3.1/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/spyzhov/ajson v0.9.0 h1:tF46gJGOenYVj+k9K1U1XpCxVWhmiyY5PsVCAs1+OJ0= github.com/spyzhov/ajson v0.9.0/go.mod h1:a6oSw0MMb7Z5aD2tPoPO+jq11ETKgXUr2XktHdT8Wt8= -github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:CKI4AZ4XmGV240rTHfO0hfE83S6/a3/Q1siZJ/vXf7A= -github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693/go.mod h1:6hSY48PjDm4UObWmGLyJE9DxYVKTgR9kbCspXXJEhcU= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -3557,76 +3020,53 @@ github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.1.1/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf h1:Z2X3Os7oRzpdJ75iPqWZc0HeJWFYNCvKsfpQwFpRNTA= github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= -github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= -github.com/tidwall/gjson v1.7.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= -github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= -github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y= -github.com/tidwall/sjson v1.1.5/go.mod h1:VuJzsZnTowhSxWdOgsAnb886i4AjEyTkk7tNtsL7EYE= -github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f h1:A+MmlgpvrHLeUP8dkBVn4Pnf5Bp5Yk2OALm7SEJLLE8= github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f/go.mod h1:OBcG9bn7sHtXgarhUEb3OfCnNsgtGnkVf41ilSZ3K3E= -github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= -github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 h1:aVGB3YnaS/JNfOW3tiHIlmNmTDg618va+eT0mVomgyI= github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8/go.mod h1:fVle4kNr08ydeohzYafr20oZzbAkhQT39gKK/pFQ5M4= github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3 h1:4EYQaWAatQokdji3zqZloVIW/Ke1RQjYw2zHULyrHJg= github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU= -github.com/unrolled/secure v0.0.0-20180918153822-f340ee86eb8b/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= -github.com/unrolled/secure v0.0.0-20181005190816-ff9db2ff917f/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= github.com/urfave/cli/v2 v2.25.0 h1:ykdZKuQey2zq0yin/l7JOm9Mh+pg72ngYMeB0ABn6q8= github.com/urfave/cli/v2 v2.25.0/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vectordotdev/go-datemath v0.1.1-0.20220323213446-f3954d0b18ae h1:oyiy3uBj1F4O3AaFh7hUGBrJjAssJhKyAbwxtkslxqo= github.com/vectordotdev/go-datemath v0.1.1-0.20220323213446-f3954d0b18ae/go.mod h1:PnwzbSst7KD3vpBzzlntZU5gjVa455Uqa5QPiKSYJzQ= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/wk8/go-ordered-map v1.0.0 h1:BV7z+2PaK8LTSd/mWgY12HyMAo5CEgkHqbkVq2thqr8= github.com/wk8/go-ordered-map v1.0.0/go.mod h1:9ZIbRunKbuvfPKyBP1SIKLcXNlv74YCOZ3t3VTS6gRk= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= @@ -3636,13 +3076,9 @@ github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6 github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= @@ -3653,10 +3089,8 @@ github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yalue/merged_fs v1.2.2 h1:vXHTpJBluJryju7BBpytr3PDIkzsPMpiEknxVGPhN/I= -github.com/yalue/merged_fs v1.2.2/go.mod h1:WqqchfVYQyclV2tnR7wtRhBddzBvLVR83Cjw9BKQw0M= +github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryBNl9eKOeqQ58Y/Qpo3Q9QNxKHX5uzzQ= +github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= @@ -3680,13 +3114,7 @@ github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= -go.elastic.co/apm v1.8.0/go.mod h1:tCw6CkOJgkWnzEthFN9HUP1uL3Gjc/Ur6m7gRPLaoH0= -go.elastic.co/apm/module/apmhttp v1.8.0/go.mod h1:9LPFlEON51/lRbnWDfqAWErihIiAFDUMfMV27YjoWQ8= -go.elastic.co/apm/module/apmot v1.8.0/go.mod h1:Q5Xzabte8G/fkvDjr1jlDuOSUt9hkVWNZEHh6ZNaTjI= -go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHtchs= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= @@ -3714,11 +3142,7 @@ go.etcd.io/etcd/raft/v3 v3.5.10 h1:cgNAYe7xrsrn/5kXMSaH8kM/Ky8mAdMqGOxyYwpP0LA= go.etcd.io/etcd/raft/v3 v3.5.10/go.mod h1:odD6kr8XQXTy9oQnyMPBOr0TVe+gT0neQhElQ6jbGRc= go.etcd.io/etcd/server/v3 v3.5.10 h1:4NOGyOwD5sUZ22PiWYKmfxqoeh72z6EhYjNosKGLmZg= go.etcd.io/etcd/server/v3 v3.5.10/go.mod h1:gBplPHfs6YI0L+RpGkTQO7buDbHv5HJGG/Bst0/zIPo= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= @@ -3730,7 +3154,6 @@ go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -3740,23 +3163,24 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/collector/featuregate v1.0.0/go.mod h1:xGbRuw+GbutRtVVSEy3YR2yuOlEyiUMhN2M9DJljgqY= go.opentelemetry.io/collector/pdata v1.0.0/go.mod h1:TsDFgs4JLNG7t6x9D8kGswXUz4mme+MyNChHx8zSF6k= -go.opentelemetry.io/collector/pdata v1.0.1 h1:dGX2h7maA6zHbl5D3AsMnF1c3Nn+3EUftbVCLzeyNvA= -go.opentelemetry.io/collector/pdata v1.0.1/go.mod h1:jutXeu0QOXYY8wcZ/hege+YAnSBP3+jpTqYU1+JTI5Y= +go.opentelemetry.io/collector/pdata v1.5.0 h1:1fKTmUpr0xCOhP/B0VEvtz7bYPQ45luQ8XFyA07j8LE= +go.opentelemetry.io/collector/pdata v1.5.0/go.mod h1:TYj8aKRWZyT/KuKQXKyqSEvK/GV+slFaDMEI+Ke64Yw= go.opentelemetry.io/collector/semconv v0.90.1/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= -go.opentelemetry.io/contrib v0.18.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.18.0/go.mod h1:iK1G0FgHurSJ/aYLg5LpnPI0pqdanM73S3dhyDp0Lk4= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 h1:RtcvQ4iw3w9NBB5yRwgA4sSa82rfId7n4atVpvKx3bY= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0/go.mod h1:f/PbKbRd4cdUICWell6DmzvVJ7QrmBgFrRHjXmAXbK4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/contrib/propagators/jaeger v1.22.0 h1:bAHX+zN/inu+Rbqk51REmC8oXLl+Dw6pp9ldQf/onaY= go.opentelemetry.io/contrib/propagators/jaeger v1.22.0/go.mod h1:bH9GkgkN21mscXcQP6lQJYI8XnEPDxlTN/ZOBuHDjqE= go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0 h1:Q9PrD94WoMolBx44ef5UWWvufpVSME0MiSymXZfedso= go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0/go.mod h1:tjp49JHNvreAAoWjdCHIVD7NXMjuJ3Dp/9iNOuPPlC8= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/exporters/jaeger v1.10.0 h1:7W3aVVjEYayu/GOqOVF4mbTvnCuxF1wWu3eRxFGQXvw= go.opentelemetry.io/otel/exporters/jaeger v1.10.0/go.mod h1:n9IGyx0fgyXXZ/i0foLHNxtET9CzXHzZeKCucvRBFgA= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= @@ -3766,15 +3190,18 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 h1:Mw5xcxMwlqoJd97vwPxA8isEaIoxsta9/Q51+TTJLGE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0/go.mod h1:CQNu9bj7o7mC6U7+CA/schKEYakYXWr79ucDHTMGhCM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/oteltest v0.18.0/go.mod h1:NyierCU3/G8DLTva7KRzGii2fdxdR89zXKH1bNWY7Bo= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -3786,7 +3213,6 @@ go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -3818,55 +3244,33 @@ go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= gocloud.dev v0.25.0 h1:Y7vDq8xj7SyM848KXf32Krda2e6jQ4CLh/mTeCSqXtk= gocloud.dev v0.25.0/go.mod h1:7HegHVCYZrMiU3IE1qtnzf/vRrDwLYnRNR3EhWX8x9Y= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180830192347-182538f80094/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181001203147-e3636079e1a4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181024171144-74cb1d3d52f4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181025113841-85e1b3f9139a/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181106171534-e4dc69e5b2fd/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190102171810-8d7daa0c54b3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200320181102-891825fb96df/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -3896,14 +3300,13 @@ golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72 golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= @@ -3971,47 +3374,32 @@ golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180816102801-aaf60122140d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180921000356-2f5d2388922f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181017193950-04a2e542c03f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181207154023-610586996380/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200219183655-46282727080f/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -4021,7 +3409,6 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -4045,7 +3432,6 @@ golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -4083,10 +3469,9 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -4153,37 +3538,22 @@ golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180831094639-fa5fdf94c789/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180921163948-d47a0f339242/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180927150500-dad3d9fb7b6e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181005133103-4497e2df6f9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181011152604-fa43e7bc11ba/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181022134430-8a28ead16f52/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181024145615-5cd93ef61a7c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181025063200-d989b31c8746/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026064943-731415f00dce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181106135930-3a76605856fd/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181206074257-70b957f3b65e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190116161447-11f53e031339/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4191,12 +3561,9 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4207,9 +3574,7 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4218,7 +3583,6 @@ golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4231,12 +3595,10 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -4306,7 +3668,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -4324,8 +3685,8 @@ golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -4347,8 +3708,8 @@ golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -4369,15 +3730,13 @@ golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -4390,37 +3749,12 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181003024731-2f84ea8ef872/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181006002542-f60d9635b16a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181008205924-a2b3f7f249e9/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181013182035-5e66757b835f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181017214349-06f26fdaaa28/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181024171208-a2dc47679d30/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181026183834-f60e5f99f081/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181105230042-78dc5bac0cac/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181107215632-34b416bd17b3/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181114190951-94339b83286c/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181119130350-139d099f6620/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181127195227-b4e97c0ed882/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181127232545-e782529d0ddd/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181203210056-e5f3ab76ea4b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181205224935-3576414c54a4/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181206194817-bcd4e47d0288/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181207183836-8bc39b988060/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181212172921-837e80568c09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190102213336-ca9055ed7d04/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190104182027-498d95493402/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190111214448-fc1d57b08d7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190118193359-16909d206f00/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -4433,20 +3767,14 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190613204242-ed0dc450797f/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624190245-7f2218787638/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190711191110-9a621aea19f8/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -4457,31 +3785,25 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200203215610-ab391d50b528/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -4501,7 +3823,6 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -4527,10 +3848,10 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/gonum v0.7.0/go.mod h1:L02bwd0sqlsvRv41G7wGWFCsVNZFv/k1xzGIxeANHGM= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= @@ -4538,9 +3859,7 @@ gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20191229114700-bbb4dff026f8/go.mod h1:2IgXn/sJaRbePPBA1wRj8OE+QLvVaH0q8SK6TSTKlnk= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.0.0-20200111075622-4abb28f724d5/go.mod h1:+HbaZVpsa73UwN7kXGCECULRHovLRJjH+t5cFPgxErs= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= @@ -4642,8 +3961,6 @@ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190626174449-989357319d63/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190708153700-3bdd9d9f5532/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -4669,7 +3986,6 @@ google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEY google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -4692,6 +4008,7 @@ google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxH google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210630183607-d20f26d13c79/go.mod h1:yiaVoXHpRzHGyxV3o4DktVWY4mSUErTKaeEOq6C3t3U= google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= @@ -4865,7 +4182,6 @@ google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLD google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -4918,7 +4234,6 @@ google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200910201057-6591123024b3/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/examples v0.0.0-20210304020650-930c79186c99/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -4940,8 +4255,6 @@ google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/DataDog/dd-trace-go.v1 v1.27.0/go.mod h1:Sp1lku8WJMvNV0kjDI4Ni/T7J/U3BO5ct5kEaoVU8+I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= @@ -4957,37 +4270,20 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo= gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/mold.v2 v2.2.0/go.mod h1:XMyyRsGtakkDPbxXbrA5VODo6bUXyvoDjLd5l3T0XoA= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= -gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mail.v2 v2.0.0-20180731213649-a0242b2233b4/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk= gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.1.9/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= -gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/telebot.v3 v3.2.1/go.mod h1:GJKwwWqp9nSkIVN51eRKU78aB5f5OnQuWdwiIZfPbko= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/validator.v2 v2.0.0-20180514200540-135c24b11c19/go.mod h1:o4V0GXN9/CAmCsvJ0oXYZvrZOe7syiDZSN1GWGZTGzc= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -4995,12 +4291,10 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -5022,32 +4316,32 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= -k8s.io/api v0.29.0 h1:NiCdQMY1QOp1H8lfRyeEf8eOwV6+0xA6XEE44ohDX2A= -k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA= +k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= +k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= -k8s.io/apimachinery v0.29.0 h1:+ACVktwyicPz0oc6MTMLwa2Pw3ouLAfAon1wPLtG48o= -k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis= -k8s.io/apiserver v0.29.0 h1:Y1xEMjJkP+BIi0GSEv1BBrf1jLU9UPfAnnGGbbDdp7o= -k8s.io/apiserver v0.29.0/go.mod h1:31n78PsRKPmfpee7/l9NYEv67u6hOL6AfcE761HapDM= +k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= +k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/apiserver v0.29.2 h1:+Z9S0dSNr+CjnVXQePG8TcBWHr3Q7BmAr7NraHvsMiQ= +k8s.io/apiserver v0.29.2/go.mod h1:B0LieKVoyU7ykQvPFm7XSdIHaCHSzCzQWPFa5bqbeMQ= k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= -k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8= -k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= +k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= +k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= k8s.io/code-generator v0.29.1 h1:8ba8BdtSmAVHgAMpzThb/fuyQeTRtN7NtN7VjMcDLew= k8s.io/code-generator v0.29.1/go.mod h1:FwFi3C9jCrmbPjekhaCYcYG1n07CYiW1+PAPCockaos= -k8s.io/component-base v0.29.0 h1:T7rjd5wvLnPBV1vC4zWd/iWRbV8Mdxs+nGaoaFzGw3s= -k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M= +k8s.io/component-base v0.29.2 h1:lpiLyuvPA9yV1aQwGLENYyK7n/8t6l3nn3zAtFTJYe8= +k8s.io/component-base v0.29.2/go.mod h1:BfB3SLrefbZXiBfbM+2H1dlat21Uewg/5qtKOl8degM= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/kms v0.29.0 h1:KJ1zaZt74CgvgV3NR7tnURJ/mJOKC5X3nwon/WdwgxI= -k8s.io/kms v0.29.0/go.mod h1:mB0f9HLxRXeXUfHfn1A7rpwOlzXI1gIWu86z6buNoYA= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kms v0.29.2 h1:MDsbp98gSlEQs7K7dqLKNNTwKFQRYYvO4UOlBOjNy6Y= +k8s.io/kms v0.29.2/go.mod h1:s/9RC4sYRZ/6Tn6yhNjbfJuZdb8LzlXhdlBnKizeFDo= k8s.io/kube-aggregator v0.29.0 h1:N4fmtePxOZ+bwiK1RhVEztOU+gkoVkvterHgpwAuiTw= k8s.io/kube-aggregator v0.29.0/go.mod h1:bjatII63ORkFg5yUFP2qm2OC49R0wwxZhRVIyJ4Z4X0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= @@ -5062,7 +4356,6 @@ lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= @@ -5081,7 +4374,6 @@ modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= @@ -5098,7 +4390,6 @@ modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= modernc.org/libc v1.22.4 h1:wymSbZb0AlrjdAVX3cjreCHTPCpPARbQXNz6BHPzdwQ= modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= @@ -5117,7 +4408,6 @@ modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4 modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= modernc.org/sqlite v1.21.2 h1:ixuUG0QS413Vfzyx6FWx6PYTmHaOegTY+hjzhn7L+a0= modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= -modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= @@ -5129,7 +4419,6 @@ modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= diff --git a/go.work b/go.work new file mode 100644 index 00000000000..14bdbd225b2 --- /dev/null +++ b/go.work @@ -0,0 +1,14 @@ +go 1.21.10 + +use ( + . + ./pkg/apimachinery + ./pkg/apiserver + ./pkg/build/wire + ./pkg/promlib + ./pkg/util/xorm +) + +// when we release xorm we would like to release it like github.com/grafana/grafana/pkg/util/xorm +// but we don't want to change all the imports. so we use replace to handle this situation +replace xorm.io/xorm => ./pkg/util/xorm diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 00000000000..b8a0ad94a77 --- /dev/null +++ b/go.work.sum @@ -0,0 +1,856 @@ +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= +buf.build/gen/go/grpc-ecosystem/grpc-gateway/bufbuild/connect-go v1.4.1-20221127060915-a1ecdc58eccd.1 h1:vp9EaPFSb75qe/793x58yE5fY1IJ/gdxb/kcDUzavtI= +buf.build/gen/go/grpc-ecosystem/grpc-gateway/bufbuild/connect-go v1.4.1-20221127060915-a1ecdc58eccd.1/go.mod h1:YDq2B5X5BChU0lxAG5MxHpDb8mx1fv9OGtF2mwOe7hY= +buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.28.1-20221127060915-a1ecdc58eccd.4 h1:z3Xc9n8yZ5k/Xr4ZTuff76TAYP20dWy7ZBV4cGIpbkM= +cloud.google.com/go/accessapproval v1.7.4 h1:ZvLvJ952zK8pFHINjpMBY5k7LTAp/6pBf50RDMRgBUI= +cloud.google.com/go/accesscontextmanager v1.8.4 h1:Yo4g2XrBETBCqyWIibN3NHNPQKUfQqti0lI+70rubeE= +cloud.google.com/go/aiplatform v1.57.0 h1:WcZ6wDf/1qBWatmGM9Z+2BTiNjQQX54k2BekHUj93DQ= +cloud.google.com/go/aiplatform v1.58.0 h1:xyCAfpI4yUMOQ4VtHN/bdmxPQ8xoEkTwFM1nbVmuQhs= +cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/analytics v0.21.6 h1:fnV7B8lqyEYxCU0LKk+vUL7mTlqRAq4uFlIthIdr/iA= +cloud.google.com/go/analytics v0.22.0 h1:w8KIgW8NRUHFVKjpkwCpLaHsr685tJ+ckPStOaSCZz0= +cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= +cloud.google.com/go/apigateway v1.6.4 h1:VVIxCtVerchHienSlaGzV6XJGtEM9828Erzyr3miUGs= +cloud.google.com/go/apigeeconnect v1.6.4 h1:jSoGITWKgAj/ssVogNE9SdsTqcXnryPzsulENSRlusI= +cloud.google.com/go/apigeeregistry v0.8.2 h1:DSaD1iiqvELag+lV4VnnqUUFd8GXELu01tKVdWZrviE= +cloud.google.com/go/apikeys v0.6.0 h1:B9CdHFZTFjVti89tmyXXrO+7vSNo2jvZuHG8zD5trdQ= +cloud.google.com/go/appengine v1.8.4 h1:Qub3fqR7iA1daJWdzjp/Q0Jz0fUG0JbMc7Ui4E9IX/E= +cloud.google.com/go/area120 v0.8.4 h1:YnSO8m02pOIo6AEOgiOoUDVbw4pf+bg2KLHi4rky320= +cloud.google.com/go/artifactregistry v1.14.6 h1:/hQaadYytMdA5zBh+RciIrXZQBWK4vN7EUsrQHG+/t8= +cloud.google.com/go/asset v1.15.3 h1:uI8Bdm81s0esVWbWrTHcjFDFKNOa9aB7rI1vud1hO84= +cloud.google.com/go/asset v1.17.0 h1:dLWfTnbwyrq/Kt8Tr2JiAbre1MEvS2Bl5cAMiYAy5Pg= +cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= +cloud.google.com/go/assuredworkloads v1.11.4 h1:FsLSkmYYeNuzDm8L4YPfLWV+lQaUrJmH5OuD37t1k20= +cloud.google.com/go/automl v1.13.4 h1:i9tOKXX+1gE7+rHpWKjiuPfGBVIYoWvLNIGpWgPtF58= +cloud.google.com/go/baremetalsolution v1.2.3 h1:oQiFYYCe0vwp7J8ZmF6siVKEumWtiPFJMJcGuyDVRUk= +cloud.google.com/go/batch v1.7.0 h1:AxuSPoL2fWn/rUyvWeNCNd0V2WCr+iHRCU9QO1PUmpY= +cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/beyondcorp v1.0.3 h1:VXf9SnrnSmj2BF2cHkoTHvOUp8gjsz1KJFOMW7czdsY= +cloud.google.com/go/bigquery v1.57.1 h1:FiULdbbzUxWD0Y4ZGPSVCDLvqRSyCIO6zKV7E2nf5uA= +cloud.google.com/go/bigquery v1.58.0 h1:drSd9RcPVLJP2iFMimvOB9SCSIrcl+9HD4II03Oy7A0= +cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik= +cloud.google.com/go/billing v1.18.0 h1:GvKy4xLy1zF1XPbwP5NJb2HjRxhnhxjjXxvyZ1S/IAo= +cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= +cloud.google.com/go/binaryauthorization v1.8.0 h1:PHS89lcFayWIEe0/s2jTBiEOtqghCxzc7y7bRNlifBs= +cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/certificatemanager v1.7.4 h1:5YMQ3Q+dqGpwUZ9X5sipsOQ1fLPsxod9HNq0+nrqc6I= +cloud.google.com/go/channel v1.17.3 h1:Rd4+fBrjiN6tZ4TR8R/38elkyEkz6oogGDr7jDyjmMY= +cloud.google.com/go/channel v1.17.4 h1:yYHOORIM+wkBy3EdwArg/WL7Lg+SoGzlKH9o3Bw2/jE= +cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= +cloud.google.com/go/cloudbuild v1.15.0 h1:9IHfEMWdCklJ1cwouoiQrnxmP0q3pH7JUt8Hqx4Qbck= +cloud.google.com/go/clouddms v1.7.3 h1:xe/wJKz55VO1+L891a1EG9lVUgfHr9Ju/I3xh1nwF84= +cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn/L650= +cloud.google.com/go/contactcenterinsights v1.12.1 h1:EiGBeejtDDtr3JXt9W7xlhXyZ+REB5k2tBgVPVtmNb0= +cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/container v1.29.0 h1:jIltU529R2zBFvP8rhiG1mgeTcnT27KhU0H/1d6SQRg= +cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/containeranalysis v0.11.3 h1:5rhYLX+3a01drpREqBZVXR9YmWH45RnML++8NsCtuD8= +cloud.google.com/go/datacatalog v1.19.0 h1:rbYNmHwvAOOwnW2FPXYkaK3Mf1MmGqRzK0mMiIEyLdo= +cloud.google.com/go/datacatalog v1.19.2 h1:BV5sB7fPc8ccv/obwtHwQtCdLMAgI4KyaQWfkh8/mWg= +cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= +cloud.google.com/go/dataflow v0.9.4 h1:7VmCNWcPJBS/srN2QnStTB6nu4Eb5TMcpkmtaPVhRt4= +cloud.google.com/go/dataform v0.9.1 h1:jV+EsDamGX6cE127+QAcCR/lergVeeZdEQ6DdrxW3sQ= +cloud.google.com/go/datafusion v1.7.4 h1:Q90alBEYlMi66zL5gMSGQHfbZLB55mOAg03DhwTTfsk= +cloud.google.com/go/datalabeling v0.8.4 h1:zrq4uMmunf2KFDl/7dS6iCDBBAxBnKVDyw6+ajz3yu0= +cloud.google.com/go/dataplex v1.13.0 h1:ACVOuxwe7gP0SqEso9SLyXbcZNk5l8hjcTX+XLntI5s= +cloud.google.com/go/dataplex v1.14.0 h1:/WhVTR4v/L6ACKjlz/9CqkxkrVh2z7C44CLMUf0f60A= +cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= +cloud.google.com/go/dataproc/v2 v2.3.0 h1:tTVP9tTxmc8fixxOd/8s6Q6Pz/+yzn7r7XdZHretQH0= +cloud.google.com/go/dataqna v0.8.4 h1:NJnu1kAPamZDs/if3bJ3+Wb6tjADHKL83NUWsaIp2zg= +cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= +cloud.google.com/go/datastream v1.10.3 h1:Z2sKPIB7bT2kMW5Uhxy44ZgdJzxzE5uKjavoW+EuHEE= +cloud.google.com/go/deploy v1.16.0 h1:5OVjzm8MPC5kP+Ywbs0mdE0O7AXvAUXksSyHAyMFyMg= +cloud.google.com/go/deploy v1.17.0 h1:P3SgJ+4rAktC2XqaI10G0ip/vzWluNBrC5VG0abMbLw= +cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= +cloud.google.com/go/dialogflow v1.47.0 h1:tLCWad8HZhlyUNfDzDP5m+oH6h/1Uvw/ei7B9AnsWMk= +cloud.google.com/go/dialogflow v1.48.1 h1:1Uq2jDJzjJ3M4xYB608FCCFHfW3JmrTmHIxRSd7JGmY= +cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= +cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ= +cloud.google.com/go/documentai v1.23.6 h1:0/S3AhS23+0qaFe3tkgMmS3STxgDgmE1jg4TvaDOZ9g= +cloud.google.com/go/documentai v1.23.7 h1:hlYieOXUwiJ7HpBR/vEPfr8nfSxveLVzbqbUkSK0c/4= +cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/domains v0.9.4 h1:ua4GvsDztZ5F3xqjeLKVRDeOvJshf5QFgWGg1CKti3A= +cloud.google.com/go/edgecontainer v1.1.4 h1:Szy3Q/N6bqgQGyxqjI+6xJZbmvPvnFHp3UZr95DKcQ0= +cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= +cloud.google.com/go/essentialcontacts v1.6.5 h1:S2if6wkjR4JCEAfDtIiYtD+sTz/oXjh2NUG4cgT1y/Q= +cloud.google.com/go/eventarc v1.13.3 h1:+pFmO4eu4dOVipSaFBLkmqrRYG94Xl/TQZFOeohkuqU= +cloud.google.com/go/filestore v1.8.0 h1:/+wUEGwk3x3Kxomi2cP5dsR8+SIXxo7M0THDjreFSYo= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= +cloud.google.com/go/functions v1.15.4 h1:ZjdiV3MyumRM6++1Ixu6N0VV9LAGlCX4AhW6Yjr1t+U= +cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N8= +cloud.google.com/go/gkebackup v1.3.4 h1:KhnOrr9A1tXYIYeXKqCKbCI8TL2ZNGiD3dm+d7BDUBg= +cloud.google.com/go/gkeconnect v0.8.4 h1:1JLpZl31YhQDQeJ98tK6QiwTpgHFYRJwpntggpQQWis= +cloud.google.com/go/gkehub v0.14.4 h1:J5tYUtb3r0cl2mM7+YHvV32eL+uZQ7lONyUZnPikCEo= +cloud.google.com/go/gkemulticloud v1.0.3 h1:NmJsNX9uQ2CT78957xnjXZb26TDIMvv+d5W2vVUt0Pg= +cloud.google.com/go/gkemulticloud v1.1.0 h1:C2Suwn3uPz+Yy0bxVjTlsMrUCaDovkgvfdyIa+EnUOU= +cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/grafeas v0.3.0 h1:oyTL/KjiUeBs9eYLw/40cpSZglUC+0F7X4iu/8t7NWs= +cloud.google.com/go/gsuiteaddons v1.6.4 h1:uuw2Xd37yHftViSI8J2hUcCS8S7SH3ZWH09sUDLW30Q= +cloud.google.com/go/iap v1.9.3 h1:M4vDbQ4TLXdaljXVZSwW7XtxpwXUUarY2lIs66m0aCM= +cloud.google.com/go/ids v1.4.4 h1:VuFqv2ctf/A7AyKlNxVvlHTzjrEvumWaZflUzBPz/M4= +cloud.google.com/go/iot v1.7.4 h1:m1WljtkZnvLTIRYW1YTOv5A6H1yKgLHR6nU7O8yf27w= +cloud.google.com/go/language v1.12.2 h1:zg9uq2yS9PGIOdc0Kz/l+zMtOlxKWonZjjo5w5YPG2A= +cloud.google.com/go/lifesciences v0.9.4 h1:rZEI/UxcxVKEzyoRS/kdJ1VoolNItRWjNN0Uk9tfexg= +cloud.google.com/go/logging v1.8.1 h1:26skQWPeYhvIasWKm48+Eq7oUqdcdbwsCVwz5Ys0FvU= +cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= +cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/managedidentities v1.6.4 h1:SF/u1IJduMqQQdJA4MDyivlIQ4SrV5qAawkr/ZEREkY= +cloud.google.com/go/maps v1.6.2 h1:WxxLo//b60nNFESefLgaBQevu8QGUmRV3+noOjCfIHs= +cloud.google.com/go/maps v1.6.3 h1:Qqs6Dza+PRp5CZO5AfgPnLwU1k3pp0IMFRDtLpT+aCA= +cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= +cloud.google.com/go/mediatranslation v0.8.4 h1:VRCQfZB4s6jN0CSy7+cO3m4ewNwgVnaePanVCQh/9Z4= +cloud.google.com/go/memcache v1.10.4 h1:cdex/ayDd294XBj2cGeMe6Y+H1JvhN8y78B9UW7pxuQ= +cloud.google.com/go/metastore v1.13.3 h1:94l/Yxg9oBZjin2bzI79oK05feYefieDq0o5fjLSkC8= +cloud.google.com/go/monitoring v1.16.3 h1:mf2SN9qSoBtIgiMA4R/y4VADPWZA7VCNJA079qLaZQ8= +cloud.google.com/go/monitoring v1.17.0 h1:blrdvF0MkPPivSO041ihul7rFMhXdVp8Uq7F59DKXTU= +cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= +cloud.google.com/go/networkconnectivity v1.14.3 h1:e9lUkCe2BexsqsUc2bjV8+gFBpQa54J+/F3qKVtW+wA= +cloud.google.com/go/networkmanagement v1.9.3 h1:HsQk4FNKJUX04k3OI6gUsoveiHMGvDRqlaFM2xGyvqU= +cloud.google.com/go/networksecurity v0.9.4 h1:947tNIPnj1bMGTIEBo3fc4QrrFKS5hh0bFVsHmFm4Vo= +cloud.google.com/go/notebooks v1.11.2 h1:eTOTfNL1yM6L/PCtquJwjWg7ZZGR0URFaFgbs8kllbM= +cloud.google.com/go/optimization v1.6.2 h1:iFsoexcp13cGT3k/Hv8PA5aK+FP7FnbhwDO9llnruas= +cloud.google.com/go/orchestration v1.8.4 h1:kgwZ2f6qMMYIVBtUGGoU8yjYWwMTHDanLwM/CQCFaoQ= +cloud.google.com/go/orgpolicy v1.11.4 h1:RWuXQDr9GDYhjmrredQJC7aY7cbyqP9ZuLbq5GJGves= +cloud.google.com/go/orgpolicy v1.12.0 h1:sab7cDiyfdthpAL0JkSpyw1C3mNqkXToVOhalm79PJQ= +cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= +cloud.google.com/go/osconfig v1.12.4 h1:OrRCIYEAbrbXdhm13/JINn9pQchvTTIzgmOCA7uJw8I= +cloud.google.com/go/oslogin v1.12.2 h1:NP/KgsD9+0r9hmHC5wKye0vJXVwdciv219DtYKYjgqE= +cloud.google.com/go/oslogin v1.13.0 h1:gbA/G4p+youIR4O/Rk6DU181QlBlpwPS16kvJwqEz8o= +cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= +cloud.google.com/go/phishingprotection v0.8.4 h1:sPLUQkHq6b4AL0czSJZ0jd6vL55GSTHz2B3Md+TCZI0= +cloud.google.com/go/policytroubleshooter v1.10.2 h1:sq+ScLP83d7GJy9+wpwYJVnY+q6xNTXwOdRIuYjvHT4= +cloud.google.com/go/privatecatalog v0.9.4 h1:Vo10IpWKbNvc/z/QZPVXgCiwfjpWoZ/wbgful4Uh/4E= +cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= +cloud.google.com/go/pubsub v1.34.0 h1:ZtPbfwfi5rLaPeSvDC29fFoE20/tQvGrUS6kVJZJvkU= +cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= +cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= +cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= +cloud.google.com/go/recaptchaenterprise/v2 v2.9.0 h1:Zrd4LvT9PaW91X/Z13H0i5RKEv9suCLuk8zp+bfOpN4= +cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recommendationengine v0.8.4 h1:JRiwe4hvu3auuh2hujiTc2qNgPPfVp+Q8KOpsXlEzKQ= +cloud.google.com/go/recommender v1.11.3 h1:VndmgyS/J3+izR8V8BHa7HV/uun8//ivQ3k5eVKKyyM= +cloud.google.com/go/recommender v1.12.0 h1:tC+ljmCCbuZ/ybt43odTFlay91n/HLIhflvaOeb0Dh4= +cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= +cloud.google.com/go/redis v1.14.1 h1:J9cEHxG9YLmA9o4jTSvWt/RuVEn6MTrPlYSCRHujxDQ= +cloud.google.com/go/resourcemanager v1.9.4 h1:JwZ7Ggle54XQ/FVYSBrMLOQIKoIT/uer8mmNvNLK51k= +cloud.google.com/go/resourcesettings v1.6.4 h1:yTIL2CsZswmMfFyx2Ic77oLVzfBFoWBYgpkgiSPnC4Y= +cloud.google.com/go/retail v1.14.4 h1:geqdX1FNqqL2p0ADXjPpw8lq986iv5GrVcieTYafuJQ= +cloud.google.com/go/run v1.3.3 h1:qdfZteAm+vgzN1iXzILo3nJFQbzziudkJrvd9wCf3FQ= +cloud.google.com/go/scheduler v1.10.5 h1:eMEettHlFhG5pXsoHouIM5nRT+k+zU4+GUvRtnxhuVI= +cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= +cloud.google.com/go/security v1.15.4 h1:sdnh4Islb1ljaNhpIXlIPgb3eYj70QWgPVDKOUYvzJc= +cloud.google.com/go/securitycenter v1.24.3 h1:crdn2Z2rFIy8WffmmhdlX3CwZJusqCiShtnrGFRwpeE= +cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/servicecontrol v1.11.1 h1:d0uV7Qegtfaa7Z2ClDzr9HJmnbJW7jn0WhZ7wOX6hLE= +cloud.google.com/go/servicedirectory v1.11.3 h1:5niCMfkw+jifmFtbBrtRedbXkJm3fubSR/KHbxSJZVM= +cloud.google.com/go/servicemanagement v1.8.0 h1:fopAQI/IAzlxnVeiKn/8WiV6zKndjFkvi+gzu+NjywY= +cloud.google.com/go/serviceusage v1.6.0 h1:rXyq+0+RSIm3HFypctp7WoXxIA563rn206CfMWdqXX4= +cloud.google.com/go/shell v1.7.4 h1:nurhlJcSVFZneoRZgkBEHumTYf/kFJptCK2eBUq/88M= +cloud.google.com/go/spanner v1.53.1 h1:xNmE0SXMSxNBuk7lRZ5G/S+A49X91zkSTt7Jn5Ptlvw= +cloud.google.com/go/spanner v1.55.0 h1:YF/A/k73EMYCjp8wcJTpkE+TcrWutHRlsCtlRSfWS64= +cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= +cloud.google.com/go/speech v1.21.0 h1:qkxNao58oF8ghAHE1Eghen7XepawYEN5zuZXYWaUTA4= +cloud.google.com/go/storagetransfer v1.10.3 h1:YM1dnj5gLjfL6aDldO2s4GeU8JoAvH1xyIwXre63KmI= +cloud.google.com/go/talent v1.6.5 h1:LnRJhhYkODDBoTwf6BeYkiJHFw9k+1mAFNyArwZUZAs= +cloud.google.com/go/texttospeech v1.7.4 h1:ahrzTgr7uAbvebuhkBAAVU6kRwVD0HWsmDsvMhtad5Q= +cloud.google.com/go/tpu v1.6.4 h1:XIEH5c0WeYGaVy9H+UueiTaf3NI6XNdB4/v6TFQJxtE= +cloud.google.com/go/trace v1.10.4 h1:2qOAuAzNezwW3QN+t41BtkDJOG42HywL73q8x/f6fnM= +cloud.google.com/go/translate v1.9.3 h1:t5WXTqlrk8VVJu/i3WrYQACjzYJiff5szARHiyqqPzI= +cloud.google.com/go/translate v1.10.0 h1:tncNaKmlZnayMMRX/mMM2d5AJftecznnxVBD4w070NI= +cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/video v1.20.3 h1:Xrpbm2S9UFQ1pZEeJt9Vqm5t2T/z9y/M3rNXhFoo8Is= +cloud.google.com/go/videointelligence v1.11.4 h1:YS4j7lY0zxYyneTFXjBJUj2r4CFe/UoIi/PJG0Zt/Rg= +cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= +cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= +cloud.google.com/go/vmmigration v1.7.4 h1:qPNdab4aGgtaRX+51jCOtJxlJp6P26qua4o1xxUDjpc= +cloud.google.com/go/vmwareengine v1.0.3 h1:WY526PqM6QNmFHSqe2sRfK6gRpzWjmL98UFkql2+JDM= +cloud.google.com/go/vpcaccess v1.7.4 h1:zbs3V+9ux45KYq8lxxn/wgXole6SlBHHKKyZhNJoS+8= +cloud.google.com/go/webrisk v1.9.4 h1:iceR3k0BCRZgf2D/NiKviVMFfuNC9LmeNLtxUFRB/wI= +cloud.google.com/go/websecurityscanner v1.6.4 h1:5Gp7h5j7jywxLUp6NTpjNPkgZb3ngl0tUSw6ICWvtJQ= +cloud.google.com/go/workflows v1.12.3 h1:qocsqETmLAl34mSa01hKZjcqAvt699gaoFbooGGMvaM= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9 h1:yxE46rQA0QaqPGqN2UnwXvgCrRqtjR1CsGSWVTRjvv4= +contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= +contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= +contrib.go.opencensus.io/exporter/stackdriver v0.13.10 h1:a9+GZPUe+ONKUwULjlEOucMMG0qfSCCenlji0Nhqbys= +contrib.go.opencensus.io/integrations/ocsql v0.1.7 h1:G3k7C0/W44zcqkpRSFyjU9f6HZkbwIrL//qqnlqWZ60= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +docker.io/go-docker v1.0.0 h1:VdXS/aNYQxyA9wdLD5z8Q8Ro688/hG8HzKxYVEVbE6s= +docker.io/go-docker v1.0.0/go.mod h1:7tiAn5a0LFmjbPDbyTPOaTTOuG1ZRNXdPA6RvKY+fpY= +filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= +git.sr.ht/~sbinet/gg v0.3.1 h1:LNhjNn8DerC8f9DHLz6lS0YYul/b602DUxDgGkd/Aik= +github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d h1:j6oB/WPCigdOkxtuPl1VSIiLpy7Mdsu6phQffbF19Ng= +github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= +github.com/Azure/azure-amqp-common-go/v3 v3.2.2 h1:CJpxNAGxP7UBhDusRUoaOn0uOorQyAYhQYLnNgkRhlY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8= +github.com/Azure/azure-service-bus-go v0.11.5 h1:EVMicXGNrSX+rHRCBgm/TRQ4VUZ1m3yAYM/AB2R/SOs= +github.com/Azure/go-amqp v0.16.4 h1:/1oIXrq5zwXLHaoYDliJyiFjJSpJZMWGgtMX9e0/Z30= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.11 h1:P6bYXFoao05z5uhOQzbC3Qd8JqF3jUoocoTeIxkp2cA= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.11/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 h1:0W/yGmFdTIT77fvdlGZ0LMISoLHFJ7Tx4U0yeB+uFs4= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= +github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0 h1:YNu23BtH0PKF+fg3ykSorCp6jSTjcEtfnYLzbmcjVRA= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/OneOfOne/xxhash v1.2.6 h1:U68crOE3y3MPttCMQGywZOLrTeF5HHJ3/vDBCJn9/bA= +github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0 h1:t527LHHE3HmiHrq74QMpNPZpGCIJzTx+apLkMKt4HC0= +github.com/RoaringBitmap/gocroaring v0.4.0 h1:5nufXUgWpBEUNEJXw7926YAA58ZAQRpWPrQV1xCoSjc= +github.com/RoaringBitmap/real-roaring-datasets v0.0.0-20190726190000-eb7c87156f76 h1:ZYlhPbqQFU+AHfgtCdHGDTtRW1a8geZyiE8c6Q+Sl1s= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4= +github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= +github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= +github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9 h1:7kQgkwGRoLzC9K0oyXdJo7nve/bynv/KwUsxbiTlzAM= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19 h1:iXUgAaqDcIUGbRoy2TdeofRG/j1zpGRSEmNK05T+bi8= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= +github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= +github.com/alecthomas/kong v0.2.11 h1:RKeJXXWfg9N47RYfMm0+igkxBCTF4bzbneAxaqid0c4= +github.com/alecthomas/kong v0.2.11/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= +github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4= +github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= +github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= +github.com/apache/arrow/go/v11 v11.0.0 h1:hqauxvFQxww+0mEU/2XHG6LT7eZternCZq+A5Yly2uM= +github.com/apache/arrow/go/v12 v12.0.0 h1:xtZE63VWl7qLdB0JObIXvvhGjoVNrQ9ciIHG2OK5cmc= +github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= +github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= +github.com/apache/arrow/go/v13 v13.0.0 h1:kELrvDQuKZo8csdWYqBQfyi431x6Zs/YJTEgUuSVcWk= +github.com/apache/arrow/go/v13 v13.0.0/go.mod h1:W69eByFNO0ZR30q1/7Sr9d83zcVZmF2MiP3fFYAWJOc= +github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= +github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhiM5J5RFxEaFvMZVEAM1KvT1YzbEOwB2EAGjA= +github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a h1:pv34s756C4pEXnjgPfGYgdhg/ZdajGhyOvzx8k+23nw= +github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1 h1:w/fPGB0t5rWwA43mux4e9ozFSH5zF1moQemlA131PWc= +github.com/aws/aws-sdk-go-v2/service/kms v1.16.3 h1:nUP29LA4GZZPihNSo5ZcF4Rl73u+bN5IBRnrQA0jFK4= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4 h1:EmIEXOjAdXtxa2OGM1VAajZV/i06Q8qd4kBpJd9/p1k= +github.com/aws/aws-sdk-go-v2/service/sns v1.17.4 h1:7TdmoJJBwLFyakXjfrGztejwY5Ie1JEto7YFfznCmAw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3 h1:uHjK81fESbGy2Y9lspub1+C6VN5W2UXTDo2A/Pm4G0U= +github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1 h1:zc1YLcknvxdW/i1MuJKmEnFB2TNkOfguuQaGRvJXPng= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= +github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= +github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= +github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/chromedp/cdproto v0.0.0-20220208224320-6efb837e6bc2/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= +github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= +github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= +github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec h1:EdRZT3IeKQmfCSrgo8SZ8V3MEnskuJP0wCYNpe+aiXo= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c h1:2zRrJWIt/f9c9HhNHAgrRgq0San5gRRUJTBXLkchal0= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= +github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= +github.com/containerd/containerd v1.6.8 h1:h4dOFDwzHmqFEP754PgfgTeVXFnLiRc6kiqC7tplDJs= +github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= +github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo= +github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= +github.com/cristalhq/hedgedhttp v0.9.1 h1:g68L9cf8uUyQKQJwciD0A1Vgbsz+QgCjuB1I8FAsCDs= +github.com/cristalhq/hedgedhttp v0.9.1/go.mod h1:XkqWU6qVMutbhW68NnzjWrGtH8NUx1UfYqGYtHVKIsI= +github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07 h1:UHFGPvSxX4C4YBApSPvmUfL8tTvWLj2ryqvT9K4Jcuk= +github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f h1:7uSNgsgcarNk4oiN/nNkO0J7KAjlsF5Yv5Gf/tFdHas= +github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4 h1:CVAqftqbj+exlab+8KJQrE+kNIVlQfJt58j4GxCMF1s= +github.com/cznic/internal v0.0.0-20180608152220-f44710a21d00 h1:FHpbUtp2K8X53/b4aFNj4my5n+i3x+CQCZWNuHWH/+E= +github.com/cznic/lldb v1.1.0 h1:AIA+ham6TSJ+XkMe8imQ/g8KPzMUVWAwqUQQdtuMsHs= +github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 h1:XNT/Zf5l++1Pyg08/HV04ppB0gKxAqtZQBRYiYrUuYk= +github.com/cznic/ql v1.2.0 h1:lcKp95ZtdF0XkWhGnVIXGF8dVD2X+ClS08tglKtf+ak= +github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65 h1:hxuZop6tSoOi0sxFzoGGYdRqNrPubyaIf9KoBG9tPiE= +github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 h1:0rkFMAbn5KBKNpJyHQ6Prb95vIKanmAe62KxsrN+sqA= +github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc h1:YKKpTb2BrXN2GYyGaygIdis1vXbE7SSAG9axGWIMClg= +github.com/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g= +github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= +github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= +github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dhui/dktest v0.3.0 h1:kwX5a7EkLcjo7VpsPQSYJcKGbXBXdjI9FGjuUj1jn6I= +github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= +github.com/drone/drone-runtime v1.1.0 h1:IsKbwiLY6+ViNBzX0F8PERJVZZcEJm9rgxEh3uZP5IE= +github.com/drone/drone-runtime v1.1.0/go.mod h1:+osgwGADc/nyl40J0fdsf8Z09bgcBZXvXXnLOY48zYs= +github.com/drone/drone-yaml v1.2.3 h1:SWzLmzr8ARhbtw1WsVDENa8WFY2Pi9l0FVMfafVUWz8= +github.com/drone/drone-yaml v1.2.3/go.mod h1:QsqliFK8nG04AHFN9tTn9XJomRBQHD4wcejWW1uz/10= +github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1 h1:E8hjIYiEyI+1S2XZSLpMkqT9V8+YMljFNBWrFpuVM3A= +github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1/go.mod h1:Hph0/pT6ZxbujnE1Z6/08p5I0XXuOsppqF6NQlGOK0E= +github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI= +github.com/eapache/go-resiliency v1.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= +github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9ndfrgrXUbOGObLHKBR4Fl3nZXwM2c7OYTT8hM= +github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= +github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2 h1:cZqz+yOJ/R64LcKjNQOdARott/jP7BnUQ9Ah7KaZCvw= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= +github.com/fsouza/fake-gcs-server v1.7.0 h1:Un0BXUXrRWYSmYyC1Rqm2e2WJfTPyDy/HGMz31emTi8= +github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= +github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= +github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= +github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= +github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= +github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= +github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd h1:hSkbZ9XSyjyBirMeqSqUrK+9HboWrweVlzRNqoBi2d4= +github.com/gobuffalo/depgen v0.1.0 h1:31atYa/UW9V5q8vMJ+W6wd64OaaTHUrCUXER358zLM4= +github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= +github.com/gobuffalo/flect v0.1.3 h1:3GQ53z7E3o00C/yy7Ko8VXqQXoJGLkrTQCLTF1EjoXU= +github.com/gobuffalo/genny v0.1.1 h1:iQ0D6SpNXIxu52WESsD+KoQ7af2e3nCfnSBoSF/hKe0= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211 h1:mSVZ4vj4khv+oThUfS+SQU3UuFIZ5Zo6UNcvK8E8Mz8= +github.com/gobuffalo/gogen v0.1.1 h1:dLg+zb+uOyd/mKeQUYIbwbNmfRsr9hd/WtYWepmayhI= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2 h1:8thhT+kUJMTMy3HlX4+y9Da+BNJck+p109tqqKp7WDs= +github.com/gobuffalo/mapi v1.0.2 h1:fq9WcL1BYrm36SzK6+aAnZ8hcp+SrmnDyAxhNx8dvJk= +github.com/gobuffalo/packd v0.1.0 h1:4sGKOD8yaYJ+dek1FDkwcxCHA40M4kfKgFHx8N2kwbU= +github.com/gobuffalo/packr/v2 v2.2.0 h1:Ir9W9XIm9j7bhhkKE9cokvtTl1vBm62A/fene/ZCj6A= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754 h1:tpom+2CJmpzAWj5/VEHync2rJGi+epHNIeRSWjzGA+4= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54= +github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4 h1:vF83LI8tAakwEwvWZtrIEx7pOySacl2TOxx6eXk4ePo= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/gofiber/fiber/v2 v2.46.0 h1:wkkWotblsGVlLjXj2dpgKQAYHtXumsK/HyFugQM68Ns= +github.com/gofiber/fiber/v2 v2.46.0/go.mod h1:DNl0/c37WLe0g92U6lx1VMQuxGUQY5V7EIaVoEsUffc= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= +github.com/google/go-jsonnet v0.18.0 h1:/6pTy6g+Jh1a1I2UMoAODkqELFiVIdOxbNwv0DDzoOg= +github.com/google/go-jsonnet v0.18.0/go.mod h1:C3fTzyVJDslXdiTqw/bTFk7vSGyCtH3MGRbDfvEwGd0= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9 h1:OF1IPgv+F4NmqmJ98KTjdN97Vs1JxDPB3vbmYzV2dpk= +github.com/google/go-replayers/grpcreplay v1.1.0 h1:S5+I3zYyZ+GQz68OfbURDdt/+cSMqCK1wrvNx7WBzTE= +github.com/google/go-replayers/httpreplay v1.1.1 h1:H91sIMlt1NZzN7R+/ASswyouLJfW0WLW7fhyUFvDEkY= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k= +github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/grafana/e2e v0.1.1-0.20221018202458-cffd2bb71c7b h1:Ha+kSIoTutf4ytlVw/SaEclDUloYx0+FXDKJWKhNbE4= +github.com/grafana/e2e v0.1.1-0.20221018202458-cffd2bb71c7b/go.mod h1:3UsooRp7yW5/NJQBlXcTsAHOoykEhNUYXkQ3r6ehEEY= +github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586 h1:/of8Z8taCPftShATouOrBVy6GaTTjgQd/VfNiZp/VXQ= +github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586/go.mod h1:PGk3RjYHpxMM8HFPhKKo+vve3DdlPUELZLSDEFehPuU= +github.com/grafana/grafana-aws-sdk v0.25.1 h1:waJERJueqB1GldclAh5+tBcY9Ju9AOO9xYSJEnOAuf4= +github.com/grafana/grafana-aws-sdk v0.25.1/go.mod h1:3zghFF6edrxn0d6k6X9HpGZXDH+VfA+MwD2Pc/9X0ec= +github.com/grafana/grafana-plugin-sdk-go v0.212.0/go.mod h1:qsI4ktDf0lig74u8SLPJf9zRdVxWV/W4Wi+Ox6gifgs= +github.com/grafana/grafana-plugin-sdk-go v0.215.0/go.mod h1:nBsh3jRItKQUXDF2BQkiQCPxqrsSQeb+7hiFyJTO1RE= +github.com/grafana/grafana-plugin-sdk-go v0.216.0/go.mod h1:FdvSvOliqpVLnytM7e89zCFyYPDE6VOn9SIjVQRvVxM= +github.com/grafana/grafana/pkg/promlib v0.0.3/go.mod h1:3El4NlsfALz8QQCbEGHGFvJUG+538QLMuALRhZ3pcoo= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hamba/avro/v2 v2.17.2 h1:6PKpEWzJfNnvBgn7m2/8WYaDOUASxfDU+Jyb4ojDgFY= +github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= +github.com/hanwen/go-fuse v1.0.0 h1:GxS9Zrn6c35/BnfiVsZVWmsG803xwE7eVRDvcf/BEVc= +github.com/hanwen/go-fuse/v2 v2.1.0 h1:+32ffteETaLYClUj0a3aHjZ1hOPxxaNEHiZiujuDaek= +github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= +github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= +github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hudl/fargo v1.4.0 h1:ZDDILMbB37UlAVLlWcJ2Iz1XuahZZTDZfdCKeclfq2s= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= +github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab h1:BA4a7pe6ZTd9F8kXETBoijjFJ/ntaa//1wiH9BZu4zU= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/influxdata/influxdb v1.7.6 h1:8mQ7A/V+3noMGCt/P9pD09ISaiz9XvgCk303UYA3gcs= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= +github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= +github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= +github.com/iris-contrib/jade v1.1.3 h1:p7J/50I0cjo0wq/VWVCDFd8taPJbuFC+bq23SniRFX0= +github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= +github.com/iris-contrib/schema v0.0.1 h1:10g/WnoRR+U+XXHWKBHeNy/+tZmM2kcAVGLOsz+yaDA= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= +github.com/jackc/pgconn v1.11.0 h1:HiHArx4yFbwl91X3qqIHtUFoiIfLNJXCQRsnzkiwwaQ= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgtype v1.10.0 h1:ILnBWrRMSXGczYvmkYD6PsYyVFUNLTnIUJHHDLmqk38= +github.com/jackc/pgx v3.2.0+incompatible h1:0Vihzu20St42/UDsvZGdNE6jak7oi/UOeMzwMPHkgFY= +github.com/jackc/pgx/v4 v4.15.0 h1:B7dTkXsdILD3MF987WGGCcg+tvLW6bZJdEcqVFeU//w= +github.com/jackc/puddle v1.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 h1:9Xm8CKtMZIXgcopfdWk/qZ1rt0HjMgfMR9nxxSeK6vk= +github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1/go.mod h1:zuHl3Hh+e9P6gmBPvcqR1HjkaWHC/csgyskg6IaFKFo= +github.com/jaegertracing/jaeger v1.41.0 h1:vVNky8dP46M2RjGaZ7qRENqylW+tBFay3h57N16Ip7M= +github.com/jaegertracing/jaeger v1.41.0/go.mod h1:SIkAT75iVmA9U+mESGYuMH6UQv6V9Qy4qxo0lwfCQAc= +github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= +github.com/jedib0t/go-pretty/v6 v6.2.4 h1:wdaj2KHD2W+mz8JgJ/Q6L/T5dB7kyqEFI16eLq7GEmk= +github.com/jedib0t/go-pretty/v6 v6.2.4/go.mod h1:+nE9fyyHGil+PuISTCrp7avEdo6bqoMwqZnuiK2r2a0= +github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= +github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jsternberg/zap-logfmt v1.2.0 h1:1v+PK4/B48cy8cfQbxL4FmmNZrjnIMr2BsnyEmXqv2o= +github.com/jsternberg/zap-logfmt v1.2.0/go.mod h1:kz+1CUmCutPWABnNkOu9hOHKdT2q3TDYCcsFy9hpqb0= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= +github.com/karrick/godirwalk v1.10.3 h1:lOpSw2vJP0y5eLBW906QwKsUK/fe/QDyoqM5rnnuPDY= +github.com/kataras/golog v0.0.10 h1:vRDRUmwacco/pmBAm8geLn8rHEdc+9Z4NAr5Sh7TG/4= +github.com/kataras/iris/v12 v12.1.8 h1:O3gJasjm7ZxpxwTH8tApZsvf274scSGQAUpNe47c37U= +github.com/kataras/neffos v0.0.14 h1:pdJaTvUG3NQfeMbbVCI8JT2T5goPldyyfUB2PJfh1Bs= +github.com/kataras/pio v0.0.2 h1:6NAi+uPJ/Zuid6mrAKlgpbI11/zK/lV4B2rxWaJN98Y= +github.com/kataras/sitemap v0.0.5 h1:4HCONX5RLgVy6G4RkYOV3vKNcma9p236LdGOipJsaFE= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= +github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs= +github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/kshvakov/clickhouse v1.3.5 h1:PDTYk9VYgbjPAWry3AoDREeMgOVUFij6bh6IjlloHL0= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= +github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= +github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= +github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= +github.com/lyft/protoc-gen-validate v0.0.13 h1:KNt/RhmQTOLr7Aj8PsJ7mTronaFyx80mRTT9qF261dA= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2 h1:JgVTCPf0uBVcUSWpyXmGpgOc62nK5HWUBKAGc3Qqa5k= +github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= +github.com/matryer/moq v0.2.7 h1:RtpiPUM8L7ZSCbSwK+QcZH/E9tgqAkFjKQxsRs25b4w= +github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= +github.com/matryer/moq v0.3.1 h1:kLDiBJoGcusWS2BixGyTkF224aSCD8nLY24tj/NcTCs= +github.com/matryer/moq v0.3.1/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= +github.com/mediocregopher/radix/v3 v3.4.2 h1:galbPBjIwmyREgwGCfQEN4X8lxbJnKBYurgz+VfcStA= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.52 h1:8XhG36F6oKQUDDSuz6dY3rioMzovKjW40W6ANuN0Dps= +github.com/minio/minio-go/v7 v7.0.52/go.mod h1:IbbodHyjUAguneyucUaahv+VMNs/EOTV9du7A7/Z3HU= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= +github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= +github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= +github.com/mithrandie/readline-csvq v1.2.1 h1:4cfeYeVSrqKEWi/1t7CjyhFD2yS6fm+l+oe+WyoSNlI= +github.com/mithrandie/readline-csvq v1.2.1/go.mod h1:ydD9Eyp3/wn8KPSNbKmMZe4RQQauCuxi26yEo4N40dk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= +github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= +github.com/mostynb/go-grpc-compression v1.1.17 h1:N9t6taOJN3mNTTi0wDf4e3lp/G/ON1TP67Pn0vTUA9I= +github.com/mostynb/go-grpc-compression v1.1.17/go.mod h1:FUSBr0QjKqQgoDG/e0yiqlR6aqyXC39+g/hFLDfSsEY= +github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= +github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8 h1:P48LjvUQpTReR3TQRbxSeSBsMXzfK0uol7eRcr7VBYQ= +github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 h1:dnMxwus89s86tI8rcGVp2HwZzlz7c5o92VOy7dSckBQ= +github.com/nats-io/jwt v1.2.2 h1:w3GMTO969dFg+UOKTmmyuu7IGdusK+7Ytlt//OYH/uU= +github.com/nats-io/jwt/v2 v2.0.3 h1:i/O6cmIsjpcQyWDYNcq2JyZ3/VTF8SJ4JWluI5OhpvI= +github.com/nats-io/nats-server/v2 v2.5.0 h1:wsnVaaXH9VRSg+A2MVg5Q727/CqxnmPLGFQ3YZYKTQg= +github.com/nats-io/nats.go v1.12.1 h1:+0ndxwUPz3CmQ2vjbXdkC1fo3FdiOQDim4gl3Mge8Qo= +github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk= +github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= +github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.74.0 h1:0dve/IbuHfQOnlIBQQwpCxIeMp7uig9DQVuvisWPDRs= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.74.0/go.mod h1:bIeSj+SaZdP3CE9Xae+zurdQC6DXX0tPP6NAEVmgtt4= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.74.0 h1:MrVOfBTNBe4n/daZjV4yvHZRR0Jg/MOCl/mNwymHwDM= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.74.0/go.mod h1:v4H2ATSrKfOTbQnmjCxpvuOjrO/GUURAgey9RzrPsuQ= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.74.0 h1:8Kk5g5PKQBUV3idjJy1NWVLLReEzjnB8C1lFgQxZ0TI= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.74.0/go.mod h1:UtVfxZGhPU2OvDh7H8o67VKWG9qHAHRNkhmZUWqCvME= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.74.0 h1:vU5ZebauzCuYNXFlQaWaYnOfjoOAnS+Sc8+oNWoHkbM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.74.0/go.mod h1:TEu3TnUv1TuyHtjllrUDQ/ImpyD+GrkDejZv4hxl3G8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.74.0 h1:COFBWXiWnhRs9x1oYJbDg5cyiNAozp8sycriD9+1/7E= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.74.0/go.mod h1:cAKlYKU+/8mk6ETOnD+EAi5gpXZjDrGweAB9YTYrv/g= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.74.0 h1:ww1pPXfAM0WHsymQnsN+s4B9DgwQC+GyoBq0t27JV/k= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.74.0/go.mod h1:OpEw7tyCg+iG1ywEgZ03qe5sP/8fhYdtWCMoqA8JCug= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.74.0 h1:0Fh6OjlUB9HlnX90/gGiyyFvnmNBv6inj7bSaVqQ7UQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.74.0/go.mod h1:13ekplz1UmvK99Vz2VjSBWPYqoRBEax5LPmA1tFHnhA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.74.0 h1:A5xoBaMHX1WzLfvlqK6NBXq4XIbuSVJIpec5r6PDE7U= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.74.0/go.mod h1:TJT7HkhFPrJic30Vk4seF/eRk8sa0VQ442Xq/qd+DLY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.74.0 h1:pWNSPCKD+V4rC+MnZj8uErEbcsYUpEqU3InNYyafAPY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.74.0/go.mod h1:0lXcDf6LUbtDxZZO3zDbRzMuL7gL1Q0FPOR8/3IBwaQ= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.74.0 h1:NWd9+rQTd6pELLf3copo7CEuNgKp90kgyhPozpwax2U= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.74.0/go.mod h1:anSbwGOousKpnNAVMNP5YieA4KOFuEzHkvya0vvtsaI= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.74.0 h1:Law7+BImq8DIBsdniSX8Iy2/GH5CRHpT1gsRaC9ZT8A= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.74.0/go.mod h1:uiW3V9EX8A5DOoxqDLuSh++ewHr+owtonCSiqMcpy3w= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.74.0 h1:2uysjsaqkf9STFeJN/M6i/sSYEN5pZJ94Qd2/Hg1pKE= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.74.0/go.mod h1:qoGuayD7cAtshnKosIQHd6dobcn6/sqgUn0v/Cg2UB8= +github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= +github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= +github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 h1:ZCnq+JUrvXcDVhX/xRolRBZifmabN1HcS1wrPSvxhrU= +github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A= +github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= +github.com/pact-foundation/pact-go v1.0.4 h1:OYkFijGHoZAYbOIb1LWXrwKQbMMRUv1oQ89blD2Mh2Q= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/performancecopilot/speed v3.0.0+incompatible h1:2WnRzIquHa5QxaJKShDkLM+sc0JPuwhXzK8OYOyt3Vg= +github.com/performancecopilot/speed/v4 v4.0.0 h1:VxEDCmdkfbQYDlcr/GC9YoN9PQ6p8ulk9xVsepYy9ZY= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= +github.com/phpdave11/gofpdi v1.0.13 h1:o61duiW8M9sMlkVXWlvP92sZJtGKENvW3VExs6dZukQ= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= +github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= +github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= +github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4 h1:BN/Nyn2nWMoqGRA7G7paDNDqTXE30mXGqzzybrfo05w= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= +github.com/ryanuber/columnize v2.1.2+incompatible h1:C89EOx/XBWwIXl8wm8OPJBd7kPF25UfsK2X7Ph/zCAk= +github.com/sagikazarmark/crypt v0.6.0 h1:REOEXCs/NFY/1jOCEouMuT4zEniE5YoXbvpC5X/TLF8= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4= +github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94/go.mod h1:90zrgN3D/WJsDd1iXHT96alCoN2KJo6/4x1DZC3wZs8= +github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee h1:8Iv5m6xEo1NR1AvpV+7XmhI4r39LGNzwUL4YpMuL5vk= +github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee/go.mod h1:qwtSXrKuJh/zsFQ12yEE89xfCrGKK63Rr7ctU/uCo4g= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/scottlepp/go-duck v0.0.20 h1:SrDrLuwouDh50QB2eaEEhfWvRpdAbnejgqn/3aHBspY= +github.com/scottlepp/go-duck v0.0.20/go.mod h1:GL+hHuKdueJRrFCduwBc7A7TQk+Tetc5BPXPVtduihY= +github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e h1:uO75wNGioszjmIzcY/tvdDYKRLVvzggtAmmJkn9j4GQ= +github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e/go.mod h1:tm/wZFQ8e24NYaBGIlnO2WGCAi67re4HHuOm0sftE/M= +github.com/segmentio/parquet-go v0.0.0-20230427215636-d483faba23a5 h1:7CWCjaHrXSUCHrRhIARMGDVKdB82tnPAQMmANeflKOw= +github.com/segmentio/parquet-go v0.0.0-20230427215636-d483faba23a5/go.mod h1:+J0xQnJjm8DuQUHBO7t57EnmPbstT6+b45+p3DC9k1Q= +github.com/sercand/kuberesolver/v4 v4.0.0 h1:frL7laPDG/lFm5n98ODmWnn+cvPpzlkf3LhzuPhcHP4= +github.com/sercand/kuberesolver/v4 v4.0.0/go.mod h1:F4RGyuRmMAjeXHKL+w4P7AwUnPceEAPAhxUgXZjKgvM= +github.com/sercand/kuberesolver/v5 v5.1.1 h1:CYH+d67G0sGBj7q5wLK61yzqJJ8gLLC8aeprPTHb6yY= +github.com/sercand/kuberesolver/v5 v5.1.1/go.mod h1:Fs1KbKhVRnB2aDWN12NjKCB+RgYMWZJ294T3BtmVCpQ= +github.com/shirou/gopsutil/v3 v3.23.2 h1:PAWSuiAszn7IhPMBtXsbSCafej7PqUOvY6YywlQUExU= +github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M= +github.com/shoenig/test v0.6.6 h1:Oe8TPH9wAbv++YPNDKJWUnI8Q4PPWCx3UbOfH+FxiMU= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= +github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/substrait-io/substrait-go v0.4.2 h1:buDnjsb3qAqTaNbOR7VKmNgXf4lYQxWEcnSGUWBtmN8= +github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= +github.com/tdewolff/minify/v2 v2.12.9 h1:dvn5MtmuQ/DFMwqf5j8QhEVpPX6fi3WGImhv8RUB4zA= +github.com/tdewolff/minify/v2 v2.12.9/go.mod h1:qOqdlDfL+7v0/fyymB+OP497nIxJYSvX4MQWA8OoiXU= +github.com/tdewolff/parse/v2 v2.6.8 h1:mhNZXYCx//xG7Yq2e/kVLNZw4YfYmeHbhx+Zc0OvFMA= +github.com/tdewolff/parse/v2 v2.6.8/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= +github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= +github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= +github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= +github.com/valyala/fasthttp v1.6.0 h1:uWF8lgKmeaIewWVPwi4GRq2P6+R46IgYZdxWtM+GtEY= +github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c= +github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d h1:3wDi6J5APMqaHBVPuVd7RmHD2gRTfqbdcVSpCNoUWtk= +github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d/go.mod h1:mb5taDqMnJiZNRQ3+02W2IFG+oEz1+dTuCXkp4jpkfo= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/weaveworks/common v0.0.0-20230511094633-334485600903 h1:ph7R2CS/0o1gBzpzK/CioUKJVsXNVXfDGR8FZ9rMZIw= +github.com/weaveworks/common v0.0.0-20230511094633-334485600903/go.mod h1:rgbeLfJUtEr+G74cwFPR1k/4N0kDeaeSv/qhUNE4hm8= +github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= +github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= +github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/willf/bloom v2.0.3+incompatible h1:QDacWdqcAUI1MPOwIQZRy9kOR7yxfyEmxX8Wdm2/JPA= +github.com/willf/bloom v2.0.3+incompatible/go.mod h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= +github.com/xanzy/go-gitlab v0.15.0 h1:rWtwKTgEnXyNUGrOArN7yyc3THRkpYcKXIXia9abywQ= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= +github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= +github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs= +go.opentelemetry.io/collector v0.74.0 h1:0s2DKWczGj/pLTsXGb1P+Je7dyuGx9Is4/Dri1+cS7g= +go.opentelemetry.io/collector v0.74.0/go.mod h1:7NjZAvkhQ6E+NLN4EAH2hw3Nssi+F14t7mV7lMNXCto= +go.opentelemetry.io/collector/component v0.74.0 h1:W32ILPgbA5LO+m9Se61hbbtiLM6FYusNM36K5/CCOi0= +go.opentelemetry.io/collector/component v0.74.0/go.mod h1:zHbWqbdmnHeIZAuO3s1Fo/kWPC2oKuolIhlPmL4bzyo= +go.opentelemetry.io/collector/confmap v0.74.0 h1:tl4fSHC/MXZiEvsZhDhd03TgzvArOe69Qn020sZsTfQ= +go.opentelemetry.io/collector/confmap v0.74.0/go.mod h1:NvUhMS2v8rniLvDAnvGjYOt0qBohk6TIibb1NuyVB1Q= +go.opentelemetry.io/collector/consumer v0.74.0 h1:+kjT/ixG+4SVSHg7u9mQe0+LNDc6PuG8Wn2hoL/yGYk= +go.opentelemetry.io/collector/consumer v0.74.0/go.mod h1:MuGqt8/OKVAOjrh5WHr1TR2qwHizy64ZP2uNSr+XpvI= +go.opentelemetry.io/collector/exporter v0.74.0 h1:VZxDuVz9kJM/Yten3xA/abJwLJNkxLThiao6E1ULW7c= +go.opentelemetry.io/collector/exporter v0.74.0/go.mod h1:kw5YoorpKqEpZZ/a5ODSoYFK1mszzcKBNORd32S8Z7c= +go.opentelemetry.io/collector/exporter/otlpexporter v0.74.0 h1:YKvTeYcBrJwbcXNy65fJ/xytUSMurpYn/KkJD0x+DAY= +go.opentelemetry.io/collector/exporter/otlpexporter v0.74.0/go.mod h1:cRbvsnpSxzySoTSnXbOGPQZu9KHlEyKkTeE21f9Q1p4= +go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= +go.opentelemetry.io/collector/receiver v0.74.0 h1:jlgBFa0iByvn8VuX27UxtqiPiZE8ejmU5lb1nSptWD8= +go.opentelemetry.io/collector/receiver v0.74.0/go.mod h1:SQkyATvoZCJefNkI2jnrR63SOdrmDLYCnQqXJ7ACqn0= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.74.0 h1:e/X/W0z2Jtpy3Yd3CXkmEm9vSpKq/P3pKUrEVMUFBRw= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.74.0/go.mod h1:9X9/RYFxJIaK0JLlRZ0PpmQSSlYpY+r4KsTOj2jWj14= +go.opentelemetry.io/collector/semconv v0.90.1 h1:2fkQZbefQBbIcNb9Rk1mRcWlFZgQOk7CpST1e1BK8eg= +go.opentelemetry.io/contrib v0.18.0 h1:uqBh0brileIvG6luvBjdxzoFL8lxDGuhxJWsvK3BveI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= +go.opentelemetry.io/contrib/propagators/b3 v1.15.0 h1:bMaonPyFcAvZ4EVzkUNkfnUHP5Zi63CIDlA3dRsEg8Q= +go.opentelemetry.io/contrib/propagators/b3 v1.15.0/go.mod h1:VjU0g2v6HSQ+NwfifambSLAeBgevjIcqmceaKWEzl0c= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.16.0/go.mod h1:StxwPndBVNZD2sZez0RQ0SP/129XGCd4aEmVGaw1/QM= +go.opentelemetry.io/otel/bridge/opencensus v0.37.0 h1:ieH3gw7b1eg90ARsFAlAsX5LKVZgnCYfaDwRrK6xLHU= +go.opentelemetry.io/otel/bridge/opencensus v0.37.0/go.mod h1:ddiK+1PE68l/Xk04BGTh9Y6WIcxcLrmcVxVlS0w5WZ0= +go.opentelemetry.io/otel/bridge/opentracing v1.10.0 h1:WzAVGovpC1s7KD5g4taU6BWYZP3QGSDVTlbRu9fIHw8= +go.opentelemetry.io/otel/bridge/opentracing v1.10.0/go.mod h1:J7GLR/uxxqMAzZptsH0pjte3Ep4GacTCrbGBoDuHBqk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/prometheus v0.37.0 h1:NQc0epfL0xItsmGgSXgfbH2C1fq2VLXkZoDFsfRNHpc= +go.opentelemetry.io/otel/exporters/prometheus v0.37.0/go.mod h1:hB8qWjsStK36t50/R0V2ULFb4u95X/Q6zupXLgvjTh8= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU= +go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= +gonum.org/v1/plot v0.10.1 h1:dnifSs43YJuNMDzB7v8wV64O4ABBHReuAVAoBxqBqS4= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= +google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= +google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= +google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f h1:hL+1ptbhFoeL1HcROQ8OGXaqH0jYRRibgWQWco0/Ugc= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0 h1:Y6QQt9D/syZt/Qgnz5a1y2O3WunQeeVDfS9+Xr82iFA= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0/go.mod h1:guYXGPwC6jwxgWKW5Y405fKWOFNwlvUlUnzyp9i0uqo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/telebot.v3 v3.2.1 h1:3I4LohaAyJBiivGmkfB+CiVu7QFOWkuZ4+KHgO/G3rs= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= +k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA= +k8s.io/apiextensions-apiserver v0.26.2 h1:/yTG2B9jGY2Q70iGskMf41qTLhL9XeNN2KhI0uDgwko= +k8s.io/apiextensions-apiserver v0.26.2/go.mod h1:Y7UPgch8nph8mGCuVk0SK83LnS8Esf3n6fUBgew8SH8= +k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis= +k8s.io/apiserver v0.29.0/go.mod h1:31n78PsRKPmfpee7/l9NYEv67u6hOL6AfcE761HapDM= +k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= +k8s.io/component-base v0.0.0-20240417101527-62c04b35eff6 h1:WN8Lymy+dCTDHgn4vhUSNIB6U+0sDiv/c9Zdr0UeAnI= +k8s.io/component-base v0.0.0-20240417101527-62c04b35eff6/go.mod h1:l0ukbPS0lwFxOzSq5ZqjutzF+5IL2TLp495PswRPSZk= +k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/kms v0.29.0/go.mod h1:mB0f9HLxRXeXUfHfn1A7rpwOlzXI1gIWu86z6buNoYA= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20231214164306-ab13479f8bf8/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= diff --git a/hack/make-aggregator-pki.sh b/hack/make-aggregator-pki.sh index cffcec1861a..0eac9f2ae19 100755 --- a/hack/make-aggregator-pki.sh +++ b/hack/make-aggregator-pki.sh @@ -7,6 +7,21 @@ set -o pipefail rm -rf data/grafana-aggregator mkdir -p data/grafana-aggregator + openssl req -nodes -new -x509 -keyout data/grafana-aggregator/ca.key -out data/grafana-aggregator/ca.crt -openssl req -out data/grafana-aggregator/client.csr -new -newkey rsa:4096 -nodes -keyout data/grafana-aggregator/client.key -subj "/CN=development/O=system:masters" -openssl x509 -req -days 365 -in data/grafana-aggregator/client.csr -CA data/grafana-aggregator/ca.crt -CAkey data/grafana-aggregator/ca.key -set_serial 01 -sha256 -out data/grafana-aggregator/client.crt +openssl req -out data/grafana-aggregator/client.csr -new -newkey rsa:4096 -nodes -keyout data/grafana-aggregator/client.key \ + -subj "/CN=development/O=system:masters" \ + -addext "extendedKeyUsage = clientAuth" +openssl x509 -req -days 365 -in data/grafana-aggregator/client.csr -CA data/grafana-aggregator/ca.crt -CAkey data/grafana-aggregator/ca.key \ + -set_serial 01 \ + -sha256 -out data/grafana-aggregator/client.crt \ + -copy_extensions=copyall + +openssl req -out data/grafana-aggregator/server.csr -new -newkey rsa:4096 -nodes -keyout data/grafana-aggregator/server.key \ + -subj "/CN=localhost/O=aggregated" \ + -addext "subjectAltName = DNS:v0alpha1.example.grafana.app.default.svc,DNS:localhost" \ + -addext "extendedKeyUsage = serverAuth, clientAuth" +openssl x509 -req -days 365 -in data/grafana-aggregator/server.csr -CA data/grafana-aggregator/ca.crt -CAkey data/grafana-aggregator/ca.key \ + -set_serial 02 \ + -sha256 -out data/grafana-aggregator/server.crt \ + -copy_extensions=copyall diff --git a/hack/openapi-codegen.sh b/hack/openapi-codegen.sh index efcf678e6bd..070966375dc 100644 --- a/hack/openapi-codegen.sh +++ b/hack/openapi-codegen.sh @@ -115,7 +115,6 @@ function grafana::codegen::gen_openapi() { local input_pkgs=() while read -r dir; do - echo ${dir} pkg="$(cd "${dir}" && GO111MODULE=on go list -find .)" input_pkgs+=("${pkg}") done < <( @@ -127,6 +126,8 @@ function grafana::codegen::gen_openapi() { | LC_ALL=C sort -u ) + + local new_report="" if [ "${#input_pkgs[@]}" != 0 ]; then echo "Generating openapi code for ${#input_pkgs[@]} targets" @@ -139,7 +140,6 @@ function grafana::codegen::gen_openapi() { inputs+=("--input-dirs" "$arg") done - local new_report new_report="${root}/${report}.tmp" if [ -n "${update_report}" ]; then new_report="${root}/${report}" @@ -157,6 +157,9 @@ function grafana::codegen::gen_openapi() { fi touch "${root}/${report}" # in case it doesn't exist yet + if [[ -z "${new_report}" ]]; then + return 0 + fi if ! diff -u "${root}/${report}" "${new_report}"; then echo -e "ERROR:" echo -e "\tAPI rule check failed for ${root}/${report}: new reported violations" diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 37c8439ea94..bb6e20502cb 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -10,7 +10,7 @@ set -o nounset set -o pipefail SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. -CODEGEN_PKG=${CODEGEN_PKG:-$(cd "${SCRIPT_ROOT}"; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo $GOPATH/pkg/mod/k8s.io/code-generator@v0.29.1)} +CODEGEN_PKG=${CODEGEN_PKG:-$(cd "${SCRIPT_ROOT}"; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo $(go env GOPATH)/pkg/mod/k8s.io/code-generator@v0.29.1)} OUTDIR="${HOME}/go/src" OPENAPI_VIOLATION_EXCEPTIONS_FILENAME="zz_generated.openapi_violation_exceptions.list" @@ -18,52 +18,70 @@ OPENAPI_VIOLATION_EXCEPTIONS_FILENAME="zz_generated.openapi_violation_exceptions source "${CODEGEN_PKG}/kube_codegen.sh" source "$(dirname "${BASH_SOURCE[0]}")/openapi-codegen.sh" +selected_pkg="${1-}" -for api_pkg in $(ls ./pkg/apis); do - if [[ "${1-}" != "" && ${api_pkg} != $1 ]]; then - continue - fi - include_common_input_dirs=$([[ ${api_pkg} == "common" ]] && echo "true" || echo "false") - for pkg_version in $(ls ./pkg/apis/${api_pkg}); do - echo "API: ${api_pkg}/${pkg_version}" - echo "-------------------------------------------" +grafana::codegen:run() { + local generate_root=$1 + local skipped="true" + for api_pkg in $(grafana:codegen:lsdirs ./${generate_root}/apis); do + if [[ "${selected_pkg}" != "" && ${api_pkg} != $selected_pkg ]]; then + continue + fi + echo "Generating code for ${generate_root}/apis/${api_pkg}..." + echo "=============================================" + skipped="false" + include_common_input_dirs=$([[ ${api_pkg} == "common" ]] && echo "true" || echo "false") kube::codegen::gen_helpers \ - --input-pkg-root github.com/grafana/grafana/pkg/apis/${api_pkg}/${pkg_version} \ + --input-pkg-root github.com/grafana/grafana/${generate_root}/apis/${api_pkg} \ --output-base "${OUTDIR}" \ --boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" + for pkg_version in $(grafana:codegen:lsdirs ./${generate_root}/apis/${api_pkg}); do + grafana::codegen::gen_openapi \ + --input-pkg-single github.com/grafana/grafana/${generate_root}/apis/${api_pkg}/${pkg_version} \ + --output-base "${OUTDIR}" \ + --report-filename "${OPENAPI_VIOLATION_EXCEPTIONS_FILENAME}" \ + --update-report \ + --boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \ + --include-common-input-dirs ${include_common_input_dirs} - echo "Generating openapi package for ${api_pkg}, version=${pkg_version} ..." + violations_file="${OUTDIR}/github.com/grafana/grafana/${generate_root}/apis/${api_pkg}/${pkg_version}/${OPENAPI_VIOLATION_EXCEPTIONS_FILENAME}" + # delete violation exceptions file, if empty + if ! grep -q . "${violations_file}"; then + echo "Deleting ${violations_file} since it is empty" + rm ${violations_file} + fi - grafana::codegen::gen_openapi \ - --input-pkg-single github.com/grafana/grafana/pkg/apis/${api_pkg}/${pkg_version} \ - --output-base "${OUTDIR}" \ - --report-filename "${OPENAPI_VIOLATION_EXCEPTIONS_FILENAME}" \ - --update-report \ - --boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \ - --include-common-input-dirs ${include_common_input_dirs} - - violations_file="${OUTDIR}/github.com/grafana/grafana/pkg/apis/${api_pkg}/${pkg_version}/${OPENAPI_VIOLATION_EXCEPTIONS_FILENAME}" - # delete violation exceptions file, if empty - if ! grep -q . "${violations_file}"; then - echo "Deleting ${violations_file} since it is empty" - rm ${violations_file} - fi - - echo "" + echo "" + done done -done - -echo "Generating client code..." -echo "---------------------------" - -kube::codegen::gen_client \ - --with-watch \ - --with-applyconfig \ - --input-pkg-root github.com/grafana/grafana/pkg/apis \ - --output-pkg-root github.com/grafana/grafana/pkg/generated \ - --output-base "${OUTDIR}" \ - --boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" + + if [[ "${skipped}" == "true" ]]; then + echo "no apis matching ${selected_pkg}. skipping..." + echo + return 0 + fi + + echo "Generating client code..." + echo "-------------------------" + + kube::codegen::gen_client \ + --with-watch \ + --with-applyconfig \ + --input-pkg-root github.com/grafana/grafana/${generate_root}/apis \ + --output-pkg-root github.com/grafana/grafana/${generate_root}/generated \ + --output-base "${OUTDIR}" \ + --boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" + + echo "" +} + +grafana:codegen:lsdirs() { + ls -d $1/*/ | xargs basename -a +} + +grafana::codegen:run pkg +grafana::codegen:run pkg/apimachinery echo "done." diff --git a/install-plugins.sh b/install-plugins.sh index 3e4cb8f1019..e56d0cfcf45 100755 --- a/install-plugins.sh +++ b/install-plugins.sh @@ -13,7 +13,7 @@ mkdir -p $pluginDir for plugin in $GRAFANA_PLUGINS ; do echo "Installing $plugin" - ./bin/grafana-cli --pluginsDir=$pluginDir plugins install $plugin + ./bin/grafana cli --pluginsDir=$pluginDir plugins install $plugin done IFS=$OLD_IFS diff --git a/jest.config.js b/jest.config.js index 17579560e6d..4ed043f73de 100644 --- a/jest.config.js +++ b/jest.config.js @@ -15,6 +15,11 @@ const esModules = [ 'leven', 'nanoid', 'monaco-promql', + '@kusto/monaco-kusto', + 'monaco-editor', + 'lodash-es', + '@msagl', + 'vscode-languageserver-types', ].join('|'); module.exports = { @@ -27,7 +32,7 @@ module.exports = { `/node_modules/(?!${esModules})`, // exclude es modules to prevent TS complaining ], moduleDirectories: ['public', 'node_modules'], - roots: ['/public/app', '/public/test', '/packages'], + roots: ['/public/app', '/public/test', '/packages', '/scripts/tests'], testRegex: '(\\.|/)(test)\\.(jsx?|tsx?)$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], setupFiles: ['jest-canvas-mock', './public/test/jest-setup.ts'], @@ -41,7 +46,9 @@ module.exports = { '\\.svg': '/public/test/mocks/svg.ts', '\\.css': '/public/test/mocks/style.ts', 'react-inlinesvg': '/public/test/mocks/react-inlinesvg.tsx', - 'monaco-editor/esm/vs/editor/editor.api': '/public/test/mocks/monaco.ts', + // resolve directly as monaco and kusto don't have main property in package.json which jest needs + '^monaco-editor$': 'monaco-editor/esm/vs/editor/editor.api.js', + '@kusto/monaco-kusto': '@kusto/monaco-kusto/release/esm/monaco.contribution.js', // near-membrane-dom won't work in a nodejs environment. '@locker/near-membrane-dom': '/public/test/mocks/nearMembraneDom.ts', '^@grafana/schema/dist/esm/(.*)$': '/packages/grafana-schema/src/$1', @@ -50,4 +57,5 @@ module.exports = { }, // Log the test results with dynamic Loki tags. Drone CI only reporters: ['default', ['/public/test/log-reporter.js', { enable: process.env.DRONE === 'true' }]], + watchPlugins: ['jest-watch-typeahead/filename', 'jest-watch-typeahead/testname'], }; diff --git a/kinds/constraint.cue b/kinds/constraint.cue deleted file mode 100644 index 2bc9f6c16c9..00000000000 --- a/kinds/constraint.cue +++ /dev/null @@ -1,7 +0,0 @@ -package kind - -import "github.com/grafana/kindsys" - -// In each child directory, the set of .cue files with 'package kind' -// must be an instance of kindsys.Core - a declaration of a core kind. -kindsys.Core diff --git a/kinds/gen.go b/kinds/gen.go index 00225af2b31..f0a1441cded 100644 --- a/kinds/gen.go +++ b/kinds/gen.go @@ -15,44 +15,49 @@ import ( "sort" "strings" - "cuelang.org/go/cue/errors" + "cuelang.org/go/cue" + "cuelang.org/go/cue/cuecontext" + "cuelang.org/go/cue/load" "github.com/grafana/codejen" "github.com/grafana/cuetsy" - "github.com/grafana/kindsys" - "github.com/grafana/grafana/pkg/codegen" - "github.com/grafana/grafana/pkg/cuectx" ) +// CoreDefParentPath is the path, relative to the repository root, where +// each child directory is expected to contain .cue files defining one +// Core kind. +var CoreDefParentPath = "kinds" + +// TSCoreKindParentPath is the path, relative to the repository root, to the directory that +// contains one directory per kind, full of generated TS kind output: types and default consts. +var TSCoreKindParentPath = filepath.Join("packages", "grafana-schema", "src", "raw") + func main() { if len(os.Args) > 1 { - fmt.Fprintf(os.Stderr, "plugin thema code generator does not currently accept any arguments\n, got %q", os.Args) + fmt.Fprintf(os.Stderr, "code generator does not currently accept any arguments\n, got %q", os.Args) os.Exit(1) } // Core kinds composite code generator. Produces all generated code in // grafana/grafana that derives from core kinds. - coreKindsGen := codejen.JennyListWithNamer(func(def kindsys.Kind) string { - return def.Props().Common().MachineName + coreKindsGen := codejen.JennyListWithNamer(func(def codegen.SchemaForGen) string { + return def.Name }) // All the jennies that comprise the core kinds generator pipeline coreKindsGen.Append( - &codegen.ResourceGoTypesJenny{}, - &codegen.SubresourceGoTypesJenny{}, - codegen.CoreKindJenny(cuectx.GoCoreKindParentPath, nil), - codegen.BaseCoreRegistryJenny(filepath.Join("pkg", "registry", "corekind"), cuectx.GoCoreKindParentPath), - codegen.LatestMajorsOrXJenny( - cuectx.TSCoreKindParentPath, - true, // forcing group so that we ignore the top level resource (for now) - codegen.TSResourceJenny{}), + &codegen.GoSpecJenny{}, + &codegen.K8ResourcesJenny{}, + &codegen.CoreRegistryJenny{}, + codegen.LatestMajorsOrXJenny(TSCoreKindParentPath), codegen.TSVeneerIndexJenny(filepath.Join("packages", "grafana-schema", "src")), - codegen.DocsJenny(filepath.Join("docs", "sources", "developers", "kinds", "core")), ) header := codegen.SlashHeaderMapper("kinds/gen.go") coreKindsGen.AddPostprocessors(header) + ctx := cuecontext.New() + cwd, err := os.Getwd() if err != nil { fmt.Fprintf(os.Stderr, "could not get working directory: %s", err) @@ -60,29 +65,15 @@ func main() { } groot := filepath.Dir(cwd) - rt := cuectx.GrafanaThemaRuntime() - var all []kindsys.Kind - - f := os.DirFS(filepath.Join(groot, cuectx.CoreDefParentPath)) + f := os.DirFS(filepath.Join(groot, CoreDefParentPath)) kinddirs := elsedie(fs.ReadDir(f, "."))("error reading core kind fs root directory") - for _, kinddir := range kinddirs { - if !kinddir.IsDir() { - continue - } - rel := filepath.Join(cuectx.CoreDefParentPath, kinddir.Name()) - def, err := cuectx.LoadCoreKindDef(rel, rt.Context(), nil) - if err != nil { - die(fmt.Errorf("%s is not a valid kind: %s", rel, errors.Details(err, nil))) - } - if def.Properties.MachineName != kinddir.Name() { - die(fmt.Errorf("%s: kind's machine name (%s) must equal parent dir name (%s)", rel, def.Properties.Name, kinddir.Name())) - } - - all = append(all, elsedie(kindsys.BindCore(rt, def))(rel)) + all, err := loadCueFiles(ctx, kinddirs) + if err != nil { + die(err) } sort.Slice(all, func(i, j int) bool { - return nameFor(all[i].Props()) < nameFor(all[j].Props()) + return all[i].Name < all[j].Name }) jfs, err := coreKindsGen.GenerateFS(all...) @@ -90,7 +81,7 @@ func main() { die(fmt.Errorf("core kinddirs codegen failed: %w", err)) } - commfsys := elsedie(genCommon(filepath.Join(groot, "pkg", "kindsys")))("common schemas failed") + commfsys := elsedie(genCommon(ctx, groot))("common schemas failed") commfsys = elsedie(commfsys.Map(header))("failed gen header on common fsys") if err = jfs.Merge(commfsys); err != nil { die(err) @@ -105,43 +96,28 @@ func main() { } } -func nameFor(m kindsys.SomeKindProperties) string { - switch x := m.(type) { - case kindsys.CoreProperties: - return x.Name - case kindsys.CustomProperties: - return x.Name - case kindsys.ComposableProperties: - return x.Name - default: - // unreachable so long as all the possibilities in KindProperties have switch branches - panic("unreachable") - } -} - type dummyCommonJenny struct{} -func genCommon(kp string) (*codejen.FS, error) { +func genCommon(ctx *cue.Context, groot string) (*codejen.FS, error) { fsys := codejen.NewFS() - - // kp := filepath.Join("pkg", "kindsys") path := filepath.Join("packages", "grafana-schema", "src", "common") - // Grab all the common_* files from kindsys and load them in - dfsys := os.DirFS(kp) - matches := elsedie(fs.Glob(dfsys, "common_*.cue"))("could not glob kindsys cue files") - for _, fname := range matches { - fpath := filepath.Join(path, strings.TrimPrefix(fname, "common_")) - fpath = fpath[:len(fpath)-4] + "_gen.cue" - data := elsedie(fs.ReadFile(dfsys, fname))("error reading " + fname) - _ = fsys.Add(*codejen.NewFile(fpath, data, dummyCommonJenny{})) - } fsys = elsedie(fsys.Map(packageMapper))("failed remapping fs") - v, err := cuectx.BuildGrafanaInstance(nil, path, "", nil) - if err != nil { - return nil, err + commonFiles := make([]string, 0) + filepath.WalkDir(filepath.Join(groot, path), func(path string, d fs.DirEntry, err error) error { + if d.IsDir() || filepath.Ext(d.Name()) != ".cue" { + return nil + } + commonFiles = append(commonFiles, path) + return nil + }) + + instance := load.Instances(commonFiles, &load.Config{})[0] + if instance.Err != nil { + return nil, instance.Err } + v := ctx.BuildInstance(instance) b := elsedie(cuetsy.Generate(v, cuetsy.Config{ Export: true, }))("failed to generate common schema TS") @@ -182,3 +158,55 @@ func die(err error) { fmt.Fprint(os.Stderr, err, "\n") os.Exit(1) } + +func loadCueFiles(ctx *cue.Context, dirs []os.DirEntry) ([]codegen.SchemaForGen, error) { + values := make([]codegen.SchemaForGen, 0) + for _, dir := range dirs { + if !dir.IsDir() { + continue + } + + entries, err := os.ReadDir(dir.Name()) + if err != nil { + fmt.Fprintf(os.Stderr, "error opening %s directory: %s", dir, err) + os.Exit(1) + } + + // It's assuming that we only have one file in each folder + entry := filepath.Join(dir.Name(), entries[0].Name()) + cueFile, err := os.ReadFile(entry) + if err != nil { + fmt.Fprintf(os.Stderr, "unable to open %s/%s file: %s", dir, entries[0].Name(), err) + os.Exit(1) + } + + v := ctx.CompileBytes(cueFile) + name, err := getSchemaName(v) + if err != nil { + return nil, err + } + + sch := codegen.SchemaForGen{ + Name: name, + FilePath: "./" + filepath.Join(CoreDefParentPath, entry), + CueFile: v, + IsGroup: false, + OutputName: strings.ToLower(name), + } + + values = append(values, sch) + } + + return values, nil +} + +func getSchemaName(v cue.Value) (string, error) { + namePath := v.LookupPath(cue.ParsePath("name")) + name, err := namePath.String() + if err != nil { + return "", fmt.Errorf("file doesn't have name field set: %s", err) + } + + name = strings.Replace(name, "-", "_", -1) + return name, nil +} diff --git a/lefthook.yml b/lefthook.yml index e12cf2c7b86..9c3bed5f538 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -14,7 +14,6 @@ pre-commit: glob: '*.{ts,tsx}' run: | yarn betterer precommit {staged_files} - yarn betterer:json stage_fixed: true frontend-lint: diff --git a/lerna.json b/lerna.json index 4111ddd64c7..44473253da9 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,5 @@ { + "$schema": "node_modules/lerna/schemas/lerna-schema.json", "npmClient": "yarn", - "version": "10.4.3" + "version": "11.0.0" } diff --git a/nx.json b/nx.json new file mode 100644 index 00000000000..3ec7fc7711f --- /dev/null +++ b/nx.json @@ -0,0 +1,16 @@ +{ + "tasksRunnerOptions": { + "default": { + "runner": "nx/tasks-runners/default", + "options": { + "cacheableOperations": ["build"] + } + } + }, + "targetDefaults": { + "build": { + "outputs": ["{projectRoot}/dist"] + } + }, + "defaultBase": "main" +} diff --git a/package.json b/package.json index d51f68136ef..e5c0cc5d65b 100644 --- a/package.json +++ b/package.json @@ -3,21 +3,23 @@ "license": "AGPL-3.0-only", "private": true, "name": "grafana", - "version": "10.4.3", + "version": "11.0.0", "repository": "github:grafana/grafana", "scripts": { - "prebuild": "yarn plugin:build", - "build": "yarn prebuild & NODE_ENV=production webpack --progress --config scripts/webpack/webpack.prod.js", - "build:nominify": "yarn run build --env noMinify=1", - "scalingo-postbuild": "env NODE_OPTIONS=--max_old_space_size=8192 yarn run build && bash ./install-plugins.sh", - "dev": "yarn prebuild & NODE_ENV=dev webpack --progress --color --config scripts/webpack/webpack.dev.js", + "build": "NODE_ENV=production nx exec --verbose -- webpack --config scripts/webpack/webpack.prod.js", + "build:nominify": "yarn run build -- --env noMinify=1", + "dev": "NODE_ENV=dev nx exec -- webpack --config scripts/webpack/webpack.dev.js", "e2e": "./e2e/start-and-run-suite", + "e2e:scenes": "./e2e/start-and-run-suite scenes", "e2e:debug": "./e2e/start-and-run-suite debug", "e2e:dev": "./e2e/start-and-run-suite dev", "e2e:benchmark:live": "./e2e/start-and-run-suite benchmark live", "e2e:enterprise": "./e2e/start-and-run-suite enterprise", "e2e:enterprise:dev": "./e2e/start-and-run-suite enterprise dev", "e2e:enterprise:debug": "./e2e/start-and-run-suite enterprise debug", + "e2e:playwright": "yarn playwright test", + "e2e:playwright:ui": "yarn playwright test --ui", + "e2e:playwright:report": "yarn playwright show-report", "test": "jest --notify --watch", "test:coverage": "jest --coverage", "test:coverage:changes": "jest --coverage --changedSince=origin/main", @@ -27,21 +29,21 @@ "lint:sass": "yarn stylelint '{public/sass,packages}/**/*.scss' --cache", "test:ci": "mkdir -p reports/junit && JEST_JUNIT_OUTPUT_DIR=reports/junit jest --ci --reporters=default --reporters=jest-junit -w ${TEST_MAX_WORKERS:-100%}", "lint:fix": "yarn lint:ts --fix", - "packages:build": "lerna run build --ignore '@grafana-plugins/*'", + "packages:build": "nx run-many -t build --projects='@grafana/*'", "packages:clean": "rimraf ./npm-artifacts && lerna run clean --parallel", "packages:prepare": "lerna version --no-push --no-git-tag-version --force-publish --exact", "packages:pack": "mkdir -p ./npm-artifacts && lerna exec --no-private -- yarn pack --out \"../../npm-artifacts/%s-%v.tgz\"", - "packages:typecheck": "lerna run typecheck", + "packages:typecheck": "nx run-many -t typecheck --projects='@grafana/*'", "prettier:check": "prettier --check --list-different=false --log-level=warn \"**/*.{ts,tsx,scss,md,mdx,json}\"", "prettier:checkDocs": "prettier --check --list-different=false --log-level=warn \"docs/**/*.md\" \"*.md\" \"packages/**/*.{ts,tsx,scss,md,mdx,json}\"", "prettier:write": "prettier --list-different \"**/*.{js,ts,tsx,scss,md,mdx,json}\" --write", - "start": "yarn themes:generate && yarn dev --watch", - "start:noTsCheck": "yarn start --env noTsCheck=1", - "start:noLint": "yarn start --env noTsCheck=1 --env noLint=1", + "start": "NODE_ENV=dev nx exec -- webpack --config scripts/webpack/webpack.dev.js --watch", + "start:noTsCheck": "yarn start -- --env noTsCheck=1", + "start:noLint": "yarn start -- --env noTsCheck=1 --env noLint=1", "stats": "webpack --mode production --config scripts/webpack/webpack.prod.js --profile --json > compilation-stats.json", "storybook": "yarn workspace @grafana/ui storybook --ci", "storybook:build": "yarn workspace @grafana/ui storybook:build", - "themes:generate": "esbuild --target=es6 ./scripts/cli/generateSassVariableFiles.ts --bundle --platform=node --tsconfig=./scripts/cli/tsconfig.json | node", + "themes-generate": "esbuild --target=es6 ./scripts/cli/generateSassVariableFiles.ts --bundle --platform=node --tsconfig=./scripts/cli/tsconfig.json | node", "themes:usage": "eslint . --ext .tsx,.ts --ignore-pattern '*.test.ts*' --ignore-pattern '*.spec.ts*' --cache --rule '{ @grafana/theme-token-usage: \"error\" }'", "typecheck": "tsc --noEmit && yarn run packages:typecheck", "plugins:build-bundled": "find plugins-bundled -name package.json -not -path '*/node_modules/*' -execdir yarn build \\;", @@ -57,16 +59,18 @@ "betterer:stats": "ts-node --transpile-only --project ./scripts/cli/tsconfig.json ./scripts/cli/reportBettererStats.ts", "betterer:issues": "ts-node --transpile-only --project ./scripts/cli/tsconfig.json ./scripts/cli/generateBettererIssues.ts", "generate-icons-bundle-cache-file": "node ./scripts/generate-icon-bundle.js", - "plugin:build": "lerna run build --ignore=\"@grafana/*\" --ignore=\"@grafana-plugins/input-datasource\"", - "plugin:build:commit": "lerna run build:commit --ignore=\"@grafana/*\" --ignore=\"@grafana-plugins/input-datasource\"", - "plugin:build:dev": "lerna run dev --ignore=\"@grafana/*\" --ignore=\"@grafana-plugins/input-datasource\"" + "plugin:build": "nx run-many -t build --projects='@grafana-plugins/*' --exclude \"@grafana-plugins/input-datasource\"", + "plugin:build:commit": "nx run-many -t build:commit --projects='@grafana-plugins/*' --exclude \"@grafana-plugins/input-datasource\"", + "plugin:build:dev": "nx run-many -t dev --projects='@grafana-plugins/*' --exclude \"@grafana-plugins/input-datasource\"", + "generate-icons": "yarn workspace @grafana/saga-icons generate", + "scalingo-postbuild": "env NODE_OPTIONS=--max_old_space_size=8192 yarn run build && bash ./install-plugins.sh" }, "grafana": { - "whatsNewUrl": "https://grafana.com/docs/grafana/next/whatsnew/whats-new-in-v10-4/", + "whatsNewUrl": "https://grafana.com/docs/grafana/next/whatsnew/whats-new-in-v11-0/", "releaseNotesUrl": "https://grafana.com/docs/grafana/next/release-notes/" }, "devDependencies": { - "@babel/runtime": "7.23.9", + "@babel/runtime": "7.24.1", "@betterer/betterer": "5.4.0", "@betterer/cli": "5.4.0", "@betterer/eslint": "5.4.0", @@ -74,18 +78,21 @@ "@emotion/eslint-plugin": "11.11.0", "@grafana/eslint-config": "7.0.0", "@grafana/eslint-plugin": "link:./packages/grafana-eslint-rules", + "@grafana/plugin-e2e": "^0.25.0", "@grafana/tsconfig": "^1.3.0-rc1", + "@manypkg/get-packages": "^2.2.0", + "@playwright/test": "1.42.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", - "@react-types/button": "3.9.1", - "@react-types/menu": "3.9.6", - "@react-types/overlays": "3.8.4", - "@react-types/shared": "3.22.0", + "@react-types/button": "3.9.2", + "@react-types/menu": "3.9.7", + "@react-types/overlays": "3.8.5", + "@react-types/shared": "3.22.1", "@rtsao/plugin-proposal-class-properties": "7.0.1-patch.1", - "@swc/core": "1.4.1", - "@swc/helpers": "0.5.6", + "@swc/core": "1.4.2", + "@swc/helpers": "0.5.8", "@testing-library/dom": "9.3.4", "@testing-library/jest-dom": "6.4.2", - "@testing-library/react": "14.2.1", + "@testing-library/react": "14.2.2", "@testing-library/user-event": "14.5.2", "@types/angular": "1.8.9", "@types/angular-route": "1.7.6", @@ -96,7 +103,8 @@ "@types/d3-scale-chromatic": "3.0.3", "@types/debounce-promise": "3.1.9", "@types/diff": "^5", - "@types/eslint": "8.56.2", + "@types/eslint": "8.56.6", + "@types/eslint-scope": "^3.7.7", "@types/file-saver": "2.0.7", "@types/glob": "^8.0.0", "@types/google.analytics": "^0.0.46", @@ -107,32 +115,32 @@ "@types/jquery": "3.5.29", "@types/js-yaml": "^4.0.5", "@types/jsurl": "^1.2.28", - "@types/lodash": "4.14.202", + "@types/lodash": "4.17.0", "@types/logfmt": "^1.2.3", "@types/lucene": "^2", "@types/marked": "5.0.2", "@types/mousetrap": "1.6.15", - "@types/node": "20.11.19", + "@types/node": "20.11.30", "@types/node-forge": "^1", "@types/ol-ext": "npm:@siedlerchr/types-ol-ext@3.2.4", "@types/papaparse": "5.3.14", "@types/pluralize": "^0.0.33", "@types/prismjs": "1.26.3", - "@types/react": "18.2.55", + "@types/react": "18.2.73", "@types/react-beautiful-dnd": "13.1.8", - "@types/react-dom": "18.2.19", + "@types/react-dom": "18.2.22", "@types/react-grid-layout": "1.3.5", "@types/react-highlight-words": "0.16.7", "@types/react-router": "5.1.20", "@types/react-router-dom": "5.3.3", - "@types/react-table": "7.7.19", + "@types/react-table": "7.7.20", "@types/react-test-renderer": "18.0.7", "@types/react-transition-group": "4.4.10", "@types/react-virtualized-auto-sizer": "1.0.4", "@types/react-window": "1.8.8", "@types/react-window-infinite-loader": "^1", "@types/redux-mock-store": "1.0.6", - "@types/semver": "7.5.7", + "@types/semver": "7.5.8", "@types/slate": "0.47.11", "@types/slate-plain-serializer": "0.7.5", "@types/slate-react": "0.22.9", @@ -144,53 +152,56 @@ "@types/yargs": "17.0.32", "@typescript-eslint/eslint-plugin": "6.21.0", "@typescript-eslint/parser": "6.21.0", - "autoprefixer": "10.4.17", + "autoprefixer": "10.4.19", "blob-polyfill": "7.0.20220408", "browserslist": "^4.21.4", "chance": "^1.0.10", "chrome-remote-interface": "0.33.0", "codeowners": "^5.1.1", "copy-webpack-plugin": "12.0.2", - "core-js": "3.36.0", + "core-js": "3.36.1", "css-loader": "6.10.0", "css-minimizer-webpack-plugin": "6.0.0", "cypress": "13.1.0", "cypress-file-upload": "5.0.8", - "esbuild": "0.18.12", - "esbuild-loader": "3.0.1", + "esbuild": "0.20.1", + "esbuild-loader": "4.1.0", "esbuild-plugin-browserslist": "^0.11.0", - "eslint": "8.56.0", + "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "27.8.0", - "eslint-plugin-jsdoc": "48.1.0", + "eslint-plugin-jest": "27.9.0", + "eslint-plugin-jsdoc": "48.2.2", "eslint-plugin-jsx-a11y": "6.8.0", "eslint-plugin-lodash": "7.4.0", - "eslint-plugin-react": "7.33.2", + "eslint-plugin-react": "7.34.1", "eslint-plugin-react-hooks": "4.6.0", - "eslint-webpack-plugin": "4.0.1", + "eslint-scope": "^8.0.0", + "eslint-webpack-plugin": "4.1.0", "expose-loader": "5.0.0", "fork-ts-checker-webpack-plugin": "9.0.2", "glob": "10.3.10", "html-loader": "5.0.0", "html-webpack-plugin": "5.6.0", "http-server": "14.1.1", - "i18next-parser": "8.12.0", + "i18next-parser": "8.13.0", "jest": "29.7.0", "jest-canvas-mock": "2.5.2", - "jest-date-mock": "1.0.8", + "jest-date-mock": "1.0.9", "jest-environment-jsdom": "29.7.0", "jest-fail-on-console": "3.1.2", "jest-junit": "16.0.0", "jest-matcher-utils": "29.7.0", - "lerna": "7.4.1", - "mini-css-extract-plugin": "2.8.0", - "msw": "2.2.0", + "jest-watch-typeahead": "^2.2.2", + "lerna": "8.1.2", + "mini-css-extract-plugin": "2.8.1", + "msw": "2.2.13", "mutationobserver-shim": "0.3.7", "ngtemplate-loader": "2.1.0", "node-notifier": "10.0.1", - "postcss": "8.4.35", - "postcss-loader": "7.3.4", + "nx": "18.1.3", + "postcss": "8.4.38", + "postcss-loader": "8.1.1", "postcss-reporter": "7.1.0", "postcss-scss": "4.0.9", "prettier": "3.2.5", @@ -200,42 +211,37 @@ "react-test-renderer": "18.2.0", "redux-mock-store": "1.5.4", "rimraf": "5.0.5", - "rudder-sdk-js": "2.48.1", - "sass": "1.70.0", - "sass-loader": "13.3.2", + "rudder-sdk-js": "2.48.6", + "sass": "1.72.0", + "sass-loader": "14.1.1", "style-loader": "3.3.4", - "stylelint": "15.11.0", - "stylelint-config-prettier": "9.0.5", - "stylelint-config-sass-guidelines": "10.0.0", + "stylelint": "16.3.1", + "stylelint-config-sass-guidelines": "11.1.0", "terser-webpack-plugin": "5.3.10", "testing-library-selector": "0.3.1", "tracelib": "1.0.1", "ts-jest": "29.1.2", "ts-node": "10.9.2", "typescript": "5.3.3", - "webpack": "5.90.2", + "webpack": "5.91.0", + "webpack-assets-manifest": "^5.1.0", "webpack-bundle-analyzer": "4.10.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "4.15.1", + "webpack-dev-server": "5.0.4", "webpack-manifest-plugin": "5.0.0", "webpack-merge": "5.10.0", + "webpackbar": "^6.0.0", "yaml": "^2.0.0", "yargs": "^17.5.1" }, "dependencies": { "@daybrush/utils": "1.13.0", "@emotion/css": "11.11.2", - "@emotion/react": "11.11.3", + "@emotion/react": "11.11.4", "@fingerprintjs/fingerprintjs": "^3.4.2", - "@floating-ui/react": "0.26.9", + "@floating-ui/react": "0.26.10", "@glideapps/glide-data-grid": "^6.0.0", - "@grafana-plugins/grafana-azure-monitor-datasource": "workspace:*", - "@grafana-plugins/grafana-pyroscope-datasource": "workspace:*", - "@grafana-plugins/grafana-testdata-datasource": "workspace:*", - "@grafana-plugins/parca": "workspace:*", - "@grafana-plugins/stackdriver": "workspace:*", - "@grafana-plugins/tempo": "workspace:*", - "@grafana/aws-sdk": "0.3.1", + "@grafana/aws-sdk": "0.3.3", "@grafana/data": "workspace:*", "@grafana/e2e-selectors": "workspace:*", "@grafana/experimental": "1.7.10", @@ -248,11 +254,12 @@ "@grafana/o11y-ds-frontend": "workspace:*", "@grafana/prometheus": "workspace:*", "@grafana/runtime": "workspace:*", - "@grafana/scenes": "^3.5.0", + "@grafana/saga-icons": "workspace:*", + "@grafana/scenes": "^4.14.0", "@grafana/schema": "workspace:*", "@grafana/sql": "workspace:*", "@grafana/ui": "workspace:*", - "@kusto/monaco-kusto": "^7.4.0", + "@kusto/monaco-kusto": "^10.0.0", "@leeoniya/ufuzzy": "1.0.14", "@lezer/common": "1.2.1", "@lezer/highlight": "1.2.0", @@ -267,10 +274,10 @@ "@opentelemetry/semantic-conventions": "1.21.0", "@popperjs/core": "2.11.8", "@prometheus-io/lezer-promql": "^0.37.0-rc.1", - "@react-aria/dialog": "3.5.11", - "@react-aria/focus": "3.16.1", - "@react-aria/overlays": "3.21.0", - "@react-aria/utils": "3.23.1", + "@react-aria/dialog": "3.5.12", + "@react-aria/focus": "3.16.2", + "@react-aria/overlays": "3.21.1", + "@react-aria/utils": "3.23.2", "@react-awesome-query-builder/core": "6.4.2", "@react-awesome-query-builder/ui": "6.4.2", "@reduxjs/toolkit": "1.9.5", @@ -294,16 +301,16 @@ "baron": "3.0.3", "brace": "0.11.1", "calculate-size": "1.1.1", - "centrifuge": "5.0.1", + "centrifuge": "5.0.2", "classnames": "2.5.1", "combokeys": "^3.0.0", "comlink": "4.4.1", "common-tags": "1.8.2", - "d3": "7.8.5", + "d3": "7.9.0", "d3-force": "3.0.0", - "d3-scale-chromatic": "3.0.0", + "d3-scale-chromatic": "3.1.0", "dangerously-set-html-content": "1.1.0", - "date-fns": "3.3.1", + "date-fns": "3.6.0", "debounce-promise": "3.1.2", "diff": "^5.1.0", "emotion": "11.0.0", @@ -316,7 +323,7 @@ "hoist-non-react-statics": "3.3.2", "i18next": "^23.0.0", "i18next-browser-languagedetector": "^7.0.2", - "immer": "10.0.3", + "immer": "10.0.4", "immutable": "4.3.5", "jquery": "3.7.1", "js-yaml": "^4.1.0", @@ -330,7 +337,7 @@ "lru-cache": "10.2.0", "lru-memoize": "^1.1.0", "lucene": "^2.1.1", - "marked": "12.0.0", + "marked": "12.0.1", "marked-mangle": "1.1.7", "memoize-one": "6.0.0", "ml-regression-polynomial": "^3.0.0", @@ -345,14 +352,14 @@ "nanoid": "^5.0.4", "node-forge": "^1.3.1", "ol": "7.4.0", - "ol-ext": "4.0.14", + "ol-ext": "4.0.17", "papaparse": "5.4.1", "pluralize": "^8.0.0", "prismjs": "1.29.0", "prop-types": "15.8.1", "pseudoizer": "^0.1.0", - "rc-cascader": "3.21.2", - "rc-drawer": "6.5.2", + "rc-cascader": "3.24.0", + "rc-drawer": "7.1.0", "rc-slider": "10.5.0", "rc-time-picker": "3.7.3", "rc-tree": "5.8.5", @@ -370,7 +377,6 @@ "react-inlinesvg": "3.0.2", "react-loading-skeleton": "3.4.0", "react-moveable": "0.56.0", - "react-popper": "2.3.0", "react-redux": "8.1.3", "react-resizable": "3.0.5", "react-responsive-carousel": "^3.2.23", @@ -383,7 +389,7 @@ "react-transition-group": "4.4.5", "react-use": "17.5.0", "react-virtual": "2.10.4", - "react-virtualized-auto-sizer": "1.0.22", + "react-virtualized-auto-sizer": "1.0.24", "react-window": "1.8.10", "react-window-infinite-loader": "1.0.9", "react-zoom-pan-pinch": "^3.3.0", @@ -398,6 +404,8 @@ "slate-plain-serializer": "0.7.13", "slate-react": "0.22.10", "symbol-observable": "4.0.0", + "systemjs": "6.14.3", + "systemjs-cjs-extra": "0.2.1", "tether-drop": "https://github.com/torkelo/drop", "tinycolor2": "1.6.0", "tslib": "2.6.2", @@ -405,9 +413,8 @@ "uplot": "1.6.30", "uuid": "9.0.1", "visjs-network": "4.25.0", - "webpack-assets-manifest": "^5.1.0", "whatwg-fetch": "3.6.20", - "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz" + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz" }, "resolutions": { "underscore": "1.13.6", @@ -426,12 +433,13 @@ "workspaces": { "packages": [ "packages/*", + "packages/!(grafana-icons)/**", "plugins-bundled/internal/*", "public/app/plugins/*/*" ] }, "engines": { - "node": ">= 20 < 22" + "node": ">=20" }, "dependenciesMeta": { "prettier@3.2.5": { diff --git a/packages/grafana-data/package.json b/packages/grafana-data/package.json index 5ffda3fd590..46027ff22e1 100644 --- a/packages/grafana-data/package.json +++ b/packages/grafana-data/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/data", - "version": "10.4.3", + "version": "11.0.0", "description": "Grafana Data Library", "keywords": [ "typescript" @@ -35,25 +35,24 @@ "postpack": "mv package.json.bak package.json" }, "dependencies": { - "@braintree/sanitize-url": "7.0.0", - "@grafana/schema": "10.4.3", + "@braintree/sanitize-url": "7.0.1", + "@grafana/schema": "11.0.0", "@types/d3-interpolate": "^3.0.0", "@types/string-hash": "1.1.3", "d3-interpolate": "3.0.1", - "date-fns": "3.3.1", + "date-fns": "3.6.0", "dompurify": "^3.0.0", "eventemitter3": "5.0.1", "fast_array_intersect": "1.1.0", "history": "4.10.1", "lodash": "4.17.21", - "marked": "12.0.0", + "marked": "12.0.1", "marked-mangle": "1.1.7", "moment": "2.30.1", "moment-timezone": "0.5.45", "ol": "7.4.0", "papaparse": "5.4.1", "react-use": "17.5.0", - "regenerator-runtime": "0.14.1", "rxjs": "7.8.1", "string-hash": "^1.1.3", "tinycolor2": "1.6.0", @@ -62,30 +61,20 @@ "xss": "^1.0.14" }, "devDependencies": { - "@grafana/tsconfig": "^1.2.0-rc1", - "@rollup/plugin-commonjs": "25.0.7", - "@rollup/plugin-json": "6.1.0", + "@grafana/tsconfig": "^1.3.0-rc1", "@rollup/plugin-node-resolve": "15.2.3", - "@testing-library/dom": "9.3.4", - "@testing-library/jest-dom": "6.4.2", - "@testing-library/react": "14.2.1", - "@testing-library/user-event": "14.5.2", "@types/dompurify": "^3.0.0", "@types/history": "4.7.11", - "@types/jest": "29.5.12", - "@types/jquery": "3.5.29", - "@types/lodash": "4.14.202", + "@types/lodash": "4.17.0", "@types/marked": "5.0.2", - "@types/node": "20.11.19", + "@types/node": "20.11.30", "@types/papaparse": "5.3.14", - "@types/react": "18.2.55", - "@types/react-dom": "18.2.19", - "@types/testing-library__jest-dom": "5.14.9", + "@types/react": "18.2.73", + "@types/react-dom": "18.2.22", "@types/tinycolor2": "1.4.6", "esbuild": "0.18.12", "react": "18.2.0", "react-dom": "18.2.0", - "react-test-renderer": "18.2.0", "rimraf": "5.0.5", "rollup": "2.79.1", "rollup-plugin-dts": "^5.0.0", @@ -94,7 +83,7 @@ "typescript": "5.3.3" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } } diff --git a/packages/grafana-data/src/context/plugins/usePluginContext.tsx b/packages/grafana-data/src/context/plugins/usePluginContext.tsx index e2ea1056629..51723446b81 100644 --- a/packages/grafana-data/src/context/plugins/usePluginContext.tsx +++ b/packages/grafana-data/src/context/plugins/usePluginContext.tsx @@ -1,7 +1,5 @@ import { useContext } from 'react'; -import { PluginMeta } from '../../types'; - import { Context, PluginContextType } from './PluginContext'; export function usePluginContext(): PluginContextType { @@ -11,21 +9,3 @@ export function usePluginContext(): PluginContextType { } return context; } - -export function usePluginMeta(): PluginMeta { - const context = usePluginContext(); - - return context.meta; -} - -export function usePluginJsonData() { - const context = usePluginContext(); - - return context.meta.jsonData; -} - -export function usePluginVersion() { - const context = usePluginContext(); - - return context.meta.info.version; -} diff --git a/packages/grafana-data/src/dataframe/ArrayDataFrame.test.ts b/packages/grafana-data/src/dataframe/ArrayDataFrame.test.ts index 75222ede2d0..624829ba778 100644 --- a/packages/grafana-data/src/dataframe/ArrayDataFrame.test.ts +++ b/packages/grafana-data/src/dataframe/ArrayDataFrame.test.ts @@ -101,4 +101,44 @@ describe('Array DataFrame', () => { } `); }); + + test('Handles first null value', () => { + const f = arrayToDataFrame([null, { id: 'abc' }]); + expect(f).toMatchInlineSnapshot(` + { + "fields": [ + { + "config": {}, + "name": "id", + "type": "string", + "values": [ + null, + "abc", + ], + }, + ], + "length": 2, + } + `); + }); + + test('Handles first undefined value', () => { + const f = arrayToDataFrame([undefined, { id: 'abc' }]); + expect(f).toMatchInlineSnapshot(` + { + "fields": [ + { + "config": {}, + "name": "id", + "type": "string", + "values": [ + undefined, + "abc", + ], + }, + ], + "length": 2, + } + `); + }); }); diff --git a/packages/grafana-data/src/dataframe/ArrayDataFrame.ts b/packages/grafana-data/src/dataframe/ArrayDataFrame.ts index aa06d36c02a..06092b59da9 100644 --- a/packages/grafana-data/src/dataframe/ArrayDataFrame.ts +++ b/packages/grafana-data/src/dataframe/ArrayDataFrame.ts @@ -21,11 +21,13 @@ export class ArrayDataFrame implements DataFrame { } /** - * arrayToDataFrame will convert any array into a DataFrame + * arrayToDataFrame will convert any array into a DataFrame. + * @param source - can be an array of objects or an array of simple values. + * @param names - will be used for ordering of fields. Source needs to be array of objects if names are provided. * * @public */ -export function arrayToDataFrame(source: any[], names?: string[]): DataFrame { +export function arrayToDataFrame(source: Array> | unknown[], names?: string[]): DataFrame { const df: DataFrame = { fields: [], length: source.length, @@ -34,30 +36,46 @@ export function arrayToDataFrame(source: any[], names?: string[]): DataFrame { return df; } + // If names are provided then we assume the source is an array of objects with the names as keys (field names). This + // makes ordering of the fields predictable. if (names) { + if (!isObjectArray(source)) { + throw new Error('source is not an array of objects'); + } + for (const name of names) { df.fields.push( makeFieldFromValues( name, - source.map((v) => v[name]) + source.map((v) => (v ? v[name] : v)) ) ); } return df; } - const first = source.find((v) => v != null); // first not null|undefined - if (first != null) { - if (typeof first === 'object') { - df.fields = Object.keys(first).map((name) => { - return makeFieldFromValues( - name, - source.map((v) => v[name]) - ); - }); - } else { - df.fields.push(makeFieldFromValues(TIME_SERIES_VALUE_FIELD_NAME, source)); - } + const firstDefined = source.find((v) => v); // first not null|undefined + // This means if the source is lots of null/undefined values we throw that away and return empty dataFrame. This is + // different to how we preserve null/undefined values if there is some defined rows. Not sure this inconsistency + // is by design or not. + if (firstDefined === null) { + return df; + } + + // If is an array of objects we use the keys as field names. + if (isObjectArray(source)) { + // We need to do this to please TS. We know source is array of objects and that there is some object in there but + // TS still thinks it can all be undefined|nulls. + const first = source.find((v) => v); + df.fields = Object.keys(first || {}).map((name) => { + return makeFieldFromValues( + name, + source.map((v) => (v ? v[name] : v)) + ); + }); + } else { + // Otherwise source should be an array of simple values, so we create single field data frame. + df.fields.push(makeFieldFromValues(TIME_SERIES_VALUE_FIELD_NAME, source)); } return df; } @@ -67,3 +85,8 @@ function makeFieldFromValues(name: string, values: unknown[]): Field { f.type = guessFieldTypeForField(f) ?? FieldType.other; return f; } + +function isObjectArray(arr: unknown[]): arr is Array | null | undefined> { + const first = arr.find((v) => v); // first not null|undefined + return arr.length > 0 && typeof first === 'object'; +} diff --git a/packages/grafana-data/src/dataframe/MutableDataFrame.ts b/packages/grafana-data/src/dataframe/MutableDataFrame.ts index 84a02a33679..4437aa44b5e 100644 --- a/packages/grafana-data/src/dataframe/MutableDataFrame.ts +++ b/packages/grafana-data/src/dataframe/MutableDataFrame.ts @@ -11,7 +11,7 @@ import { guessFieldTypeFromValue, guessFieldTypeForField, toDataFrameDTO } from export type MutableField = Field; /** @deprecated */ -type MutableVectorCreator = (buffer?: any[]) => any[]; +type MutableVectorCreator = (buffer?: unknown[]) => unknown[]; export const MISSING_VALUE = undefined; // Treated as connected in new graph panel @@ -243,7 +243,7 @@ export class MutableDataFrame extends FunctionalVector implements Da throw new Error('Unable to set value beyond current length'); } - const obj = (value as any) || {}; + const obj = (value as Record) || {}; for (const field of this.fields) { field.values[index] = obj[field.name]; } @@ -253,7 +253,7 @@ export class MutableDataFrame extends FunctionalVector implements Da * Get an object with a property for each field in the DataFrame */ get(idx: number): T { - const v: any = {}; + const v: Record = {}; for (const field of this.fields) { v[field.name] = field.values[idx]; } diff --git a/packages/grafana-data/src/dataframe/index.ts b/packages/grafana-data/src/dataframe/index.ts index 9f35f56765d..3e14458a1f0 100644 --- a/packages/grafana-data/src/dataframe/index.ts +++ b/packages/grafana-data/src/dataframe/index.ts @@ -1,6 +1,5 @@ export * from './DataFrameView'; export * from './FieldCache'; -export * from './CircularDataFrame'; export * from './MutableDataFrame'; export * from './processDataFrame'; export * from './dimensions'; diff --git a/packages/grafana-data/src/datetime/moment_wrapper.ts b/packages/grafana-data/src/datetime/moment_wrapper.ts index ae0f8d66ec1..6b60bb524bd 100644 --- a/packages/grafana-data/src/datetime/moment_wrapper.ts +++ b/packages/grafana-data/src/datetime/moment_wrapper.ts @@ -53,7 +53,7 @@ export interface DateTimeDuration { export interface DateTime extends Object { add: (amount?: DateTimeInput, unit?: DurationUnit) => DateTime; - set: (unit: DurationUnit, amount: DateTimeInput) => void; + set: (unit: DurationUnit | 'date', amount: DateTimeInput) => void; diff: (amount: DateTimeInput, unit?: DurationUnit, truncate?: boolean) => number; endOf: (unitOfTime: DurationUnit) => DateTime; format: (formatInput?: FormatInput) => string; @@ -126,10 +126,6 @@ export const dateTimeForTimeZone = ( input?: DateTimeInput, formatInput?: FormatInput ): DateTime => { - if (timezone === 'utc') { - return toUtc(input, formatInput); - } - if (timezone && timezone !== 'browser') { let result: moment.Moment; diff --git a/packages/grafana-data/src/field/fieldComparers.ts b/packages/grafana-data/src/field/fieldComparers.ts index 972b435cd35..3f525b06405 100644 --- a/packages/grafana-data/src/field/fieldComparers.ts +++ b/packages/grafana-data/src/field/fieldComparers.ts @@ -5,7 +5,6 @@ import { Field, FieldType } from '../types/dataFrame'; type IndexComparer = (a: number, b: number) => number; -/** @public */ export const fieldIndexComparer = (field: Field, reverse = false): IndexComparer => { const values = field.values; @@ -26,8 +25,7 @@ export const fieldIndexComparer = (field: Field, reverse = false): IndexComparer } }; -/** @public */ -export const timeComparer = (a: unknown, b: unknown): number => { +const timeComparer = (a: unknown, b: unknown): number => { if (!a || !b) { return falsyComparer(a, b); } @@ -49,20 +47,18 @@ export const timeComparer = (a: unknown, b: unknown): number => { return 0; }; -/** @public */ -export const numericComparer = (a: number, b: number): number => { +const numericComparer = (a: number, b: number): number => { return a - b; }; -/** @public */ -export const stringComparer = (a: string, b: string): number => { +const stringComparer = (a: string, b: string): number => { if (!a || !b) { return falsyComparer(a, b); } return a.localeCompare(b); }; -export const booleanComparer = (a: boolean, b: boolean): number => { +const booleanComparer = (a: boolean, b: boolean): number => { return falsyComparer(a, b); }; diff --git a/packages/grafana-data/src/field/fieldState.ts b/packages/grafana-data/src/field/fieldState.ts index 7ae0552baa2..065960148e0 100644 --- a/packages/grafana-data/src/field/fieldState.ts +++ b/packages/grafana-data/src/field/fieldState.ts @@ -1,4 +1,12 @@ -import { DataFrame, Field, TIME_SERIES_VALUE_FIELD_NAME, FieldType, TIME_SERIES_TIME_FIELD_NAME } from '../types'; +import { getFieldMatcher } from '../transformations'; +import { + DataFrame, + Field, + TIME_SERIES_VALUE_FIELD_NAME, + FieldType, + TIME_SERIES_TIME_FIELD_NAME, + FieldConfigSource, +} from '../types'; import { formatLabels } from '../utils/labels'; /** @@ -51,6 +59,53 @@ export function cacheFieldDisplayNames(frames: DataFrame[]) { }); } +/** + * + * moves each field's config.custom.hideFrom to field.state.hideFrom + * and mutates orgiginal field.config.custom.hideFrom to one with explicit overrides only, (without the ad-hoc stateful __system override from legend toggle) + */ +export function decoupleHideFromState(frames: DataFrame[], fieldConfig: FieldConfigSource) { + frames.forEach((frame) => { + frame.fields.forEach((field) => { + const hideFrom = { + legend: false, + tooltip: false, + viz: false, + ...fieldConfig.defaults.custom?.hideFrom, + }; + + // with ad hoc __system override applied + const hideFromState = field.config.custom?.hideFrom; + + fieldConfig.overrides.forEach((o) => { + if ('__systemRef' in o) { + return; + } + + const m = getFieldMatcher(o.matcher); + + if (m(field, frame, frames)) { + for (const p of o.properties) { + if (p.id === 'custom.hideFrom') { + Object.assign(hideFrom, p.value); + } + } + } + }); + + field.state = { + ...field.state, + hideFrom: { + ...hideFromState, + }, + }; + + // original with perm overrides + field.config.custom.hideFrom = hideFrom; + }); + }); +} + export function getFieldDisplayName(field: Field, frame?: DataFrame, allFrames?: DataFrame[]): string { const existingTitle = field.state?.displayName; const multipleFrames = Boolean(allFrames && allFrames.length > 1); diff --git a/packages/grafana-data/src/index.ts b/packages/grafana-data/src/index.ts index abdfdfce1b3..bbe35a8fbe1 100644 --- a/packages/grafana-data/src/index.ts +++ b/packages/grafana-data/src/index.ts @@ -5,7 +5,6 @@ */ export * from './utils'; export * from './types'; -export * from './vector'; export * from './dataframe'; export * from './transformations'; export * from './datetime'; @@ -44,3 +43,9 @@ export { export { usePluginContext } from './context/plugins/usePluginContext'; export { isDataSourcePluginContext } from './context/plugins/guards'; export { getLinksSupplier } from './field/fieldOverrides'; + +// deprecated +export { CircularVector } from './vector/CircularVector'; +export { vectorator } from './vector/FunctionalVector'; +export { ArrayVector } from './vector/ArrayVector'; +export * from './dataframe/CircularDataFrame'; diff --git a/packages/grafana-data/src/monaco/languageRegistry.ts b/packages/grafana-data/src/monaco/languageRegistry.ts index fcfc843ab31..f12cca29320 100644 --- a/packages/grafana-data/src/monaco/languageRegistry.ts +++ b/packages/grafana-data/src/monaco/languageRegistry.ts @@ -4,7 +4,7 @@ import { Registry, RegistryItem } from '../utils/Registry'; * @alpha */ export interface MonacoLanguageRegistryItem extends RegistryItem { - init: () => Promise; + init: () => Worker; } /** diff --git a/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.ts b/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.ts index f3a8d44faf7..3bcdf8883ae 100644 --- a/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.ts +++ b/packages/grafana-data/src/panel/getPanelOptionsWithDefaults.ts @@ -14,7 +14,7 @@ import { ThresholdsConfig, ThresholdsMode } from '../types/thresholds'; import { PanelPlugin } from './PanelPlugin'; -export interface Props { +interface Props { plugin: PanelPlugin; currentFieldConfig: FieldConfigSource; currentOptions: Record; diff --git a/packages/grafana-data/src/themes/createTypography.ts b/packages/grafana-data/src/themes/createTypography.ts index 1473adc2bb8..3f11990c0e7 100644 --- a/packages/grafana-data/src/themes/createTypography.ts +++ b/packages/grafana-data/src/themes/createTypography.ts @@ -114,6 +114,7 @@ export function createTypography(colors: ThemeColors, typographyInput: ThemeTypo h6: buildVariant(fontWeightMedium, 14, 22, 0.15), body: buildVariant(fontWeightRegular, fontSize, 22, 0.15), bodySmall: buildVariant(fontWeightRegular, 12, 18, 0.15), + code: { ...buildVariant(fontWeightRegular, 14, 16, 0.15), fontFamily: fontFamilyMonospace }, }; const size = { @@ -152,4 +153,5 @@ export interface ThemeTypographyVariantTypes { h6: ThemeTypographyVariant; body: ThemeTypographyVariant; bodySmall: ThemeTypographyVariant; + code: ThemeTypographyVariant; } diff --git a/packages/grafana-data/src/themes/createVisualizationColors.ts b/packages/grafana-data/src/themes/createVisualizationColors.ts index 163e6ba7c2b..89ccd9bbd20 100644 --- a/packages/grafana-data/src/themes/createVisualizationColors.ts +++ b/packages/grafana-data/src/themes/createVisualizationColors.ts @@ -52,7 +52,7 @@ export function createVisualizationColors(colors: ThemeColors): ThemeVisualizati } // special colors - byNameIndex['transparent'] = 'rgba(0,0,0,0)'; + byNameIndex['transparent'] = colors.mode === 'light' ? 'rgba(255, 255, 255, 0)' : 'rgba(0,0,0,0)'; byNameIndex['panel-bg'] = colors.background.primary; byNameIndex['text'] = colors.text.primary; diff --git a/packages/grafana-data/src/transformations/fieldReducer.test.ts b/packages/grafana-data/src/transformations/fieldReducer.test.ts index 2ca0e31cade..f96321508b3 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.test.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.test.ts @@ -1,7 +1,7 @@ import { difference } from 'lodash'; import { createDataFrame, guessFieldTypeFromValue } from '../dataframe/processDataFrame'; -import { Field, FieldType, NullValueMode, Vector } from '../types/index'; +import { Field, FieldType, NullValueMode } from '../types/index'; import { fieldReducers, ReducerID, reduceField, defaultCalcs } from './fieldReducer'; @@ -65,7 +65,7 @@ describe('Stats Calculators', () => { it('should handle undefined field data without crashing', () => { const stats = reduceField({ - field: { name: 'a', values: undefined as unknown as Vector, config: {}, type: FieldType.number }, + field: { name: 'a', values: undefined as unknown as unknown[], config: {}, type: FieldType.number }, reducers: [ReducerID.first, ReducerID.last, ReducerID.mean, ReducerID.count], }); diff --git a/packages/grafana-data/src/transformations/fieldReducer.ts b/packages/grafana-data/src/transformations/fieldReducer.ts index e43697d15cc..b303654b895 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.ts @@ -41,6 +41,7 @@ export interface FieldReducerInfo extends RegistryItem { // Internal details emptyInputResult?: unknown; // typically null, but some things like 'count' & 'sum' should be zero standard: boolean; // The most common stats can all be calculated in a single pass + preservesUnits: boolean; // Whether this reducer preserves units, certain ones don't e.g. count, distinct count, etc, reduce?: FieldReducer; } @@ -141,6 +142,7 @@ export const fieldReducers = new Registry(() => [ standard: true, aliasIds: ['current'], reduce: calculateLastNotNull, + preservesUnits: true, }, { id: ReducerID.last, @@ -148,6 +150,7 @@ export const fieldReducers = new Registry(() => [ description: 'Last value', standard: true, reduce: calculateLast, + preservesUnits: true, }, { id: ReducerID.firstNotNull, @@ -155,17 +158,33 @@ export const fieldReducers = new Registry(() => [ description: 'First non-null value (also excludes NaNs)', standard: true, reduce: calculateFirstNotNull, + preservesUnits: true, + }, + { + id: ReducerID.first, + name: 'First', + description: 'First Value', + standard: true, + reduce: calculateFirst, + preservesUnits: true, + }, + { id: ReducerID.min, name: 'Min', description: 'Minimum Value', standard: true, preservesUnits: true }, + { id: ReducerID.max, name: 'Max', description: 'Maximum Value', standard: true, preservesUnits: true }, + { + id: ReducerID.mean, + name: 'Mean', + description: 'Average Value', + standard: true, + aliasIds: ['avg'], + preservesUnits: true, }, - { id: ReducerID.first, name: 'First', description: 'First Value', standard: true, reduce: calculateFirst }, - { id: ReducerID.min, name: 'Min', description: 'Minimum Value', standard: true }, - { id: ReducerID.max, name: 'Max', description: 'Maximum Value', standard: true }, - { id: ReducerID.mean, name: 'Mean', description: 'Average Value', standard: true, aliasIds: ['avg'] }, { id: ReducerID.variance, name: 'Variance', description: 'Variance of all values in a field', standard: false, reduce: calculateStdDev, + preservesUnits: true, }, { id: ReducerID.stdDev, @@ -173,6 +192,7 @@ export const fieldReducers = new Registry(() => [ description: 'Standard deviation of all values in a field', standard: false, reduce: calculateStdDev, + preservesUnits: true, }, { id: ReducerID.sum, @@ -181,6 +201,7 @@ export const fieldReducers = new Registry(() => [ emptyInputResult: 0, standard: true, aliasIds: ['total'], + preservesUnits: true, }, { id: ReducerID.count, @@ -188,36 +209,42 @@ export const fieldReducers = new Registry(() => [ description: 'Number of values in response', emptyInputResult: 0, standard: true, + preservesUnits: false, }, { id: ReducerID.range, name: 'Range', description: 'Difference between minimum and maximum values', standard: true, + preservesUnits: true, }, { id: ReducerID.delta, name: 'Delta', description: 'Cumulative change in value', standard: true, + preservesUnits: true, }, { id: ReducerID.step, name: 'Step', description: 'Minimum interval between values', standard: true, + preservesUnits: true, }, { id: ReducerID.diff, name: 'Difference', description: 'Difference between first and last values', standard: true, + preservesUnits: true, }, { id: ReducerID.logmin, name: 'Min (above zero)', description: 'Used for log min scale', standard: true, + preservesUnits: true, }, { id: ReducerID.allIsZero, @@ -225,6 +252,7 @@ export const fieldReducers = new Registry(() => [ description: 'All values are zero', emptyInputResult: false, standard: true, + preservesUnits: true, }, { id: ReducerID.allIsNull, @@ -232,6 +260,7 @@ export const fieldReducers = new Registry(() => [ description: 'All values are null', emptyInputResult: true, standard: true, + preservesUnits: false, }, { id: ReducerID.changeCount, @@ -239,6 +268,7 @@ export const fieldReducers = new Registry(() => [ description: 'Number of times the value changes', standard: false, reduce: calculateChangeCount, + preservesUnits: false, }, { id: ReducerID.distinctCount, @@ -246,12 +276,14 @@ export const fieldReducers = new Registry(() => [ description: 'Number of distinct values', standard: false, reduce: calculateDistinctCount, + preservesUnits: false, }, { id: ReducerID.diffperc, name: 'Difference percent', description: 'Percentage difference between first and last values', standard: true, + preservesUnits: false, }, { id: ReducerID.allValues, @@ -259,6 +291,7 @@ export const fieldReducers = new Registry(() => [ description: 'Returns an array with all values', standard: false, reduce: (field: Field) => ({ allValues: [...field.values] }), + preservesUnits: false, }, { id: ReducerID.uniqueValues, @@ -268,6 +301,7 @@ export const fieldReducers = new Registry(() => [ reduce: (field: Field) => ({ uniqueValues: [...new Set(field.values)], }), + preservesUnits: false, }, ]); diff --git a/packages/grafana-data/src/transformations/matchers.ts b/packages/grafana-data/src/transformations/matchers.ts index 3ad60ca07cc..21ec33dda24 100644 --- a/packages/grafana-data/src/transformations/matchers.ts +++ b/packages/grafana-data/src/transformations/matchers.ts @@ -21,6 +21,7 @@ import { getNullValueMatchers } from './matchers/valueMatchers/nullMatchers'; import { getNumericValueMatchers } from './matchers/valueMatchers/numericMatchers'; import { getRangeValueMatchers } from './matchers/valueMatchers/rangeMatchers'; import { getRegexValueMatcher } from './matchers/valueMatchers/regexMatchers'; +import { getSubstringValueMatchers } from './matchers/valueMatchers/substringMatchers'; export { type FieldValueMatcherConfig } from './matchers/fieldValueMatcher'; @@ -59,6 +60,7 @@ export const valueMatchers = new Registry(() => { ...getNullValueMatchers(), ...getNumericValueMatchers(), ...getEqualValueMatchers(), + ...getSubstringValueMatchers(), ...getRangeValueMatchers(), ...getRegexValueMatcher(), ]; diff --git a/packages/grafana-data/src/transformations/matchers/ids.ts b/packages/grafana-data/src/transformations/matchers/ids.ts index 5830e62f5fb..415e4fe21a8 100644 --- a/packages/grafana-data/src/transformations/matchers/ids.ts +++ b/packages/grafana-data/src/transformations/matchers/ids.ts @@ -52,5 +52,7 @@ export enum ValueMatcherID { lowerOrEqual = 'lowerOrEqual', equal = 'equal', notEqual = 'notEqual', + substring = 'substring', + notSubstring = 'notSubstring', between = 'between', } diff --git a/packages/grafana-data/src/transformations/matchers/nameMatcher.ts b/packages/grafana-data/src/transformations/matchers/nameMatcher.ts index 7befe20ee88..52d44a36b19 100644 --- a/packages/grafana-data/src/transformations/matchers/nameMatcher.ts +++ b/packages/grafana-data/src/transformations/matchers/nameMatcher.ts @@ -41,7 +41,7 @@ const fieldNameMatcher: FieldMatcherInfo = { defaultOptions: '', get: (name: string): FieldMatcher => { - const uniqueNames = new Set([name] ?? []); + const uniqueNames = new Set([name]); const fallback = fieldNameFallback(uniqueNames); diff --git a/packages/grafana-data/src/transformations/matchers/predicates.ts b/packages/grafana-data/src/transformations/matchers/predicates.ts index ef26e05be1e..7939f95aec0 100644 --- a/packages/grafana-data/src/transformations/matchers/predicates.ts +++ b/packages/grafana-data/src/transformations/matchers/predicates.ts @@ -184,11 +184,11 @@ export const alwaysFieldMatcher = (field: Field) => { return true; }; -export const alwaysFrameMatcher = (frame: DataFrame) => { +const alwaysFrameMatcher = (frame: DataFrame) => { return true; }; -export const neverFieldMatcher = (field: Field) => { +const neverFieldMatcher = (field: Field) => { return false; }; @@ -196,7 +196,7 @@ export const notTimeFieldMatcher = (field: Field) => { return field.type !== FieldType.time; }; -export const neverFrameMatcher = (frame: DataFrame) => { +const neverFrameMatcher = (frame: DataFrame) => { return false; }; diff --git a/packages/grafana-data/src/transformations/matchers/valueMatchers/substringMatchers.test.ts b/packages/grafana-data/src/transformations/matchers/valueMatchers/substringMatchers.test.ts new file mode 100644 index 00000000000..f9f7789cd66 --- /dev/null +++ b/packages/grafana-data/src/transformations/matchers/valueMatchers/substringMatchers.test.ts @@ -0,0 +1,130 @@ +import { toDataFrame } from '../../../dataframe'; +import { DataFrame } from '../../../types/dataFrame'; +import { getValueMatcher } from '../../matchers'; +import { ValueMatcherID } from '../ids'; + +describe('value substring to matcher', () => { + const data: DataFrame[] = [ + toDataFrame({ + fields: [ + { + name: 'temp', + values: ['24', null, '10', 'asd', '42'], + }, + ], + }), + ]; + + const matcher = getValueMatcher({ + id: ValueMatcherID.substring, + options: { + value: '2', + }, + }); + + it('should match when option value is a substring', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 0; + + expect(matcher(valueIndex, field, frame, data)).toBeTruthy(); + }); + + // Added for https://github.com/grafana/grafana/pull/83548#pullrequestreview-1904931540 where the matcher was not handling null values + it('should be a mismatch if the option is null and should not cause errors', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 1; + + expect(matcher(valueIndex, field, frame, data)).toBeFalsy(); + }); + + it('should not match when option value is different', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 2; + + expect(matcher(valueIndex, field, frame, data)).toBeFalsy(); + }); + + it('should match when option value is a substring', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 4; + + expect(matcher(valueIndex, field, frame, data)).toBeTruthy(); + }); +}); + +describe('value not substring matcher', () => { + const data: DataFrame[] = [ + toDataFrame({ + fields: [ + { + name: 'temp', + values: ['24', null, '050', 'asd', '42', '0'], + }, + ], + }), + ]; + + const matcher = getValueMatcher({ + id: ValueMatcherID.notSubstring, + options: { + value: '5', + }, + }); + + it('should not match if the value is "0" and the option value is "0"', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 5; + + const zeroMatcher = getValueMatcher({ + id: ValueMatcherID.notSubstring, + options: { + value: '0', + }, + }); + + expect(zeroMatcher(valueIndex, field, frame, data)).toBeFalsy(); + }); + + it('should match when option value is a substring', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 0; + + expect(matcher(valueIndex, field, frame, data)).toBeTruthy(); + }); + + it('should not match when option value is different', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 2; + + expect(matcher(valueIndex, field, frame, data)).toBeFalsy(); + }); + + it('should match when value is null because null its not a substring', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 4; + + expect(matcher(valueIndex, field, frame, data)).toBeTruthy(); + }); + + it('it should not match if the option value is empty string', () => { + const frame = data[0]; + const field = frame.fields[0]; + const valueIndex = 0; + const emptyMatcher = getValueMatcher({ + id: ValueMatcherID.notSubstring, + options: { + value: '', + }, + }); + + expect(emptyMatcher(valueIndex, field, frame, data)).toBeFalsy(); + }); +}); diff --git a/packages/grafana-data/src/transformations/matchers/valueMatchers/substringMatchers.ts b/packages/grafana-data/src/transformations/matchers/valueMatchers/substringMatchers.ts new file mode 100644 index 00000000000..07d5d8486ab --- /dev/null +++ b/packages/grafana-data/src/transformations/matchers/valueMatchers/substringMatchers.ts @@ -0,0 +1,41 @@ +import { Field, FieldType } from '../../../types/dataFrame'; +import { ValueMatcherInfo } from '../../../types/transformations'; +import { ValueMatcherID } from '../ids'; + +import { BasicValueMatcherOptions } from './types'; + +const isSubstringMatcher: ValueMatcherInfo = { + id: ValueMatcherID.substring, + name: 'Contains substring', + description: 'Match where value for given field is a substring to options value.', + get: (options) => { + return (valueIndex: number, field: Field) => { + const value = field.values[valueIndex]; + return (value && value.includes(options.value)) || options.value === ''; + }; + }, + getOptionsDisplayText: () => { + return `Matches all rows where field is similar to the value.`; + }, + isApplicable: (field) => field.type === FieldType.string, + getDefaultOptions: () => ({ value: '' }), +}; + +const isNotSubstringValueMatcher: ValueMatcherInfo = { + id: ValueMatcherID.notSubstring, + name: 'Does not contain substring', + description: 'Match where value for given field is not a substring to options value.', + get: (options) => { + return (valueIndex: number, field: Field) => { + const value = field.values[valueIndex]; + return typeof value === 'string' && options.value !== '' && !value.includes(options.value); + }; + }, + getOptionsDisplayText: () => { + return `Matches all rows where field is not similar to the value.`; + }, + isApplicable: (field) => field.type === FieldType.string, + getDefaultOptions: () => ({ value: '' }), +}; + +export const getSubstringValueMatchers = (): ValueMatcherInfo[] => [isSubstringMatcher, isNotSubstringValueMatcher]; diff --git a/packages/grafana-data/src/transformations/transformers/calculateField.ts b/packages/grafana-data/src/transformations/transformers/calculateField.ts index e50dc3b268b..b50f1bcac2d 100644 --- a/packages/grafana-data/src/transformations/transformers/calculateField.ts +++ b/packages/grafana-data/src/transformations/transformers/calculateField.ts @@ -61,7 +61,7 @@ export interface BinaryOptions { right: string; } -export interface IndexOptions { +interface IndexOptions { asPercentile: boolean; } diff --git a/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts b/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts index b61174d2e13..5d2ba4b10f9 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts @@ -26,6 +26,25 @@ const seriesAWithSingleField = toDataFrame({ ], }); +const multiSeriesWithSingleField = [ + toDataFrame({ + name: 'A', + length: 3, + fields: [ + { name: 'time', type: FieldType.time, values: [1000, 2000, 3000] }, + { name: 'value', type: FieldType.number, values: [1, 0, 1] }, + ], + }), + toDataFrame({ + name: 'B', + length: 3, + fields: [ + { name: 'time', type: FieldType.time, values: [5000, 6000, 7000] }, + { name: 'value', type: FieldType.number, values: [0, 1, 1] }, + ], + }), +]; + describe('FilterByValue transformer', () => { beforeAll(() => { mockTransformationsRegistry([filterByValueTransformer]); @@ -72,6 +91,68 @@ describe('FilterByValue transformer', () => { }); }); + it('should not cross frame boundaries', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.filterByValue, + options: { + type: FilterByValueType.exclude, + match: FilterByValueMatch.any, + filters: [ + { + fieldName: 'A value', + config: { + id: ValueMatcherID.equal, + options: { value: 0 }, + }, + }, + { + fieldName: 'B value', + config: { + id: ValueMatcherID.equal, + options: { value: 0 }, + }, + }, + ], + }, + }; + + await expect(transformDataFrame([cfg], multiSeriesWithSingleField)).toEmitValuesWith((received) => { + const processed = received[0]; + + expect(processed.length).toEqual(2); + + expect(processed[0].fields).toEqual([ + { + name: 'time', + type: FieldType.time, + values: [1000, 3000], + state: {}, + }, + { + name: 'value', + type: FieldType.number, + values: [1, 1], + state: {}, + }, + ]); + + expect(processed[1].fields).toEqual([ + { + name: 'time', + type: FieldType.time, + values: [6000, 7000], + state: {}, + }, + { + name: 'value', + type: FieldType.number, + values: [1, 1], + state: {}, + }, + ]); + }); + }); + it('should include values', async () => { const lowerOrEqual: MatcherConfig> = { id: ValueMatcherID.lowerOrEqual, diff --git a/packages/grafana-data/src/transformations/transformers/filterByValue.ts b/packages/grafana-data/src/transformations/transformers/filterByValue.ts index 766c98fcc2d..39e80a2d824 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByValue.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByValue.ts @@ -92,14 +92,16 @@ export const filterByValueTransformer: DataTransformerInfo { - if (!Array.isArray(data) || data.length === 0) { + if (data.length === 0) { return data; } - const rows = new Set(); + const processed: DataFrame[] = []; + + const fieldIndexByName = groupFieldIndexByName(data); for (const frame of data) { - const fieldIndexByName = groupFieldIndexByName(frame, data); + const rows = new Set(); let matchers; if (transformationsVariableSupport()) { @@ -135,13 +137,9 @@ export const filterByValueTransformer: DataTransformerInfo => { - return frame.fields.reduce((all: Record, field, fieldIndex) => { - const fieldName = getFieldDisplayName(field, frame, data); - all[fieldName] = fieldIndex; - return all; - }, {}); +const groupFieldIndexByName = (data: DataFrame[]) => { + const lookup: Record = {}; + + for (const frame of data) { + frame.fields.forEach((field, fieldIndex) => { + const fieldName = getFieldDisplayName(field, frame, data); + lookup[fieldName] = fieldIndex; + }); + } + + return lookup; }; diff --git a/packages/grafana-data/src/transformations/transformers/formatTime.test.ts b/packages/grafana-data/src/transformations/transformers/formatTime.test.ts index bf3700418a3..fe5096226a3 100644 --- a/packages/grafana-data/src/transformations/transformers/formatTime.test.ts +++ b/packages/grafana-data/src/transformations/transformers/formatTime.test.ts @@ -2,7 +2,7 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; import { FieldType } from '../../types/dataFrame'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; -import { createTimeFormatter, formatTimeTransformer } from './formatTime'; +import { applyFormatTime, formatTimeTransformer } from './formatTime'; describe('Format Time Transformer', () => { beforeAll(() => { @@ -16,7 +16,6 @@ describe('Format Time Transformer', () => { timezone: 'utc', }; - const formatter = createTimeFormatter(options.timeField, options.outputFormat, options.timezone); const frame = toDataFrame({ fields: [ { @@ -27,8 +26,32 @@ describe('Format Time Transformer', () => { ], }); - const newFrame = formatter(frame.fields); - expect(newFrame[0].values).toEqual(['2021-02', '2023-07', '2023-04', '2023-07', '2023-08']); + const newFrames = applyFormatTime(options, [frame]); + expect(newFrames[0].fields[0].values).toEqual(['2021-02', '2023-07', '2023-04', '2023-07', '2023-08']); + }); + + it('will match on getFieldDisplayName', () => { + const options = { + timeField: 'Created', + outputFormat: 'YYYY-MM', + timezone: 'utc', + }; + + const frame = toDataFrame({ + fields: [ + { + name: 'created', + type: FieldType.time, + values: [1612939600000, 1689192000000, 1682025600000, 1690328089000, 1691011200000], + config: { + displayName: 'Created', + }, + }, + ], + }); + + const newFrames = applyFormatTime(options, [frame]); + expect(newFrames[0].fields[0].values).toEqual(['2021-02', '2023-07', '2023-04', '2023-07', '2023-08']); }); it('will handle formats with times', () => { @@ -38,7 +61,6 @@ describe('Format Time Transformer', () => { timezone: 'utc', }; - const formatter = createTimeFormatter(options.timeField, options.outputFormat, options.timezone); const frame = toDataFrame({ fields: [ { @@ -49,8 +71,8 @@ describe('Format Time Transformer', () => { ], }); - const newFrame = formatter(frame.fields); - expect(newFrame[0].values).toEqual([ + const newFrames = applyFormatTime(options, [frame]); + expect(newFrames[0].fields[0].values).toEqual([ '2021-02 6:46:40 am', '2023-07 8:00:00 pm', '2023-04 9:20:00 pm', @@ -66,7 +88,6 @@ describe('Format Time Transformer', () => { timezone: 'utc', }; - const formatter = createTimeFormatter(options.timeField, options.outputFormat, options.timezone); const frame = toDataFrame({ fields: [ { @@ -77,8 +98,8 @@ describe('Format Time Transformer', () => { ], }); - const newFrame = formatter(frame.fields); - expect(newFrame[0].values).toEqual([ + const newFrames = applyFormatTime(options, [frame]); + expect(newFrames[0].fields[0].values).toEqual([ '2021-02 6:46:40 am', '2023-07 8:00:00 pm', '2023-04 9:20:00 pm', diff --git a/packages/grafana-data/src/transformations/transformers/formatTime.ts b/packages/grafana-data/src/transformations/transformers/formatTime.ts index bd5a496562b..62314055dc3 100644 --- a/packages/grafana-data/src/transformations/transformers/formatTime.ts +++ b/packages/grafana-data/src/transformations/transformers/formatTime.ts @@ -2,8 +2,9 @@ import { map } from 'rxjs/operators'; import { TimeZone } from '@grafana/schema'; -import { DataFrame, Field, TransformationApplicabilityLevels } from '../../types'; -import { DataTransformerInfo } from '../../types/transformations'; +import { cacheFieldDisplayNames } from '../../field'; +import { DataFrame, TransformationApplicabilityLevels } from '../../types'; +import { DataTransformContext, DataTransformerInfo } from '../../types/transformations'; import { fieldToStringField } from './convertFieldType'; import { DataTransformerID } from './ids'; @@ -34,21 +35,10 @@ export const formatTimeTransformer: DataTransformerInfo (source) => + operator: (options, ctx) => (source) => source.pipe( map((data) => { - // If a field and a format are configured - // then format the time output - const formatter = createTimeFormatter(options.timeField, options.outputFormat, options.timezone); - - if (!Array.isArray(data) || data.length === 0) { - return data; - } - - return data.map((frame) => ({ - ...frame, - fields: formatter(frame.fields), - })); + return applyFormatTime(options, data, ctx); }) ), }; @@ -56,21 +46,27 @@ export const formatTimeTransformer: DataTransformerInfo (fields: Field[]) => { - return fields.map((field) => { - // Find the configured field - if (field.name === timeField) { - // Update values to use the configured format - let formattedField = null; - if (timezone) { - formattedField = fieldToStringField(field, outputFormat, { timeZone: timezone }); - } else { - formattedField = fieldToStringField(field, outputFormat); - } +export const applyFormatTime = ( + { timeField, outputFormat, timezone }: FormatTimeTransformerOptions, + data: DataFrame[], + ctx?: DataTransformContext +) => { + if (!Array.isArray(data) || data.length === 0) { + return data; + } - return formattedField; - } + cacheFieldDisplayNames(data); + + outputFormat = ctx?.interpolate(outputFormat) ?? outputFormat; + + return data.map((frame) => ({ + ...frame, + fields: frame.fields.map((field) => { + if (field.state?.displayName === timeField) { + field = fieldToStringField(field, outputFormat, { timeZone: timezone }); + } - return field; - }); + return field; + }), + })); }; diff --git a/packages/grafana-data/src/transformations/transformers/groupToNestedTable.ts b/packages/grafana-data/src/transformations/transformers/groupToNestedTable.ts index 146f86a6e46..aa2d1f9c883 100644 --- a/packages/grafana-data/src/transformations/transformers/groupToNestedTable.ts +++ b/packages/grafana-data/src/transformations/transformers/groupToNestedTable.ts @@ -11,7 +11,7 @@ import { DataTransformerID } from './ids'; export const SHOW_NESTED_HEADERS_DEFAULT = true; -export enum GroupByOperationID { +enum GroupByOperationID { aggregate = 'aggregate', groupBy = 'groupby', } diff --git a/packages/grafana-data/src/transformations/transformers/histogram.test.ts b/packages/grafana-data/src/transformations/transformers/histogram.test.ts index 64a952d2196..7bbd03397a0 100644 --- a/packages/grafana-data/src/transformations/transformers/histogram.test.ts +++ b/packages/grafana-data/src/transformations/transformers/histogram.test.ts @@ -22,6 +22,14 @@ describe('histogram frames frames', () => { fields: [{ name: 'C', type: FieldType.number, values: [5, 6, 7, 8, 9] }], }); + const series3 = toDataFrame({ + fields: [{ name: 'D', type: FieldType.number, values: [1, 2, 3, null, null] }], + }); + + const series4 = toDataFrame({ + fields: [{ name: 'E', type: FieldType.number, values: [4, 5, null, 6, null], config: { noValue: '0' } }], + }); + const out = histogramFieldsToFrame(buildHistogram([series1, series2])!); expect( out.fields.map((f) => ({ @@ -188,5 +196,87 @@ describe('histogram frames frames', () => { }, ] `); + + // NULLs filtering test + const out3 = histogramFieldsToFrame(buildHistogram([series3])!); + expect( + out3.fields.map((f) => ({ + name: f.name, + values: f.values, + })) + ).toMatchInlineSnapshot(` + [ + { + "name": "xMin", + "values": [ + 1, + 2, + 3, + ], + }, + { + "name": "xMax", + "values": [ + 2, + 3, + 4, + ], + }, + { + "name": "D", + "values": [ + 1, + 1, + 1, + ], + }, + ] + `); + + // noValue nulls test + const out4 = histogramFieldsToFrame(buildHistogram([series4])!); + expect( + out4.fields.map((f) => ({ + name: f.name, + values: f.values, + config: f.config, + })) + ).toMatchInlineSnapshot(` + [ + { + "config": {}, + "name": "xMin", + "values": [ + 0, + 4, + 5, + 6, + ], + }, + { + "config": {}, + "name": "xMax", + "values": [ + 1, + 5, + 6, + 7, + ], + }, + { + "config": { + "noValue": "0", + "unit": undefined, + }, + "name": "E", + "values": [ + 2, + 1, + 1, + 1, + ], + }, + ] + `); }); }); diff --git a/packages/grafana-data/src/transformations/transformers/histogram.ts b/packages/grafana-data/src/transformations/transformers/histogram.ts index 3f21dcdd9ce..39d54ffeda9 100644 --- a/packages/grafana-data/src/transformations/transformers/histogram.ts +++ b/packages/grafana-data/src/transformations/transformers/histogram.ts @@ -8,6 +8,7 @@ import { roundDecimals } from '../../utils'; import { DataTransformerID } from './ids'; import { AlignedData, join } from './joinDataFrames'; +import { nullToValueField } from './nulls/nullToValue'; import { transformationsVariableSupport } from './utils'; /** @@ -334,6 +335,26 @@ export function buildHistogram(frames: DataFrame[], options?: HistogramTransform let bucketCount = options?.bucketCount ?? DEFAULT_BUCKET_COUNT; let bucketOffset = options?.bucketOffset ?? 0; + // replace or filter nulls from numeric fields + frames = frames.map((frame) => { + return { + ...frame, + fields: frame.fields.map((field) => { + if (field.type === FieldType.number) { + const noValue = Number(field.config.noValue); + + if (!Number.isNaN(noValue)) { + field = nullToValueField(field, noValue); + } else { + field = { ...field, values: field.values.filter((v) => v != null) }; + } + } + + return field; + }), + }; + }); + // if bucket size is auto, try to calc from all numeric fields if (!bucketSize || bucketSize < 0) { let allValues: number[] = []; @@ -347,8 +368,6 @@ export function buildHistogram(frames: DataFrame[], options?: HistogramTransform } } - allValues = allValues.filter((v) => v != null); - allValues.sort((a, b) => a - b); let smallestDelta = Infinity; @@ -384,7 +403,7 @@ export function buildHistogram(frames: DataFrame[], options?: HistogramTransform } } - const getBucket = (v: number) => incrRoundDn(v - bucketOffset, bucketSize!) + bucketOffset; + const getBucket = (v: number) => roundDecimals(incrRoundDn(v - bucketOffset, bucketSize!) + bucketOffset, 9); // guess number of decimals let bucketDecimals = (('' + bucketSize).match(/\.\d+$/) ?? ['.'])[0].length - 1; @@ -463,7 +482,12 @@ export function buildHistogram(frames: DataFrame[], options?: HistogramTransform name: 'count', values: vals, type: FieldType.number, - state: undefined, + state: { + ...counts[0].state, + displayName: 'Count', + multipleFrames: false, + origin: { frameIndex: 0, fieldIndex: 2 }, + }, }, ]; } else { diff --git a/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts b/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts index f19b6b0ccb7..0b994b79402 100644 --- a/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts +++ b/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts @@ -56,6 +56,16 @@ export interface JoinOptions { */ keepOriginIndices?: boolean; + /** + * @internal -- keep any pre-cached state.displayName + */ + keepDisplayNames?: boolean; + + /** + * @internal -- Optionally specify how to treat null values + */ + nullMode?: (field: Field) => JoinNullMode; + /** * @internal -- Optionally specify a join mode (outer or inner) */ @@ -90,6 +100,13 @@ export function joinDataFrames(options: JoinOptions): DataFrame | undefined { return; } + const nullMode = + options.nullMode ?? + ((field: Field) => { + let spanNulls = field.config.custom?.spanNulls; + return spanNulls === true ? NULL_REMOVE : spanNulls === -1 ? NULL_RETAIN : NULL_EXPAND; + }); + if (options.frames.length === 1) { let frame = options.frames[0]; let frameCopy = frame; @@ -181,8 +198,7 @@ export function joinDataFrames(options: JoinOptions): DataFrame | undefined { } // Support the standard graph span nulls field config - let spanNulls = field.config.custom?.spanNulls; - nullModesFrame.push(spanNulls === true ? NULL_REMOVE : spanNulls === -1 ? NULL_RETAIN : NULL_EXPAND); + nullModesFrame.push(nullMode(field)); let labels = field.labels ?? {}; let name = field.name; @@ -223,8 +239,10 @@ export function joinDataFrames(options: JoinOptions): DataFrame | undefined { for (const field of fields) { a.push(field.values); originalFields.push(field); - // clear field displayName state - delete field.state?.displayName; + if (!options.keepDisplayNames) { + // clear field displayName state + delete field.state?.displayName; + } // store frame field order for tabular data join frameFieldsOrder.push(fieldsOrder); fieldsOrder++; @@ -367,9 +385,9 @@ export type AlignedData = | [xValues: number[] | TypedArray, ...yValues: Array | TypedArray>]; // nullModes -const NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true) -const NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default) -const NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts +export const NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true) +export const NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default) +export const NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts type JoinNullMode = number; // NULL_IGNORE | NULL_RETAIN | NULL_EXPAND; diff --git a/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.ts b/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.ts index 4c3ba5a81e6..a2d2eeb88c7 100644 --- a/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.ts +++ b/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.ts @@ -1,27 +1,31 @@ -import { DataFrame } from '../../../types'; +import { DataFrame, Field } from '../../../types'; export function nullToValue(frame: DataFrame) { return { ...frame, fields: frame.fields.map((field) => { - const noValue = +field.config?.noValue!; + const noValue = Number(field.config.noValue); if (!Number.isNaN(noValue)) { - const transformedVals = field.values.slice(); - - for (let i = 0; i < transformedVals.length; i++) { - if (transformedVals[i] === null) { - transformedVals[i] = noValue; - } - } - - return { - ...field, - values: transformedVals, - }; + return nullToValueField(field, noValue); } else { return field; } }), }; } + +export function nullToValueField(field: Field, noValue: number) { + const transformedVals = field.values.slice(); + + for (let i = 0; i < transformedVals.length; i++) { + if (transformedVals[i] === null) { + transformedVals[i] = noValue; + } + } + + return { + ...field, + values: transformedVals, + }; +} diff --git a/packages/grafana-data/src/transformations/transformers/reduce.ts b/packages/grafana-data/src/transformations/transformers/reduce.ts index f8ba7adddc5..d7e8ba8cda5 100644 --- a/packages/grafana-data/src/transformations/transformers/reduce.ts +++ b/packages/grafana-data/src/transformations/transformers/reduce.ts @@ -64,7 +64,7 @@ export const reduceTransformer: DataTransformerInfo = /** * @internal only exported for testing */ -export function reduceSeriesToRows( +function reduceSeriesToRows( data: DataFrame[], matcher: FieldMatcher, reducerId: ReducerID[], @@ -156,7 +156,7 @@ export function reduceSeriesToRows( return mergeResults(processed); } -export function getDistinctLabelKeys(frames: DataFrame[]): string[] { +function getDistinctLabelKeys(frames: DataFrame[]): string[] { const keys = new Set(); for (const frame of frames) { for (const field of frame.fields) { @@ -173,7 +173,7 @@ export function getDistinctLabelKeys(frames: DataFrame[]): string[] { /** * @internal only exported for testing */ -export function mergeResults(data: DataFrame[]): DataFrame | undefined { +function mergeResults(data: DataFrame[]): DataFrame | undefined { if (!data?.length) { return undefined; } diff --git a/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts b/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts index 49829c3e377..23f6de76225 100644 --- a/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts +++ b/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts @@ -11,6 +11,33 @@ describe('Series to rows', () => { mockTransformationsRegistry([seriesToRowsTransformer]); }); + it('should do transform even with only one series', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.seriesToRows, + options: {}, + }; + + const seriesA = toDataFrame({ + name: 'A', + fields: [ + { name: 'Time', type: FieldType.time, values: [1000] }, + { name: 'Temp', type: FieldType.number, values: [1] }, + ], + }); + + await expect(transformDataFrame([cfg], [seriesA])).toEmitValuesWith((received) => { + const result = received[0]; + + const expected: Field[] = [ + createField('Time', FieldType.time, [1000]), + createField('Metric', FieldType.string, ['A']), + createField('Value', FieldType.number, [1]), + ]; + + expect(unwrap(result[0].fields)).toEqual(expected); + }); + }); + it('combine two series into one', async () => { const cfg: DataTransformerConfig = { id: DataTransformerID.seriesToRows, diff --git a/packages/grafana-data/src/transformations/transformers/seriesToRows.ts b/packages/grafana-data/src/transformations/transformers/seriesToRows.ts index bbfcfcb4b14..cf0793ef7d0 100644 --- a/packages/grafana-data/src/transformations/transformers/seriesToRows.ts +++ b/packages/grafana-data/src/transformations/transformers/seriesToRows.ts @@ -25,7 +25,7 @@ export const seriesToRowsTransformer: DataTransformerInfo (source) => source.pipe( map((data) => { - if (!Array.isArray(data) || data.length <= 1) { + if (!Array.isArray(data) || data.length === 0) { return data; } diff --git a/packages/grafana-data/src/transformations/transformers/sortBy.ts b/packages/grafana-data/src/transformations/transformers/sortBy.ts index 7cd99acce36..58315815621 100644 --- a/packages/grafana-data/src/transformations/transformers/sortBy.ts +++ b/packages/grafana-data/src/transformations/transformers/sortBy.ts @@ -43,7 +43,7 @@ export const sortByTransformer: DataTransformerInfo = ), }; -export function sortDataFrames(data: DataFrame[], sort: SortByField[], ctx: DataTransformContext): DataFrame[] { +function sortDataFrames(data: DataFrame[], sort: SortByField[], ctx: DataTransformContext): DataFrame[] { return data.map((frame) => { const s = attachFieldIndex(frame, sort, ctx); if (s.length && s[0].index != null) { diff --git a/packages/grafana-data/src/types/OptionsUIRegistryBuilder.ts b/packages/grafana-data/src/types/OptionsUIRegistryBuilder.ts index 0765f1987a3..b5a0e74f34f 100644 --- a/packages/grafana-data/src/types/OptionsUIRegistryBuilder.ts +++ b/packages/grafana-data/src/types/OptionsUIRegistryBuilder.ts @@ -30,7 +30,7 @@ export interface OptionsEditorItem /** * Describes an API for option editors UI builder */ -export interface OptionsUIRegistryBuilderAPI< +interface OptionsUIRegistryBuilderAPI< TOptions, TEditorProps, T extends OptionsEditorItem, diff --git a/packages/grafana-data/src/types/app.ts b/packages/grafana-data/src/types/app.ts index fcb58a7ccb1..626ab368bf2 100644 --- a/packages/grafana-data/src/types/app.ts +++ b/packages/grafana-data/src/types/app.ts @@ -111,9 +111,7 @@ export class AppPlugin extends GrafanaPlugin( - extension: Omit, 'type'> - ) { + configureExtensionComponent(extension: Omit, 'type'>) { this._extensionConfigs.push({ ...extension, type: PluginExtensionTypes.component, diff --git a/packages/grafana-data/src/types/config.ts b/packages/grafana-data/src/types/config.ts index c3e4cea9b05..72f89ea9286 100644 --- a/packages/grafana-data/src/types/config.ts +++ b/packages/grafana-data/src/types/config.ts @@ -14,7 +14,10 @@ import { GrafanaTheme, IconName, NavLinkDTO, OrgRole } from '.'; * @public */ export interface BuildInfo { + // This MUST be a semver-ish version string, such as "11.0.0-54321" version: string; + // Version to show in the UI instead of version + versionString: string; commit: string; env: string; edition: GrafanaEdition; @@ -123,6 +126,7 @@ export interface CurrentUserDTO { language: string; permissions?: Record; analytics: AnalyticsSettings; + authenticatedBy: string; /** @deprecated Use theme instead */ lightTheme: boolean; @@ -166,10 +170,6 @@ export interface GrafanaConfig { allowOrgCreate: boolean; disableLoginForm: boolean; defaultDatasource: string; - alertingEnabled: boolean; - alertingErrorOrTimeout: string; - alertingNoDataOrNullValues: string; - alertingMinInterval: number; authProxyEnabled: boolean; exploreEnabled: boolean; queryHistoryEnabled: boolean; @@ -226,9 +226,19 @@ export interface GrafanaConfig { sqlConnectionLimits: SqlConnectionLimits; sharedWithMeFolderUID?: string; rootFolderUID?: string; + localFileSystemAvailable?: boolean; + cloudMigrationIsTarget?: boolean; + listDashboardScopesEndpoint?: string; + listScopesEndpoint?: string; // The namespace to use for kubernetes apiserver requests namespace: string; + + /** + * Language used in Grafana's UI. This is after the user's preference (or deteceted locale) is resolved to one of + * Grafana's supported language. + */ + language: string | undefined; } export interface SqlConnectionLimits { @@ -263,4 +273,5 @@ export interface AuthSettings { GenericOAuthSkipOrgRoleSync?: boolean; disableLogin?: boolean; + basicAuthStrongPasswordPolicy?: boolean; } diff --git a/packages/grafana-data/src/types/dataFrame.ts b/packages/grafana-data/src/types/dataFrame.ts index b2fbf0ac46a..291f88b2333 100644 --- a/packages/grafana-data/src/types/dataFrame.ts +++ b/packages/grafana-data/src/types/dataFrame.ts @@ -1,3 +1,5 @@ +import { HideSeriesConfig } from '@grafana/schema'; + import { ScopedVars } from './ScopedVars'; import { QueryResultBase, Labels, NullValueMode } from './data'; import { DataLink, LinkModel } from './dataLink'; @@ -5,7 +7,6 @@ import { DecimalCount, DisplayProcessor, DisplayValue, DisplayValueAlignmentFact import { FieldColor } from './fieldColor'; import { ThresholdsConfig } from './thresholds'; import { ValueMapping } from './valueMapping'; -import { Vector } from './vector'; /** @public */ export enum FieldType { @@ -133,7 +134,7 @@ export interface ValueLinkConfig { valueRowIndex?: number; } -export interface Field> { +export interface Field { /** * Name of the field (column) */ @@ -149,10 +150,8 @@ export interface Field> { /** * The raw field values - * In Grafana 10, this accepts both simple arrays and the Vector interface - * In Grafana 11, the Vector interface will be removed */ - values: V | T[]; + values: T[]; /** * When type === FieldType.Time, this can optionally store @@ -234,6 +233,15 @@ export interface FieldState { * It's up to each visualization to calculate and set this. */ alignmentFactors?: DisplayValueAlignmentFactors; + + /** + * This is the current ad-hoc state of whether this series is hidden in viz, tooltip, and legend. + * + * Currently this will match field.config.custom.hideFrom because fieldOverrides applies the special __system + * override to the actual config during toggle via legend. This should go away once we have a unified system + * for layering ad hoc field overrides and options but still being able to get the stateless fieldConfig and panel options + */ + hideFrom?: HideSeriesConfig; } /** @public */ @@ -264,7 +272,7 @@ export interface FieldDTO { name: string; // The column name type?: FieldType; config?: FieldConfig; - values?: Vector | T[]; // toJSON will always be T[], input could be either + values?: T[]; labels?: Labels; } diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index 7f20cb9273d..f555983f67f 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -14,7 +14,7 @@ import { DataQuery } from './query'; import { RawTimeRange, TimeRange } from './time'; import { CustomVariableSupport, DataSourceVariableSupport, StandardVariableSupport } from './variables'; -import { AdHocVariableFilter, DataSourceRef, WithAccessControlMetadata } from '.'; +import { AdHocVariableFilter, DataSourceRef, Scope, WithAccessControlMetadata } from '.'; export interface DataSourcePluginOptionsEditorProps< JSONData extends DataSourceJsonData = DataSourceJsonData, @@ -190,9 +190,6 @@ type VariableSupport; /** - * This function is not called automatically unless running within the DataSourceWithBackend - * - * @deprecated + * Optionally, you can implement this method to prevent certain queries from being executed. + * Return false to prevent the query from being executed. */ - filterQuery?(query: TQuery): boolean; + filterQuery?(query: TQuery): boolean { + return true; + } /** * Get hints for query improvements @@ -429,10 +427,6 @@ export interface QueryEditorProps< */ data?: PanelData; range?: TimeRange; - /** - * @deprecated This is not used anymore and will be removed in a future release. - */ - exploreId?: string; history?: Array>; queries?: DataQuery[]; app?: CoreApp; @@ -445,15 +439,6 @@ export enum ExploreMode { Tracing = 'Tracing', } -/** - * @deprecated use QueryEditorProps instead - */ -export type ExploreQueryFieldProps< - DSType extends DataSourceApi, - TQuery extends DataQuery = DataQuery, - TOptions extends DataSourceJsonData = DataSourceJsonData, -> = QueryEditorProps; - export interface QueryEditorHelpProps { datasource: DataSourceApi; query: TQuery; @@ -574,6 +559,8 @@ export interface DataQueryRequest { // Used to correlate multiple related requests queryGroupId?: string; + + scope?: Scope | undefined; } export interface DataQueryTimings { diff --git a/packages/grafana-data/src/types/explore.ts b/packages/grafana-data/src/types/explore.ts index 537104f0418..90f21ae568b 100644 --- a/packages/grafana-data/src/types/explore.ts +++ b/packages/grafana-data/src/types/explore.ts @@ -58,9 +58,7 @@ export interface ExploreLogsPanelState { export interface SplitOpenOptions { datasourceUid: string; - /** @deprecated Will be removed in a future version. Use queries instead. */ - query?: T; - queries?: T[]; + queries: T[]; range?: TimeRange; panelsState?: ExplorePanelsState; correlationHelperData?: ExploreCorrelationHelperData; diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 4a43b10aa27..1d27dc64036 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -24,34 +24,31 @@ export interface FeatureToggles { panelTitleSearch?: boolean; publicDashboards?: boolean; publicDashboardsEmailSharing?: boolean; + publicDashboardsScene?: boolean; lokiExperimentalStreaming?: boolean; featureHighlights?: boolean; - migrationLocking?: boolean; storage?: boolean; correlations?: boolean; exploreContentOutline?: boolean; datasourceQueryMultiStatus?: boolean; - traceToMetrics?: boolean; autoMigrateOldPanels?: boolean; autoMigrateGraphPanel?: boolean; autoMigrateTablePanel?: boolean; autoMigratePiechartPanel?: boolean; autoMigrateWorldmapPanel?: boolean; autoMigrateStatPanel?: boolean; + autoMigrateXYChartPanel?: boolean; disableAngular?: boolean; canvasPanelNesting?: boolean; newVizTooltips?: boolean; scenes?: boolean; disableSecretsCompatibility?: boolean; logRequestsInstrumentedAsUnknown?: boolean; - dataConnectionsConsole?: boolean; topnav?: boolean; returnToPrevious?: boolean; grpcServer?: boolean; unifiedStorage?: boolean; cloudWatchCrossAccountQuerying?: boolean; - redshiftAsyncQueryDataSupport?: boolean; - athenaAsyncQueryDataSupport?: boolean; showDashboardValidationWarnings?: boolean; mysqlAnsiQuotes?: boolean; accessControlOnCall?: boolean; @@ -78,7 +75,6 @@ export interface FeatureToggles { alertStateHistoryLokiOnly?: boolean; unifiedRequestLog?: boolean; renderAuthJWT?: boolean; - externalServiceAuth?: boolean; refactorVariablesTimeRange?: boolean; enableElasticsearchBackendQuerying?: boolean; faroDatasourceSelector?: boolean; @@ -90,8 +86,6 @@ export interface FeatureToggles { frontendSandboxMonitorOnly?: boolean; sqlDatasourceDatabaseSelection?: boolean; lokiFormatQuery?: boolean; - cloudWatchLogsMonacoEditor?: boolean; - exploreScrollableLogsContainer?: boolean; recordedQueriesMulti?: boolean; pluginsDynamicAngularDetectionPatterns?: boolean; vizAndWidgetSplit?: boolean; @@ -106,7 +100,6 @@ export interface FeatureToggles { grafanaAPIServerEnsureKubectlAccess?: boolean; featureToggleAdminPage?: boolean; awsAsyncQueryCaching?: boolean; - splitScopes?: boolean; permissionsFilterRemoveSubquery?: boolean; prometheusConfigOverhaulAuth?: boolean; configurableSchedulerTick?: boolean; @@ -114,6 +107,7 @@ export interface FeatureToggles { alertingNoDataErrorExecution?: boolean; angularDeprecationUI?: boolean; dashgpt?: boolean; + aiGeneratedDashboardChanges?: boolean; reportingRetries?: boolean; sseGroupByDatasource?: boolean; libraryPanelRBAC?: boolean; @@ -123,7 +117,6 @@ export interface FeatureToggles { externalCorePlugins?: boolean; pluginsAPIMetrics?: boolean; idForwarding?: boolean; - cloudWatchWildCardDimensionValues?: boolean; externalServiceAccounts?: boolean; panelMonitoring?: boolean; enableNativeHTTPHistogram?: boolean; @@ -139,7 +132,6 @@ export interface FeatureToggles { awsDatasourcesNewFormStyling?: boolean; cachingOptimizeSerializationMemoryUsage?: boolean; panelTitleSearchInV1?: boolean; - pluginsInstrumentationStatusSource?: boolean; managedPluginsInstall?: boolean; prometheusPromQAIL?: boolean; addFieldFromCalculationStatFunctions?: boolean; @@ -157,17 +149,14 @@ export interface FeatureToggles { canvasPanelPanZoom?: boolean; logsInfiniteScrolling?: boolean; flameGraphItemCollapsing?: boolean; - alertingDetailsViewV2?: boolean; - datatrails?: boolean; + exploreMetrics?: boolean; alertingSimplifiedRouting?: boolean; logRowsPopoverMenu?: boolean; pluginsSkipHostEnvVars?: boolean; tableSharedCrosshair?: boolean; regressionTransformation?: boolean; - displayAnonymousStats?: boolean; lokiQueryHints?: boolean; kubernetesFeatureToggles?: boolean; - alertingPreviewUpgrade?: boolean; enablePluginsTracingByDefault?: boolean; cloudRBACRoles?: boolean; alertingQueryOptimization?: boolean; @@ -176,10 +165,16 @@ export interface FeatureToggles { onPremToCloudMigrations?: boolean; alertingSaveStatePeriodic?: boolean; promQLScope?: boolean; + sqlExpressions?: boolean; nodeGraphDotLayout?: boolean; groupToNestedTableTransformation?: boolean; newPDFRendering?: boolean; kubernetesAggregator?: boolean; + expressionParser?: boolean; groupByVariable?: boolean; - alertingUpgradeDryrunOnStart?: boolean; + betterPageScrolling?: boolean; + scopeFilters?: boolean; + ssoSettingsSAML?: boolean; + usePrometheusFrontendPackage?: boolean; + oauthRequireSubClaim?: boolean; } diff --git a/packages/grafana-data/src/types/icon.ts b/packages/grafana-data/src/types/icon.ts index 6b3a862a301..4b6761b33b4 100644 --- a/packages/grafana-data/src/types/icon.ts +++ b/packages/grafana-data/src/types/icon.ts @@ -85,10 +85,12 @@ export const availableIconsIndex = { 'dice-three': true, docker: true, 'document-info': true, + 'document-layout-left': true, 'download-alt': true, draggabledots: true, edit: true, 'ellipsis-v': true, + enter: true, envelope: true, 'exchange-alt': true, 'exclamation-triangle': true, @@ -176,6 +178,7 @@ export const availableIconsIndex = { monitor: true, palette: true, 'panel-add': true, + paragraph: true, 'pathfinder-unite': true, pause: true, pen: true, @@ -217,6 +220,8 @@ export const availableIconsIndex = { sync: true, 'sync-slash': true, table: true, + 'table-collapse-all': true, + 'table-expand-all': true, 'tag-alt': true, 'telegram-alt': true, 'text-fields': true, diff --git a/packages/grafana-data/src/types/index.ts b/packages/grafana-data/src/types/index.ts index 5ee1e8971a4..e467d5d8ee4 100644 --- a/packages/grafana-data/src/types/index.ts +++ b/packages/grafana-data/src/types/index.ts @@ -66,3 +66,4 @@ export { type PluginExtensionCommandPaletteContext, type PluginExtensionOpenModalOptions, } from './pluginExtensions'; +export * from './scopes'; diff --git a/packages/grafana-data/src/types/logs.ts b/packages/grafana-data/src/types/logs.ts index e63e5512976..d9edfca6bc2 100644 --- a/packages/grafana-data/src/types/logs.ts +++ b/packages/grafana-data/src/types/logs.ts @@ -185,6 +185,7 @@ export type SupplementaryQueryOptions = LogsVolumeOption | LogsSampleOptions; */ export type LogsVolumeOption = { type: SupplementaryQueryType.LogsVolume; + field?: string; }; /** @@ -237,7 +238,8 @@ export interface DataSourceWithSupplementaryQueriesSupport + request: DataQueryRequest, + options?: SupplementaryQueryOptions ): DataQueryRequest | undefined; /** * Returns supplementary query types that data source supports. diff --git a/packages/grafana-data/src/types/pluginExtensions.ts b/packages/grafana-data/src/types/pluginExtensions.ts index 68fa3c7d1d8..e7a26223c34 100644 --- a/packages/grafana-data/src/types/pluginExtensions.ts +++ b/packages/grafana-data/src/types/pluginExtensions.ts @@ -32,9 +32,9 @@ export type PluginExtensionLink = PluginExtensionBase & { category?: string; }; -export type PluginExtensionComponent = PluginExtensionBase & { +export type PluginExtensionComponent = PluginExtensionBase & { type: PluginExtensionTypes.component; - component: React.ComponentType; + component: React.ComponentType; }; export type PluginExtension = PluginExtensionLink | PluginExtensionComponent; @@ -77,16 +77,14 @@ export type PluginExtensionLinkConfig = { category?: string; }; -export type PluginExtensionComponentConfig = { +export type PluginExtensionComponentConfig = { type: PluginExtensionTypes.component; title: string; description: string; // The React component that will be rendered as the extension - // (This component receives the context as a prop when it is rendered. You can just return `null` from the component to hide for certain contexts) - component: React.ComponentType<{ - context?: Context; - }>; + // (This component receives contextual information as props when it is rendered. You can just return `null` from the component to hide it.) + component: React.ComponentType; // The unique identifier of the Extension Point // (Core Grafana extension point ids are available in the `PluginExtensionPoints` enum) diff --git a/packages/grafana-data/src/types/scopes.ts b/packages/grafana-data/src/types/scopes.ts new file mode 100644 index 00000000000..09dd972f98c --- /dev/null +++ b/packages/grafana-data/src/types/scopes.ts @@ -0,0 +1,20 @@ +export interface ScopeDashboard { + uid: string; + title: string; + url: string; +} + +export interface ScopeFilter { + key: string; + value: string; + operator: string; +} + +export interface Scope { + uid: string; + title: string; + type: string; + description: string; + category: string; + filters: ScopeFilter[]; +} diff --git a/packages/grafana-data/src/types/templateVars.ts b/packages/grafana-data/src/types/templateVars.ts index b088ed63c85..1b01e5b9e53 100644 --- a/packages/grafana-data/src/types/templateVars.ts +++ b/packages/grafana-data/src/types/templateVars.ts @@ -1,4 +1,5 @@ import { LoadingState } from './data'; +import { MetricFindValue } from './datasource'; import { DataSourceRef } from './query'; export type VariableType = TypedVariableModel['type']; @@ -63,6 +64,10 @@ export interface AdHocVariableModel extends BaseVariableModel { * Filters that are always applied to the lookup of keys. Not shown in the AdhocFilterBuilder UI. */ baseFilters?: AdHocVariableFilter[]; + /** + * Static keys that override any dynamic keys from the datasource. + */ + defaultKeys?: MetricFindValue[]; } export interface GroupByVariableModel extends VariableWithOptions { diff --git a/packages/grafana-data/src/types/vector.ts b/packages/grafana-data/src/types/vector.ts index be903d96abf..06358553e9a 100644 --- a/packages/grafana-data/src/types/vector.ts +++ b/packages/grafana-data/src/types/vector.ts @@ -53,82 +53,3 @@ export function patchArrayVectorProrotypeMethods() { } //this function call is intentional patchArrayVectorProrotypeMethods(); - -/** @deprecated use a simple Array */ -export interface Vector extends Array { - length: number; - - /** - * Access the value by index (Like an array) - * - * @deprecated use a simple Array - */ - get(index: number): T; - - /** - * Set a value - * - * @deprecated use a simple Array - */ - set: (index: number, value: T) => void; - - /** - * Adds the value to the vector - * Same as Array.push() - * - * @deprecated use a simple Array - */ - add: (value: T) => void; - - /** - * Get the results as an array. - * - * @deprecated use a simple Array - */ - toArray(): T[]; -} - -/** - * Apache arrow vectors are Read/Write - * - * @deprecated -- this is now part of the base Vector interface - */ -export interface ReadWriteVector extends Vector {} - -/** - * Vector with standard manipulation functions - * - * @deprecated -- this is now part of the base Vector interface - */ -export interface MutableVector extends ReadWriteVector {} - -/** - * This is an extremely inefficient Vector wrapper that allows vectors to - * be treated as arrays. We should avoid using this wrapper, but it is helpful - * for a clean migration to arrays - * - * @deprecated - */ -export function makeArrayIndexableVector(v: T): T { - return new Proxy(v, { - get(target: Vector, property: string, receiver: Vector) { - if (typeof property !== 'symbol') { - const idx = +property; - if (String(idx) === property) { - return target.get(idx); - } - } - return Reflect.get(target, property, receiver); - }, - set(target: Vector, property: string, value: unknown, receiver: Vector) { - if (typeof property !== 'symbol') { - const idx = +property; - if (String(idx) === property) { - target.set(idx, value); - return true; - } - } - return Reflect.set(target, property, value, receiver); - }, - }); -} diff --git a/packages/grafana-data/src/utils/arrayUtils.test.ts b/packages/grafana-data/src/utils/arrayUtils.test.ts index b41c3e728b7..132580a6415 100644 --- a/packages/grafana-data/src/utils/arrayUtils.test.ts +++ b/packages/grafana-data/src/utils/arrayUtils.test.ts @@ -1,6 +1,6 @@ import { SortOrder } from '@grafana/schema'; -import { sortValues } from './arrayUtils'; +import { insertAfterImmutably, insertBeforeImmutably, sortValues } from './arrayUtils'; describe('arrayUtils', () => { describe('sortValues', () => { @@ -30,4 +30,52 @@ describe('arrayUtils', () => { expect(sorted).toEqual(expected); }); }); + + describe('insertBeforeImmutably', () => { + const original = [1, 2, 3]; + + it.each` + item | index | expected + ${4} | ${1} | ${[1, 4, 2, 3]} + ${4} | ${2} | ${[1, 2, 4, 3]} + ${0} | ${0} | ${[0, 1, 2, 3]} + `('add $item before $index', ({ item, index, expected }) => { + const output = insertBeforeImmutably(original, item, index); + expect(output).toStrictEqual(expected); + }); + + it('should throw when out of bounds', () => { + expect(() => { + insertBeforeImmutably([], 1, -1); + }).toThrow(); + + expect(() => { + insertBeforeImmutably([], 1, 3); + }).toThrow(); + }); + }); + + describe('insertAfterImmutably', () => { + const original = [1, 2, 3]; + + it.each` + item | index | expected + ${4} | ${1} | ${[1, 2, 4, 3]} + ${4} | ${0} | ${[1, 4, 2, 3]} + ${4} | ${2} | ${[1, 2, 3, 4]} + `('add $item after $index', ({ item, index, expected }) => { + const output = insertAfterImmutably(original, item, index); + expect(output).toStrictEqual(expected); + }); + + it('should throw when out of bounds', () => { + expect(() => { + insertAfterImmutably([], 1, -1); + }).toThrow(); + + expect(() => { + insertAfterImmutably([], 1, 3); + }).toThrow(); + }); + }); }); diff --git a/packages/grafana-data/src/utils/arrayUtils.ts b/packages/grafana-data/src/utils/arrayUtils.ts index fe56786fedc..843c4d01e95 100644 --- a/packages/grafana-data/src/utils/arrayUtils.ts +++ b/packages/grafana-data/src/utils/arrayUtils.ts @@ -7,6 +7,30 @@ export function moveItemImmutably(arr: T[], from: number, to: number) { return clone; } +/** @internal */ +export function insertBeforeImmutably(array: T[], item: T, index: number): T[] { + if (index < 0 || index > array.length) { + throw new Error('Index out of bounds'); + } + + const clone = [...array]; + clone.splice(index, 0, item); + + return clone; +} + +/** @internal */ +export function insertAfterImmutably(array: T[], item: T, index: number): T[] { + if (index < 0 || index > array.length) { + throw new Error('Index out of bounds'); + } + + const clone = [...array]; + clone.splice(index + 1, 0, item); + + return clone; +} + /** * Given a sort order and a value, return a function that can be used to sort values * Null/undefined/empty string values are always sorted to the end regardless of the sort order provided diff --git a/packages/grafana-data/src/utils/nodeGraph.ts b/packages/grafana-data/src/utils/nodeGraph.ts index b846348a7a7..4cb05d054c3 100644 --- a/packages/grafana-data/src/utils/nodeGraph.ts +++ b/packages/grafana-data/src/utils/nodeGraph.ts @@ -15,7 +15,7 @@ export enum NodeGraphDataFrameFieldNames { // grafana/ui [nodes] icon = 'icon', // Defines a single color if string (hex or html named value) or color mode config can be used as threshold or - // gradient. arc__ fields must not be defined if used [nodes] + // gradient. arc__ fields must not be defined if used [nodes + edges] color = 'color', // Id of the source node [required] [edges] @@ -32,6 +32,10 @@ export enum NodeGraphDataFrameFieldNames { // Thickness of the edge [edges] thickness = 'thickness', - // Whether the node or edge should be highlighted (e.g., shown in red) in the UI + // Whether the node or edge should be highlighted (e.g., shown in red) in the UI [nodes + edges] + // @deprecated -- for edges use color instead highlighted = 'highlighted', + + // Defines the stroke dash array for the edge [edges]. See SVG strokeDasharray definition for syntax. + strokeDasharray = 'strokedasharray', } diff --git a/packages/grafana-data/src/utils/tests/mockDataSource.ts b/packages/grafana-data/src/utils/tests/mockDataSource.ts new file mode 100644 index 00000000000..cfc0d99d6be --- /dev/null +++ b/packages/grafana-data/src/utils/tests/mockDataSource.ts @@ -0,0 +1,69 @@ +import { Observable } from 'rxjs'; + +import { + DataQuery, + DataQueryRequest, + DataQueryResponse, + DataSourceApi, + DataSourceInstanceSettings, + DataSourceJsonData, + DataSourcePluginMeta, + PluginMetaInfo, + PluginType, + TestDataSourceResponse, +} from '../../types'; + +export interface TestQuery extends DataQuery { + query: string; +} + +export interface TestJsonData extends DataSourceJsonData { + url?: string; +} + +const info: PluginMetaInfo = { + author: { + name: '', + }, + description: '', + links: [], + logos: { + large: '', + small: '', + }, + screenshots: [], + updated: '', + version: '', +}; + +export const meta: DataSourcePluginMeta = { + id: '', + name: '', + type: PluginType.datasource, + info, + module: '', + baseUrl: '', +}; + +export const TestDataSettings: DataSourceInstanceSettings = { + jsonData: { url: 'http://localhost:3000' }, + id: 0, + uid: '', + type: '', + name: 'Test Datasource', + meta, + readOnly: false, + access: 'direct', +}; + +export class TestDataSource extends DataSourceApi { + query(request: DataQueryRequest): Promise | Observable { + throw new Error('Method not implemented.'); + } + testDatasource(): Promise { + throw new Error('Method not implemented.'); + } + constructor(instanceSettings: DataSourceInstanceSettings = TestDataSettings) { + super(instanceSettings); + } +} diff --git a/packages/grafana-data/src/valueFormats/categories.ts b/packages/grafana-data/src/valueFormats/categories.ts index 83438456624..79ef525e249 100644 --- a/packages/grafana-data/src/valueFormats/categories.ts +++ b/packages/grafana-data/src/valueFormats/categories.ts @@ -45,6 +45,7 @@ export const getCategories = (): ValueFormatCategory[] => [ id: 'short', fn: scaledUnits(1000, ['', ' K', ' Mil', ' Bil', ' Tri', ' Quadr', ' Quint', ' Sext', ' Sept']), }, + { name: 'SI short', id: 'sishort', fn: SIPrefix('') }, { name: 'Percent (0-100)', id: 'percent', fn: toPercent }, { name: 'Percent (0.0-1.0)', id: 'percentunit', fn: toPercentUnit }, { name: 'Humidity (%H)', id: 'humidity', fn: toFixedUnit('%H') }, diff --git a/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts b/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts index fe230f5023b..4eb18bf8c50 100644 --- a/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts +++ b/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts @@ -102,13 +102,6 @@ export function toMilliSeconds(size: number, decimals?: DecimalCount, scaledDeci return toFixedScaled(size / 31536000000, decimals, ' year'); } -export function trySubstract(value1: DecimalCount, value2: DecimalCount): DecimalCount { - if (value1 !== null && value1 !== undefined && value2 !== null && value2 !== undefined) { - return value1 - value2; - } - return undefined; -} - export function toSeconds(size: number, decimals?: DecimalCount): FormattedValue { if (size === null) { return { text: '' }; diff --git a/packages/grafana-data/src/vector/AppendedVectors.test.ts b/packages/grafana-data/src/vector/AppendedVectors.test.ts deleted file mode 100644 index 29ef1dabe02..00000000000 --- a/packages/grafana-data/src/vector/AppendedVectors.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AppendedVectors } from './AppendedVectors'; -import { ArrayVector } from './ArrayVector'; - -describe('Check Appending Vector', () => { - it('should transparently join them', () => { - jest.spyOn(console, 'warn').mockImplementation(); - const appended = new AppendedVectors(); - appended.append(new ArrayVector([1, 2, 3])); - appended.append(new ArrayVector([4, 5, 6])); - appended.append(new ArrayVector([7, 8, 9])); - expect(appended.length).toEqual(9); - expect(appended[0]).toEqual(1); - expect(appended[1]).toEqual(2); - expect(appended[100]).toEqual(undefined); - - appended.setLength(5); - expect(appended.length).toEqual(5); - appended.append(new ArrayVector(['a', 'b', 'c'])); - expect(appended.length).toEqual(8); - expect(appended.toArray()).toEqual([1, 2, 3, 4, 5, 'a', 'b', 'c']); - - appended.setLength(2); - appended.setLength(6); - appended.append(new ArrayVector(['x', 'y', 'z'])); - expect(appended.toArray()).toEqual([1, 2, undefined, undefined, undefined, undefined, 'x', 'y', 'z']); - }); -}); diff --git a/packages/grafana-data/src/vector/AppendedVectors.ts b/packages/grafana-data/src/vector/AppendedVectors.ts deleted file mode 100644 index af9873a69c2..00000000000 --- a/packages/grafana-data/src/vector/AppendedVectors.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Vector, makeArrayIndexableVector } from '../types/vector'; - -import { FunctionalVector } from './FunctionalVector'; -import { vectorToArray } from './vectorToArray'; - -interface AppendedVectorInfo { - start: number; - end: number; - values: Vector; -} - -/** - * This may be more trouble than it is worth. This trades some computation time for - * RAM -- rather than allocate a new array the size of all previous arrays, this just - * points the correct index to their original array values - * - * @deprecated use a simple Arrays. NOTE this is not used in grafana core - */ -export class AppendedVectors extends FunctionalVector { - length = 0; - source: Array> = []; - - constructor(startAt = 0) { - super(); - this.length = startAt; - return makeArrayIndexableVector(this); - } - - /** - * Make the vector look like it is this long - */ - setLength(length: number) { - if (length > this.length) { - // make the vector longer (filling with undefined) - this.length = length; - } else if (length < this.length) { - // make the array shorter - const sources: Array> = []; - for (const src of this.source) { - sources.push(src); - if (src.end > length) { - src.end = length; - break; - } - } - this.source = sources; - this.length = length; - } - } - - append(v: Vector): AppendedVectorInfo { - const info = { - start: this.length, - end: this.length + v.length, - values: v, - }; - this.length = info.end; - this.source.push(info); - return info; - } - - get(index: number): T { - for (let i = 0; i < this.source.length; i++) { - const src = this.source[i]; - if (index >= src.start && index < src.end) { - return src.values[index - src.start]; - } - } - return undefined as unknown as T; - } - - toArray(): T[] { - return vectorToArray(this); - } - - toJSON(): T[] { - return vectorToArray(this); - } -} diff --git a/packages/grafana-data/src/vector/ArrayVector.test.ts b/packages/grafana-data/src/vector/ArrayVector.test.ts index 3d9ae35fc5f..eb0c53dfa0c 100644 --- a/packages/grafana-data/src/vector/ArrayVector.test.ts +++ b/packages/grafana-data/src/vector/ArrayVector.test.ts @@ -2,6 +2,9 @@ import { Field, FieldType } from '../types'; import { ArrayVector } from './ArrayVector'; +// There's lots of @ts-expect-error here, because we actually expect it to be a typescript error +// to further encourge developers not to use ArrayVector + describe('ArrayVector', () => { beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(); @@ -9,12 +12,14 @@ describe('ArrayVector', () => { it('should init 150k with 65k Array.push() chonking', () => { const arr = Array.from({ length: 150e3 }, (v, i) => i); + /// @ts-expect-error const av = new ArrayVector(arr); expect(av.toArray()).toEqual(arr); }); it('should support add and push', () => { + /// @ts-expect-error const av = new ArrayVector(); av.add(1); av.push(2); @@ -28,17 +33,26 @@ describe('ArrayVector', () => { name: 'test', config: {}, type: FieldType.number, + /// @ts-expect-error values: new ArrayVector(), // this defaults to `new ArrayVector()` }; expect(field).toBeDefined(); // Before collapsing Vector, ReadWriteVector, and MutableVector these all worked fine + + /// @ts-expect-error field.values = new ArrayVector(); + /// @ts-expect-error field.values = new ArrayVector(undefined); + /// @ts-expect-error field.values = new ArrayVector([1, 2, 3]); + /// @ts-expect-error field.values = new ArrayVector([]); + /// @ts-expect-error field.values = new ArrayVector([1, undefined]); + /// @ts-expect-error field.values = new ArrayVector([null]); + /// @ts-expect-error field.values = new ArrayVector(['a', 'b', 'c']); expect(field.values.length).toBe(3); }); diff --git a/packages/grafana-data/src/vector/ArrayVector.ts b/packages/grafana-data/src/vector/ArrayVector.ts index 01b615162b7..0673f12f74a 100644 --- a/packages/grafana-data/src/vector/ArrayVector.ts +++ b/packages/grafana-data/src/vector/ArrayVector.ts @@ -6,12 +6,12 @@ let notified = false; * * @deprecated use a simple Array */ -export class ArrayVector extends Array { +export class ArrayVector extends Array { get buffer() { return this; } - set buffer(values: any[]) { + set buffer(values: T[]) { this.length = 0; const len = values?.length; @@ -27,10 +27,10 @@ export class ArrayVector extends Array { } /** - * This any type is here to make the change type changes in v10 non breaking for plugins. - * Before you could technically assign field.values any typed ArrayVector no matter what the Field T type was. + * ArrayVector is deprecated and should not be used. If you get a Typescript error here, use plain arrays for field.values. */ - constructor(buffer?: any[]) { + // `never` is used to force a build-type error from Typescript to encourage developers to move away from using this + constructor(buffer: never) { super(); this.buffer = buffer ?? []; diff --git a/packages/grafana-data/src/vector/AsNumberVector.ts b/packages/grafana-data/src/vector/AsNumberVector.ts deleted file mode 100644 index cc47ad3d7ec..00000000000 --- a/packages/grafana-data/src/vector/AsNumberVector.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Vector } from '../types'; - -/** - * This will force all values to be numbers - * - * @public - * @deprecated use a simple Arrays. NOTE: Not used in grafana core - */ -export class AsNumberVector extends Array { - constructor(field: Vector) { - super(); - return field.map((v) => +v); - } -} diff --git a/packages/grafana-data/src/vector/BinaryOperationVector.test.ts b/packages/grafana-data/src/vector/BinaryOperationVector.test.ts deleted file mode 100644 index 10ab760f1bb..00000000000 --- a/packages/grafana-data/src/vector/BinaryOperationVector.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { binaryOperators, BinaryOperationID } from '../utils/binaryOperators'; - -import { ArrayVector } from './ArrayVector'; -import { BinaryOperationVector } from './BinaryOperationVector'; -import { ConstantVector } from './ConstantVector'; - -describe('ScaledVector', () => { - it('should support multiply operations', () => { - jest.spyOn(console, 'warn').mockImplementation(); - const source = new ArrayVector([1, 2, 3, 4]); - const scale = 2.456; - const operation = binaryOperators.get(BinaryOperationID.Multiply).operation; - const v = new BinaryOperationVector(source, new ConstantVector(scale, source.length), operation); - expect(v.length).toEqual(source.length); - // Accessed with getters - for (let i = 0; i < 4; i++) { - expect(v.get(i)).toEqual(source.get(i) * scale); - } - // Accessed with array index - for (let i = 0; i < 4; i++) { - expect(v[i]).toEqual(source[i] * scale); - } - }); -}); diff --git a/packages/grafana-data/src/vector/BinaryOperationVector.ts b/packages/grafana-data/src/vector/BinaryOperationVector.ts deleted file mode 100644 index 4848e040e2f..00000000000 --- a/packages/grafana-data/src/vector/BinaryOperationVector.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Vector } from '../types/vector'; -import { BinaryOperation } from '../utils/binaryOperators'; - -/** - * @public - * @deprecated use a simple Arrays. NOTE: Not used in grafana core - */ -export class BinaryOperationVector extends Array { - constructor(left: Vector, right: Vector, operation: BinaryOperation) { - super(); - - const arr = new Array(left.length); - for (let i = 0; i < arr.length; i++) { - arr[i] = operation(left[i], right[i]); - } - return arr; - } -} diff --git a/packages/grafana-data/src/vector/CircularVector.ts b/packages/grafana-data/src/vector/CircularVector.ts index fa3bd2503a8..221f7c488e5 100644 --- a/packages/grafana-data/src/vector/CircularVector.ts +++ b/packages/grafana-data/src/vector/CircularVector.ts @@ -1,5 +1,3 @@ -import { makeArrayIndexableVector } from '../types'; - import { FunctionalVector } from './FunctionalVector'; interface CircularOptions { @@ -36,7 +34,27 @@ export class CircularVector extends FunctionalVector { if (options.capacity) { this.setCapacity(options.capacity); } - return makeArrayIndexableVector(this); + return new Proxy(this, { + get(target: CircularVector, property: string, receiver: CircularVector) { + if (typeof property !== 'symbol') { + const idx = +property; + if (String(idx) === property) { + return target.get(idx); + } + } + return Reflect.get(target, property, receiver); + }, + set(target: CircularVector, property: string, value: T, receiver: CircularVector) { + if (typeof property !== 'symbol') { + const idx = +property; + if (String(idx) === property) { + target.set(idx, value); + return true; + } + } + return Reflect.set(target, property, value, receiver); + }, + }); } /** diff --git a/packages/grafana-data/src/vector/ConstantVector.test.ts b/packages/grafana-data/src/vector/ConstantVector.test.ts deleted file mode 100644 index 2d94fc34428..00000000000 --- a/packages/grafana-data/src/vector/ConstantVector.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ConstantVector } from './ConstantVector'; - -describe('ConstantVector', () => { - it('should support constant values', () => { - const value = 3.5; - const v = new ConstantVector(value, 7); - expect(v.length).toEqual(7); - - expect(v.get(0)).toEqual(value); - expect(v.get(1)).toEqual(value); - - // Now check all of them - for (let i = 0; i < 7; i++) { - expect(v.get(i)).toEqual(value); - expect(v[i]).toEqual(value); - } - }); -}); diff --git a/packages/grafana-data/src/vector/ConstantVector.ts b/packages/grafana-data/src/vector/ConstantVector.ts deleted file mode 100644 index 0eb19fc7636..00000000000 --- a/packages/grafana-data/src/vector/ConstantVector.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @public - * @deprecated use a simple Arrays. NOTE: Not used in grafana core. - */ -export class ConstantVector extends Array { - constructor(value: T, len: number) { - super(); - return new Array(len).fill(value); - } -} diff --git a/packages/grafana-data/src/vector/FormattedVector.ts b/packages/grafana-data/src/vector/FormattedVector.ts deleted file mode 100644 index 8e4cd9be949..00000000000 --- a/packages/grafana-data/src/vector/FormattedVector.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { DisplayProcessor } from '../types'; -import { Vector } from '../types/vector'; -import { formattedValueToString } from '../valueFormats'; - -/** - * @public - * @deprecated use a simple Arrays. NOTE: not used in grafana core. - */ -export class FormattedVector extends Array { - constructor(source: Vector, formatter: DisplayProcessor) { - super(); - return source.map((v) => formattedValueToString(formatter(v))); - } -} diff --git a/packages/grafana-data/src/vector/FunctionalVector.ts b/packages/grafana-data/src/vector/FunctionalVector.ts index 5c2984c4b72..bcd13d96090 100644 --- a/packages/grafana-data/src/vector/FunctionalVector.ts +++ b/packages/grafana-data/src/vector/FunctionalVector.ts @@ -1,12 +1,8 @@ -import { Vector } from '../types'; - -import { vectorToArray } from './vectorToArray'; - /** * @public * @deprecated use a simple Arrays */ -export abstract class FunctionalVector implements Vector { +export abstract class FunctionalVector { abstract get length(): number; abstract get(index: number): T; @@ -55,7 +51,11 @@ export abstract class FunctionalVector implements Vector { } toArray(): T[] { - return vectorToArray(this); + const arr = new Array(this.length); + for (let i = 0; i < this.length; i++) { + arr[i] = this.get(i); + } + return arr; } join(separator?: string | undefined): string { @@ -183,7 +183,7 @@ const emptyarray: any[] = []; * * @deprecated use a simple Arrays */ -export function vectorator(vector: Vector) { +export function vectorator(vector: FunctionalVector) { return { *[Symbol.iterator]() { for (let i = 0; i < vector.length; i++) { diff --git a/packages/grafana-data/src/vector/IndexVector.ts b/packages/grafana-data/src/vector/IndexVector.ts deleted file mode 100644 index 1dfeb92ab36..00000000000 --- a/packages/grafana-data/src/vector/IndexVector.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Field, FieldType } from '../types'; - -/** - * IndexVector is a simple vector implementation that returns the index value - * for each element in the vector. It is functionally equivolant a vector backed - * by an array with values: `[0,1,2,...,length-1]` - * - * @deprecated use a simple Arrays. NOTE: not used in grafana core - */ -export class IndexVector extends Array { - constructor(len: number) { - super(); - const arr = new Array(len); - for (let i = 0; i < len; i++) { - arr[i] = i; - } - return arr; - } - - /** - * Returns a field representing the range [0 ... length-1] - * - * @deprecated - */ - static newField(len: number): Field { - return { - name: '', - values: new IndexVector(len), - type: FieldType.number, - config: { - min: 0, - max: len - 1, - }, - }; - } -} diff --git a/packages/grafana-data/src/vector/SortedVector.test.ts b/packages/grafana-data/src/vector/SortedVector.test.ts deleted file mode 100644 index 0d7a6c556a4..00000000000 --- a/packages/grafana-data/src/vector/SortedVector.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ArrayVector } from './ArrayVector'; -import { SortedVector } from './SortedVector'; - -describe('SortedVector', () => { - it('Should support sorting', () => { - jest.spyOn(console, 'warn').mockImplementation(); - const values = new ArrayVector([1, 5, 2, 4]); - const sorted = new SortedVector(values, [0, 2, 3, 1]); - expect(sorted.toArray()).toEqual([1, 2, 4, 5]); - - // The proxy should still be an instance of SortedVector (used in timeseries) - expect(sorted instanceof SortedVector).toBeTruthy(); - }); -}); diff --git a/packages/grafana-data/src/vector/SortedVector.ts b/packages/grafana-data/src/vector/SortedVector.ts deleted file mode 100644 index 8ed64671688..00000000000 --- a/packages/grafana-data/src/vector/SortedVector.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { makeArrayIndexableVector, Vector } from '../types/vector'; - -import { FunctionalVector } from './FunctionalVector'; -import { vectorToArray } from './vectorToArray'; - -/** - * Values are returned in the order defined by the input parameter - * - * @deprecated use a simple Arrays - */ -export class SortedVector extends FunctionalVector { - constructor( - private source: Vector, - private order: number[] - ) { - super(); - return makeArrayIndexableVector(this); - } - - get length(): number { - return this.source.length; - } - - get(index: number): T { - return this.source.get(this.order[index]); - } - - toArray(): T[] { - return vectorToArray(this); - } - - toJSON(): T[] { - return vectorToArray(this); - } - - getOrderArray(): number[] { - return this.order; - } -} diff --git a/packages/grafana-data/src/vector/index.ts b/packages/grafana-data/src/vector/index.ts deleted file mode 100644 index 5401189d278..00000000000 --- a/packages/grafana-data/src/vector/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from './AppendedVectors'; -export * from './ArrayVector'; -export * from './CircularVector'; -export * from './ConstantVector'; -export * from './BinaryOperationVector'; -export * from './SortedVector'; -export * from './FormattedVector'; -export * from './IndexVector'; -export * from './AsNumberVector'; - -export { vectorator } from './FunctionalVector'; diff --git a/packages/grafana-data/src/vector/vectorToArray.ts b/packages/grafana-data/src/vector/vectorToArray.ts deleted file mode 100644 index 7ec23d9c261..00000000000 --- a/packages/grafana-data/src/vector/vectorToArray.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Vector } from '../types/vector'; - -/** @deprecated use a simple Arrays */ -export function vectorToArray(v: Vector): T[] { - const arr: T[] = Array(v.length); - for (let i = 0; i < v.length; i++) { - arr[i] = v.get(i); - } - return arr; -} diff --git a/packages/grafana-e2e-selectors/package.json b/packages/grafana-e2e-selectors/package.json index d408b3eea89..1627b9e6768 100644 --- a/packages/grafana-e2e-selectors/package.json +++ b/packages/grafana-e2e-selectors/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/e2e-selectors", - "version": "10.4.3", + "version": "11.0.0", "description": "Grafana End-to-End Test Selectors Library", "keywords": [ "cli", @@ -39,9 +39,8 @@ "postpack": "mv package.json.bak package.json" }, "devDependencies": { - "@rollup/plugin-commonjs": "25.0.7", "@rollup/plugin-node-resolve": "15.2.3", - "@types/node": "20.11.19", + "@types/node": "20.11.30", "esbuild": "0.18.12", "rimraf": "5.0.5", "rollup": "2.79.1", @@ -50,7 +49,7 @@ "rollup-plugin-node-externals": "^5.0.0" }, "dependencies": { - "@grafana/tsconfig": "^1.2.0-rc1", + "@grafana/tsconfig": "^1.3.0-rc1", "tslib": "2.6.2", "typescript": "5.3.3" } diff --git a/packages/grafana-e2e-selectors/src/selectors/components.ts b/packages/grafana-e2e-selectors/src/selectors/components.ts index 82c905e8c4e..84914fa5d75 100644 --- a/packages/grafana-e2e-selectors/src/selectors/components.ts +++ b/packages/grafana-e2e-selectors/src/selectors/components.ts @@ -212,6 +212,11 @@ export const Components = { rcContentWrapper: () => '.rc-drawer-content-wrapper', subtitle: 'data-testid drawer subtitle', }, + DashboardSaveDrawer: { + saveButton: 'data-testid Save dashboard drawer button', + saveAsButton: 'data-testid Save as dashboard drawer button', + saveAsTitleInput: 'Save dashboard title field', + }, }, PanelEditor: { General: { @@ -221,6 +226,7 @@ export const Components = { content: 'Panel editor option pane content', select: 'Panel editor option pane select', fieldLabel: (type: string) => `${type} field property editor`, + fieldInput: (title: string) => `data-testid Panel editor option pane field input ${title}`, }, // not sure about the naming *DataPane* DataPane: { @@ -277,6 +283,8 @@ export const Components = { queryInspectorButton: 'Query inspector button', queryHistoryButton: 'data-testid query-history-button', addQuery: 'data-testid query-tab-add-query', + queryGroupTopSection: 'data-testid query group top section', + addExpression: 'data-testid query-tab-add-expression', }, QueryHistory: { queryText: 'Query text', @@ -292,6 +300,11 @@ export const Components = { AlertTab: { content: 'data-testid Alert editor tab content', }, + AlertRules: { + groupToggle: 'data-testid group-collapse-toggle', + toggle: 'data-testid collapse-toggle', + expandedContent: 'data-testid expanded-content', + }, Alert: { /** * @deprecated use alertV2 from Grafana 8.3 instead @@ -355,7 +368,25 @@ export const Components = { }, NavToolbar: { container: 'data-testid Nav toolbar', + shareDashboard: 'data-testid Share dashboard', + markAsFavorite: 'data-testid Mark as favorite', + editDashboard: { + editButton: 'data-testid Edit dashboard button', + saveButton: 'data-testid Save dashboard button', + exitButton: 'data-testid Exit edit mode button', + settingsButton: 'data-testid Dashboard settings', + addRowButton: 'data-testid Add row button', + addLibraryPanelButton: 'data-testid Add a panel from the panel library button', + addVisualizationButton: 'data-testid Add new visualization menu item', + pastePanelButton: 'data-testid Paste panel button', + discardChangesButton: 'data-testid Discard changes button', + discardLibraryPanelButton: 'data-testid Discard library panel button', + unlinkLibraryPanelButton: 'data-testid Unlink library panel button', + saveLibraryPanelButton: 'data-testid Save library panel button', + backToDashboardButton: 'data-testid Back to dashboard button', + }, }, + PageToolbar: { container: () => '.page-toolbar', item: (tooltip: string) => `${tooltip}`, @@ -416,6 +447,7 @@ export const Components = { */ container: 'Time zone picker select container', containerV2: 'data-testid Time zone picker select container', + changeTimeSettingsButton: 'data-testid Time zone picker Change time settings button', }, WeekStartPicker: { /** @@ -527,8 +559,30 @@ export const Components = { Annotations: { annotationsTypeInput: 'annotations-type-input', annotationsChoosePanelInput: 'choose-panels-input', + editor: { + testButton: 'data-testid annotations-test-button', + resultContainer: 'data-testid annotations-query-result-container', + }, }, Tooltip: { container: 'data-testid tooltip', }, + ReturnToPrevious: { + buttonGroup: 'data-testid dismissable button group', + backButton: 'data-testid back', + dismissButton: 'data-testid dismiss', + }, + SQLQueryEditor: { + selectColumn: 'data-testid select-column', + selectAggregation: 'data-testid select-aggregation', + selectAlias: 'data-testid select-alias', + filterConjunction: 'data-testid filter-conjunction', + filterField: 'data-testid filter-field', + filterOperator: 'data-testid filter-operator', + headerTableSelector: 'data-testid header-table-selector', + headerFilterSwitch: 'data-testid header-filter-switch', + headerGroupSwitch: 'data-testid header-group-switch', + headerOrderSwitch: 'data-testid header-order-switch', + headerPreviewSwitch: 'data-testid header-preview-switch', + }, }; diff --git a/packages/grafana-e2e-selectors/src/selectors/pages.ts b/packages/grafana-e2e-selectors/src/selectors/pages.ts index 3fb85a71772..c687b2033b4 100644 --- a/packages/grafana-e2e-selectors/src/selectors/pages.ts +++ b/packages/grafana-e2e-selectors/src/selectors/pages.ts @@ -57,6 +57,12 @@ export const Pages = { navV2: 'data-testid Dashboard navigation', publicDashboardTag: 'data-testid public dashboard tag', shareButton: 'data-testid share-button', + scrollContainer: 'data-testid Dashboard canvas scroll container', + playlistControls: { + prev: 'data-testid playlist previous dashboard button', + stop: 'data-testid playlist stop dashboard button', + next: 'data-testid playlist next dashboard button', + }, }, SubMenu: { submenu: 'Dashboard submenu', @@ -190,6 +196,7 @@ export const Pages = { AdHocFiltersVariable: { datasourceSelect: Components.DataSourcePicker.inputV2, infoText: 'data-testid ad-hoc filters variable info text', + modeToggle: 'data-testid ad-hoc filters variable mode toggle', }, }, }, @@ -220,6 +227,7 @@ export const Pages = { save: 'Dashboard settings Save Dashboard Modal Save button', saveVariables: 'Dashboard settings Save Dashboard Modal Save variables checkbox', saveTimerange: 'Dashboard settings Save Dashboard Modal Save timerange checkbox', + saveRefresh: 'Dashboard settings Save Dashboard Modal Save refresh checkbox', }, SharePanelModal: { linkToRenderedImage: 'Link to rendered image', @@ -251,6 +259,9 @@ export const Pages = { ReshareLink: 'data-testid public dashboard reshare link button', }, }, + PublicDashboardScene: { + Tab: 'Tab Public Dashboard', + }, }, PublicDashboard: { page: 'public-dashboard-page', @@ -259,6 +270,12 @@ export const Pages = { title: 'public-dashboard-title', pausedDescription: 'public-dashboard-paused-description', }, + footer: 'public-dashboard-footer', + }, + PublicDashboardScene: { + loadingPage: 'public-dashboard-scene-loading-page', + page: 'public-dashboard-scene-page', + controls: 'public-dashboard-controls', }, RequestViewAccess: { form: 'request-view-access-form', diff --git a/packages/grafana-e2e/README.md b/packages/grafana-e2e/README.md index 48e8a285956..a488db87725 100644 --- a/packages/grafana-e2e/README.md +++ b/packages/grafana-e2e/README.md @@ -1,5 +1,5 @@ # Grafana End-to-End Test library -> **@grafana/e2e is currently in BETA**. - -This package contains an API wrapper built on top of [Cypress](https://www.cypress.io) that simplifies creating end-to-end tests for Grafana. More information can be found [here](https://github.com/grafana/grafana/blob/main/contribute/style-guides/e2e.md). +> [!CAUTION] +> This package is deprecated. +> If you'd like to write end-to-end tests for a Grafana plugin (core or external), use the [`@grafana/plugin-e2e`](https://grafana.com/developers/plugin-tools/e2e-test-a-plugin/introduction) package. diff --git a/packages/grafana-e2e/package.json b/packages/grafana-e2e/package.json index f66374aee76..440847c560f 100644 --- a/packages/grafana-e2e/package.json +++ b/packages/grafana-e2e/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/e2e", - "version": "10.4.3", + "version": "11.0.0", "description": "Grafana End-to-End Test Library", "keywords": [ "cli", @@ -63,9 +63,9 @@ "@babel/core": "7.23.2", "@babel/preset-env": "7.23.2", "@cypress/webpack-preprocessor": "5.17.1", - "@grafana/e2e-selectors": "10.4.3", - "@grafana/schema": "10.4.3", - "@grafana/tsconfig": "^1.2.0-rc1", + "@grafana/e2e-selectors": "11.0.0", + "@grafana/schema": "11.0.0", + "@grafana/tsconfig": "^1.3.0-rc1", "@mochajs/json-file-reporter": "^1.2.0", "babel-loader": "9.1.3", "blink-diff": "1.0.13", diff --git a/packages/grafana-eslint-rules/README.md b/packages/grafana-eslint-rules/README.md index cf90384e326..1bd800c979e 100644 --- a/packages/grafana-eslint-rules/README.md +++ b/packages/grafana-eslint-rules/README.md @@ -1,6 +1,6 @@ # Grafana ESLint Rules -This package contains custom eslint rules for use within the Grafana codebase only. They're extremley specific to our codebase, and are of little use to anyone else. They're not published to NPM, and are consumed through the Yarn workspace. +This package contains custom eslint rules for use within the Grafana codebase only. They're extremely specific to our codebase, and are of little use to anyone else. They're not published to NPM, and are consumed through the Yarn workspace. ## Rules diff --git a/packages/grafana-eslint-rules/package.json b/packages/grafana-eslint-rules/package.json index 84d0bbbeafe..1f50e448df0 100644 --- a/packages/grafana-eslint-rules/package.json +++ b/packages/grafana-eslint-rules/package.json @@ -1,7 +1,7 @@ { "name": "@grafana/eslint-plugin", "description": "ESLint rules for use within the Grafana repo. Not suitable (or supported) for external use.", - "version": "10.4.3", + "version": "11.0.0", "main": "./index.cjs", "author": "Grafana Labs", "license": "Apache-2.0", @@ -15,7 +15,7 @@ }, "devDependencies": { "@typescript-eslint/types": "^6.0.0", - "eslint": "8.56.0", + "eslint": "8.57.0", "tslib": "2.6.2" }, "private": true diff --git a/packages/grafana-flamegraph/package.json b/packages/grafana-flamegraph/package.json index 98ca7c112e2..cb53ea14c80 100644 --- a/packages/grafana-flamegraph/package.json +++ b/packages/grafana-flamegraph/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/flamegraph", - "version": "10.4.3", + "version": "11.0.0", "description": "Grafana flamegraph visualization component", "keywords": [ "grafana", @@ -44,30 +44,30 @@ ], "dependencies": { "@emotion/css": "11.11.2", - "@grafana/data": "10.4.3", - "@grafana/ui": "10.4.3", + "@grafana/data": "11.0.0", + "@grafana/ui": "11.0.0", "@leeoniya/ufuzzy": "1.0.14", "d3": "^7.8.5", "lodash": "4.17.21", "react": "18.2.0", "react-use": "17.5.0", - "react-virtualized-auto-sizer": "1.0.22", + "react-virtualized-auto-sizer": "1.0.24", "tinycolor2": "1.6.0", "tslib": "2.6.2" }, "devDependencies": { - "@babel/core": "7.23.9", - "@babel/preset-env": "7.23.9", - "@babel/preset-react": "7.23.3", - "@grafana/tsconfig": "^1.2.0-rc1", + "@babel/core": "7.24.3", + "@babel/preset-env": "7.24.3", + "@babel/preset-react": "7.24.1", + "@grafana/tsconfig": "^1.3.0-rc1", "@rollup/plugin-node-resolve": "15.2.3", "@testing-library/jest-dom": "^6.1.2", - "@testing-library/react": "14.2.1", + "@testing-library/react": "14.2.2", "@testing-library/user-event": "14.5.2", "@types/d3": "^7", "@types/jest": "^29.5.4", - "@types/lodash": "4.14.202", - "@types/react": "18.2.55", + "@types/lodash": "4.17.0", + "@types/react": "18.2.73", "@types/react-virtualized-auto-sizer": "1.0.4", "@types/tinycolor2": "1.4.6", "babel-jest": "29.7.0", @@ -82,7 +82,7 @@ "typescript": "5.3.3" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } } diff --git a/packages/grafana-flamegraph/src/FlameGraph/FlameGraph.test.tsx b/packages/grafana-flamegraph/src/FlameGraph/FlameGraph.test.tsx index 93fb6b71eb3..90fdf831406 100644 --- a/packages/grafana-flamegraph/src/FlameGraph/FlameGraph.test.tsx +++ b/packages/grafana-flamegraph/src/FlameGraph/FlameGraph.test.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { createDataFrame } from '@grafana/data'; -import { ColorScheme } from '../types'; +import { ColorScheme, SelectedView } from '../types'; import FlameGraph from './FlameGraph'; import { FlameGraphDataContainer } from './dataTransform'; @@ -23,7 +23,7 @@ jest.mock('react-use', () => { }); describe('FlameGraph', () => { - function setup() { + function setup(props?: Partial>) { const flameGraphData = createDataFrame(data); const container = new FlameGraphDataContainer(flameGraphData, { collapsing: true }); @@ -47,6 +47,9 @@ describe('FlameGraph', () => { onFocusPillClick={onFocusPillClick} onSandwichPillClick={onSandwichPillClick} colorScheme={ColorScheme.ValueBased} + selectedView={SelectedView.FlameGraph} + search={''} + {...props} /> ); return { @@ -80,18 +83,31 @@ describe('FlameGraph', () => { expect(screen.getByText('16.5 Bil | 16.5 Bil samples (Count)')).toBeDefined(); }); - it('should render context menu', async () => { + it('should render context menu + extra items', async () => { const event = new MouseEvent('click', { bubbles: true }); Object.defineProperty(event, 'offsetX', { get: () => 10 }); Object.defineProperty(event, 'offsetY', { get: () => 10 }); Object.defineProperty(HTMLCanvasElement.prototype, 'clientWidth', { configurable: true, value: 500 }); - setup(); + setup({ + getExtraContextMenuButtons: (clickedItemData, data, state) => { + expect(clickedItemData).toMatchObject({ posX: 0, posY: 0, label: 'total' }); + expect(data.length).toEqual(1101); + expect(state).toEqual({ + selectedView: SelectedView.FlameGraph, + isDiff: false, + search: '', + collapseConfig: undefined, + }); + return [{ label: 'test extra item', icon: 'eye', onClick: () => {} }]; + }, + }); const canvas = screen.getByTestId('flameGraph') as HTMLCanvasElement; expect(canvas).toBeInTheDocument(); expect(screen.queryByTestId('contextMenu')).not.toBeInTheDocument(); fireEvent(canvas, event); expect(screen.getByTestId('contextMenu')).toBeInTheDocument(); + expect(screen.getByText('test extra item')).toBeInTheDocument(); }); }); diff --git a/packages/grafana-flamegraph/src/FlameGraph/FlameGraph.tsx b/packages/grafana-flamegraph/src/FlameGraph/FlameGraph.tsx index 6bd6bb1ab9f..0a207cb94ea 100644 --- a/packages/grafana-flamegraph/src/FlameGraph/FlameGraph.tsx +++ b/packages/grafana-flamegraph/src/FlameGraph/FlameGraph.tsx @@ -22,9 +22,10 @@ import React, { useEffect, useState } from 'react'; import { Icon } from '@grafana/ui'; import { PIXELS_PER_LEVEL } from '../constants'; -import { ClickedItemData, ColorScheme, ColorSchemeDiff, TextAlign } from '../types'; +import { ClickedItemData, ColorScheme, ColorSchemeDiff, SelectedView, TextAlign } from '../types'; import FlameGraphCanvas from './FlameGraphCanvas'; +import { GetExtraContextMenuButtonsFunction } from './FlameGraphContextMenu'; import FlameGraphMetadata from './FlameGraphMetadata'; import { CollapsedMap, FlameGraphDataContainer, LevelItem } from './dataTransform'; @@ -45,7 +46,10 @@ type Props = { onSandwichPillClick: () => void; colorScheme: ColorScheme | ColorSchemeDiff; showFlameGraphOnly?: boolean; + getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction; collapsing?: boolean; + selectedView: SelectedView; + search: string; }; const FlameGraph = ({ @@ -64,7 +68,10 @@ const FlameGraph = ({ onSandwichPillClick, colorScheme, showFlameGraphOnly, + getExtraContextMenuButtons, collapsing, + selectedView, + search, }: Props) => { const styles = getStyles(); @@ -122,7 +129,10 @@ const FlameGraph = ({ showFlameGraphOnly, collapsedMap, setCollapsedMap, + getExtraContextMenuButtons, collapsing, + search, + selectedView, }; const canvas = levelsCallers ? ( <> diff --git a/packages/grafana-flamegraph/src/FlameGraph/FlameGraphCanvas.tsx b/packages/grafana-flamegraph/src/FlameGraph/FlameGraphCanvas.tsx index c5b067abea2..3d4f43a644e 100644 --- a/packages/grafana-flamegraph/src/FlameGraph/FlameGraphCanvas.tsx +++ b/packages/grafana-flamegraph/src/FlameGraph/FlameGraphCanvas.tsx @@ -3,9 +3,9 @@ import React, { MouseEvent as ReactMouseEvent, useCallback, useEffect, useRef, u import { useMeasure } from 'react-use'; import { PIXELS_PER_LEVEL } from '../constants'; -import { ClickedItemData, ColorScheme, ColorSchemeDiff, TextAlign } from '../types'; +import { ClickedItemData, ColorScheme, ColorSchemeDiff, SelectedView, TextAlign } from '../types'; -import FlameGraphContextMenu from './FlameGraphContextMenu'; +import FlameGraphContextMenu, { GetExtraContextMenuButtonsFunction } from './FlameGraphContextMenu'; import FlameGraphTooltip from './FlameGraphTooltip'; import { CollapseConfig, CollapsedMap, FlameGraphDataContainer, LevelItem } from './dataTransform'; import { getBarX, useFlameRender } from './rendering'; @@ -37,6 +37,10 @@ type Props = { collapsedMap: CollapsedMap; setCollapsedMap: (collapsedMap: CollapsedMap) => void; collapsing?: boolean; + getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction; + + selectedView: SelectedView; + search: string; }; const FlameGraphCanvas = ({ @@ -61,6 +65,9 @@ const FlameGraphCanvas = ({ collapsedMap, setCollapsedMap, collapsing, + getExtraContextMenuButtons, + selectedView, + search, }: Props) => { const styles = getStyles(); @@ -186,6 +193,7 @@ const FlameGraphCanvas = ({ /> {!showFlameGraphOnly && clickedItemData && ( i.collapsed)} allGroupsExpanded={Array.from(collapsedMap.values()).every((i) => !i.collapsed)} + getExtraContextMenuButtons={getExtraContextMenuButtons} + selectedView={selectedView} + search={search} /> )}
diff --git a/packages/grafana-flamegraph/src/FlameGraph/FlameGraphContextMenu.tsx b/packages/grafana-flamegraph/src/FlameGraph/FlameGraphContextMenu.tsx index 3a370f5dc86..c84d4810f42 100644 --- a/packages/grafana-flamegraph/src/FlameGraph/FlameGraphContextMenu.tsx +++ b/packages/grafana-flamegraph/src/FlameGraph/FlameGraphContextMenu.tsx @@ -1,12 +1,26 @@ import React from 'react'; -import { MenuItem, MenuGroup, ContextMenu } from '@grafana/ui'; +import { DataFrame } from '@grafana/data'; +import { MenuItem, MenuGroup, ContextMenu, IconName } from '@grafana/ui'; -import { ClickedItemData } from '../types'; +import { ClickedItemData, SelectedView } from '../types'; -import { CollapseConfig } from './dataTransform'; +import { CollapseConfig, FlameGraphDataContainer } from './dataTransform'; + +export type GetExtraContextMenuButtonsFunction = ( + clickedItemData: ClickedItemData, + data: DataFrame, + state: { selectedView: SelectedView; isDiff: boolean; search: string; collapseConfig?: CollapseConfig } +) => ExtraContextMenuButton[]; + +export type ExtraContextMenuButton = { + label: string; + icon: IconName; + onClick: () => void; +}; type Props = { + data: FlameGraphDataContainer; itemData: ClickedItemData; onMenuItemClick: () => void; onItemFocus: () => void; @@ -15,13 +29,17 @@ type Props = { onCollapseGroup: () => void; onExpandAllGroups: () => void; onCollapseAllGroups: () => void; + getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction; collapseConfig?: CollapseConfig; collapsing?: boolean; allGroupsCollapsed?: boolean; allGroupsExpanded?: boolean; + selectedView: SelectedView; + search: string; }; const FlameGraphContextMenu = ({ + data, itemData, onMenuItemClick, onItemFocus, @@ -31,11 +49,21 @@ const FlameGraphContextMenu = ({ onCollapseGroup, onExpandAllGroups, onCollapseAllGroups, + getExtraContextMenuButtons, collapsing, allGroupsExpanded, allGroupsCollapsed, + selectedView, + search, }: Props) => { function renderItems() { + const extraButtons = + getExtraContextMenuButtons?.(itemData, data.data, { + selectedView, + isDiff: data.isDiffFlamegraph(), + search, + collapseConfig, + }) || []; return ( <> - + {extraButtons.map(({ label, icon, onClick }) => { + return onClick()} key={label} />; + })} {collapsing && ( {collapseConfig ? ( diff --git a/packages/grafana-flamegraph/src/FlameGraph/dataTransform.ts b/packages/grafana-flamegraph/src/FlameGraph/dataTransform.ts index 1fb84619476..142500c926e 100644 --- a/packages/grafana-flamegraph/src/FlameGraph/dataTransform.ts +++ b/packages/grafana-flamegraph/src/FlameGraph/dataTransform.ts @@ -272,7 +272,7 @@ export class FlameGraphDataContainer { } isDiffFlamegraph() { - return this.valueRightField && this.selfRightField; + return Boolean(this.valueRightField && this.selfRightField); } getLabel(index: number) { diff --git a/packages/grafana-flamegraph/src/FlameGraphContainer.tsx b/packages/grafana-flamegraph/src/FlameGraphContainer.tsx index df8435c0dad..c4962e5b181 100644 --- a/packages/grafana-flamegraph/src/FlameGraphContainer.tsx +++ b/packages/grafana-flamegraph/src/FlameGraphContainer.tsx @@ -7,6 +7,7 @@ import { DataFrame, GrafanaTheme2 } from '@grafana/data'; import { ThemeContext } from '@grafana/ui'; import FlameGraph from './FlameGraph/FlameGraph'; +import { GetExtraContextMenuButtonsFunction } from './FlameGraph/FlameGraphContextMenu'; import { FlameGraphDataContainer } from './FlameGraph/dataTransform'; import FlameGraphHeader from './FlameGraphHeader'; import FlameGraphTopTableContainer from './TopTable/FlameGraphTopTableContainer'; @@ -52,6 +53,11 @@ export type Props = { */ extraHeaderElements?: React.ReactNode; + /** + * Extra buttons that will be shown in the context menu when user clicks on a Node. + */ + getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction; + /** * If true the flamegraph will be rendered on top of the table. */ @@ -80,6 +86,7 @@ const FlameGraphContainer = ({ vertical, showFlameGraphOnly, disableCollapsing, + getExtraContextMenuButtons, }: Props) => { const [focusedItemData, setFocusedItemData] = useState(); @@ -169,6 +176,9 @@ const FlameGraphContainer = ({ colorScheme={colorScheme} showFlameGraphOnly={showFlameGraphOnly} collapsing={!disableCollapsing} + getExtraContextMenuButtons={getExtraContextMenuButtons} + selectedView={selectedView} + search={search} /> ); @@ -238,7 +248,7 @@ const FlameGraphContainer = ({ stickyHeader={Boolean(stickyHeader)} extraHeaderElements={extraHeaderElements} vertical={vertical} - isDiffMode={Boolean(dataContainer.isDiffFlamegraph())} + isDiffMode={dataContainer.isDiffFlamegraph()} /> )} diff --git a/packages/grafana-flamegraph/src/types.ts b/packages/grafana-flamegraph/src/types.ts index c4616a26847..aa8a84de882 100644 --- a/packages/grafana-flamegraph/src/types.ts +++ b/packages/grafana-flamegraph/src/types.ts @@ -1,5 +1,9 @@ import { LevelItem } from './FlameGraph/dataTransform'; +export { type FlameGraphDataContainer } from './FlameGraph/dataTransform'; + +export { type ExtraContextMenuButton } from './FlameGraph/FlameGraphContextMenu'; + export type ClickedItemData = { posX: number; posY: number; diff --git a/packages/grafana-icons/.gitignore b/packages/grafana-icons/.gitignore new file mode 100644 index 00000000000..61e79a90563 --- /dev/null +++ b/packages/grafana-icons/.gitignore @@ -0,0 +1,7 @@ +.idea +dist +node_modules +compiled +/icons-gen/ +/src/icons-gen/ +/src/index.ts diff --git a/packages/grafana-icons/.svgrrc.cjs b/packages/grafana-icons/.svgrrc.cjs new file mode 100644 index 00000000000..2c1c29451bf --- /dev/null +++ b/packages/grafana-icons/.svgrrc.cjs @@ -0,0 +1,32 @@ +/** + * Reference: https://react-svgr.com/docs/options/ + */ +module.exports = { + icon: '{dir}/[name].gen.js', + typescript: true, + jsxRuntime: 'automatic', + outDir: './src/icons-gen', + template: require('./templates/icon.cjs'), + indexTemplate: require('./templates/index.cjs'), + memo: true, + svgoConfig: { + plugins: [ + // Sanitise the SVGs + 'removeScriptElement', + ], + }, + jsx: { + babelConfig: { + plugins: [ + // Remove fill and id attributes from SVG child elements + [ + '@svgr/babel-plugin-remove-jsx-attribute', + { + elements: ['path', 'g', 'clipPath'], + attributes: ['id', 'fill'], + }, + ], + ], + }, + }, +}; diff --git a/metadata.md b/packages/grafana-icons/CHANGELOG.md similarity index 100% rename from metadata.md rename to packages/grafana-icons/CHANGELOG.md diff --git a/packages/grafana-icons/LICENSE_APACHE2 b/packages/grafana-icons/LICENSE_APACHE2 new file mode 100644 index 00000000000..373dde574a0 --- /dev/null +++ b/packages/grafana-icons/LICENSE_APACHE2 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 Grafana Labs + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/grafana-icons/README.md b/packages/grafana-icons/README.md new file mode 100644 index 00000000000..78cbf4bf9e3 --- /dev/null +++ b/packages/grafana-icons/README.md @@ -0,0 +1,14 @@ +# Grafana Saga Icons + +This package contains the icon React components used in Grafana and Grafana plugins. + +## Uploading a new icon + +To add a new icon to the library, open a PR which adds the SVG file for the icon into the `svg` directory. The file should be named with the icon name in kebab-case. For example, if the icon name is `MyIcon`, the file should be named `my-icon.svg`. Once the PR is merged, the icon will be automatically generated and added to the library. + +## Development + +1. Clone the repository +2. Run `yarn install` +3. After the installation, the icon components can be found in the `src/icons-gen` directory. +4. To regenerate/update the components, run `yarn generate`. diff --git a/packages/grafana-icons/package.json b/packages/grafana-icons/package.json new file mode 100644 index 00000000000..5074eade13b --- /dev/null +++ b/packages/grafana-icons/package.json @@ -0,0 +1,64 @@ +{ + "name": "@grafana/saga-icons", + "version": "0.0.0", + "private": true, + "description": "Icons for Grafana", + "author": "Grafana Labs", + "license": "Apache-2.0", + "sideEffects": false, + "repository": { + "type": "git", + "url": "https://github.com/grafana/grafana.git", + "directory": "packages/grafana-icons" + }, + "type": "module", + "main": "src/index.ts", + "types": "src/index.ts", + "publishConfig": { + "main": "dist/index.js", + "types": "dist/index.d.ts", + "access": "public" + }, + "files": [ + "./dist", + "./README.md", + "./CHANGELOG.md", + "./LICENSE_APACHE2" + ], + "scripts": { + "clean": "rimraf ./dist ./compiled ./package.tgz ./src/icons-gen", + "generate": "yarn clean && npx @svgr/cli ./svg --silent && mv ./src/icons-gen/index.ts ./src", + "typecheck": "tsc --emitDeclarationOnly false --noEmit", + "lint": "eslint --ext .ts,.tsx ./src", + "prettier:check": "prettier --check --list-different=false --log-level=warn \"**/*.{ts,tsx,scss,md,mdx,json}\"", + "build": "yarn generate && rollup -c rollup.config.ts" + }, + "devDependencies": { + "@grafana/tsconfig": "^1.3.0-rc1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^11.1.6", + "@svgr/babel-plugin-remove-jsx-attribute": "^8.0.0", + "@svgr/cli": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0", + "@svgr/plugin-prettier": "^8.1.0", + "@svgr/plugin-svgo": "^8.1.0", + "@types/node": "20.11.30", + "@types/react": "18.2.73", + "@types/react-dom": "18.2.22", + "esbuild": "0.18.12", + "prettier": "3.2.5", + "react": "18.2.0", + "react-dom": "18.2.0", + "rimraf": "5.0.5", + "rollup": "2.79.1", + "rollup-plugin-dts": "^6.1.0", + "rollup-plugin-esbuild": "5.0.0", + "rollup-plugin-node-externals": "5.0.0", + "ts-node": "10.9.2", + "typescript": "5.3.3" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } +} diff --git a/packages/grafana-icons/rollup.config.ts b/packages/grafana-icons/rollup.config.ts new file mode 100644 index 00000000000..c812043094d --- /dev/null +++ b/packages/grafana-icons/rollup.config.ts @@ -0,0 +1,30 @@ +import resolve from '@rollup/plugin-node-resolve'; +import path from 'path'; +import dts from 'rollup-plugin-dts'; +import esbuild from 'rollup-plugin-esbuild'; +import externals from 'rollup-plugin-node-externals'; + +import pkg from './package.json'; + +export default [ + { + input: 'src/index.ts', + plugins: [externals({ deps: true, packagePath: './package.json' }), resolve(), esbuild()], + output: [ + { + format: 'esm', + sourcemap: true, + dir: path.dirname(pkg.publishConfig.module), + preserveModules: true, + }, + ], + }, + { + input: 'src/index.ts', + plugins: [dts()], + output: { + file: pkg.publishConfig.types, + format: 'es', + }, + }, +]; diff --git a/packages/grafana-icons/src/IconBase.tsx b/packages/grafana-icons/src/IconBase.tsx new file mode 100644 index 00000000000..cc4149e7413 --- /dev/null +++ b/packages/grafana-icons/src/IconBase.tsx @@ -0,0 +1,52 @@ +import React, { SVGProps } from 'react'; + +export type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'xxxl'; + +export interface IconProps extends Omit, 'onLoad' | 'onError' | 'ref'> { + /** Size (width and height) of the icon. Defaults to "md" or 16x16px */ + size?: IconSize; + /** Render the title element with the provided text. + * More info: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title + */ + title?: string; + /** Color of the icon. Defaults to "currentColor" */ + color?: string; +} + +function getSvgSize(size: IconSize) { + const sizeMap = { + xs: 12, + sm: 14, + md: 16, + lg: 18, + xl: 24, + xxl: 36, + xxxl: 48, + }; + + return sizeMap[size] || 16; +} + +export const IconBase = ({ title, size = 'md', color = 'currentColor', ...props }: IconProps) => { + const svgSize = getSvgSize(size); + + return ( + + {title && {title}} + {props.children} + + ); +}; diff --git a/packages/grafana-icons/svg/ai.svg b/packages/grafana-icons/svg/ai.svg new file mode 100644 index 00000000000..7ea7ce6376b --- /dev/null +++ b/packages/grafana-icons/svg/ai.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/grafana-icons/svg/angle-right.svg b/packages/grafana-icons/svg/angle-right.svg new file mode 100644 index 00000000000..b21121fe607 --- /dev/null +++ b/packages/grafana-icons/svg/angle-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/grafana-icons/svg/apps.svg b/packages/grafana-icons/svg/apps.svg new file mode 100644 index 00000000000..f6f6ffe2eaa --- /dev/null +++ b/packages/grafana-icons/svg/apps.svg @@ -0,0 +1 @@ + diff --git a/packages/grafana-icons/svg/book.svg b/packages/grafana-icons/svg/book.svg new file mode 100644 index 00000000000..8e59539d7a4 --- /dev/null +++ b/packages/grafana-icons/svg/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/grafana-icons/svg/cancel.svg b/packages/grafana-icons/svg/cancel.svg new file mode 100644 index 00000000000..138499ab728 --- /dev/null +++ b/packages/grafana-icons/svg/cancel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/grafana-icons/svg/traces.svg b/packages/grafana-icons/svg/traces.svg new file mode 100644 index 00000000000..a58acc03951 --- /dev/null +++ b/packages/grafana-icons/svg/traces.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/grafana-icons/templates/icon.cjs b/packages/grafana-icons/templates/icon.cjs new file mode 100644 index 00000000000..2514571e00e --- /dev/null +++ b/packages/grafana-icons/templates/icon.cjs @@ -0,0 +1,45 @@ +/** + * Modify the JSX to use the IconBase component as a wrapper + */ +const modifyJSX = (jsx) => { + jsx.openingElement.name.name = 'IconBase'; + jsx.openingElement.attributes = [ + { + type: 'JSXSpreadAttribute', + argument: { + type: 'Identifier', + name: 'props', + }, + }, + ]; + + jsx.closingElement.name.name = 'IconBase'; + + return jsx; +}; + +const comments = ` +// This is an auto-generated file, created by svgr-cli. +// Do not edit this file manually. +// To update the component, modify the template in templates/icon.js. +// Run "yarn generate" to update. +`; +const imports = ` +import React, { memo } from 'react'; + +import { IconBase, IconProps } from '../IconBase'; +`; +const template = ({ exports, jsx, componentName }, { tpl }) => { + return tpl` +${comments} +${imports} + +const ${componentName} = (props: IconProps) => ( + ${modifyJSX(jsx)} +); + +${exports}; +`; +}; + +module.exports = template; diff --git a/packages/grafana-icons/templates/index.cjs b/packages/grafana-icons/templates/index.cjs new file mode 100644 index 00000000000..9bbd0507a39 --- /dev/null +++ b/packages/grafana-icons/templates/index.cjs @@ -0,0 +1,12 @@ +const path = require('path'); + +function defaultIndexTemplate(filePaths) { + const exportEntries = filePaths.map(({ path: filePath }) => { + const basename = path.basename(filePath, path.extname(filePath)); + const exportName = /^\d/.test(basename) ? `Svg${basename}` : basename; + return `export { default as ${exportName} } from './icons-gen/${basename}'`; + }); + return ["export { type IconProps } from './IconBase';", ...exportEntries].join('\n'); +} + +module.exports = defaultIndexTemplate; diff --git a/packages/grafana-icons/tsconfig.build.json b/packages/grafana-icons/tsconfig.build.json new file mode 100644 index 00000000000..54309163ebc --- /dev/null +++ b/packages/grafana-icons/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "exclude": ["dist", "node_modules", "test", "**/*.test.ts*"], + "extends": "./tsconfig.json" +} diff --git a/packages/grafana-icons/tsconfig.json b/packages/grafana-icons/tsconfig.json new file mode 100644 index 00000000000..06210e1a227 --- /dev/null +++ b/packages/grafana-icons/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "declarationDir": "./compiled", + "emitDeclarationOnly": true, + "isolatedModules": true, + "rootDirs": ["."], + "resolveJsonModule": true + }, + "exclude": ["dist/**/*"], + "extends": "@grafana/tsconfig", + "include": ["src/**/*.ts"] +} diff --git a/packages/grafana-o11y-ds-frontend/package.json b/packages/grafana-o11y-ds-frontend/package.json index 9bd86ed9dea..05efd9983e1 100644 --- a/packages/grafana-o11y-ds-frontend/package.json +++ b/packages/grafana-o11y-ds-frontend/package.json @@ -3,7 +3,7 @@ "license": "AGPL-3.0-only", "name": "@grafana/o11y-ds-frontend", "private": true, - "version": "10.4.3", + "version": "11.0.0", "description": "Library to manage traces in Grafana.", "sideEffects": false, "repository": { @@ -18,24 +18,23 @@ }, "dependencies": { "@emotion/css": "11.11.2", - "@grafana/data": "workspace:*", - "@grafana/e2e-selectors": "workspace:*", + "@grafana/data": "11.0.0", + "@grafana/e2e-selectors": "11.0.0", "@grafana/experimental": "1.7.10", - "@grafana/runtime": "workspace:*", - "@grafana/schema": "workspace:*", - "@grafana/ui": "workspace:*", - "react": "18.2.0", + "@grafana/runtime": "11.0.0", + "@grafana/schema": "11.0.0", + "@grafana/ui": "11.0.0", "react-use": "17.5.0", "rxjs": "7.8.1", "tslib": "2.6.2" }, "devDependencies": { - "@grafana/tsconfig": "^1.2.0-rc1", + "@grafana/tsconfig": "^1.3.0-rc1", "@testing-library/jest-dom": "^6.1.2", - "@testing-library/react": "14.2.1", + "@testing-library/react": "14.2.2", "@testing-library/user-event": "14.5.2", "@types/jest": "^29.5.4", - "@types/react": "18.2.55", + "@types/react": "18.2.73", "@types/systemjs": "6.13.5", "@types/testing-library__jest-dom": "5.14.9", "jest": "^29.6.4", @@ -45,7 +44,7 @@ "typescript": "5.3.3" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } } diff --git a/packages/grafana-o11y-ds-frontend/src/TemporaryAlert.tsx b/packages/grafana-o11y-ds-frontend/src/TemporaryAlert.tsx index cabc3e3c493..8a7003a576c 100644 --- a/packages/grafana-o11y-ds-frontend/src/TemporaryAlert.tsx +++ b/packages/grafana-o11y-ds-frontend/src/TemporaryAlert.tsx @@ -58,5 +58,17 @@ export const TemporaryAlert = (props: AlertProps) => { } }, [props.severity, props.text]); - return <>{visible && }; + return ( + <> + {visible && ( + setVisible(false)} + severity={props.severity} + title={props.text} + /> + )} + + ); }; diff --git a/packages/grafana-o11y-ds-frontend/src/TraceToLogs/TraceToLogsSettings.tsx b/packages/grafana-o11y-ds-frontend/src/TraceToLogs/TraceToLogsSettings.tsx index 02c6d04ec0e..bc290883d65 100644 --- a/packages/grafana-o11y-ds-frontend/src/TraceToLogs/TraceToLogsSettings.tsx +++ b/packages/grafana-o11y-ds-frontend/src/TraceToLogs/TraceToLogsSettings.tsx @@ -229,7 +229,7 @@ function IdFilter(props: IdFilterProps) { label={`Filter by ${props.type} ID`} labelWidth={26} grow - tooltip={`Filters logs by ${props.type} ID`} + tooltip={`Filters logs by ${props.type} ID, where the ${props.type} ID should be part of the log line`} > > { - const pluginModules = await glob(path.resolve(process.cwd(), `module.{ts,tsx}`)); + const pluginModules = await glob(path.resolve(process.cwd(), `module.{ts,tsx}`), { absolute: true }); if (pluginModules.length > 0) { return { module: pluginModules[0], diff --git a/packages/grafana-plugin-configs/webpack.config.ts b/packages/grafana-plugin-configs/webpack.config.ts index 3b53e20553a..0f851707350 100644 --- a/packages/grafana-plugin-configs/webpack.config.ts +++ b/packages/grafana-plugin-configs/webpack.config.ts @@ -2,8 +2,9 @@ import CopyWebpackPlugin from 'copy-webpack-plugin'; import ESLintPlugin from 'eslint-webpack-plugin'; import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; import path from 'path'; +// @ts-expect-error - there are no types for this package import ReplaceInFileWebpackPlugin from 'replace-in-file-webpack-plugin'; -import { Configuration, DefinePlugin } from 'webpack'; +import { Configuration } from 'webpack'; import { DIST_DIR } from './constants'; import { getPackageJson, getPluginJson, getEntries, hasLicense } from './utils'; @@ -32,7 +33,7 @@ const config = async (env: Record): Promise => { buildDependencies: { config: [__filename], }, - cacheDirectory: path.resolve(__dirname, '../../.yarn/.cache/webpack', path.basename(process.cwd())), + cacheDirectory: path.resolve(__dirname, '../../node_modules/.cache/webpack', path.basename(process.cwd())), }, context: process.cwd(), @@ -144,6 +145,7 @@ const config = async (env: Record): Promise => { }, path: path.resolve(process.cwd(), DIST_DIR), publicPath: `public/plugins/${pluginJson.id}/`, + uniqueName: pluginJson.id, }, plugins: [ @@ -184,27 +186,27 @@ const config = async (env: Record): Promise => { ], }, ]), - env.development - ? new ForkTsCheckerWebpackPlugin({ - async: true, - issue: { - include: [{ file: '**/*.{ts,tsx}' }], - }, - typescript: { configFile: path.join(process.cwd(), 'tsconfig.json') }, - }) - : new DefinePlugin({}), - env.development - ? new ESLintPlugin({ - extensions: ['.ts', '.tsx'], - lintDirtyModulesOnly: true, // don't lint on start, only lint changed files - cacheLocation: path.resolve( - __dirname, - '../../.yarn/.cache/eslint-webpack-plugin', - path.basename(process.cwd()), - '.eslintcache' - ), - }) - : new DefinePlugin({}), + ...(env.development + ? [ + new ForkTsCheckerWebpackPlugin({ + async: true, + issue: { + include: [{ file: '**/*.{ts,tsx}' }], + }, + typescript: { configFile: path.join(process.cwd(), 'tsconfig.json') }, + }), + new ESLintPlugin({ + extensions: ['.ts', '.tsx'], + lintDirtyModulesOnly: true, // don't lint on start, only lint changed files + cacheLocation: path.resolve( + __dirname, + '../../node_modules/.cache/eslint-webpack-plugin', + path.basename(process.cwd()), + '.eslintcache' + ), + }), + ] + : []), ], resolve: { @@ -212,6 +214,8 @@ const config = async (env: Record): Promise => { unsafeCache: true, }, + stats: 'minimal', + watchOptions: { ignored: ['**/node_modules', '**/dist', '**/.yarn'], }, diff --git a/packages/grafana-prometheus/package.json b/packages/grafana-prometheus/package.json index e557343a3ea..49237ce1511 100644 --- a/packages/grafana-prometheus/package.json +++ b/packages/grafana-prometheus/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "AGPL-3.0-only", "name": "@grafana/prometheus", - "version": "10.4.3", + "version": "11.0.0", "description": "Grafana Prometheus Library", "keywords": [ "typescript" @@ -37,26 +37,26 @@ }, "dependencies": { "@emotion/css": "11.11.2", - "@floating-ui/react": "0.26.9", - "@grafana/data": "workspace:*", + "@floating-ui/react": "0.26.10", + "@grafana/data": "11.0.0", "@grafana/experimental": "1.7.10", - "@grafana/faro-web-sdk": "1.3.8", - "@grafana/runtime": "workspace:*", - "@grafana/schema": "workspace:*", - "@grafana/ui": "workspace:*", + "@grafana/faro-web-sdk": "1.5.0", + "@grafana/runtime": "11.0.0", + "@grafana/schema": "11.0.0", + "@grafana/ui": "11.0.0", "@leeoniya/ufuzzy": "1.0.14", "@lezer/common": "1.2.1", "@lezer/highlight": "1.2.0", "@lezer/lr": "1.3.3", "@prometheus-io/lezer-promql": "^0.37.0-rc.1", "@reduxjs/toolkit": "1.9.5", - "d3": "7.8.5", - "date-fns": "3.3.1", + "d3": "7.9.0", + "date-fns": "3.6.0", "debounce-promise": "3.1.2", "eventemitter3": "5.0.1", "lodash": "4.17.21", "lru-cache": "10.2.0", - "marked": "12.0.0", + "marked": "12.0.1", "marked-mangle": "1.1.7", "moment": "2.30.1", "moment-timezone": "0.5.45", @@ -76,33 +76,33 @@ }, "devDependencies": { "@emotion/eslint-plugin": "11.11.0", - "@grafana/e2e": "workspace:*", - "@grafana/e2e-selectors": "workspace:*", + "@grafana/e2e": "11.0.0", + "@grafana/e2e-selectors": "11.0.0", "@grafana/tsconfig": "^1.3.0-rc1", "@rollup/plugin-image": "3.0.3", "@rollup/plugin-node-resolve": "15.2.3", - "@swc/core": "1.4.0", - "@swc/helpers": "0.5.6", + "@swc/core": "1.4.2", + "@swc/helpers": "0.5.8", "@testing-library/dom": "9.3.4", "@testing-library/jest-dom": "6.4.2", - "@testing-library/react": "14.2.1", + "@testing-library/react": "14.2.2", "@testing-library/user-event": "14.5.2", "@types/d3": "7.4.3", "@types/debounce-promise": "3.1.9", - "@types/eslint": "8.56.2", + "@types/eslint": "8.56.6", "@types/jest": "29.5.12", "@types/jquery": "3.5.29", - "@types/lodash": "4.14.202", + "@types/lodash": "4.17.0", "@types/marked": "5.0.2", - "@types/node": "20.11.19", + "@types/node": "20.11.30", "@types/pluralize": "^0.0.33", "@types/prismjs": "1.26.3", - "@types/react": "18.2.55", + "@types/react": "18.2.73", "@types/react-beautiful-dnd": "13.1.8", - "@types/react-dom": "18.2.19", + "@types/react-dom": "18.2.22", "@types/react-highlight-words": "0.16.7", "@types/react-window": "1.8.8", - "@types/semver": "7.5.7", + "@types/semver": "7.5.8", "@types/testing-library__jest-dom": "5.14.9", "@types/uuid": "9.0.8", "@typescript-eslint/eslint-plugin": "6.21.0", @@ -110,16 +110,16 @@ "copy-webpack-plugin": "12.0.2", "css-loader": "6.10.0", "esbuild": "0.18.12", - "eslint": "8.56.0", + "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "27.8.0", - "eslint-plugin-jsdoc": "48.1.0", + "eslint-plugin-jest": "27.9.0", + "eslint-plugin-jsdoc": "48.2.2", "eslint-plugin-jsx-a11y": "6.8.0", "eslint-plugin-lodash": "7.4.0", - "eslint-plugin-react": "7.33.2", + "eslint-plugin-react": "7.34.1", "eslint-plugin-react-hooks": "4.6.0", - "eslint-webpack-plugin": "4.0.1", + "eslint-webpack-plugin": "4.1.0", "fork-ts-checker-webpack-plugin": "9.0.2", "glob": "10.3.10", "jest": "29.7.0", @@ -134,17 +134,17 @@ "rollup-plugin-dts": "^5.0.0", "rollup-plugin-esbuild": "5.0.0", "rollup-plugin-node-externals": "^5.0.0", - "sass": "1.70.0", - "sass-loader": "13.3.2", + "sass": "1.72.0", + "sass-loader": "14.1.1", "style-loader": "3.3.4", "testing-library-selector": "0.3.1", "ts-node": "10.9.2", "typescript": "5.3.3", - "webpack": "5.90.2", + "webpack": "5.91.0", "webpack-cli": "5.1.4" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } } diff --git a/packages/grafana-prometheus/src/dataquery.cue b/packages/grafana-prometheus/src/dataquery.cue deleted file mode 100644 index 177af1929c6..00000000000 --- a/packages/grafana-prometheus/src/dataquery.cue +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2023 Grafana Labs -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package grafanaplugin - -import ( - common "github.com/grafana/grafana/packages/grafana-schema/src/common" -) - -composableKinds: DataQuery: { - maturity: "experimental" - - lineage: { - schemas: [{ - version: [0, 0] - schema: { - common.DataQuery - - // The actual expression/query that will be evaluated by Prometheus - expr: string - // Returns only the latest value that Prometheus has scraped for the requested time series - instant?: bool - // Returns a Range vector, comprised of a set of time series containing a range of data points over time for each time series - range?: bool - // Execute an additional query to identify interesting raw samples relevant for the given expr - exemplar?: bool - // Specifies which editor is being used to prepare the query. It can be "code" or "builder" - editorMode?: #QueryEditorMode - // Query format to determine how to display data points in panel. It can be "time_series", "table", "heatmap" - format?: #PromQueryFormat - // Series name override or template. Ex. {{hostname}} will be replaced with label value for hostname - legendFormat?: string - // @deprecated Used to specify how many times to divide max data points by. We use max data points under query options - // See https://github.com/grafana/grafana/issues/48081 - intervalFactor?: number - - scope?: { - matchers: string - } - - #QueryEditorMode: "code" | "builder" @cuetsy(kind="enum") - #PromQueryFormat: "time_series" | "table" | "heatmap" @cuetsy(kind="type") - } - }] - lenses: [] - } -} diff --git a/packages/grafana-prometheus/src/dataquery.gen.ts b/packages/grafana-prometheus/src/dataquery.gen.ts deleted file mode 100644 index 3ba622cecff..00000000000 --- a/packages/grafana-prometheus/src/dataquery.gen.ts +++ /dev/null @@ -1,57 +0,0 @@ -// Code generated - EDITING IS FUTILE. DO NOT EDIT. -// -// Generated by: -// public/app/plugins/gen.go -// Using jennies: -// TSTypesJenny -// PluginTSTypesJenny -// -// Run 'make gen-cue' from repository root to regenerate. - -import * as common from '@grafana/schema'; - -export enum QueryEditorMode { - Builder = 'builder', - Code = 'code', -} - -export type PromQueryFormat = ('time_series' | 'table' | 'heatmap'); - -export interface Prometheus extends common.DataQuery { - /** - * Specifies which editor is being used to prepare the query. It can be "code" or "builder" - */ - editorMode?: QueryEditorMode; - /** - * Execute an additional query to identify interesting raw samples relevant for the given expr - */ - exemplar?: boolean; - /** - * The actual expression/query that will be evaluated by Prometheus - */ - expr: string; - /** - * Query format to determine how to display data points in panel. It can be "time_series", "table", "heatmap" - */ - format?: PromQueryFormat; - /** - * Returns only the latest value that Prometheus has scraped for the requested time series - */ - instant?: boolean; - /** - * @deprecated Used to specify how many times to divide max data points by. We use max data points under query options - * See https://github.com/grafana/grafana/issues/48081 - */ - intervalFactor?: number; - /** - * Series name override or template. Ex. {{hostname}} will be replaced with label value for hostname - */ - legendFormat?: string; - /** - * Returns a Range vector, comprised of a set of time series containing a range of data points over time for each time series - */ - range?: boolean; - scope?: { - matchers: string; - }; -} diff --git a/packages/grafana-prometheus/src/dataquery.ts b/packages/grafana-prometheus/src/dataquery.ts new file mode 100644 index 00000000000..545a32345b7 --- /dev/null +++ b/packages/grafana-prometheus/src/dataquery.ts @@ -0,0 +1,46 @@ +import { Scope } from '@grafana/data'; +import * as common from '@grafana/schema'; + +export enum QueryEditorMode { + Builder = 'builder', + Code = 'code', +} + +export type PromQueryFormat = 'time_series' | 'table' | 'heatmap'; + +export interface Prometheus extends common.DataQuery { + /** + * Specifies which editor is being used to prepare the query. It can be "code" or "builder" + */ + editorMode?: QueryEditorMode; + /** + * Execute an additional query to identify interesting raw samples relevant for the given expr + */ + exemplar?: boolean; + /** + * The actual expression/query that will be evaluated by Prometheus + */ + expr: string; + /** + * Query format to determine how to display data points in panel. It can be "time_series", "table", "heatmap" + */ + format?: PromQueryFormat; + /** + * Returns only the latest value that Prometheus has scraped for the requested time series + */ + instant?: boolean; + /** + * @deprecated Used to specify how many times to divide max data points by. We use max data points under query options + * See https://github.com/grafana/grafana/issues/48081 + */ + intervalFactor?: number; + /** + * Series name override or template. Ex. {{hostname}} will be replaced with label value for hostname + */ + legendFormat?: string; + /** + * Returns a Range vector, comprised of a set of time series containing a range of data points over time for each time series + */ + range?: boolean; + scope?: Scope; +} diff --git a/packages/grafana-prometheus/src/datasource.ts b/packages/grafana-prometheus/src/datasource.ts index 956b4a268be..b5225af0b38 100644 --- a/packages/grafana-prometheus/src/datasource.ts +++ b/packages/grafana-prometheus/src/datasource.ts @@ -30,6 +30,7 @@ import { import { BackendDataSourceResponse, BackendSrvRequest, + config, DataSourceWithBackend, FetchResponse, getBackendSrv, @@ -363,6 +364,11 @@ export class PrometheusDatasource // We need to pass utcOffsetSec to backend to calculate aligned range utcOffsetSec: request.range.to.utcOffset() * 60, }; + + if (config.featureToggles.promQLScope) { + processedTarget.scope = request.scope; + } + if (target.instant && target.range) { // We have query type "Both" selected // We should send separate queries with different refId diff --git a/packages/grafana-prometheus/src/index.ts b/packages/grafana-prometheus/src/index.ts index 978ddc79b0d..76302ec9570 100644 --- a/packages/grafana-prometheus/src/index.ts +++ b/packages/grafana-prometheus/src/index.ts @@ -62,7 +62,7 @@ export { PromQail } from './querybuilder/components/promQail/PromQail'; export { PrometheusDatasource } from './datasource'; // The parts export { addLabelToQuery } from './add_label_to_query'; -export { type QueryEditorMode, type PromQueryFormat, type Prometheus } from './dataquery.gen'; +export { type QueryEditorMode, type PromQueryFormat, type Prometheus } from './dataquery'; export { PrometheusMetricFindQuery } from './metric_find_query'; export { promqlGrammar } from './promql'; export { getQueryHints, getInitHints } from './query_hints'; diff --git a/packages/grafana-prometheus/src/querybuilder/components/LabelFilterItem.tsx b/packages/grafana-prometheus/src/querybuilder/components/LabelFilterItem.tsx index 85b2ccd0535..c1a28d8f96f 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/LabelFilterItem.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/LabelFilterItem.tsx @@ -189,8 +189,6 @@ export function LabelFilterItem({ const operators = [ { label: '=', value: '=', isMultiValue: false }, { label: '!=', value: '!=', isMultiValue: false }, - { label: '<', value: '<', isMultiValue: false }, - { label: '>', value: '>', isMultiValue: false }, { label: '=~', value: '=~', isMultiValue: true }, { label: '!~', value: '!~', isMultiValue: true }, ]; diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.test.tsx index 7223993ff88..54f44c46f13 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.test.tsx @@ -11,7 +11,7 @@ import { QueryHint, TimeRange, } from '@grafana/data'; -import { TemplateSrv } from '@grafana/runtime'; +import { config, TemplateSrv } from '@grafana/runtime'; import { PrometheusDatasource } from '../../datasource'; import PromQlLanguageProvider from '../../language_provider'; @@ -59,6 +59,10 @@ const bugQuery: PromVisualQuery = { ], }; +afterEach(() => { + jest.restoreAllMocks(); +}); + describe('PromQueryBuilder', () => { it('shows empty just with metric selected', async () => { setup(); @@ -104,6 +108,28 @@ describe('PromQueryBuilder', () => { await waitFor(() => expect(datasource.getVariables).toBeCalled()); }); + it('checks if the LLM plugin is enabled when the `prometheusPromQAIL` feature is enabled', async () => { + jest.replaceProperty(config, 'featureToggles', { + prometheusPromQAIL: true, + }); + const mockIsLLMPluginEnabled = jest.fn(); + mockIsLLMPluginEnabled.mockResolvedValue(true); + jest.spyOn(require('./promQail/state/helpers'), 'isLLMPluginEnabled').mockImplementation(mockIsLLMPluginEnabled); + setup(); + await waitFor(() => expect(mockIsLLMPluginEnabled).toHaveBeenCalledTimes(1)); + }); + + it('does not check if the LLM plugin is enabled when the `prometheusPromQAIL` feature is disabled', async () => { + jest.replaceProperty(config, 'featureToggles', { + prometheusPromQAIL: false, + }); + const mockIsLLMPluginEnabled = jest.fn(); + mockIsLLMPluginEnabled.mockResolvedValue(true); + jest.spyOn(require('./promQail/state/helpers'), 'isLLMPluginEnabled').mockImplementation(mockIsLLMPluginEnabled); + setup(); + await waitFor(() => expect(mockIsLLMPluginEnabled).toHaveBeenCalledTimes(0)); + }); + // it('tries to load labels when metric selected', async () => { const { languageProvider } = setup(); diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.tsx index 1a34a75b985..e05b1c2caa2 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilder.tsx @@ -36,15 +36,12 @@ export interface PromQueryBuilderProps { showExplain: boolean; } -// initial commit for hackathon-2023-08-promqail -// AI/ML + Prometheus -const prometheusPromQAIL = config.featureToggles.prometheusPromQAIL; - export const PromQueryBuilder = React.memo((props) => { const { datasource, query, onChange, onRunQuery, data, showExplain } = props; const [highlightedOp, setHighlightedOp] = useState(); const [showDrawer, setShowDrawer] = useState(false); const [llmAppEnabled, updateLlmAppEnabled] = useState(false); + const { prometheusPromQAIL } = config.featureToggles; // AI/ML + Prometheus const lang = { grammar: promqlGrammar, name: 'promql' }; @@ -55,8 +52,11 @@ export const PromQueryBuilder = React.memo((props) => { const check = await isLLMPluginEnabled(); updateLlmAppEnabled(check); } - checkLlms(); - }, []); + + if (prometheusPromQAIL) { + checkLlms(); + } + }, [prometheusPromQAIL]); return ( <> diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.tsx index 5a6b8273799..79f93db2fe7 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.tsx @@ -6,7 +6,7 @@ import { EditorField, EditorRow, EditorSwitch } from '@grafana/experimental'; import { AutoSizeInput, RadioButtonGroup, Select } from '@grafana/ui'; import { getQueryTypeChangeHandler, getQueryTypeOptions } from '../../components/PromExploreExtraField'; -import { PromQueryFormat } from '../../dataquery.gen'; +import { PromQueryFormat } from '../../dataquery'; import { PromQuery } from '../../types'; import { QueryOptionGroup } from '../shared/QueryOptionGroup'; @@ -37,7 +37,7 @@ export const PromQueryBuilderOptions = React.memo( }; const onChangeStep = (evt: React.FormEvent) => { - onChange({ ...query, interval: evt.currentTarget.value }); + onChange({ ...query, interval: evt.currentTarget.value.trim() }); onRunQuery(); }; diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.tsx index a0016b986e8..f85090e0cad 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.tsx @@ -8,7 +8,7 @@ import { reportInteraction } from '@grafana/runtime'; import { Button, ConfirmModal, Space } from '@grafana/ui'; import { PromQueryEditorProps } from '../../components/types'; -import { PromQueryFormat } from '../../dataquery.gen'; +import { PromQueryFormat } from '../../dataquery'; import { PromQuery } from '../../types'; import { QueryPatternsModal } from '../QueryPatternsModal'; import { promQueryEditorExplainKey, useFlag } from '../hooks/useFlag'; diff --git a/packages/grafana-prometheus/src/querybuilder/operations.ts b/packages/grafana-prometheus/src/querybuilder/operations.ts index 752bd564eda..3b445efa37e 100644 --- a/packages/grafana-prometheus/src/querybuilder/operations.ts +++ b/packages/grafana-prometheus/src/querybuilder/operations.ts @@ -201,7 +201,6 @@ export function getOperationDefinitions(): QueryBuilderOperationDef[] { ], defaultParams: ['', ',', ''], renderer: labelJoinRenderer, - explainHandler: labelJoinExplainHandler, addOperationHandler: labelJoinAddOperationHandler, }), createFunction({ id: PromOperationId.Log10 }), @@ -357,21 +356,11 @@ function addNestedQueryHandler(def: QueryBuilderOperationDef, query: PromVisualQ } function labelJoinRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) { - const paramZero = model.params[0] ?? ''; - const paramOne = model.params[1] ?? ''; - - const separator = `"${paramOne}"`; - return `${model.id}(${innerExpr}, "${paramZero}", ${separator}, "${model.params.slice(2).join(separator)}")`; -} - -function labelJoinExplainHandler(op: QueryBuilderOperation, def?: QueryBuilderOperationDef): string { - let explainMessage = def?.documentation ?? 'no docs'; - - if (typeof op.params[1] !== 'string') { - explainMessage += ' 🚨🚨🚨 The `separator` must be a string.'; + if (typeof model.params[1] !== 'string') { + throw 'The separator must be a string'; } - - return explainMessage; + const separator = `"${model.params[1]}"`; + return `${model.id}(${innerExpr}, "${model.params[0]}", ${separator}, "${model.params.slice(2).join(separator)}")`; } function labelJoinAddOperationHandler(def: QueryBuilderOperationDef, query: T) { diff --git a/packages/grafana-prometheus/src/result_transformer.test.ts b/packages/grafana-prometheus/src/result_transformer.test.ts index 62ce599eaa6..bc2f251767f 100644 --- a/packages/grafana-prometheus/src/result_transformer.test.ts +++ b/packages/grafana-prometheus/src/result_transformer.test.ts @@ -1,13 +1,19 @@ import { cacheFieldDisplayNames, createDataFrame, - DataQueryRequest, - DataQueryResponse, FieldType, - PreferredVisualisationType, + type DataQueryRequest, + type DataQueryResponse, + type PreferredVisualisationType, } from '@grafana/data'; -import { parseSampleValue, sortSeriesByLabel, transformDFToTable, transformV2 } from './result_transformer'; +import { + parseSampleValue, + sortSeriesByLabel, + transformDFToTable, + transformToHistogramOverTime, + transformV2, +} from './result_transformer'; import { PromQuery } from './types'; jest.mock('@grafana/runtime', () => ({ @@ -404,6 +410,7 @@ describe('Prometheus Result Transformer', () => { expect(series.data[0].fields[2].name).toEqual('2'); expect(series.data[0].fields[3].name).toEqual('+Inf'); }); + it('results with heatmap format (with metric name) should be correctly transformed', () => { const options = { targets: [ @@ -925,6 +932,89 @@ describe('Prometheus Result Transformer', () => { expect(traceField).toBeDefined(); expect(traceField!.config.links?.length).toBe(0); }); + + it('should convert values less than 1e-9 to 0', () => { + // pulled from real response + const bucketValues = [ + [0.22222222222222218, 0.24444444444444444, 0.19999999999999996], // le=0.005 + [0.39999999999999997, 0.44444444444444436, 0.42222222222222217], + [0.3999999999999999, 0.44444444444444436, 0.42222222222222217], + [0.3999999999999999, 0.44444444444444436, 0.42222222222222217], + [0.3999999999999999, 0.44444444444444436, 0.42222222222222217], + [0.3999999999999999, 0.44444444444444436, 0.42222222222222217], + [0.39999999999999997, 0.44444444444444436, 0.42222222222222217], + [0.39999999999999997, 0.44444444444444436, 0.42222222222222217], + [0.3999999999999999, 0.44444444444444436, 0.42222222222222217], + [0.3999999999999999, 0.44444444444444436, 0.42222222222222217], + [0.3999999999999999, 0.44444444444444436, 0.42222222222222217], + [0.4666666666666666, 0.5111111111111111, 0.4888888888888888], + [0.4666666666666666, 0.5111111111111111, 0.4888888888888888], + [0.46666666666666656, 0.5111111111111111, 0.4888888888888888], + [0.46666666666666656, 0.5111111111111111, 0.4888888888888888], // le=+Inf + ]; + + const frames = bucketValues.map((vals) => + createDataFrame({ + refId: 'A', + fields: [ + { type: FieldType.time, values: [1, 2, 3] }, + { + type: FieldType.number, + values: vals.slice(), + }, + ], + }) + ); + + const fieldValues = transformToHistogramOverTime(frames).map((frame) => frame.fields[1].values); + + expect(fieldValues).toEqual([ + [0.22222222222222218, 0.24444444444444444, 0.19999999999999996], + [0.17777777777777778, 0.19999999999999993, 0.2222222222222222], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + [0.06666666666666671, 0.06666666666666671, 0.06666666666666665], + [0, 0, 0], + [0, 0, 0], + [0, 0, 0], + ]); + }); + + it('should throw an error if the series does not contain number-type values', () => { + const response = { + state: 'Done', + data: [ + ['10', '10', '0'], + ['20', '10', '30'], + ['20', '10', '35'], + ].map((values) => + createDataFrame({ + refId: 'A', + fields: [ + { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, + { name: 'Value', type: FieldType.string, values }, + ], + }) + ), + } as unknown as DataQueryResponse; + const request = { + targets: [ + { + format: 'heatmap', + refId: 'A', + }, + ], + } as unknown as DataQueryRequest; + + expect(() => transformV2(response, request, {})).toThrow(); + }); }); describe('transformDFToTable', () => { diff --git a/packages/grafana-prometheus/src/result_transformer.ts b/packages/grafana-prometheus/src/result_transformer.ts index 0fbcfe58806..ac93f7955a8 100644 --- a/packages/grafana-prometheus/src/result_transformer.ts +++ b/packages/grafana-prometheus/src/result_transformer.ts @@ -359,7 +359,8 @@ function mergeHeatmapFrames(frames: DataFrame[]): DataFrame[] { ]; } -function transformToHistogramOverTime(seriesList: DataFrame[]) { +/** @internal */ +export function transformToHistogramOverTime(seriesList: DataFrame[]): DataFrame[] { /* t1 = timestamp1, t2 = timestamp2 etc. t1 t2 t3 t1 t2 t3 le10 10 10 0 => 10 10 0 @@ -377,6 +378,10 @@ function transformToHistogramOverTime(seriesList: DataFrame[]) { for (let j = 0; j < topSeries.values.length; j++) { const bottomPoint = bottomSeries.values[j] || [0]; topSeries.values[j] -= bottomPoint; + + if (topSeries.values[j] < 1e-9) { + topSeries.values[j] = 0; + } } } diff --git a/packages/grafana-prometheus/src/types.ts b/packages/grafana-prometheus/src/types.ts index 5ddb69d811b..f3c5730b380 100644 --- a/packages/grafana-prometheus/src/types.ts +++ b/packages/grafana-prometheus/src/types.ts @@ -1,7 +1,7 @@ import { DataSourceJsonData } from '@grafana/data'; import { DataQuery } from '@grafana/schema'; -import { Prometheus as GenPromQuery } from './dataquery.gen'; +import { Prometheus as GenPromQuery } from './dataquery'; import { QueryBuilderLabelFilter, QueryEditorMode } from './querybuilder/shared/types'; export interface PromQuery extends GenPromQuery, DataQuery { diff --git a/packages/grafana-runtime/package.json b/packages/grafana-runtime/package.json index 59ddedfe544..b16cf186d32 100644 --- a/packages/grafana-runtime/package.json +++ b/packages/grafana-runtime/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/runtime", - "version": "10.4.3", + "version": "11.0.0", "description": "Grafana Runtime Library", "keywords": [ "grafana", @@ -37,31 +37,29 @@ "postpack": "mv package.json.bak package.json" }, "dependencies": { - "@grafana/data": "10.4.3", - "@grafana/e2e-selectors": "10.4.3", + "@grafana/data": "11.0.0", + "@grafana/e2e-selectors": "11.0.0", "@grafana/faro-web-sdk": "^1.3.6", - "@grafana/schema": "10.4.3", - "@grafana/ui": "10.4.3", + "@grafana/schema": "11.0.0", + "@grafana/ui": "11.0.0", "history": "4.10.1", "lodash": "4.17.21", "rxjs": "7.8.1", - "systemjs": "6.14.3", - "systemjs-cjs-extra": "0.2.0", "tslib": "2.6.2" }, "devDependencies": { - "@grafana/tsconfig": "^1.2.0-rc1", - "@rollup/plugin-commonjs": "25.0.7", + "@grafana/tsconfig": "^1.3.0-rc1", "@rollup/plugin-node-resolve": "15.2.3", + "@rollup/plugin-terser": "0.4.4", "@testing-library/dom": "9.3.4", - "@testing-library/react": "14.2.1", + "@testing-library/react": "14.2.2", "@testing-library/user-event": "14.5.2", "@types/angular": "1.8.9", "@types/history": "4.7.11", "@types/jest": "29.5.12", - "@types/lodash": "4.14.202", - "@types/react": "18.2.55", - "@types/react-dom": "18.2.19", + "@types/lodash": "4.17.0", + "@types/react": "18.2.73", + "@types/react-dom": "18.2.22", "@types/systemjs": "6.13.5", "esbuild": "0.18.12", "lodash": "4.17.21", @@ -73,11 +71,10 @@ "rollup-plugin-esbuild": "5.0.0", "rollup-plugin-node-externals": "^5.0.0", "rollup-plugin-sourcemaps": "0.6.3", - "rollup-plugin-terser": "7.0.2", "typescript": "5.3.3" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } } diff --git a/packages/grafana-runtime/src/config.ts b/packages/grafana-runtime/src/config.ts index f90928cde68..624174f13d9 100644 --- a/packages/grafana-runtime/src/config.ts +++ b/packages/grafana-runtime/src/config.ts @@ -21,9 +21,16 @@ import { export interface AzureSettings { cloud?: string; + clouds?: AzureCloudInfo[]; managedIdentityEnabled: boolean; workloadIdentityEnabled: boolean; userIdentityEnabled: boolean; + userIdentityFallbackCredentialsEnabled: boolean; +} + +export interface AzureCloudInfo { + name: string; + displayName: string; } export type AppPluginConfig = { @@ -57,10 +64,6 @@ export class GrafanaBootConfig implements GrafanaConfig { feedbackLinksEnabled = true; disableLoginForm = false; defaultDatasource = ''; // UID - alertingEnabled = false; - alertingErrorOrTimeout = ''; - alertingNoDataOrNullValues = ''; - alertingMinInterval = 1; angularSupportEnabled = false; authProxyEnabled = false; exploreEnabled = false; @@ -99,6 +102,9 @@ export class GrafanaBootConfig implements GrafanaConfig { licenseInfo: LicenseInfo = {} as LicenseInfo; rendererAvailable = false; rendererVersion = ''; + rendererDefaultImageWidth = 1000; + rendererDefaultImageHeight = 500; + rendererDefaultImageScale = 1; secretsManagerPluginEnabled = false; supportBundlesEnabled = false; http2Enabled = false; @@ -124,6 +130,7 @@ export class GrafanaBootConfig implements GrafanaConfig { managedIdentityEnabled: false, workloadIdentityEnabled: false, userIdentityEnabled: false, + userIdentityFallbackCredentialsEnabled: false, }; caching = { enabled: false, @@ -168,6 +175,14 @@ export class GrafanaBootConfig implements GrafanaConfig { disableFrontendSandboxForPlugins: string[] = []; sharedWithMeFolderUID: string | undefined; rootFolderUID: string | undefined; + localFileSystemAvailable: boolean | undefined; + cloudMigrationIsTarget: boolean | undefined; + + /** + * Language used in Grafana's UI. This is after the user's preference (or deteceted locale) is resolved to one of + * Grafana's supported language. + */ + language: string | undefined; constructor(options: GrafanaBootConfig) { this.bootData = options.bootData; @@ -202,7 +217,6 @@ export class GrafanaBootConfig implements GrafanaConfig { if (this.buildInfo.env === 'development') { overrideFeatureTogglesFromUrl(this); } - overrideFeatureTogglesFromLocalStorage(this); if (this.featureToggles.disableAngular) { @@ -239,11 +253,27 @@ function overrideFeatureTogglesFromUrl(config: GrafanaBootConfig) { return; } + const migrationFeatureFlags = new Set([ + 'autoMigrateOldPanels', + 'autoMigrateGraphPanel', + 'autoMigrateTablePanel', + 'autoMigratePiechartPanel', + 'autoMigrateWorldmapPanel', + 'autoMigrateStatPanel', + 'disableAngular', + ]); + const params = new URLSearchParams(window.location.search); params.forEach((value, key) => { if (key.startsWith('__feature.')) { const featureToggles = config.featureToggles as Record; const featureName = key.substring(10); + + // skip the migration feature flags + if (migrationFeatureFlags.has(featureName)) { + return; + } + const toggleState = value === 'true' || value === ''; // browser rewrites true as '' if (toggleState !== featureToggles[key]) { featureToggles[featureName] = toggleState; diff --git a/packages/grafana-runtime/src/index.ts b/packages/grafana-runtime/src/index.ts index fe98d4ab619..f5fc864e640 100644 --- a/packages/grafana-runtime/src/index.ts +++ b/packages/grafana-runtime/src/index.ts @@ -6,13 +6,7 @@ export * from './services'; export * from './config'; export * from './analytics/types'; -export { - loadPluginCss, - SystemJS, - type PluginCssOptions, - setPluginImportUtils, - getPluginImportUtils, -} from './utils/plugin'; +export { loadPluginCss, type PluginCssOptions, setPluginImportUtils, getPluginImportUtils } from './utils/plugin'; export { reportMetaAnalytics, reportInteraction, reportPageview, reportExperimentView } from './analytics/utils'; export { featureEnabled } from './utils/licensing'; export { logInfo, logDebug, logWarning, logError, createMonitoringLogger } from './utils/logging'; @@ -23,6 +17,7 @@ export { type HealthCheckResultDetails, HealthStatus, type StreamOptionsProvider, + isExpressionReference, } from './utils/DataSourceWithBackend'; export { toDataQueryResponse, diff --git a/packages/grafana-runtime/src/services/pluginExtensions/getPluginExtensions.ts b/packages/grafana-runtime/src/services/pluginExtensions/getPluginExtensions.ts index 66f2cf2abc3..dcd52b200b2 100644 --- a/packages/grafana-runtime/src/services/pluginExtensions/getPluginExtensions.ts +++ b/packages/grafana-runtime/src/services/pluginExtensions/getPluginExtensions.ts @@ -41,10 +41,15 @@ export const getPluginLinkExtensions: GetPluginExtensions = }; }; -export const getPluginComponentExtensions: GetPluginExtensions = (options) => { +// This getter doesn't support the `context` option (contextual information can be passed in as component props) +export const getPluginComponentExtensions = (options: { + extensionPointId: string; + limitPerPlugin?: number; +}): { extensions: Array> } => { const { extensions } = getPluginExtensions(options); + const componentExtensions = extensions.filter(isPluginExtensionComponent) as Array>; return { - extensions: extensions.filter(isPluginExtensionComponent), + extensions: componentExtensions, }; }; diff --git a/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts b/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts index 204fc4bec2c..f867d1762cf 100644 --- a/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts +++ b/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts @@ -43,7 +43,7 @@ export const ExpressionDatasourceRef = Object.freeze({ }); /** - * @internal + * @public */ export function isExpressionReference(ref?: DataSourceRef | string | null): boolean { if (!ref) { @@ -134,10 +134,6 @@ class DataSourceWithBackend< const { intervalMs, maxDataPoints, queryCachingTTL, range, requestId, hideFromInspector = false } = request; let targets = request.targets; - if (this.filterQuery) { - targets = targets.filter((q) => this.filterQuery!(q)); - } - let hasExpr = false; const pluginIDs = new Set(); const dsUIDs = new Set(); @@ -275,16 +271,6 @@ class DataSourceWithBackend< return queries.map((q) => this.applyTemplateVariables(q, scopedVars, filters)); } - /** - * Override to skip executing a query. Note this function may not be called - * if the query method is overwritten. - * - * @returns false if the query should be skipped - * - * @virtual - */ - filterQuery?(query: TQuery): boolean; - /** * Override to apply template variables and adhoc filters. The result is usually also `TQuery`, but sometimes this can * be used to modify the query structure before sending to the backend. diff --git a/packages/grafana-runtime/src/utils/logging.ts b/packages/grafana-runtime/src/utils/logging.ts index 251719a9339..d7c94da53d8 100644 --- a/packages/grafana-runtime/src/utils/logging.ts +++ b/packages/grafana-runtime/src/utils/logging.ts @@ -58,6 +58,22 @@ export function logError(err: Error, contexts?: LogContext) { } } +/** + * Log a measurement + * + * @public + */ +export type MeasurementValues = Record; +export function logMeasurement(type: string, values: MeasurementValues, context?: LogContext) { + if (config.grafanaJavascriptAgent.enabled) { + faro.api.pushMeasurement({ + type, + values, + context, + }); + } +} + /** * Creates a monitoring logger with four levels of logging methods: `logDebug`, `logInfo`, `logWarning`, and `logError`. * These methods use `faro.api.pushX` web SDK methods to report these logs or errors to the Faro collector. @@ -70,6 +86,7 @@ export function logError(err: Error, contexts?: LogContext) { * - `logInfo(message: string, contexts?: LogContext)`: Logs an informational message. * - `logWarning(message: string, contexts?: LogContext)`: Logs a warning message. * - `logError(error: Error, contexts?: LogContext)`: Logs an error message. + * - `logMeasurement(measurement: Omit, contexts?: LogContext)`: Logs a measurement. * Each method combines the `defaultContext` (if provided), the `source`, and an optional `LogContext` parameter into a full context that is included with the log message. */ export function createMonitoringLogger(source: string, defaultContext?: LogContext) { @@ -107,5 +124,13 @@ export function createMonitoringLogger(source: string, defaultContext?: LogConte * @param {LogContext} [contexts] - Optional additional context to be included. */ logError: (error: Error, contexts?: LogContext) => logError(error, createFullContext(contexts)), + + /** + * Logs an measurement with optional additional context. + * @param {MeasurementEvent} measurement - The measurement object to be recorded. + * @param {LogContext} [contexts] - Optional additional context to be included. + */ + logMeasurement: (type: string, measurement: MeasurementValues, contexts?: LogContext) => + logMeasurement(type, measurement, createFullContext(contexts)), }; } diff --git a/packages/grafana-runtime/src/utils/plugin.ts b/packages/grafana-runtime/src/utils/plugin.ts index ce2ab40b5b3..e3ff8ff026a 100644 --- a/packages/grafana-runtime/src/utils/plugin.ts +++ b/packages/grafana-runtime/src/utils/plugin.ts @@ -1,9 +1,3 @@ -import 'systemjs/dist/system'; -// Add ability to load plugins bundled as AMD format -import 'systemjs/dist/extras/amd'; -// Add ability to load plugins bundled as CJS format -import 'systemjs-cjs-extra'; - import { PanelPlugin } from '@grafana/data'; import { config } from '../config'; @@ -19,11 +13,6 @@ export interface PluginCssOptions { dark: string; } -/** - * @internal - */ -export const SystemJS = window.System; - /** * Use this to load css for a Grafana plugin by specifying a {@link PluginCssOptions} * containing styling for the dark and the light theme. @@ -34,7 +23,7 @@ export const SystemJS = window.System; export async function loadPluginCss(options: PluginCssOptions): Promise { try { const cssPath = config.bootData.user.theme === 'light' ? options.light : options.dark; - return SystemJS.import(cssPath); + return window.System.import(cssPath); } catch (err) { console.error(err); } @@ -62,11 +51,3 @@ export function getPluginImportUtils(): PluginImportUtils { return pluginImportUtils; } - -// Grafana relies on RequireJS for Monaco Editor to load. -// The SystemJS AMD extra creates a global define which causes RequireJS to silently bail. -// Here we move and reset global define so Monaco Editor loader script continues to work. -// @ts-ignore -window.__grafana_amd_define = window.define; -// @ts-ignore -window.define = undefined; diff --git a/packages/grafana-runtime/src/utils/returnToPrevious.ts b/packages/grafana-runtime/src/utils/returnToPrevious.ts index 7b699cad7b4..7810eb46c0a 100644 --- a/packages/grafana-runtime/src/utils/returnToPrevious.ts +++ b/packages/grafana-runtime/src/utils/returnToPrevious.ts @@ -6,6 +6,11 @@ export const setReturnToPreviousHook = (hook: ReturnToPreviousHook) => { rtpHook = hook; }; +/** + * Guidelines: + * - Only use the ‘Return to previous’ functionality when the user is sent to another context, such as from Alerting to a dashboard. + * - Specify a button title that identifies the page to return to in the most understandable way. Do not use text such as ‘Back to the previous page’. Be specific. + */ export const useReturnToPrevious: ReturnToPreviousHook = () => { if (!rtpHook) { if (process.env.NODE_ENV !== 'production') { diff --git a/packages/grafana-schema/package.json b/packages/grafana-schema/package.json index 3c23f0541b0..feb94f64fe9 100644 --- a/packages/grafana-schema/package.json +++ b/packages/grafana-schema/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/schema", - "version": "10.4.3", + "version": "11.0.0", "description": "Grafana Schema Library", "keywords": [ "typescript" @@ -36,9 +36,7 @@ "postpack": "mv package.json.bak package.json" }, "devDependencies": { - "@grafana/tsconfig": "^1.2.0-rc1", - "@rollup/plugin-commonjs": "25.0.7", - "@rollup/plugin-json": "6.1.0", + "@grafana/tsconfig": "^1.3.0-rc1", "@rollup/plugin-node-resolve": "15.2.3", "esbuild": "0.18.12", "glob": "^10.2.7", diff --git a/packages/grafana-schema/src/common/common.gen.ts b/packages/grafana-schema/src/common/common.gen.ts index e95004ac43a..a0c69ebbb06 100644 --- a/packages/grafana-schema/src/common/common.gen.ts +++ b/packages/grafana-schema/src/common/common.gen.ts @@ -43,9 +43,7 @@ export interface DataQuery { */ datasource?: unknown; /** - * true if query is disabled (ie should not be returned to the dashboard) - * Note this does not always imply that the query should not be executed since - * the results from a hidden query may be used as the input to other queries (SSE etc) + * If hide is set to true, Grafana will filter out the response(s) associated with this query before returning it to the panel. */ hide?: boolean; /** @@ -792,6 +790,7 @@ export interface TableSparklineCellOptions extends GraphFieldConfig { * Colored background cell options */ export interface TableColoredBackgroundCellOptions { + applyToRow?: boolean; mode?: TableCellBackgroundDisplayMode; type: TableCellDisplayMode.ColorBackground; } diff --git a/packages/grafana-schema/src/common/dataquery_gen.cue b/packages/grafana-schema/src/common/dataquery_gen.cue index 3d6c8f721da..bcf14f3d134 100644 --- a/packages/grafana-schema/src/common/dataquery_gen.cue +++ b/packages/grafana-schema/src/common/dataquery_gen.cue @@ -23,9 +23,7 @@ DataQuery: { // By default, the UI will assign A->Z; however setting meaningful names may be useful. refId: string - // true if query is disabled (ie should not be returned to the dashboard) - // Note this does not always imply that the query should not be executed since - // the results from a hidden query may be used as the input to other queries (SSE etc) + // If hide is set to true, Grafana will filter out the response(s) associated with this query before returning it to the panel. hide?: bool // Specify the query flavor diff --git a/packages/grafana-schema/src/common/table.cue b/packages/grafana-schema/src/common/table.cue index c6aa05df53e..5c6dce2a5de 100644 --- a/packages/grafana-schema/src/common/table.cue +++ b/packages/grafana-schema/src/common/table.cue @@ -71,6 +71,7 @@ TableSparklineCellOptions: { TableColoredBackgroundCellOptions: { type: TableCellDisplayMode & "color-background" mode?: TableCellBackgroundDisplayMode + applyToRow?: bool } @cuetsy(kind="interface") // Height of a table cell diff --git a/packages/grafana-schema/src/raw/accesspolicy/x/accesspolicy_types.gen.ts b/packages/grafana-schema/src/raw/accesspolicy/x/accesspolicy_types.gen.ts index 814c5cf3eaf..7e18ea50777 100644 --- a/packages/grafana-schema/src/raw/accesspolicy/x/accesspolicy_types.gen.ts +++ b/packages/grafana-schema/src/raw/accesspolicy/x/accesspolicy_types.gen.ts @@ -3,7 +3,7 @@ // Generated by: // kinds/gen.go // Using jennies: -// TSResourceJenny +// TSTypesJenny // LatestMajorsOrXJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/composable/alertgroups/panelcfg/x/AlertGroupsPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/alertgroups/panelcfg/x/AlertGroupsPanelCfg_types.gen.ts deleted file mode 100644 index 92e7ec7429f..00000000000 --- a/packages/grafana-schema/src/raw/composable/alertgroups/panelcfg/x/AlertGroupsPanelCfg_types.gen.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Code generated - EDITING IS FUTILE. DO NOT EDIT. -// -// Generated by: -// public/app/plugins/gen.go -// Using jennies: -// TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny -// -// Run 'make gen-cue' from repository root to regenerate. - -export const pluginVersion = "10.4.3"; - -export interface Options { - /** - * Name of the alertmanager used as a source for alerts - */ - alertmanager: string; - /** - * Expand all alert groups by default - */ - expandAll: boolean; - /** - * Comma-separated list of values used to filter alert results - */ - labels: string; -} diff --git a/packages/grafana-schema/src/raw/composable/annotationslist/panelcfg/x/AnnotationsListPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/annotationslist/panelcfg/x/AnnotationsListPanelCfg_types.gen.ts index 58ba34fbf4c..429df18af9b 100644 --- a/packages/grafana-schema/src/raw/composable/annotationslist/panelcfg/x/AnnotationsListPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/annotationslist/panelcfg/x/AnnotationsListPanelCfg_types.gen.ts @@ -4,12 +4,11 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options { limit: number; diff --git a/packages/grafana-schema/src/raw/composable/azuremonitor/dataquery/x/AzureMonitorDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/azuremonitor/dataquery/x/AzureMonitorDataQuery_types.gen.ts index a22f7674cbf..d6d068b7e1e 100644 --- a/packages/grafana-schema/src/raw/composable/azuremonitor/dataquery/x/AzureMonitorDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/azuremonitor/dataquery/x/AzureMonitorDataQuery_types.gen.ts @@ -4,8 +4,7 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/composable/barchart/panelcfg/x/BarChartPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/barchart/panelcfg/x/BarChartPanelCfg_types.gen.ts index e30ba5adf83..554beec23f5 100644 --- a/packages/grafana-schema/src/raw/composable/barchart/panelcfg/x/BarChartPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/barchart/panelcfg/x/BarChartPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip, common.OptionsWithTextFormatting { /** diff --git a/packages/grafana-schema/src/raw/composable/bargauge/panelcfg/x/BarGaugePanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/bargauge/panelcfg/x/BarGaugePanelCfg_types.gen.ts index 579ae6cfe0c..5325f72c91b 100644 --- a/packages/grafana-schema/src/raw/composable/bargauge/panelcfg/x/BarGaugePanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/bargauge/panelcfg/x/BarGaugePanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options extends common.SingleStatBaseOptions { displayMode: common.BarGaugeDisplayMode; diff --git a/packages/grafana-schema/src/raw/composable/candlestick/panelcfg/x/CandlestickPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/candlestick/panelcfg/x/CandlestickPanelCfg_types.gen.ts index 3476d2508d4..bfbd73b7bcf 100644 --- a/packages/grafana-schema/src/raw/composable/candlestick/panelcfg/x/CandlestickPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/candlestick/panelcfg/x/CandlestickPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export enum VizDisplayMode { Candles = 'candles', diff --git a/packages/grafana-schema/src/raw/composable/canvas/panelcfg/x/CanvasPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/canvas/panelcfg/x/CanvasPanelCfg_types.gen.ts index 2efd80f06a6..768f5c0ae4f 100644 --- a/packages/grafana-schema/src/raw/composable/canvas/panelcfg/x/CanvasPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/canvas/panelcfg/x/CanvasPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as ui from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export enum HorizontalConstraint { Center = 'center', @@ -39,6 +38,7 @@ export interface Placement { height?: number; left?: number; right?: number; + rotation?: number; top?: number; width?: number; } @@ -59,6 +59,7 @@ export interface BackgroundConfig { export interface LineConfig { color?: ui.ColorDimensionConfig; + radius?: number; width?: number; } @@ -82,10 +83,17 @@ export interface CanvasConnection { path: ConnectionPath; size?: ui.ScaleDimensionConfig; source: ConnectionCoordinates; + sourceOriginal?: ConnectionCoordinates; target: ConnectionCoordinates; targetName?: string; + targetOriginal?: ConnectionCoordinates; + vertices?: Array; } +export const defaultCanvasConnection: Partial = { + vertices: [], +}; + export interface CanvasElementOptions { background?: BackgroundConfig; border?: LineConfig; diff --git a/packages/grafana-schema/src/raw/composable/cloudwatch/dataquery/x/CloudWatchDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/cloudwatch/dataquery/x/CloudWatchDataQuery_types.gen.ts index 8f1b8d92714..c3404ba34e0 100644 --- a/packages/grafana-schema/src/raw/composable/cloudwatch/dataquery/x/CloudWatchDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/cloudwatch/dataquery/x/CloudWatchDataQuery_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface MetricStat { /** diff --git a/packages/grafana-schema/src/raw/composable/dashboardlist/panelcfg/x/DashboardListPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/dashboardlist/panelcfg/x/DashboardListPanelCfg_types.gen.ts index d9d7f66b846..3c51431596d 100644 --- a/packages/grafana-schema/src/raw/composable/dashboardlist/panelcfg/x/DashboardListPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/dashboardlist/panelcfg/x/DashboardListPanelCfg_types.gen.ts @@ -4,12 +4,11 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options { /** diff --git a/packages/grafana-schema/src/raw/composable/datagrid/panelcfg/x/DatagridPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/datagrid/panelcfg/x/DatagridPanelCfg_types.gen.ts index b490590fbd1..a80268c69cc 100644 --- a/packages/grafana-schema/src/raw/composable/datagrid/panelcfg/x/DatagridPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/datagrid/panelcfg/x/DatagridPanelCfg_types.gen.ts @@ -4,12 +4,11 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options { selectedSeries: number; diff --git a/packages/grafana-schema/src/raw/composable/debug/panelcfg/x/DebugPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/debug/panelcfg/x/DebugPanelCfg_types.gen.ts index 406c6177790..492887103c6 100644 --- a/packages/grafana-schema/src/raw/composable/debug/panelcfg/x/DebugPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/debug/panelcfg/x/DebugPanelCfg_types.gen.ts @@ -4,12 +4,11 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export type UpdateConfig = { render: boolean, diff --git a/packages/grafana-schema/src/raw/composable/elasticsearch/dataquery/x/ElasticsearchDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/elasticsearch/dataquery/x/ElasticsearchDataQuery_types.gen.ts index 7a3a9698d73..ed63955fbc6 100644 --- a/packages/grafana-schema/src/raw/composable/elasticsearch/dataquery/x/ElasticsearchDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/elasticsearch/dataquery/x/ElasticsearchDataQuery_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export type BucketAggregation = (DateHistogram | Histogram | Terms | Filters | GeoHashGrid | Nested); diff --git a/packages/grafana-schema/src/raw/composable/gauge/panelcfg/x/GaugePanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/gauge/panelcfg/x/GaugePanelCfg_types.gen.ts index 50d7a88ee04..b8be225c4b7 100644 --- a/packages/grafana-schema/src/raw/composable/gauge/panelcfg/x/GaugePanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/gauge/panelcfg/x/GaugePanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options extends common.SingleStatBaseOptions { minVizHeight: number; diff --git a/packages/grafana-schema/src/raw/composable/geomap/panelcfg/x/GeomapPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/geomap/panelcfg/x/GeomapPanelCfg_types.gen.ts index b7a9e918ab7..e4b5e7c2ce9 100644 --- a/packages/grafana-schema/src/raw/composable/geomap/panelcfg/x/GeomapPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/geomap/panelcfg/x/GeomapPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as ui from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options { basemap: ui.MapLayerOptions; diff --git a/packages/grafana-schema/src/raw/composable/googlecloudmonitoring/dataquery/x/GoogleCloudMonitoringDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/googlecloudmonitoring/dataquery/x/GoogleCloudMonitoringDataQuery_types.gen.ts index fd333a2f0e2..0185e3000b1 100644 --- a/packages/grafana-schema/src/raw/composable/googlecloudmonitoring/dataquery/x/GoogleCloudMonitoringDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/googlecloudmonitoring/dataquery/x/GoogleCloudMonitoringDataQuery_types.gen.ts @@ -4,8 +4,7 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/composable/grafanapyroscope/dataquery/x/GrafanaPyroscopeDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/grafanapyroscope/dataquery/x/GrafanaPyroscopeDataQuery_types.gen.ts index 2be0dcface6..1c5e39ee716 100644 --- a/packages/grafana-schema/src/raw/composable/grafanapyroscope/dataquery/x/GrafanaPyroscopeDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/grafanapyroscope/dataquery/x/GrafanaPyroscopeDataQuery_types.gen.ts @@ -4,8 +4,7 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/composable/heatmap/panelcfg/x/HeatmapPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/heatmap/panelcfg/x/HeatmapPanelCfg_types.gen.ts index 169a18c6b71..75b1234b457 100644 --- a/packages/grafana-schema/src/raw/composable/heatmap/panelcfg/x/HeatmapPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/heatmap/panelcfg/x/HeatmapPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as ui from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; /** * Controls the color mode of the heatmap diff --git a/packages/grafana-schema/src/raw/composable/histogram/panelcfg/x/HistogramPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/histogram/panelcfg/x/HistogramPanelCfg_types.gen.ts index fc0b0e3f122..086f216a990 100644 --- a/packages/grafana-schema/src/raw/composable/histogram/panelcfg/x/HistogramPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/histogram/panelcfg/x/HistogramPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip { /** @@ -37,7 +36,7 @@ export const defaultOptions: Partial = { bucketOffset: 0, }; -export interface FieldConfig extends common.AxisConfig, common.HideableFieldConfig { +export interface FieldConfig extends common.AxisConfig, common.HideableFieldConfig, common.StackableFieldConfig { /** * Controls the fill opacity of the bars. */ diff --git a/packages/grafana-schema/src/raw/composable/logs/panelcfg/x/LogsPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/logs/panelcfg/x/LogsPanelCfg_types.gen.ts index 089c4e46023..34d1a601541 100644 --- a/packages/grafana-schema/src/raw/composable/logs/panelcfg/x/LogsPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/logs/panelcfg/x/LogsPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options { dedupStrategy: common.LogsDedupStrategy; diff --git a/packages/grafana-schema/src/raw/composable/loki/dataquery/x/LokiDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/loki/dataquery/x/LokiDataQuery_types.gen.ts index d9cbaece188..6b17809ec1c 100644 --- a/packages/grafana-schema/src/raw/composable/loki/dataquery/x/LokiDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/loki/dataquery/x/LokiDataQuery_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export enum QueryEditorMode { Builder = 'builder', diff --git a/packages/grafana-schema/src/raw/composable/news/panelcfg/x/NewsPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/news/panelcfg/x/NewsPanelCfg_types.gen.ts index 2192da1fee3..6eb818b4f75 100644 --- a/packages/grafana-schema/src/raw/composable/news/panelcfg/x/NewsPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/news/panelcfg/x/NewsPanelCfg_types.gen.ts @@ -4,12 +4,11 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options { /** diff --git a/packages/grafana-schema/src/raw/composable/nodegraph/panelcfg/x/NodeGraphPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/nodegraph/panelcfg/x/NodeGraphPanelCfg_types.gen.ts index a631366176d..0a6984797d4 100644 --- a/packages/grafana-schema/src/raw/composable/nodegraph/panelcfg/x/NodeGraphPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/nodegraph/panelcfg/x/NodeGraphPanelCfg_types.gen.ts @@ -4,12 +4,11 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface ArcOption { /** diff --git a/packages/grafana-schema/src/raw/composable/parca/dataquery/x/ParcaDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/parca/dataquery/x/ParcaDataQuery_types.gen.ts index a4d6fd645a3..61aeb06a3d1 100644 --- a/packages/grafana-schema/src/raw/composable/parca/dataquery/x/ParcaDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/parca/dataquery/x/ParcaDataQuery_types.gen.ts @@ -4,8 +4,7 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/composable/piechart/panelcfg/x/PieChartPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/piechart/panelcfg/x/PieChartPanelCfg_types.gen.ts index 32c5b21ff63..905545644b3 100644 --- a/packages/grafana-schema/src/raw/composable/piechart/panelcfg/x/PieChartPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/piechart/panelcfg/x/PieChartPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; /** * Select the pie chart display style. diff --git a/packages/grafana-schema/src/raw/composable/prometheus/dataquery/x/PrometheusDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/prometheus/dataquery/x/PrometheusDataQuery_types.gen.ts deleted file mode 100644 index fbd05e03a56..00000000000 --- a/packages/grafana-schema/src/raw/composable/prometheus/dataquery/x/PrometheusDataQuery_types.gen.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated - EDITING IS FUTILE. DO NOT EDIT. -// -// Generated by: -// public/app/plugins/gen.go -// Using jennies: -// TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny -// -// Run 'make gen-cue' from repository root to regenerate. - -import * as common from '@grafana/schema'; - -export const pluginVersion = "10.4.3"; - -export enum QueryEditorMode { - Builder = 'builder', - Code = 'code', -} - -export type PromQueryFormat = ('time_series' | 'table' | 'heatmap'); - -export interface PrometheusDataQuery extends common.DataQuery { - /** - * Specifies which editor is being used to prepare the query. It can be "code" or "builder" - */ - editorMode?: QueryEditorMode; - /** - * Execute an additional query to identify interesting raw samples relevant for the given expr - */ - exemplar?: boolean; - /** - * The actual expression/query that will be evaluated by Prometheus - */ - expr: string; - /** - * Query format to determine how to display data points in panel. It can be "time_series", "table", "heatmap" - */ - format?: PromQueryFormat; - /** - * Returns only the latest value that Prometheus has scraped for the requested time series - */ - instant?: boolean; - /** - * @deprecated Used to specify how many times to divide max data points by. We use max data points under query options - * See https://github.com/grafana/grafana/issues/48081 - */ - intervalFactor?: number; - /** - * Series name override or template. Ex. {{hostname}} will be replaced with label value for hostname - */ - legendFormat?: string; - /** - * Returns a Range vector, comprised of a set of time series containing a range of data points over time for each time series - */ - range?: boolean; - scope?: { - matchers: string; - }; -} diff --git a/packages/grafana-schema/src/raw/composable/stat/panelcfg/x/StatPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/stat/panelcfg/x/StatPanelCfg_types.gen.ts index 320aa4fbc26..d06e86987a1 100644 --- a/packages/grafana-schema/src/raw/composable/stat/panelcfg/x/StatPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/stat/panelcfg/x/StatPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options extends common.SingleStatBaseOptions { colorMode: common.BigValueColorMode; diff --git a/packages/grafana-schema/src/raw/composable/statetimeline/panelcfg/x/StateTimelinePanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/statetimeline/panelcfg/x/StateTimelinePanelCfg_types.gen.ts index 9f072e62530..7bf0c92bee8 100644 --- a/packages/grafana-schema/src/raw/composable/statetimeline/panelcfg/x/StateTimelinePanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/statetimeline/panelcfg/x/StateTimelinePanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as ui from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones { /** diff --git a/packages/grafana-schema/src/raw/composable/statushistory/panelcfg/x/StatusHistoryPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/statushistory/panelcfg/x/StatusHistoryPanelCfg_types.gen.ts index 0e1d007785d..b796c21a586 100644 --- a/packages/grafana-schema/src/raw/composable/statushistory/panelcfg/x/StatusHistoryPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/statushistory/panelcfg/x/StatusHistoryPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as ui from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones { /** diff --git a/packages/grafana-schema/src/raw/composable/table/panelcfg/x/TablePanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/table/panelcfg/x/TablePanelCfg_types.gen.ts index b9b6f840634..d358ee664a5 100644 --- a/packages/grafana-schema/src/raw/composable/table/panelcfg/x/TablePanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/table/panelcfg/x/TablePanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as ui from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options { /** diff --git a/packages/grafana-schema/src/raw/composable/tempo/dataquery/x/TempoDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/tempo/dataquery/x/TempoDataQuery_types.gen.ts index 3371fbaa7b9..fbb226a11f3 100644 --- a/packages/grafana-schema/src/raw/composable/tempo/dataquery/x/TempoDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/tempo/dataquery/x/TempoDataQuery_types.gen.ts @@ -4,8 +4,7 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. @@ -70,10 +69,7 @@ export const defaultTempoQuery: Partial = { groupBy: [], }; -/** - * search = Loki search, nativeSearch = Tempo search for backwards compatibility - */ -export type TempoQueryType = ('traceql' | 'traceqlSearch' | 'search' | 'serviceMap' | 'upload' | 'nativeSearch' | 'traceId' | 'clear'); +export type TempoQueryType = ('traceql' | 'traceqlSearch' | 'serviceMap' | 'upload' | 'nativeSearch' | 'traceId' | 'clear'); /** * The state of the TraceQL streaming search query diff --git a/packages/grafana-schema/src/raw/composable/testdata/dataquery/x/TestDataDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/testdata/dataquery/x/TestDataDataQuery_types.gen.ts deleted file mode 100644 index 91f7cbe3bdb..00000000000 --- a/packages/grafana-schema/src/raw/composable/testdata/dataquery/x/TestDataDataQuery_types.gen.ts +++ /dev/null @@ -1,144 +0,0 @@ -// Code generated - EDITING IS FUTILE. DO NOT EDIT. -// -// Generated by: -// public/app/plugins/gen.go -// Using jennies: -// TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny -// -// Run 'make gen-cue' from repository root to regenerate. - -import * as common from '@grafana/schema'; - -export const pluginVersion = "%VERSION%"; - -export enum TestDataQueryType { - Annotations = 'annotations', - Arrow = 'arrow', - CSVContent = 'csv_content', - CSVFile = 'csv_file', - CSVMetricValues = 'csv_metric_values', - DataPointsOutsideRange = 'datapoints_outside_range', - ExponentialHeatmapBucketData = 'exponential_heatmap_bucket_data', - FlameGraph = 'flame_graph', - GrafanaAPI = 'grafana_api', - LinearHeatmapBucketData = 'linear_heatmap_bucket_data', - Live = 'live', - Logs = 'logs', - ManualEntry = 'manual_entry', - NoDataPoints = 'no_data_points', - NodeGraph = 'node_graph', - PredictableCSVWave = 'predictable_csv_wave', - PredictablePulse = 'predictable_pulse', - RandomWalk = 'random_walk', - RandomWalkTable = 'random_walk_table', - RandomWalkWithError = 'random_walk_with_error', - RawFrame = 'raw_frame', - ServerError500 = 'server_error_500', - Simulation = 'simulation', - SlowQuery = 'slow_query', - StreamingClient = 'streaming_client', - TableStatic = 'table_static', - Trace = 'trace', - USA = 'usa', - VariablesQuery = 'variables-query', -} - -export interface StreamingQuery { - bands?: number; - noise: number; - speed: number; - spread: number; - type: ('signal' | 'logs' | 'fetch' | 'traces'); - url?: string; -} - -export interface PulseWaveQuery { - offCount?: number; - offValue?: number; - onCount?: number; - onValue?: number; - timeStep?: number; -} - -export interface SimulationQuery { - config?: Record; - key: { - type: string; - tick: number; - uid?: string; - }; - last?: boolean; - stream?: boolean; -} - -export interface NodesQuery { - count?: number; - seed?: number; - type?: ('random' | 'response_small' | 'response_medium' | 'random edges'); -} - -export interface USAQuery { - fields?: Array; - mode?: string; - period?: string; - states?: Array; -} - -export const defaultUSAQuery: Partial = { - fields: [], - states: [], -}; - -export interface CSVWave { - labels?: string; - name?: string; - timeStep?: number; - valuesCSV?: string; -} - -/** - * TODO: Should this live here given it's not used in the dataquery? - */ -export interface Scenario { - description?: string; - hideAliasField?: boolean; - id: string; - name: string; - stringInput: string; -} - -export interface TestDataDataQuery extends common.DataQuery { - alias?: string; - channel?: string; - csvContent?: string; - csvFileName?: string; - csvWave?: Array; // TODO can we prevent partial from being generated - /** - * Drop percentage (the chance we will lose a point 0-100) - */ - dropPercent?: number; - errorType?: ('server_panic' | 'frontend_exception' | 'frontend_observable'); - flamegraphDiff?: boolean; - labels?: string; - levelColumn?: boolean; - lines?: number; - nodes?: NodesQuery; - points?: Array>; - pulseWave?: PulseWaveQuery; - rawFrameContent?: string; - scenarioId?: TestDataQueryType; - seriesCount?: number; - sim?: SimulationQuery; - spanCount?: number; - stream?: StreamingQuery; - stringInput?: string; - usa?: USAQuery; -} - -export const defaultTestDataDataQuery: Partial = { - csvWave: [], - points: [], - scenarioId: TestDataQueryType.RandomWalk, -}; diff --git a/packages/grafana-schema/src/raw/composable/text/panelcfg/x/TextPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/text/panelcfg/x/TextPanelCfg_types.gen.ts index ab01d70664e..3c64e8ffa4c 100644 --- a/packages/grafana-schema/src/raw/composable/text/panelcfg/x/TextPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/text/panelcfg/x/TextPanelCfg_types.gen.ts @@ -4,12 +4,11 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export enum TextMode { Code = 'code', diff --git a/packages/grafana-schema/src/raw/composable/timeseries/panelcfg/x/TimeSeriesPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/timeseries/panelcfg/x/TimeSeriesPanelCfg_types.gen.ts index 55788e230af..6f5bc7b6cbe 100644 --- a/packages/grafana-schema/src/raw/composable/timeseries/panelcfg/x/TimeSeriesPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/timeseries/panelcfg/x/TimeSeriesPanelCfg_types.gen.ts @@ -4,17 +4,17 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; export interface Options extends common.OptionsWithTimezones { legend: common.VizLegendOptions; + orientation?: common.VizOrientation; tooltip: common.VizTooltipOptions; } diff --git a/packages/grafana-schema/src/raw/composable/trend/panelcfg/x/TrendPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/trend/panelcfg/x/TrendPanelCfg_types.gen.ts index 4107abd3132..a1b0a7a04d6 100644 --- a/packages/grafana-schema/src/raw/composable/trend/panelcfg/x/TrendPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/trend/panelcfg/x/TrendPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; /** * Identical to timeseries... except it does not have timezone settings diff --git a/packages/grafana-schema/src/raw/composable/xychart/panelcfg/x/XYChartPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/xychart/panelcfg/x/XYChartPanelCfg_types.gen.ts index 853f09cd462..4ea19439ea5 100644 --- a/packages/grafana-schema/src/raw/composable/xychart/panelcfg/x/XYChartPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/xychart/panelcfg/x/XYChartPanelCfg_types.gen.ts @@ -4,14 +4,13 @@ // public/app/plugins/gen.go // Using jennies: // TSTypesJenny -// LatestMajorsOrXJenny -// PluginEachMajorJenny +// PluginTsTypesJenny // // Run 'make gen-cue' from repository root to regenerate. import * as common from '@grafana/schema'; -export const pluginVersion = "10.4.3"; +export const pluginVersion = "11.0.0"; /** * Auto is "table" in the UI diff --git a/packages/grafana-schema/src/raw/composable/xychart2/panelcfg/x/XYChartPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/xychart2/panelcfg/x/XYChartPanelCfg_types.gen.ts new file mode 100644 index 00000000000..286f9026b4c --- /dev/null +++ b/packages/grafana-schema/src/raw/composable/xychart2/panelcfg/x/XYChartPanelCfg_types.gen.ts @@ -0,0 +1,95 @@ +// Code generated - EDITING IS FUTILE. DO NOT EDIT. +// +// Generated by: +// public/app/plugins/gen.go +// Using jennies: +// TSTypesJenny +// PluginTsTypesJenny +// +// Run 'make gen-cue' from repository root to regenerate. + +import * as common from '@grafana/schema'; + +export const pluginVersion = "11.0.0-pre"; + +/** + * Auto is "table" in the UI + */ +export enum SeriesMapping { + Auto = 'auto', + Manual = 'manual', +} + +export enum XYShowMode { + Lines = 'lines', + Points = 'points', + PointsAndLines = 'points+lines', +} + +/** + * NOTE: (copied from dashboard_kind.cue, since not exported) + * Matcher is a predicate configuration. Based on the config a set of field(s) or values is filtered in order to apply override / transformation. + * It comes with in id ( to resolve implementation from registry) and a configuration that’s specific to a particular matcher type. + */ +export interface MatcherConfig { + /** + * The matcher id. This is used to find the matcher implementation from registry. + */ + id: string; + /** + * The matcher options. This is specific to the matcher implementation. + */ + options?: unknown; +} + +export const defaultMatcherConfig: Partial = { + id: '', +}; + +export interface FieldConfig extends common.HideableFieldConfig, common.AxisConfig { + lineStyle?: common.LineStyle; + /** + * lineColor?: common.ColorDimensionConfig + */ + lineWidth?: number; + pointSize?: { + fixed?: number; + min?: number; + max?: number; + }; + show?: XYShowMode; +} + +export const defaultFieldConfig: Partial = { + show: XYShowMode.Points, +}; + +export interface XYSeriesConfig { + color?: { + matcher: MatcherConfig; + }; + frame?: { + matcher: MatcherConfig; + }; + name?: { + fixed?: string; + }; + size?: { + matcher: MatcherConfig; + }; + x?: { + matcher: MatcherConfig; + }; + y?: { + matcher: MatcherConfig; + }; +} + +export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip { + mapping: SeriesMapping; + series: Array; +} + +export const defaultOptions: Partial = { + series: [], +}; diff --git a/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts b/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts index 886dd0e3466..9b3d3b54504 100644 --- a/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts +++ b/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts @@ -3,7 +3,7 @@ // Generated by: // kinds/gen.go // Using jennies: -// TSResourceJenny +// TSTypesJenny // LatestMajorsOrXJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/librarypanel/x/librarypanel_types.gen.ts b/packages/grafana-schema/src/raw/librarypanel/x/librarypanel_types.gen.ts index d3b967e7a76..97cba2a5c5e 100644 --- a/packages/grafana-schema/src/raw/librarypanel/x/librarypanel_types.gen.ts +++ b/packages/grafana-schema/src/raw/librarypanel/x/librarypanel_types.gen.ts @@ -3,7 +3,7 @@ // Generated by: // kinds/gen.go // Using jennies: -// TSResourceJenny +// TSTypesJenny // LatestMajorsOrXJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/preferences/x/preferences_types.gen.ts b/packages/grafana-schema/src/raw/preferences/x/preferences_types.gen.ts index 033e4233d4b..b685f299f2e 100644 --- a/packages/grafana-schema/src/raw/preferences/x/preferences_types.gen.ts +++ b/packages/grafana-schema/src/raw/preferences/x/preferences_types.gen.ts @@ -3,7 +3,7 @@ // Generated by: // kinds/gen.go // Using jennies: -// TSResourceJenny +// TSTypesJenny // LatestMajorsOrXJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/publicdashboard/x/publicdashboard_types.gen.ts b/packages/grafana-schema/src/raw/publicdashboard/x/publicdashboard_types.gen.ts index 9a1ae8596fd..b94e4baefe3 100644 --- a/packages/grafana-schema/src/raw/publicdashboard/x/publicdashboard_types.gen.ts +++ b/packages/grafana-schema/src/raw/publicdashboard/x/publicdashboard_types.gen.ts @@ -3,7 +3,7 @@ // Generated by: // kinds/gen.go // Using jennies: -// TSResourceJenny +// TSTypesJenny // LatestMajorsOrXJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/role/x/role_types.gen.ts b/packages/grafana-schema/src/raw/role/x/role_types.gen.ts index 781665e9250..88cadf639fe 100644 --- a/packages/grafana-schema/src/raw/role/x/role_types.gen.ts +++ b/packages/grafana-schema/src/raw/role/x/role_types.gen.ts @@ -3,7 +3,7 @@ // Generated by: // kinds/gen.go // Using jennies: -// TSResourceJenny +// TSTypesJenny // LatestMajorsOrXJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/rolebinding/x/rolebinding_types.gen.ts b/packages/grafana-schema/src/raw/rolebinding/x/rolebinding_types.gen.ts index a41535cc5df..ea6d65fbf4e 100644 --- a/packages/grafana-schema/src/raw/rolebinding/x/rolebinding_types.gen.ts +++ b/packages/grafana-schema/src/raw/rolebinding/x/rolebinding_types.gen.ts @@ -3,7 +3,7 @@ // Generated by: // kinds/gen.go // Using jennies: -// TSResourceJenny +// TSTypesJenny // LatestMajorsOrXJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-schema/src/raw/team/x/team_types.gen.ts b/packages/grafana-schema/src/raw/team/x/team_types.gen.ts index fef0a47a874..4f136372c37 100644 --- a/packages/grafana-schema/src/raw/team/x/team_types.gen.ts +++ b/packages/grafana-schema/src/raw/team/x/team_types.gen.ts @@ -3,7 +3,7 @@ // Generated by: // kinds/gen.go // Using jennies: -// TSResourceJenny +// TSTypesJenny // LatestMajorsOrXJenny // // Run 'make gen-cue' from repository root to regenerate. diff --git a/packages/grafana-sql/package.json b/packages/grafana-sql/package.json index b0a9f11562a..8ea148fdaa1 100644 --- a/packages/grafana-sql/package.json +++ b/packages/grafana-sql/package.json @@ -3,7 +3,7 @@ "license": "AGPL-3.0-only", "private": true, "name": "@grafana/sql", - "version": "10.4.3", + "version": "11.0.0", "repository": { "type": "git", "url": "http://github.com/grafana/grafana.git", @@ -15,18 +15,18 @@ }, "dependencies": { "@emotion/css": "11.11.2", - "@grafana/data": "workspace:*", + "@grafana/data": "11.0.0", "@grafana/experimental": "1.7.10", - "@grafana/runtime": "workspace:*", - "@grafana/ui": "workspace:*", + "@grafana/runtime": "11.0.0", + "@grafana/ui": "11.0.0", "@react-awesome-query-builder/ui": "6.4.2", - "@types/lodash": "4.14.202", + "@types/lodash": "4.17.0", "@types/react-virtualized-auto-sizer": "1.0.4", "@types/uuid": "9.0.8", "immutable": "4.3.5", "lodash": "4.17.21", "react-use": "17.5.0", - "react-virtualized-auto-sizer": "1.0.22", + "react-virtualized-auto-sizer": "1.0.24", "rxjs": "7.8.1", "sql-formatter-plus": "^1.3.6", "tslib": "2.6.2", @@ -35,11 +35,11 @@ "devDependencies": { "@grafana/tsconfig": "^1.3.0-rc1", "@testing-library/jest-dom": "^6.1.2", - "@testing-library/react": "14.2.1", + "@testing-library/react": "14.2.2", "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "14.5.2", "@types/jest": "^29.5.4", - "@types/react": "18.2.55", + "@types/react": "18.2.73", "@types/systemjs": "6.13.5", "@types/testing-library__jest-dom": "5.14.9", "jest": "^29.6.4", @@ -49,6 +49,6 @@ "typescript": "5.3.3" }, "peerDependencies": { - "@grafana/runtime": "workspace:*" + "@grafana/runtime": "10.4.0-pre" } } diff --git a/packages/grafana-sql/src/components/QueryHeader.tsx b/packages/grafana-sql/src/components/QueryHeader.tsx index c27c7a018c6..3501a5e9ea3 100644 --- a/packages/grafana-sql/src/components/QueryHeader.tsx +++ b/packages/grafana-sql/src/components/QueryHeader.tsx @@ -3,6 +3,7 @@ import { useCopyToClipboard } from 'react-use'; import { v4 as uuidv4 } from 'uuid'; import { SelectableValue } from '@grafana/data'; +import { selectors } from '@grafana/e2e-selectors'; import { EditorField, EditorHeader, EditorMode, EditorRow, FlexItem, InlineSelect } from '@grafana/experimental'; import { reportInteraction } from '@grafana/runtime'; import { Button, InlineSwitch, RadioButtonGroup, Tooltip, Space } from '@grafana/ui'; @@ -137,6 +138,7 @@ export function QueryHeader({ { onOptionsChange: Function; options: DataSourceSettings; } -function toNumber(text: string): number { - if (text.trim() === '') { - // calling `Number('')` returns zero, - // so we have to handle this case - return NaN; - } - - return Number(text); -} - export const ConnectionLimits = (props: Props) => { const { onOptionsChange, options } = props; const jsonData = options.jsonData; @@ -115,15 +107,11 @@ export const ConnectionLimits = (props: Props) } > - { - const newVal = toNumber(e.currentTarget.value); - if (!Number.isNaN(newVal)) { - onMaxConnectionsChanged(newVal); - } + { + onMaxConnectionsChanged(value); }} width={labelWidth} /> @@ -133,7 +121,7 @@ export const ConnectionLimits = (props: Props) label={ } > - { - const newVal = toNumber(e.currentTarget.value); - if (!Number.isNaN(newVal)) { - onJSONDataNumberChanged('connMaxLifetime')(newVal); - } + { + onJSONDataNumberChanged('connMaxLifetime')(value); }} width={labelWidth} /> diff --git a/packages/grafana-sql/src/components/configuration/NumberInput.tsx b/packages/grafana-sql/src/components/configuration/NumberInput.tsx new file mode 100644 index 00000000000..875dc921116 --- /dev/null +++ b/packages/grafana-sql/src/components/configuration/NumberInput.tsx @@ -0,0 +1,34 @@ +import React from 'react'; + +import { Input } from '@grafana/ui/src/components/Input/Input'; + +type NumberInputProps = { + value: number; + defaultValue: number; + onChange: (value: number) => void; + width: number; +}; + +export function NumberInput({ value, defaultValue, onChange, width }: NumberInputProps) { + const [isEmpty, setIsEmpty] = React.useState(false); + return ( + { + if (e.currentTarget.value?.trim() === '') { + setIsEmpty(true); + onChange(defaultValue); + } else { + setIsEmpty(false); + const newVal = Number(e.currentTarget.value); + if (!Number.isNaN(newVal)) { + onChange(newVal); + } + } + }} + width={width} + /> + ); +} diff --git a/packages/grafana-sql/src/components/visual-query-builder/AwesomeQueryBuilder.tsx b/packages/grafana-sql/src/components/visual-query-builder/AwesomeQueryBuilder.tsx index a6895d1bbd9..2f2db035813 100644 --- a/packages/grafana-sql/src/components/visual-query-builder/AwesomeQueryBuilder.tsx +++ b/packages/grafana-sql/src/components/visual-query-builder/AwesomeQueryBuilder.tsx @@ -16,6 +16,7 @@ import { isString } from 'lodash'; import React from 'react'; import { dateTime, toOption } from '@grafana/data'; +import { selectors } from '@grafana/e2e-selectors'; import { Button, DateTimePicker, Input, Select } from '@grafana/ui'; const buttonLabels = { @@ -124,6 +125,7 @@ export const settings: Settings = { ({ label: op.label, value: op.key }))} aria-label="Operator" + data-testid={selectors.components.SQLQueryEditor.filterOperator} menuShouldPortal value={operatorProps?.selectedKey} onChange={(val) => { diff --git a/packages/grafana-sql/src/components/visual-query-builder/SelectRow.tsx b/packages/grafana-sql/src/components/visual-query-builder/SelectRow.tsx index 411934f406e..5591fc237be 100644 --- a/packages/grafana-sql/src/components/visual-query-builder/SelectRow.tsx +++ b/packages/grafana-sql/src/components/visual-query-builder/SelectRow.tsx @@ -3,6 +3,7 @@ import { uniqueId } from 'lodash'; import React, { useCallback } from 'react'; import { SelectableValue, toOption } from '@grafana/data'; +import { selectors } from '@grafana/e2e-selectors'; import { EditorField, Stack } from '@grafana/experimental'; import { Button, Select, useStyles2 } from '@grafana/ui'; @@ -115,6 +116,7 @@ export function SelectRow({ sql, format, columns, onSqlChange, functions }: Sele - -
- ) : null} - - - - - {onAlternative ? ( - + - ) : null} - + {onAlternative ? ( + + ) : null} + + ); }; diff --git a/packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx index c2a7d8f6457..358d985a169 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx @@ -67,7 +67,6 @@ export const getStyles = (theme: GrafanaTheme2) => { return { modal: css({ zIndex: theme.zIndex.modal, - position: 'absolute', boxShadow: theme.shadows.z3, backgroundColor: theme.colors.background.primary, border: `1px solid ${theme.colors.border.weak}`, diff --git a/packages/grafana-ui/src/components/DateTimePickers/DatePickerWithInput/DatePickerWithInput.tsx b/packages/grafana-ui/src/components/DateTimePickers/DatePickerWithInput/DatePickerWithInput.tsx index 581d6b72e96..515160fceed 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/DatePickerWithInput/DatePickerWithInput.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/DatePickerWithInput/DatePickerWithInput.tsx @@ -1,7 +1,8 @@ import { css } from '@emotion/css'; -import React, { ChangeEvent } from 'react'; +import { autoUpdate, flip, shift, useClick, useDismiss, useFloating, useInteractions } from '@floating-ui/react'; +import React, { ChangeEvent, useState } from 'react'; -import { dateTime } from '@grafana/data'; +import { GrafanaTheme2, dateTime } from '@grafana/data'; import { useStyles2 } from '../../../themes'; import { Props as InputProps, Input } from '../../Input/Input'; @@ -35,17 +36,41 @@ export const DatePickerWithInput = ({ placeholder = 'Date', ...rest }: DatePickerWithInputProps) => { - const [open, setOpen] = React.useState(false); + const [open, setOpen] = useState(false); const styles = useStyles2(getStyles); + // the order of middleware is important! + // see https://floating-ui.com/docs/arrow#order + const middleware = [ + flip({ + // see https://floating-ui.com/docs/flip#combining-with-shift + crossAxis: false, + boundary: document.body, + }), + shift(), + ]; + + const { context, refs, floatingStyles } = useFloating({ + open, + placement: 'bottom-start', + onOpenChange: setOpen, + middleware, + whileElementsMounted: autoUpdate, + strategy: 'fixed', + }); + + const click = useClick(context); + const dismiss = useDismiss(context); + const { getReferenceProps, getFloatingProps } = useInteractions([dismiss, click]); + return (
setOpen(true)} onChange={(ev: ChangeEvent) => { // Allow resetting the date if (ev.target.value === '') { @@ -54,25 +79,28 @@ export const DatePickerWithInput = ({ }} className={styles.input} {...rest} + {...getReferenceProps()} /> - { - onChange(ev); - if (closeOnSelect) { - setOpen(false); - } - }} - onClose={() => setOpen(false)} - /> +
+ { + onChange(ev); + if (closeOnSelect) { + setOpen(false); + } + }} + onClose={() => setOpen(false)} + /> +
); }; -const getStyles = () => { +const getStyles = (theme: GrafanaTheme2) => { return { container: css({ position: 'relative', @@ -84,5 +112,8 @@ const getStyles = () => { WebkitAppearance: 'none', }, }), + popover: css({ + zIndex: theme.zIndex.tooltip, + }), }; }; diff --git a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.test.tsx b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.test.tsx index 1f4bed87550..5258ee22ad0 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.test.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.test.tsx @@ -2,15 +2,23 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; -import { dateTime } from '@grafana/data'; +import { dateTime, dateTimeAsMoment, dateTimeForTimeZone, getTimeZone, setTimeZoneResolver } from '@grafana/data'; import { Components } from '@grafana/e2e-selectors'; import { DateTimePicker, Props } from './DateTimePicker'; +// An assortment of timezones that we will test the behavior of the DateTimePicker with different timezones +const TEST_TIMEZONES = ['browser', 'Europe/Stockholm', 'America/Indiana/Marengo']; + +const defaultTimeZone = getTimeZone(); +afterAll(() => { + return setTimeZoneResolver(() => defaultTimeZone); +}); + const renderDatetimePicker = (props?: Props) => { const combinedProps = Object.assign( { - date: dateTime('2021-05-05 12:00:00'), + date: dateTimeForTimeZone(getTimeZone(), '2021-05-05 12:00:00'), onChange: () => {}, }, props @@ -26,12 +34,22 @@ describe('Date time picker', () => { expect(screen.queryByTestId('date-time-picker')).toBeInTheDocument(); }); - it('input should have a value', () => { + it.each(TEST_TIMEZONES)('input should have a value (timezone: %s)', (timeZone) => { + setTimeZoneResolver(() => timeZone); renderDatetimePicker(); - expect(screen.queryByDisplayValue('2021-05-05 12:00:00')).toBeInTheDocument(); + const dateTimeInput = screen.getByTestId(Components.DateTimePicker.input); + expect(dateTimeInput).toHaveDisplayValue('2021-05-05 12:00:00'); }); - it('should update date onblur', async () => { + it.each(TEST_TIMEZONES)('should render (timezone %s)', (timeZone) => { + setTimeZoneResolver(() => timeZone); + renderDatetimePicker(); + const dateTimeInput = screen.getByTestId(Components.DateTimePicker.input); + expect(dateTimeInput).toHaveDisplayValue('2021-05-05 12:00:00'); + }); + + it.each(TEST_TIMEZONES)('should update date onblur (timezone: %)', async (timeZone) => { + setTimeZoneResolver(() => timeZone); const onChangeInput = jest.fn(); render(); const dateTimeInput = screen.getByTestId(Components.DateTimePicker.input); @@ -42,7 +60,8 @@ describe('Date time picker', () => { expect(onChangeInput).toHaveBeenCalled(); }); - it('should not update onblur if invalid date', async () => { + it.each(TEST_TIMEZONES)('should not update onblur if invalid date (timezone: %s)', async (timeZone) => { + setTimeZoneResolver(() => timeZone); const onChangeInput = jest.fn(); render(); const dateTimeInput = screen.getByTestId(Components.DateTimePicker.input); @@ -53,31 +72,167 @@ describe('Date time picker', () => { expect(onChangeInput).not.toHaveBeenCalled(); }); - it('should be able to select values in TimeOfDayPicker without blurring the element', async () => { - renderDatetimePicker(); + it.each(TEST_TIMEZONES)( + 'should not change the day at times near the day boundary (timezone: %s)', + async (timeZone) => { + setTimeZoneResolver(() => timeZone); + const onChangeInput = jest.fn(); + render(); + + // Click the calendar button + await userEvent.click(screen.getByRole('button', { name: 'Time picker' })); + + // Check the active day is the 5th + expect(screen.getByRole('button', { name: 'May 5, 2021' })).toHaveClass('react-calendar__tile--active'); + + // open the time of day overlay + await userEvent.click(screen.getAllByRole('textbox')[1]); + + // change the hour + await userEvent.click( + screen.getAllByRole('button', { + name: '00', + })[0] + ); - // open the calendar + time picker - await userEvent.click(screen.getByLabelText('Time picker')); + // Check the active day is the 5th + expect(screen.getByRole('button', { name: 'May 5, 2021' })).toHaveClass('react-calendar__tile--active'); - // open the time of day overlay - await userEvent.click(screen.getAllByRole('textbox')[1]); + // change the hour + await userEvent.click( + screen.getAllByRole('button', { + name: '23', + })[0] + ); - // check the hour element is visible - const hourElement = screen.getAllByRole('button', { - name: '00', - })[0]; - expect(hourElement).toBeVisible(); + // Check the active day is the 5th + expect(screen.getByRole('button', { name: 'May 5, 2021' })).toHaveClass('react-calendar__tile--active'); + } + ); + + it.each(TEST_TIMEZONES)( + 'should not reset the time when selecting a different day (timezone: %s)', + async (timeZone) => { + setTimeZoneResolver(() => timeZone); + const onChangeInput = jest.fn(); + render(); + + // Click the calendar button + await userEvent.click(screen.getByRole('button', { name: 'Time picker' })); + + // Select a different day in the calendar + await userEvent.click(screen.getByRole('button', { name: 'May 15, 2021' })); + + const timeInput = screen.getAllByRole('textbox')[1]; + expect(timeInput).toHaveClass('rc-time-picker-input'); + expect(timeInput).not.toHaveDisplayValue('00:00:00'); + } + ); + + it.each(TEST_TIMEZONES)( + 'should always show the correct matching day in the calendar (timezone: %s)', + async (timeZone) => { + setTimeZoneResolver(() => timeZone); + const onChangeInput = jest.fn(); + render(); + + const dateTimeInputValue = screen.getByTestId(Components.DateTimePicker.input).getAttribute('value')!; + + // takes the string from the input + // depending on the timezone, this will look something like 2024-04-05 19:59:41 + // parses out the day value and strips the leading 0 + const day = parseInt(dateTimeInputValue.split(' ')[0].split('-')[2], 10); + + // Click the calendar button + await userEvent.click(screen.getByRole('button', { name: 'Time picker' })); + + // Check the active day matches the input + expect(screen.getByRole('button', { name: `May ${day}, 2021` })).toHaveClass('react-calendar__tile--active'); + } + ); - // select the hour value and check it's still visible - await userEvent.click(hourElement); - expect(hourElement).toBeVisible(); + it.each(TEST_TIMEZONES)( + 'should always show the correct matching day when selecting a date in the calendar (timezone: %s)', + async (timeZone) => { + setTimeZoneResolver(() => timeZone); + const onChangeInput = jest.fn(); + render(); - // click outside the overlay and check the hour element is no longer visible + // Click the calendar button + await userEvent.click(screen.getByRole('button', { name: 'Time picker' })); + + // Select a new day + const day = 8; + await userEvent.click(screen.getByRole('button', { name: `May ${day}, 2021` })); + await userEvent.click(screen.getByRole('button', { name: 'Apply' })); + + const onChangeInputArg = onChangeInput.mock.calls[0][0]; + + expect(dateTimeAsMoment(dateTimeForTimeZone(timeZone, onChangeInputArg)).date()).toBe(day); + } + ); + + it.each(TEST_TIMEZONES)('should not alter a UTC time when blurring (timezone: %s)', async (timeZone) => { + setTimeZoneResolver(() => timeZone); + const onChangeInput = jest.fn(); + + // render with a UTC value + const { rerender } = render( + + ); + + const inputValue = screen.getByTestId(Components.DateTimePicker.input).getAttribute('value')!; + + // blur the input to trigger an onChange + await userEvent.click(screen.getByTestId(Components.DateTimePicker.input)); await userEvent.click(document.body); - expect( - screen.queryByRole('button', { - name: '00', - }) - ).not.toBeInTheDocument(); + + const onChangeValue = onChangeInput.mock.calls[0][0]; + expect(onChangeInput).toHaveBeenCalledWith(onChangeValue); + + // now rerender with the "changed" value + rerender(); + + // expect the input to show the same value + expect(screen.getByTestId(Components.DateTimePicker.input)).toHaveDisplayValue(inputValue); + + // blur the input to trigger an onChange + await userEvent.click(screen.getByTestId(Components.DateTimePicker.input)); + await userEvent.click(document.body); + + // expect the onChange to be called with the same value + expect(onChangeInput).toHaveBeenCalledWith(onChangeValue); }); + + it.each(TEST_TIMEZONES)( + 'should be able to select values in TimeOfDayPicker without blurring the element (timezone: %s)', + async (timeZone) => { + setTimeZoneResolver(() => timeZone); + renderDatetimePicker(); + + // open the calendar + time picker + await userEvent.click(screen.getByLabelText('Time picker')); + + // open the time of day overlay + await userEvent.click(screen.getAllByRole('textbox')[1]); + + // check the hour element is visible + const hourElement = screen.getAllByRole('button', { + name: '00', + })[0]; + expect(hourElement).toBeVisible(); + + // select the hour value and check it's still visible + await userEvent.click(hourElement); + expect(hourElement).toBeVisible(); + + // click outside the overlay and check the hour element is no longer visible + await userEvent.click(document.body); + expect( + screen.queryByRole('button', { + name: '00', + }) + ).not.toBeInTheDocument(); + } + ); }); diff --git a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx index e0e7f45a113..569363bf454 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx @@ -1,13 +1,21 @@ import { css, cx } from '@emotion/css'; +import { autoUpdate, flip, shift, useFloating } from '@floating-ui/react'; import { useDialog } from '@react-aria/dialog'; import { FocusScope } from '@react-aria/focus'; import { useOverlay } from '@react-aria/overlays'; import React, { FormEvent, ReactNode, useCallback, useEffect, useRef, useState } from 'react'; import Calendar from 'react-calendar'; -import { usePopper } from 'react-popper'; import { useMedia } from 'react-use'; -import { dateTimeFormat, DateTime, dateTime, GrafanaTheme2, isDateTime } from '@grafana/data'; +import { + dateTimeFormat, + DateTime, + dateTime, + GrafanaTheme2, + isDateTime, + dateTimeForTimeZone, + getTimeZone, +} from '@grafana/data'; import { Components } from '@grafana/e2e-selectors'; import { useStyles2, useTheme2 } from '../../../themes'; @@ -21,6 +29,7 @@ import { Portal } from '../../Portal/Portal'; import { TimeOfDayPicker, POPUP_CLASS_NAME } from '../TimeOfDayPicker'; import { getBodyStyles } from '../TimeRangePicker/CalendarBody'; import { isValid } from '../utils'; +import { adjustDateForReactCalendar } from '../utils/adjustDateForReactCalendar'; export interface Props { /** Input date for the component */ @@ -76,11 +85,24 @@ export const DateTimePicker = ({ const isFullscreen = useMedia(`(min-width: ${theme.breakpoints.values.lg}px)`); const styles = useStyles2(getStyles); - const [markerElement, setMarkerElement] = useState(); - const [selectorElement, setSelectorElement] = useState(); + // the order of middleware is important! + // see https://floating-ui.com/docs/arrow#order + const middleware = [ + flip({ + // see https://floating-ui.com/docs/flip#combining-with-shift + crossAxis: false, + boundary: document.body, + }), + shift(), + ]; - const popper = usePopper(markerElement, selectorElement, { + const { refs, floatingStyles } = useFloating({ + open: isOpen, placement: 'bottom-start', + onOpenChange: setOpen, + middleware, + whileElementsMounted: autoUpdate, + strategy: 'fixed', }); const onApply = useCallback( @@ -107,7 +129,7 @@ export const DateTimePicker = ({ isFullscreen={isFullscreen} onOpen={onOpen} label={label} - ref={setMarkerElement} + ref={refs.setReference} showSeconds={showSeconds} /> {isOpen ? ( @@ -122,8 +144,8 @@ export const DateTimePicker = ({ onClose={() => setOpen(false)} maxDate={maxDate} minDate={minDate} - ref={setSelectorElement} - style={popper.styles.popper} + ref={refs.setFloating} + style={floatingStyles} showSeconds={showSeconds} disabledHours={disabledHours} disabledMinutes={disabledMinutes} @@ -214,7 +236,7 @@ const DateTimeInput = React.forwardRef( const onBlur = useCallback(() => { if (!internalDate.invalid) { - const date = dateTime(internalDate.value); + const date = dateTimeForTimeZone(getTimeZone(), internalDate.value); onChange(date); } }, [internalDate, onChange]); @@ -263,9 +285,18 @@ const DateTimeCalendar = React.forwardRef ) => { const calendarStyles = useStyles2(getBodyStyles); const styles = useStyles2(getStyles); - const [internalDate, setInternalDate] = useState(() => { + + // need to keep these 2 separate in state since react-calendar doesn't support different timezones + const [timeOfDayDateTime, setTimeOfDayDateTime] = useState(() => { + if (date && date.isValid()) { + return dateTimeForTimeZone(getTimeZone(), date); + } + + return dateTimeForTimeZone(getTimeZone(), new Date()); + }); + const [reactCalendarDate, setReactCalendarDate] = useState(() => { if (date && date.isValid()) { - return date.toDate(); + return adjustDateForReactCalendar(date.toDate(), getTimeZone()); } return new Date(); @@ -273,28 +304,33 @@ const DateTimeCalendar = React.forwardRef const onChangeDate = useCallback['onChange']>>((date) => { if (date && !Array.isArray(date)) { - setInternalDate((prevState) => { - // If we don't use time from prevState - // the time will be reset to 00:00:00 - date.setHours(prevState.getHours()); - date.setMinutes(prevState.getMinutes()); - date.setSeconds(prevState.getSeconds()); - - return date; - }); + setReactCalendarDate(date); } }, []); const onChangeTime = useCallback((date: DateTime) => { - setInternalDate(date.toDate()); + setTimeOfDayDateTime(date); }, []); + // here we need to stitch the 2 date objects back together + const handleApply = () => { + // we take the date that's set by TimeOfDayPicker + const newDate = dateTime(timeOfDayDateTime); + + // and apply the date/month/year set by react-calendar + newDate.set('date', reactCalendarDate.getDate()); + newDate.set('month', reactCalendarDate.getMonth()); + newDate.set('year', reactCalendarDate.getFullYear()); + + onChange(newDate); + }; + return (
} nextAriaLabel="Next month" prevLabel={} @@ -310,14 +346,14 @@ const DateTimeCalendar = React.forwardRef
- diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOffset.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOffset.tsx index 0c1ca7fbb7d..e9e269d2c15 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOffset.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOffset.tsx @@ -33,9 +33,6 @@ export const formatUtcOffset = (timestamp: number, timeZone: TimeZone): string = format: 'Z', }); - if (offset === '+00:00') { - return 'UTC'; - } return `UTC${offset}`; }; diff --git a/packages/grafana-ui/src/components/DateTimePickers/utils/adjustDateForReactCalendar.ts b/packages/grafana-ui/src/components/DateTimePickers/utils/adjustDateForReactCalendar.ts new file mode 100644 index 00000000000..b8f0f2e5f3c --- /dev/null +++ b/packages/grafana-ui/src/components/DateTimePickers/utils/adjustDateForReactCalendar.ts @@ -0,0 +1,28 @@ +import { getZone } from '@grafana/data'; + +/** + * React calendar doesn't support showing dates in other time zones, so attempting to show + * values near midnight in another time zone than your browsers may end up showing the wrong date + * + * This function adjusts a date by "moving" the time to appear as if it's local. + * e.g. make 5 PM New York "look like" 5 PM in the user's local browser time. + * See also https://github.com/wojtekmaj/react-calendar/issues/511#issuecomment-835333976 + */ +export function adjustDateForReactCalendar(date: Date, timeZone: string): Date { + const zone = getZone(timeZone); + if (!zone) { + return date; + } + + // get utc offset for timezone preference + const timezonePrefOffset = zone.utcOffset(date.getTime()); + + // get utc offset for local timezone + const localOffset = date.getTimezoneOffset(); + + // calculate difference between timezone preference and local timezone + const diff = timezonePrefOffset - localOffset; + + const newDate = new Date(date.getTime() - diff * 1000 * 60); + return newDate; +} diff --git a/packages/grafana-ui/src/components/Dropdown/Dropdown.tsx b/packages/grafana-ui/src/components/Dropdown/Dropdown.tsx index 759c96b0dc7..e1bc28cab9b 100644 --- a/packages/grafana-ui/src/components/Dropdown/Dropdown.tsx +++ b/packages/grafana-ui/src/components/Dropdown/Dropdown.tsx @@ -1,5 +1,6 @@ import { css } from '@emotion/css'; import { + FloatingFocusManager, autoUpdate, flip, offset as floatingUIOffset, @@ -9,7 +10,6 @@ import { useFloating, useInteractions, } from '@floating-ui/react'; -import { FocusScope } from '@react-aria/focus'; import React, { useEffect, useRef, useState } from 'react'; import { CSSTransition } from 'react-transition-group'; @@ -83,7 +83,7 @@ export const Dropdown = React.memo(({ children, overlay, placement, offset, onVi })} {show && ( - + {/* this is handling bubbled events from the inner overlay see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/no-static-element-interactions.md#case-the-event-handler-is-only-being-used-to-capture-bubbled-events @@ -100,7 +100,7 @@ export const Dropdown = React.memo(({ children, overlay, placement, offset, onVi
{ReactUtils.renderOrCallToRender(overlay, { ...getFloatingProps() })}
-
+
)} diff --git a/packages/grafana-ui/src/components/EmptyState/EmptyState.mdx b/packages/grafana-ui/src/components/EmptyState/EmptyState.mdx new file mode 100644 index 00000000000..1851d7c91c2 --- /dev/null +++ b/packages/grafana-ui/src/components/EmptyState/EmptyState.mdx @@ -0,0 +1,106 @@ +import { ArgTypes } from '@storybook/blocks'; +import { EmptyState } from './EmptyState'; + +# EmptyState + +The EmptyState component consists of a message and optionally an image, button, and additional information. + +## When to use + +Use an empty state to communicate to the user that there is no data to display and provide instructions for what to do next. +Example use cases: + +- When a user has not created a particular resource yet +- When a filter or search query returns no results +- When a user completes all actions, such as clearing their inbox or notifications + +There are different variants to handle the most common empty state use cases. These variants provide a specific default message and image. + +## Usage + +### `variant="call-to-action"` + +Use when there is no data to display and you want to encourage the user to take an action. Usually either to complete some initial configuration, or to create an item. + +```jsx +import { EmptyState, LinkButton, TextLink } from '@grafana/ui'; + + + Create playlist + + } +> + You can use playlists to cycle dashboards on TVs without user control.{' '} + + Learn more. + +; +``` + +For scenarios where there is no single button that can be clicked to create the item, you can omit the `button` prop. Instead, provide additional information to help the user understand how to create the specific resource. + +```jsx +import { EmptyState, TextLink } from '@grafana/ui'; + + + Create a library panel from any existing dashboard panel through the panel context menu.{' '} + + Learn more. + +; +``` + +### `variant="not-found"` + +Use in place of content when a search query or filter returns no results. + +There are sensible defaults for the image, so in most cases all you need to provide is a message. + +```jsx +import { EmptyState } from '@grafana/ui'; + +; +``` + +### `variant="completed"` + +For when a user has completed all tasks on a page, such as reading all their notifications. + +```jsx +import { EmptyState } from '@grafana/ui'; + +; +``` + +## Customization + +For all variants you can: + +- provide a custom image or hide the image entirely +- provide a button (e.g. to provide a call to action or clear the search query) +- provide additional information via React children + +```jsx +import { Button, EmptyState, TextLink } from '@grafana/ui'; + +} + image={} + message="No playlists found" + variant="not-found" +> + Optionally provide some additional information here. Maybe even a link to{' '} + + documentation. + +; +``` + +## Props + + diff --git a/packages/grafana-ui/src/components/EmptyState/EmptyState.story.tsx b/packages/grafana-ui/src/components/EmptyState/EmptyState.story.tsx new file mode 100644 index 00000000000..9e81d2e234e --- /dev/null +++ b/packages/grafana-ui/src/components/EmptyState/EmptyState.story.tsx @@ -0,0 +1,52 @@ +import { Meta, StoryFn } from '@storybook/react'; +import React from 'react'; + +import { Button } from '../Button'; + +import { EmptyState } from './EmptyState'; +import mdx from './EmptyState.mdx'; + +const meta: Meta = { + title: 'General/EmptyState', + component: EmptyState, + parameters: { + docs: { + page: mdx, + }, + controls: { + exclude: ['image'], + }, + }, + argTypes: { + button: { + control: 'select', + options: ['None', 'Create', 'Clear filters'], + }, + children: { + type: 'string', + }, + }, +}; + +export const Basic: StoryFn = (args) => { + let button; + if (args.button === 'Create') { + button = ( + + ); + } else if (args.button === 'Clear filters') { + button = ; + } + return ; +}; + +Basic.args = { + button: 'Create', + children: 'Use this space to add any additional information', + message: "You haven't created any dashboards yet", + variant: 'call-to-action', +}; + +export default meta; diff --git a/packages/grafana-ui/src/components/EmptyState/EmptyState.tsx b/packages/grafana-ui/src/components/EmptyState/EmptyState.tsx new file mode 100644 index 00000000000..28d7f67724e --- /dev/null +++ b/packages/grafana-ui/src/components/EmptyState/EmptyState.tsx @@ -0,0 +1,92 @@ +import { css } from '@emotion/css'; +import React, { ReactNode } from 'react'; +import SVG from 'react-inlinesvg'; + +import { GrafanaTheme2 } from '@grafana/data'; + +import { useStyles2 } from '../../themes'; +import { Box } from '../Layout/Box/Box'; +import { Stack } from '../Layout/Stack/Stack'; +import { Text } from '../Text/Text'; + +import { GrotCTA } from './GrotCTA/GrotCTA'; +import { GrotNotFound } from './GrotNotFound/GrotNotFound'; +import GrotCompleted from './grot-completed.svg'; + +interface Props { + /** + * Provide a button to render below the message + */ + button?: ReactNode; + hideImage?: boolean; + /** + * Override the default image for the variant + */ + image?: ReactNode; + /** + * Message to display to the user + */ + message: string; + /** + * Which variant to use. Affects the default image shown. + */ + variant: 'call-to-action' | 'not-found' | 'completed'; +} + +export const EmptyState = ({ + button, + children, + image, + message, + hideImage = false, + variant, +}: React.PropsWithChildren) => { + const styles = useStyles2(getStyles); + const imageToShow = image ?? getDefaultImageForVariant(variant); + + return ( + +
+ {!hideImage && imageToShow} + + + {message} + + {children && ( + + {children} + + )} + + {button} +
+
+ ); +}; + +function getDefaultImageForVariant(variant: Props['variant']) { + switch (variant) { + case 'call-to-action': { + return ; + } + case 'not-found': { + return ; + } + case 'completed': { + return ; + } + default: { + throw new Error(`Unknown variant: ${variant}`); + } + } +} + +const getStyles = (theme: GrafanaTheme2) => ({ + container: css({ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + gap: theme.spacing(4), + maxWidth: '600px', + }), +}); diff --git a/packages/grafana-ui/src/components/EmptyState/GrotCTA/GrotCTA.tsx b/packages/grafana-ui/src/components/EmptyState/GrotCTA/GrotCTA.tsx new file mode 100644 index 00000000000..ce7d363fb6f --- /dev/null +++ b/packages/grafana-ui/src/components/EmptyState/GrotCTA/GrotCTA.tsx @@ -0,0 +1,32 @@ +import { css } from '@emotion/css'; +import React, { SVGProps } from 'react'; +import SVG from 'react-inlinesvg'; + +import { GrafanaTheme2 } from '@grafana/data'; + +import { useStyles2 } from '../../../themes'; + +import grotCTASvg from './grot-cta.svg'; + +export interface Props { + width?: SVGProps['width']; + height?: SVGProps['height']; +} + +export const GrotCTA = ({ width = 'auto', height }: Props) => { + const styles = useStyles2(getStyles); + + return ; +}; + +GrotCTA.displayName = 'GrotCTA'; + +const getStyles = (theme: GrafanaTheme2) => { + return { + svg: css({ + '#grot-cta-cactus-1, #grot-cta-cactus-2': { + fill: theme.isDark ? '#58558c' : '#c9c5f4', + }, + }), + }; +}; diff --git a/packages/grafana-ui/src/components/EmptyState/GrotCTA/grot-cta.svg b/packages/grafana-ui/src/components/EmptyState/GrotCTA/grot-cta.svg new file mode 100644 index 00000000000..7e44c92839c --- /dev/null +++ b/packages/grafana-ui/src/components/EmptyState/GrotCTA/grot-cta.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/grafana-ui/src/components/EmptyState/GrotNotFound/GrotNotFound.tsx b/packages/grafana-ui/src/components/EmptyState/GrotNotFound/GrotNotFound.tsx new file mode 100644 index 00000000000..1f09105dbf6 --- /dev/null +++ b/packages/grafana-ui/src/components/EmptyState/GrotNotFound/GrotNotFound.tsx @@ -0,0 +1,72 @@ +import { css } from '@emotion/css'; +import React, { SVGProps, useEffect, useRef } from 'react'; +import SVG from 'react-inlinesvg'; + +import { GrafanaTheme2 } from '@grafana/data'; + +import { useStyles2 } from '../../../themes'; + +import notFoundSvg from './grot-not-found.svg'; + +const MIN_ARM_ROTATION = -20; +const MAX_ARM_ROTATION = 5; +const MIN_ARM_TRANSLATION = -5; +const MAX_ARM_TRANSLATION = 5; + +export interface Props { + width?: SVGProps['width']; + height?: SVGProps['height']; +} + +export const GrotNotFound = ({ width = 'auto', height }: Props) => { + const svgRef = useRef(null); + const styles = useStyles2(getStyles); + + useEffect(() => { + const handleMouseMove = (event: MouseEvent) => { + const grotArm = svgRef.current?.querySelector('#grot-not-found-arm'); + const grotMagnifier = svgRef.current?.querySelector('#grot-not-found-magnifier'); + + const { clientX, clientY } = event; + const { innerWidth, innerHeight } = window; + const heightRatio = clientY / innerHeight; + const widthRatio = clientX / innerWidth; + const rotation = getIntermediateValue(heightRatio, MIN_ARM_ROTATION, MAX_ARM_ROTATION); + const translation = getIntermediateValue(widthRatio, MIN_ARM_TRANSLATION, MAX_ARM_TRANSLATION); + + window.requestAnimationFrame(() => { + grotArm?.setAttribute('style', `transform: rotate(${rotation}deg) translateX(${translation}%)`); + grotMagnifier?.setAttribute('style', `transform: rotate(${rotation}deg) translateX(${translation}%)`); + }); + }; + + window.addEventListener('mousemove', handleMouseMove); + + return () => { + window.removeEventListener('mousemove', handleMouseMove); + }; + }, []); + + return ; +}; + +GrotNotFound.displayName = 'GrotNotFound'; + +const getStyles = (theme: GrafanaTheme2) => { + return { + svg: css({ + '#grot-not-found-arm, #grot-not-found-magnifier': { + transformOrigin: 'center', + }, + }), + }; +}; + +/** + * Given a start value, end value, and a ratio, return the intermediate value + * Works with negative and inverted start/end values + */ +const getIntermediateValue = (ratio: number, start: number, end: number) => { + const value = ratio * (end - start) + start; + return value; +}; diff --git a/packages/grafana-ui/src/components/EmptyState/GrotNotFound/grot-not-found.svg b/packages/grafana-ui/src/components/EmptyState/GrotNotFound/grot-not-found.svg new file mode 100644 index 00000000000..f5574a95946 --- /dev/null +++ b/packages/grafana-ui/src/components/EmptyState/GrotNotFound/grot-not-found.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/grafana-ui/src/components/EmptyState/grot-completed.svg b/packages/grafana-ui/src/components/EmptyState/grot-completed.svg new file mode 100644 index 00000000000..2205faa698d --- /dev/null +++ b/packages/grafana-ui/src/components/EmptyState/grot-completed.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx b/packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx new file mode 100644 index 00000000000..9a57e38fc50 --- /dev/null +++ b/packages/grafana-ui/src/components/InteractiveTable/Expander/index.tsx @@ -0,0 +1,44 @@ +import { css } from '@emotion/css'; +import React from 'react'; +import { CellProps, HeaderProps } from 'react-table'; + +import { IconButton } from '../../IconButton/IconButton'; + +const expanderContainerStyles = css({ + display: 'flex', + alignItems: 'center', + height: '100%', +}); + +export function ExpanderCell({ row, __rowID }: CellProps) { + return ( +
+ +
+ ); +} + +export function ExpanderHeader({ isAllRowsExpanded, toggleAllRowsExpanded }: HeaderProps) { + return ( +
+ toggleAllRowsExpanded()} + size={'lg'} + tooltip={!isAllRowsExpanded ? 'Expand all rows' : 'Collapse all rows'} + variant={'secondary'} + /> +
+ ); +} diff --git a/packages/grafana-ui/src/components/InteractiveTable/ExpanderCell.tsx b/packages/grafana-ui/src/components/InteractiveTable/ExpanderCell.tsx deleted file mode 100644 index 03261f08dc0..00000000000 --- a/packages/grafana-ui/src/components/InteractiveTable/ExpanderCell.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { css } from '@emotion/css'; -import React from 'react'; -import { CellProps } from 'react-table'; - -import { IconButton } from '../IconButton/IconButton'; - -const expanderContainerStyles = css({ - display: 'flex', - alignItems: 'center', - height: '100%', -}); - -export function ExpanderCell({ row, __rowID }: CellProps) { - return ( -
- -
- ); -} diff --git a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.mdx b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.mdx index 4bde01ab917..c5c04a59cf6 100644 --- a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.mdx +++ b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.mdx @@ -111,6 +111,7 @@ export const MyComponent = () => { data={tableData} getRowId={(r) => r.datasource} renderExpandedRow={ExpandedCell} + showExpandAll /> ); }; diff --git a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx index 9d688b1d6d9..c4deeb1ed4a 100644 --- a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx +++ b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx @@ -1,151 +1,25 @@ -import { Meta, StoryFn } from '@storybook/react'; +import { Meta, StoryFn, StoryObj } from '@storybook/react'; import React, { useCallback, useMemo, useState } from 'react'; -import { InteractiveTable, Column, CellProps, LinkButton } from '@grafana/ui'; +import { InteractiveTable, CellProps, LinkButton } from '@grafana/ui'; + +import { Field } from '../Forms/Field'; +import { Input } from '../Input/Input'; import { FetchDataArgs, InteractiveTableHeaderTooltip } from './InteractiveTable'; import mdx from './InteractiveTable.mdx'; const EXCLUDED_PROPS = ['className', 'renderExpandedRow', 'getRowId', 'fetchData']; -const meta: Meta = { - title: 'Experimental/InteractiveTable', - component: InteractiveTable, - parameters: { - docs: { - page: mdx, - }, - controls: { - exclude: EXCLUDED_PROPS, - }, - }, - args: {}, - argTypes: {}, -}; - -interface TableData { - header1: string; - header2?: number; - noheader?: string; -} - -export const Basic: StoryFn = (args) => { - const columns = useMemo>>( - () => [ - { id: 'header2', header: 'With missing values', sortType: 'number', disableGrow: true }, - { - id: 'noheader', - sortType: 'number', - }, - ], - [] - ); - const data: TableData[] = useMemo( - () => [ - { header1: 'a', header2: 1 }, - { header1: 'b', noheader: "This column doesn't have an header" }, - { header1: 'c', noheader: "But it's still sortable" }, - ], - [] - ); - - return r.header1} />; -}; - -interface WithRowExpansionData { - datasource: string; - repo: string; - description: string; -} - -const ExpandedCell = ({ description }: WithRowExpansionData) => { - return

{description}

; -}; - -export const WithRowExpansion: StoryFn = (args) => { - const tableData: WithRowExpansionData[] = [ - { - datasource: 'Prometheus', - repo: 'https://github.com/prometheus/prometheus', - description: 'Open source time series database & alerting.', - }, - { - datasource: 'Loki', - repo: 'https://github.com/grafana/loki', - description: 'Like Prometheus but for logs. OSS logging solution from Grafana Labs.', - }, - { - datasource: 'Tempo', - repo: 'https://github.com/grafana/tempo', - description: 'High volume, minimal dependency trace storage. OSS tracing solution from Grafana Labs.', - }, - ]; - - const columns: Array> = [ - { id: 'datasource', header: 'Data Source' }, - { id: 'repo', header: 'Repo' }, - ]; - - return ( - r.datasource} - renderExpandedRow={ExpandedCell} - /> - ); -}; - -interface WithCustomCellData { - datasource: string; - repo: string; -} - -const RepoCell = ({ - row: { - original: { repo }, - }, -}: CellProps) => { - return ( - - Open on GithHub - - ); -}; - -export const WithCustomCell: StoryFn = (args) => { - const tableData: WithCustomCellData[] = [ - { - datasource: 'Prometheus', - repo: 'https://github.com/prometheus/prometheus', - }, - { - datasource: 'Loki', - repo: 'https://github.com/grafana/loki', - }, - { - datasource: 'Tempo', - repo: 'https://github.com/grafana/tempo', - }, - ]; - - const columns: Array> = [ - { id: 'datasource', header: 'Data Source' }, - { id: 'repo', header: 'Repo', cell: RepoCell }, - ]; - - return r.datasource} />; -}; - -interface WithPaginationData { +interface CarData { id: string; firstName: string; lastName: string; - car: string; + car?: string; age: number; } -const pageableData: WithPaginationData[] = [ +const pageableData: CarData[] = [ { id: '48a3926a-e82c-4c26-b959-3a5f473e186e', firstName: 'Brynne', lastName: 'Denisevich', car: 'Cougar', age: 47 }, { id: 'cf281390-adbf-4407-8cf3-a52e012f63e6', @@ -228,60 +102,177 @@ const pageableData: WithPaginationData[] = [ { id: 'b9b0b559-acc1-4bd8-b052-160ecf3e4f68', firstName: 'Ermanno', lastName: 'Sinott', car: 'Thunderbird', age: 26 }, ]; -export const WithPagination: StoryFn = (args) => { - const columns: Array> = [ - { id: 'firstName', header: 'First name' }, - { id: 'lastName', header: 'Last name' }, - { id: 'car', header: 'Car', sortType: 'string' }, - { id: 'age', header: 'Age', sortType: 'number' }, - ]; - return r.id} pageSize={15} />; +const meta: Meta> = { + title: 'Experimental/InteractiveTable', + component: InteractiveTable, + parameters: { + docs: { + page: mdx, + }, + controls: { + exclude: EXCLUDED_PROPS, + }, + }, + args: { + columns: [ + { id: 'firstName', header: 'First name', sortType: 'string' }, + { id: 'lastName', header: 'Last name', sortType: 'string' }, + { id: 'car', header: 'Car', sortType: 'string' }, + { id: 'age', header: 'Age' }, + ], + data: pageableData.slice(0, 10), + getRowId: (r) => r.id, + pageSize: 0, + showExpandAll: false, + }, + argTypes: {}, }; -export const WithHeaderTooltips: StoryFn = (args) => { - const columns: Array> = [ - { id: 'firstName', header: 'First name' }, - { id: 'lastName', header: 'Last name' }, - { id: 'car', header: 'Car', sortType: 'string' }, - { id: 'age', header: 'Age', sortType: 'number' }, - ]; +type TableStoryObj = StoryObj>; - const headerTooltips: Record = { - age: { content: 'The number of years since the person was born' }, - lastName: { - content: () => { - return ( - <> -

Here is an h4

-
Some content
-
Some more content
- - ); +export const Basic: TableStoryObj = { + args: { + columns: [ + { + id: 'firstName', + header: 'First name', + sortType: 'alphanumeric', }, - iconName: 'plus-square', - }, - }; + { + id: 'lastName', + sortType: 'alphanumeric', + }, + { id: 'car', header: 'With missing values', sortType: 'alphanumeric', disableGrow: true }, + ], + data: [ + { + id: 'be5736f5-7015-4668-a03d-44b56f2b012c', + firstName: 'Sonni', + lastName: 'Still sortable!', + car: 'Legend', + age: 75, + }, + { id: 'fdbe3559-c68a-4f2f-b579-48ef02642628', firstName: 'Hanson', lastName: 'Giraudeau', car: 'X5', age: 67 }, + { id: '7d0ee01a-7ac5-4e0a-9c73-e864d10c0152', firstName: 'Whitman', lastName: 'Seabridge', age: 99 }, + { id: '177c2287-b7cb-4b5f-8976-56ee993bed61', firstName: 'Aleda', lastName: 'Friman', car: 'X5', age: 44 }, + { id: '87c21e60-c2f4-4a01-b2af-a6d22c196e25', firstName: 'Cullen', lastName: 'Kobpac', car: 'Montero', age: 28 }, + { id: 'dd89f32d-2ef4-4c35-8e23-a8b2219e3a69', firstName: 'Fitz', lastName: 'Butterwick', car: 'Fox', age: 70 }, + { + id: 'cc1b4de7-8ec5-49bd-93bc-bee9fa1ccf37', + firstName: 'Jordon', + lastName: 'Harrington', + car: 'Elantra', + age: 39, + }, + ], + }, +}; + +const ExpandedCell = ({ car }: CarData) => { + return

{car}

; +}; + +export const WithRowExpansion: TableStoryObj = { + args: { + renderExpandedRow: ExpandedCell, + }, +}; + +interface WithCustomCellData { + datasource: string; + repo: string; +} + +const RepoCell = ({ + row: { + original: { repo }, + }, +}: CellProps) => { + return ( + + Open on GithHub + + ); +}; + +export const WithCustomCell: StoryObj> = { + args: { + columns: [ + { id: 'datasource', header: 'Data Source' }, + { id: 'repo', header: 'Repo', cell: RepoCell }, + ], + data: [ + { + datasource: 'Prometheus', + repo: 'https://github.com/prometheus/prometheus', + }, + { + datasource: 'Loki', + repo: 'https://github.com/grafana/loki', + }, + { + datasource: 'Tempo', + repo: 'https://github.com/grafana/tempo', + }, + ], + getRowId: (r) => r.datasource, + }, +}; + +export const WithPagination: StoryFn = (args) => { + const [filter, setFilter] = useState(''); + + const data = useMemo(() => { + if (filter) { + return pageableData.filter((d) => d.firstName.toLowerCase().includes(filter.toLowerCase())); + } + return pageableData; + }, [filter]); return ( - r.id} - headerTooltips={headerTooltips} - /> + <> + + { + setFilter(event.currentTarget.value); + }} + /> + + + ); }; +WithPagination.args = { + pageSize: 15, +}; + +const headerTooltips: Record = { + age: { content: 'The number of years since the person was born' }, + lastName: { + content: () => { + return ( + <> +

Here is an h4

+
Some content
+
Some more content
+ + ); + }, + iconName: 'plus-square', + }, +}; +export const WithHeaderTooltips: TableStoryObj = { + args: { + headerTooltips, + }, +}; + export const WithControlledSort: StoryFn = (args) => { - const columns: Array> = [ - { id: 'firstName', header: 'First name', sortType: 'string' }, - { id: 'lastName', header: 'Last name', sortType: 'string' }, - { id: 'car', header: 'Car', sortType: 'string' }, - { id: 'age', header: 'Age' }, - ]; const [data, setData] = useState(pageableData); - const fetchData = useCallback(({ sortBy }: FetchDataArgs) => { + const fetchData = useCallback(({ sortBy }: FetchDataArgs) => { if (!sortBy?.length) { return setData(pageableData); } @@ -291,9 +282,9 @@ export const WithControlledSort: StoryFn = (args) => { newData.sort((a, b) => { const sort = sortBy[0]; // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - const aData = a[sort.id as keyof Omit]; + const aData = a[sort.id as keyof Omit]; // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - const bData = b[sort.id as keyof Omit]; + const bData = b[sort.id as keyof Omit]; if (sort.desc) { return bData.localeCompare(aData); } @@ -303,6 +294,7 @@ export const WithControlledSort: StoryFn = (args) => { }, 300); }, []); - return r.id} pageSize={15} fetchData={fetchData} />; + return ; }; + export default meta; diff --git a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.test.tsx b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.test.tsx index 1e9418850aa..ec6c704f832 100644 --- a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.test.tsx +++ b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.test.tsx @@ -77,28 +77,101 @@ describe('InteractiveTable', () => { expect(valueColumnHeader).not.toHaveAttribute('aria-sort'); expect(countryColumnHeader).not.toHaveAttribute('aria-sort'); }); - - it('correctly expands rows', async () => { - const columns: Array> = [{ id: 'id', header: 'ID' }]; - const data: TableData[] = [{ id: '1', value: '1', country: 'Sweden' }]; - const { user } = setup( -
{row.country}
} - /> - ); - - const expanderButton = screen.getByRole('button', { name: /toggle row expanded/i }); - await user.click(expanderButton); - - expect(screen.getByTestId('test-1')).toHaveTextContent('Sweden'); - - expect(expanderButton.getAttribute('aria-controls')).toBe( - // ancestor tr's id should match the expander button's aria-controls attribute - screen.getByTestId('test-1').parentElement?.parentElement?.id - ); + describe('row expansion', () => { + it('correctly expands rows', async () => { + const columns: Array> = [{ id: 'id', header: 'ID' }]; + const data: TableData[] = [{ id: '1', value: '1', country: 'Sweden' }]; + const { user } = setup( +
{row.country}
} + /> + ); + + const expanderButton = screen.getByRole('button', { name: /toggle row expanded/i }); + await user.click(expanderButton); + + expect(screen.getByTestId('test-1')).toHaveTextContent('Sweden'); + + expect(expanderButton.getAttribute('aria-controls')).toBe( + // ancestor tr's id should match the expander button's aria-controls attribute + screen.getByTestId('test-1').parentElement?.parentElement?.id + ); + }); + it('does not render expand all when showExpandAll is false', async () => { + const columns: Array> = [{ id: 'id', header: 'ID' }]; + const data: TableData[] = [{ id: '1', value: '1', country: 'Sweden' }]; + setup( +
{row.country}
} + showExpandAll={false} + /> + ); + + expect(screen.queryByRole('button', { name: 'Expand all rows' })).not.toBeInTheDocument(); + }); + it('does not render expand all when showExpandAll is not provided', async () => { + const columns: Array> = [{ id: 'id', header: 'ID' }]; + const data: TableData[] = [{ id: '1', value: '1', country: 'Sweden' }]; + setup( +
{row.country}
} + /> + ); + + expect(screen.queryByRole('button', { name: 'Expand all rows' })).not.toBeInTheDocument(); + }); + it('renders expand all when showExpandAll is true', async () => { + const columns: Array> = [{ id: 'id', header: 'ID' }]; + const data: TableData[] = [{ id: '1', value: '1', country: 'Sweden' }]; + setup( +
{row.country}
} + showExpandAll + /> + ); + + expect(screen.getByRole('button', { name: 'Expand all rows' })).toBeInTheDocument(); + }); + it('expands all rows when expand all is clicked', async () => { + const columns: Array> = [{ id: 'id', header: 'ID' }]; + const data: TableData[] = [ + { id: '1', value: '1', country: 'Sweden' }, + { id: '2', value: '2', country: 'Belgium' }, + { id: '3', value: '3', country: 'France' }, + ]; + const { user } = setup( +
{row.country}
} + showExpandAll + /> + ); + + expect(screen.queryByTestId('test-1')).not.toBeInTheDocument(); + expect(screen.queryByTestId('test-2')).not.toBeInTheDocument(); + expect(screen.queryByTestId('test-3')).not.toBeInTheDocument(); + + const expandAllButton = screen.getByRole('button', { name: 'Expand all rows' }); + await user.click(expandAllButton); + + expect(screen.queryByTestId('test-1')).toBeInTheDocument(); + expect(screen.queryByTestId('test-2')).toBeInTheDocument(); + expect(screen.queryByTestId('test-3')).toBeInTheDocument(); + }); }); describe('pagination', () => { it('does not render pagination controls if pageSize is not set', () => { diff --git a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.tsx b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.tsx index cdd8df052b8..a1ced1b5d0c 100644 --- a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.tsx +++ b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.tsx @@ -120,7 +120,8 @@ export type InteractiveTableHeaderTooltip = { export type FetchDataArgs = { sortBy: Array> }; export type FetchDataFunc = ({ sortBy }: FetchDataArgs) => void; -interface Props { + +interface BaseProps { className?: string; /** * Table's columns definition. Must be memoized. @@ -140,12 +141,10 @@ interface Props { headerTooltips?: Record; /** * Number of rows per page. A value of zero disables pagination. Defaults to 0. + * A React hooks error will be thrown if pageSize goes from greater than 0 to 0 or vice versa. If enabling pagination, + * make sure pageSize remains a non-zero value. */ pageSize?: number; - /** - * Render function for the expanded row. if not provided, the tables rows will not be expandable. - */ - renderExpandedRow?: (row: TableData) => ReactNode; /** * A custom function to fetch data when the table is sorted. If not provided, the table will be sorted client-side. * It's important for this function to have a stable identity, e.g. being wrapped into useCallback to prevent unnecessary @@ -154,6 +153,24 @@ interface Props { fetchData?: FetchDataFunc; } +interface WithExpandableRow extends BaseProps { + /** + * Render function for the expanded row. if not provided, the tables rows will not be expandable. + */ + renderExpandedRow: (row: TableData) => ReactNode; + /** + * Whether to show the "Expand all" button. Depends on renderExpandedRow to be provided. Defaults to false. + */ + showExpandAll?: boolean; +} + +interface WithoutExpandableRow extends BaseProps { + renderExpandedRow?: never; + showExpandAll?: never; +} + +type Props = WithExpandableRow | WithoutExpandableRow; + /** @alpha */ export function InteractiveTable({ className, @@ -163,12 +180,13 @@ export function InteractiveTable({ headerTooltips, pageSize = 0, renderExpandedRow, + showExpandAll = false, fetchData, }: Props) { const styles = useStyles2(getStyles); const tableColumns = useMemo(() => { - return getColumns(columns); - }, [columns]); + return getColumns(columns, showExpandAll); + }, [columns, showExpandAll]); const id = useUniqueId(); const getRowHTMLID = useCallback( (row: Row) => { @@ -180,7 +198,7 @@ export function InteractiveTable({ const tableHooks: Array> = [useSortBy, useExpanded]; const multiplePages = data.length > pageSize; - const paginationEnabled = pageSize > 0 && multiplePages; + const paginationEnabled = pageSize > 0; if (paginationEnabled) { tableHooks.push(usePagination); @@ -288,7 +306,7 @@ export function InteractiveTable({ })} - {paginationEnabled && ( + {paginationEnabled && multiplePages && ( = RTColumn & { }; // Returns the columns in a "react-table" acceptable format -export function getColumns(columns: Array>): Array> { +export function getColumns( + columns: Array>, + showExpandAll = false +): Array> { return [ { id: EXPANDER_CELL_ID, Cell: ExpanderCell, + ...(showExpandAll && { + Header: ExpanderHeader, + }), disableSortBy: true, width: 0, }, diff --git a/packages/grafana-ui/src/components/Layout/Box/Box.story.tsx b/packages/grafana-ui/src/components/Layout/Box/Box.story.tsx index 203f9f13108..b564a3d2476 100644 --- a/packages/grafana-ui/src/components/Layout/Box/Box.story.tsx +++ b/packages/grafana-ui/src/components/Layout/Box/Box.story.tsx @@ -73,6 +73,7 @@ Basic.argTypes = { paddingBottom: SpacingTokenControl, paddingLeft: SpacingTokenControl, paddingRight: SpacingTokenControl, + direction: { control: 'select', options: ['row', 'row-reverse', 'column', 'column-reverse'] }, display: { control: 'select', options: ['flex', 'block', 'inline', 'none'] }, backgroundColor: { control: 'select', options: backgroundOptions }, borderStyle: { control: 'select', options: borderStyleOptions }, diff --git a/packages/grafana-ui/src/components/Layout/Box/Box.tsx b/packages/grafana-ui/src/components/Layout/Box/Box.tsx index 754f0889552..3f4a36c6950 100644 --- a/packages/grafana-ui/src/components/Layout/Box/Box.tsx +++ b/packages/grafana-ui/src/components/Layout/Box/Box.tsx @@ -4,7 +4,7 @@ import React, { ElementType, forwardRef, PropsWithChildren } from 'react'; import { GrafanaTheme2, ThemeSpacingTokens, ThemeShape, ThemeShadows } from '@grafana/data'; import { useStyles2 } from '../../../themes'; -import { AlignItems, FlexProps, JustifyContent } from '../types'; +import { AlignItems, Direction, FlexProps, JustifyContent } from '../types'; import { ResponsiveProp, getResponsiveStyle } from '../utils/responsiveness'; type Display = 'flex' | 'block' | 'inline' | 'inline-block' | 'none'; @@ -54,6 +54,7 @@ interface BoxProps extends FlexProps, Omit, 'c // Flex Props alignItems?: ResponsiveProp; + direction?: ResponsiveProp; justifyContent?: ResponsiveProp; gap?: ResponsiveProp; @@ -91,6 +92,7 @@ export const Box = forwardRef>((props, borderColor, borderStyle, borderRadius, + direction, justifyContent, alignItems, boxShadow, @@ -123,6 +125,7 @@ export const Box = forwardRef>((props, borderColor, borderStyle, borderRadius, + direction, justifyContent, alignItems, boxShadow, @@ -188,6 +191,7 @@ const getStyles = ( borderColor: BoxProps['borderColor'], borderStyle: BoxProps['borderStyle'], borderRadius: BoxProps['borderRadius'], + direction: BoxProps['direction'], justifyContent: BoxProps['justifyContent'], alignItems: BoxProps['alignItems'], boxShadow: BoxProps['boxShadow'], @@ -247,6 +251,9 @@ const getStyles = ( getResponsiveStyle(theme, backgroundColor, (val) => ({ backgroundColor: customBackgroundColor(val, theme), })), + getResponsiveStyle(theme, direction, (val) => ({ + flexDirection: val, + })), getResponsiveStyle(theme, grow, (val) => ({ flexGrow: val, })), diff --git a/packages/grafana-ui/src/components/Layout/Grid/Grid.story.tsx b/packages/grafana-ui/src/components/Layout/Grid/Grid.story.tsx index 2c73d9d0f43..d4dadc083ad 100644 --- a/packages/grafana-ui/src/components/Layout/Grid/Grid.story.tsx +++ b/packages/grafana-ui/src/components/Layout/Grid/Grid.story.tsx @@ -6,6 +6,10 @@ import { useTheme2 } from '../../../themes'; import { Grid } from './Grid'; import mdx from './Grid.mdx'; +const dimensions = Array.from({ length: 9 }).map(() => ({ + minHeight: `${Math.random() * 100 + 100}px`, +})); + const meta: Meta = { title: 'General/Layout/Grid', component: Grid, @@ -22,15 +26,21 @@ const meta: Meta = { export const ColumnsNumber: StoryFn = (args) => { const theme = useTheme2(); return ( - + {Array.from({ length: 9 }).map((_, i) => ( -
+
N# {i}
))} ); }; +ColumnsNumber.argTypes = { + alignItems: { + control: 'select', + options: ['stretch', 'flex-start', 'flex-end', 'center', 'baseline', 'start', 'end', 'self-start', 'self-end'], + }, +}; ColumnsNumber.args = { columns: 3, }; diff --git a/packages/grafana-ui/src/components/Layout/Grid/Grid.tsx b/packages/grafana-ui/src/components/Layout/Grid/Grid.tsx index 0a452686b8a..4225bb6074b 100644 --- a/packages/grafana-ui/src/components/Layout/Grid/Grid.tsx +++ b/packages/grafana-ui/src/components/Layout/Grid/Grid.tsx @@ -4,12 +4,14 @@ import React, { forwardRef, HTMLAttributes } from 'react'; import { GrafanaTheme2, ThemeSpacingTokens } from '@grafana/data'; import { useStyles2 } from '../../../themes'; +import { AlignItems } from '../types'; import { getResponsiveStyle, ResponsiveProp } from '../utils/responsiveness'; interface GridPropsBase extends Omit, 'className' | 'style'> { children: NonNullable; /** Specifies the gutters between columns and rows. It is overwritten when a column or row gap has a value. */ gap?: ResponsiveProp; + alignItems?: ResponsiveProp; } interface PropsWithColumns extends GridPropsBase { @@ -30,8 +32,8 @@ interface PropsWithMinColumnWidth extends GridPropsBase { type GridProps = PropsWithColumns | PropsWithMinColumnWidth; export const Grid = forwardRef((props, ref) => { - const { children, gap, columns, minColumnWidth, ...rest } = props; - const styles = useStyles2(getGridStyles, gap, columns, minColumnWidth); + const { alignItems, children, gap, columns, minColumnWidth, ...rest } = props; + const styles = useStyles2(getGridStyles, gap, columns, minColumnWidth, alignItems); return (
@@ -46,7 +48,8 @@ const getGridStyles = ( theme: GrafanaTheme2, gap: GridProps['gap'], columns: GridProps['columns'], - minColumnWidth: GridProps['minColumnWidth'] + minColumnWidth: GridProps['minColumnWidth'], + alignItems: GridProps['alignItems'] ) => { return { grid: css([ @@ -62,6 +65,9 @@ const getGridStyles = ( getResponsiveStyle(theme, columns, (val) => ({ gridTemplateColumns: `repeat(${val}, 1fr)`, })), + getResponsiveStyle(theme, alignItems, (val) => ({ + alignItems: val, + })), ]), }; }; diff --git a/packages/grafana-ui/src/components/Layout/LayoutItemContext.ts b/packages/grafana-ui/src/components/Layout/LayoutItemContext.ts deleted file mode 100644 index 08832aab601..00000000000 --- a/packages/grafana-ui/src/components/Layout/LayoutItemContext.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createContext } from 'react'; - -export interface LayoutItemContextProps { - boostZIndex(): () => void; -} - -/** - * Provides an API for downstream components (e.g. within panels) to inform the layout - * that anchored tooltips or context menus could overflow the panel bounds. The layout - * system can then boost the z-index of items with any anchored contents to prevent the overflown - * content from rendering underneath adjacent layout items (e.g. other panels) that naturally - * render later/higher in the stacking order - * - * This is used by VizTooltips and Annotations, which anchor to data points or time range within - * the viz drawing area - * - * @internal - */ -export const LayoutItemContext = createContext({ - boostZIndex: () => () => {}, -}); diff --git a/packages/grafana-ui/src/components/Link/TextLink.story.tsx b/packages/grafana-ui/src/components/Link/TextLink.story.tsx index a4dcdc74a31..deeed326145 100644 --- a/packages/grafana-ui/src/components/Link/TextLink.story.tsx +++ b/packages/grafana-ui/src/components/Link/TextLink.story.tsx @@ -18,7 +18,10 @@ const meta: Meta = { controls: { exclude: ['href', 'external'] }, }, argTypes: { - variant: { control: 'select', options: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'body', 'bodySmall', undefined] }, + variant: { + control: 'select', + options: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'body', 'bodySmall', undefined], + }, weight: { control: 'select', options: ['bold', 'medium', 'light', 'regular', undefined], @@ -30,10 +33,6 @@ const meta: Meta = { inline: { control: 'boolean' }, }, args: { - variant: 'body', - weight: 'light', - color: undefined, - inline: false, href: 'https://www.google.com', external: true, icon: 'external-link-alt', diff --git a/packages/grafana-ui/src/components/Link/TextLink.tsx b/packages/grafana-ui/src/components/Link/TextLink.tsx index 2a50bc9e2db..2d5a253bee8 100644 --- a/packages/grafana-ui/src/components/Link/TextLink.tsx +++ b/packages/grafana-ui/src/components/Link/TextLink.tsx @@ -10,6 +10,8 @@ import { customWeight } from '../Text/utils'; import { Link } from './Link'; +type TextLinkVariants = keyof Omit; + interface TextLinkProps extends Omit, 'target' | 'rel'> { /** url to which redirect the user, external or internal */ href: string; @@ -19,8 +21,8 @@ interface TextLinkProps extends Omit, 't external?: boolean; /** True when the link will be displayed inline with surrounding text, false if it will be displayed as a block. Depending on this prop correspondant default styles will be applied */ inline?: boolean; - /** The default variant is 'body'. To fit another styles set the correspondent variant as it is necessary also to adjust the icon size */ - variant?: keyof ThemeTypographyVariantTypes; + /** The default variant is 'body'. To fit another styles set the correspondent variant as it is necessary also to adjust the icon size. `code` is excluded, as it is not fit for links. */ + variant?: TextLinkVariants; /** Override the default weight for the used variant */ weight?: 'light' | 'regular' | 'medium' | 'bold'; /** Set the icon to be shown. An external link will show the 'external-link-alt' icon as default.*/ @@ -29,7 +31,7 @@ interface TextLinkProps extends Omit, 't } const svgSizes: { - [key in keyof ThemeTypographyVariantTypes]: IconSize; + [key in TextLinkVariants]: IconSize; } = { h1: 'xl', h2: 'xl', diff --git a/packages/grafana-ui/src/components/Menu/Menu.tsx b/packages/grafana-ui/src/components/Menu/Menu.tsx index 4d52692fe69..9dc03f1ee55 100644 --- a/packages/grafana-ui/src/components/Menu/Menu.tsx +++ b/packages/grafana-ui/src/components/Menu/Menu.tsx @@ -4,6 +4,7 @@ import React, { useImperativeHandle, useRef } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { useStyles2 } from '../../themes'; +import { Box } from '../Layout/Box/Box'; import { MenuDivider } from './MenuDivider'; import { MenuGroup } from './MenuGroup'; @@ -27,17 +28,22 @@ const MenuComp = React.forwardRef( const localRef = useRef(null); useImperativeHandle(forwardedRef, () => localRef.current!); - const [handleKeys] = useMenuFocus({ localRef, onOpen, onClose, onKeyDown }); + const [handleKeys] = useMenuFocus({ isMenuOpen: true, localRef, onOpen, onClose, onKeyDown }); return ( -
{header && (
(
)} {children} -
+ ); } ); @@ -66,17 +72,10 @@ export const Menu = Object.assign(MenuComp, { const getStyles = (theme: GrafanaTheme2) => { return { header: css({ - padding: `${theme.spacing(0.5, 1, 1, 1)}`, + padding: theme.spacing(0.5, 1, 1, 1), }), headerBorder: css({ borderBottom: `1px solid ${theme.colors.border.weak}`, }), - wrapper: css({ - background: `${theme.colors.background.primary}`, - boxShadow: `${theme.shadows.z3}`, - display: `inline-block`, - borderRadius: `${theme.shape.radius.default}`, - padding: `${theme.spacing(0.5, 0)}`, - }), }; }; diff --git a/packages/grafana-ui/src/components/Menu/MenuItem.tsx b/packages/grafana-ui/src/components/Menu/MenuItem.tsx index 49f3d751f0a..b6947643064 100644 --- a/packages/grafana-ui/src/components/Menu/MenuItem.tsx +++ b/packages/grafana-ui/src/components/Menu/MenuItem.tsx @@ -79,7 +79,6 @@ export const MenuItem = React.memo( const styles = useStyles2(getStyles); const [isActive, setIsActive] = useState(active); const [isSubMenuOpen, setIsSubMenuOpen] = useState(false); - const [openedWithArrow, setOpenedWithArrow] = useState(false); const onMouseEnter = useCallback(() => { if (disabled) { return; @@ -128,7 +127,6 @@ export const MenuItem = React.memo( event.stopPropagation(); if (hasSubMenu) { setIsSubMenuOpen(true); - setOpenedWithArrow(true); setIsActive(true); } break; @@ -178,8 +176,6 @@ export const MenuItem = React.memo( @@ -219,7 +215,7 @@ const getStyles = (theme: GrafanaTheme2) => { width: '100%', position: 'relative', - '&:hover, &:focus, &:focus-visible': { + '&:hover, &:focus-visible': { background: theme.colors.action.hover, color: theme.colors.text.primary, textDecoration: 'none', diff --git a/packages/grafana-ui/src/components/Menu/SubMenu.test.tsx b/packages/grafana-ui/src/components/Menu/SubMenu.test.tsx index 67ea2daa520..b86d43e5e34 100644 --- a/packages/grafana-ui/src/components/Menu/SubMenu.test.tsx +++ b/packages/grafana-ui/src/components/Menu/SubMenu.test.tsx @@ -13,9 +13,7 @@ describe('SubMenu', () => { , ]; - render( - - ); + render(); expect(screen.getByTestId(selectors.components.Menu.SubMenu.icon)).toBeInTheDocument(); diff --git a/packages/grafana-ui/src/components/Menu/SubMenu.tsx b/packages/grafana-ui/src/components/Menu/SubMenu.tsx index 5016f72b776..50b49828874 100644 --- a/packages/grafana-ui/src/components/Menu/SubMenu.tsx +++ b/packages/grafana-ui/src/components/Menu/SubMenu.tsx @@ -17,10 +17,6 @@ export interface SubMenuProps { items?: Array>; /** Open */ isOpen: boolean; - /** Marks whether subMenu was opened with arrow */ - openedWithArrow: boolean; - /** Changes value of openedWithArrow */ - setOpenedWithArrow: (openedWithArrow: boolean) => void; /** Closes the subMenu */ close: () => void; /** Custom style */ @@ -28,46 +24,42 @@ export interface SubMenuProps { } /** @internal */ -export const SubMenu = React.memo( - ({ items, isOpen, openedWithArrow, setOpenedWithArrow, close, customStyle }: SubMenuProps) => { - const styles = useStyles2(getStyles); - const localRef = useRef(null); - const [handleKeys] = useMenuFocus({ - localRef, - isMenuOpen: isOpen, - openedWithArrow, - setOpenedWithArrow, - close, - }); +export const SubMenu = React.memo(({ items, isOpen, close, customStyle }: SubMenuProps) => { + const styles = useStyles2(getStyles); + const localRef = useRef(null); + const [handleKeys] = useMenuFocus({ + localRef, + isMenuOpen: isOpen, + close, + }); - const [pushLeft, setPushLeft] = useState(false); - useEffect(() => { - if (isOpen && localRef.current) { - setPushLeft(isElementOverflowing(localRef.current)); - } - }, [isOpen]); + const [pushLeft, setPushLeft] = useState(false); + useEffect(() => { + if (isOpen && localRef.current) { + setPushLeft(isElementOverflowing(localRef.current)); + } + }, [isOpen]); - return ( - <> -
- -
- {isOpen && ( -
-
- {items} -
+ return ( + <> +
+ +
+ {isOpen && ( +
+
+ {items}
- )} - - ); - } -); +
+ )} + + ); +}); SubMenu.displayName = 'SubMenu'; diff --git a/packages/grafana-ui/src/components/Menu/hooks.test.tsx b/packages/grafana-ui/src/components/Menu/hooks.test.tsx index 254f41c7a8a..4ca9e69045c 100644 --- a/packages/grafana-ui/src/components/Menu/hooks.test.tsx +++ b/packages/grafana-ui/src/components/Menu/hooks.test.tsx @@ -141,18 +141,15 @@ describe('useMenuFocus', () => { expect(onKeyDown).toHaveBeenCalledTimes(2); }); - it('focuses on first item when menu was opened with arrow', () => { + it('focuses on first item', () => { const ref = createRef(); render(getMenuElement(ref)); const isMenuOpen = true; - const openedWithArrow = true; - const setOpenedWithArrow = jest.fn(); - renderHook(() => useMenuFocus({ localRef: ref, isMenuOpen, openedWithArrow, setOpenedWithArrow })); + renderHook(() => useMenuFocus({ localRef: ref, isMenuOpen })); expect(screen.getByText('Item 1').tabIndex).toBe(0); - expect(setOpenedWithArrow).toHaveBeenCalledWith(false); }); it('clicks focused item when Enter key is pressed', () => { diff --git a/packages/grafana-ui/src/components/Menu/hooks.ts b/packages/grafana-ui/src/components/Menu/hooks.ts index 6713535827a..b6111f9804f 100644 --- a/packages/grafana-ui/src/components/Menu/hooks.ts +++ b/packages/grafana-ui/src/components/Menu/hooks.ts @@ -8,8 +8,6 @@ const UNFOCUSED = -1; export interface UseMenuFocusProps { localRef: RefObject; isMenuOpen?: boolean; - openedWithArrow?: boolean; - setOpenedWithArrow?: (openedWithArrow: boolean) => void; close?: () => void; onOpen?: (focusOnItem: (itemId: number) => void) => void; onClose?: () => void; @@ -23,8 +21,6 @@ export type UseMenuFocusReturn = [(event: React.KeyboardEvent) => void]; export const useMenuFocus = ({ localRef, isMenuOpen, - openedWithArrow, - setOpenedWithArrow, close, onOpen, onClose, @@ -33,11 +29,10 @@ export const useMenuFocus = ({ const [focusedItem, setFocusedItem] = useState(UNFOCUSED); useEffect(() => { - if (isMenuOpen && openedWithArrow) { + if (isMenuOpen) { setFocusedItem(0); - setOpenedWithArrow?.(false); } - }, [isMenuOpen, openedWithArrow, setOpenedWithArrow]); + }, [isMenuOpen]); useEffect(() => { const menuItems = localRef?.current?.querySelectorAll( diff --git a/packages/grafana-ui/src/components/Modal/ModalsContext.tsx b/packages/grafana-ui/src/components/Modal/ModalsContext.tsx index d2841532942..aa69fc4ed52 100644 --- a/packages/grafana-ui/src/components/Modal/ModalsContext.tsx +++ b/packages/grafana-ui/src/components/Modal/ModalsContext.tsx @@ -22,6 +22,10 @@ interface ModalsProviderProps { props?: any; } +/** + * @deprecated. + * Not the real implementation used by core. + */ export class ModalsProvider extends Component { constructor(props: ModalsProviderProps) { super(props); diff --git a/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx b/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx index a7ac0d7fb0d..7ab4854ec2c 100644 --- a/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx +++ b/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx @@ -119,14 +119,12 @@ class UnthemedCodeEditor extends PureComponent { } }); - const languagePromise = this.loadCustomLanguage(); - if (onChange) { editor.getModel()?.onDidChangeContent(() => onChange(editor.getValue())); } if (onEditorDidMount) { - languagePromise.then(() => onEditorDidMount(editor, monaco)); + onEditorDidMount(editor, monaco); } }; diff --git a/packages/grafana-ui/src/components/Monaco/ReactMonacoEditor.tsx b/packages/grafana-ui/src/components/Monaco/ReactMonacoEditor.tsx index a6db1ce5fc3..0f0ab1b3ee3 100644 --- a/packages/grafana-ui/src/components/Monaco/ReactMonacoEditor.tsx +++ b/packages/grafana-ui/src/components/Monaco/ReactMonacoEditor.tsx @@ -1,4 +1,5 @@ -import MonacoEditor, { loader as monacoEditorLoader, Monaco } from '@monaco-editor/react'; +import Editor, { loader as monacoEditorLoader, Monaco } from '@monaco-editor/react'; +import * as monaco from 'monaco-editor'; import React, { useCallback } from 'react'; import { useTheme2 } from '../../themes'; @@ -6,11 +7,8 @@ import { useTheme2 } from '../../themes'; import defineThemes from './theme'; import type { ReactMonacoEditorProps } from './types'; -monacoEditorLoader.config({ - paths: { - vs: (window.__grafana_public_path__ ?? 'public/') + 'lib/monaco/min/vs', - }, -}); +// pass the monaco editor to the loader to bypass requirejs +monacoEditorLoader.config({ monaco }); export const ReactMonacoEditor = (props: ReactMonacoEditorProps) => { const { beforeMount } = props; @@ -25,10 +23,6 @@ export const ReactMonacoEditor = (props: ReactMonacoEditorProps) => { ); return ( - + ); }; diff --git a/packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx b/packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx index da00cbf970a..4f4d690a42d 100644 --- a/packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx +++ b/packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx @@ -358,15 +358,6 @@ const getStyles = (theme: GrafanaTheme2) => { display: 'flex', flexDirection: 'column', - '> *': { - zIndex: 0, - }, - - // matches .react-grid-item styles in _dashboard_grid.scss to ensure any contained tooltips occlude adjacent panels - '&:hover, &:active, &:focus': { - zIndex: theme.zIndex.activePanel, - }, - '.show-on-hover': { opacity: '0', visibility: 'hidden', diff --git a/packages/grafana-ui/src/components/Portal/Portal.tsx b/packages/grafana-ui/src/components/Portal/Portal.tsx index 0e00c7b2025..aa6f309bb07 100644 --- a/packages/grafana-ui/src/components/Portal/Portal.tsx +++ b/packages/grafana-ui/src/components/Portal/Portal.tsx @@ -9,7 +9,7 @@ interface Props { forwardedRef?: React.ForwardedRef; } -export function Portal(props: PropsWithChildren) { +export function Portal(props: PropsWithChildren): JSX.Element { const { children, className, root, forwardedRef } = props; const theme = useTheme2(); const node = useRef(null); diff --git a/packages/grafana-ui/src/components/Select/Select.mdx b/packages/grafana-ui/src/components/Select/Select.mdx index 78318d59314..5af27ea2344 100644 --- a/packages/grafana-ui/src/components/Select/Select.mdx +++ b/packages/grafana-ui/src/components/Select/Select.mdx @@ -1,8 +1,11 @@ -import { ArgTypes, Preview } from '@storybook/blocks'; -import { Select, AsyncSelect, MultiSelect, AsyncMultiSelect } from './Select'; -import { generateOptions } from './mockOptions'; +import { ArgTypes } from '@storybook/blocks'; +import { Select, AsyncSelect } from './Select'; -# Select variants +# Select + +Select is the base for every component on this page. The approaches mentioned here are also applicable to `AsyncSelect`, `MultiSelect`, `AsyncMultiSelect`. + +## Select variants Select is an input with the ability to search and create new values. It should be used when you have a list of options. If the data has a tree structure, consider using `Cascader` instead. Select has some features: @@ -12,10 +15,6 @@ Select has some features: - Select from async data - Create custom values that aren't in the list -## Select - -Select is the base for every component on this page. The approaches mentioned here are also applicable to `AsyncSelect`, `MultiSelect`, `AsyncMultiSelect`. - ### Options format There are four properties for each option: @@ -61,6 +60,57 @@ const SelectComponent = () => { }; ``` +### Resetting selected value from outside the component + +If you want to reset the selected value from outside the component, e.g. if there are two Select components that should be in sync, you can set the dependent Select value to `null` in the `onChange` handler of the first Select component. + +```tsx +import React, { useState } from 'react'; +import { Select } from '@grafana/ui'; + +const SelectComponent = () => { + const [person, setPerson] = useState(''); + const [team, setTeam] = useState(''); + + return ( +
+ setTeam(value)} + options={[ + { + value: 'team1', + label: 'Team 1', + }, + { + value: 'team', + label: 'Team 2', + }, + ]} + value={team} + /> +
+ ); +}; +``` + ## AsyncSelect Like regular Select, but handles fetching options asynchronously. Use the `loadOptions` prop for the async function that loads the options. If `defaultOptions` is set to `true`, `loadOptions` will be called when the component is mounted. @@ -83,7 +133,6 @@ const basicSelectAsync = () => { /> ); }; - ``` Where the async function could look like this: @@ -126,7 +175,7 @@ const multiSelect = () => { Like MultiSelect but handles data asynchronously with the `loadOptions` prop. -# Testing +## Testing Using React Testing Library, you can select the ` - {query.data ? ( -
{describeDataFrame(query.data)}
- ) : ( - - {name}: {describeDataFrame(datasource.data)}    - - - )} - - - {query.data && } -
- ); - } -} diff --git a/plugins-bundled/internal/input-datasource/src/img/input.svg b/plugins-bundled/internal/input-datasource/src/img/input.svg deleted file mode 100644 index 5d2d8ce6c5b..00000000000 --- a/plugins-bundled/internal/input-datasource/src/img/input.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/plugins-bundled/internal/input-datasource/src/module.ts b/plugins-bundled/internal/input-datasource/src/module.ts deleted file mode 100644 index 66765d458c5..00000000000 --- a/plugins-bundled/internal/input-datasource/src/module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { DataSourcePlugin } from '@grafana/data'; - -import { InputConfigEditor } from './InputConfigEditor'; -import { InputDatasource } from './InputDatasource'; -import { InputQueryEditor } from './InputQueryEditor'; -import { InputOptions, InputQuery } from './types'; - -export const plugin = new DataSourcePlugin(InputDatasource) - .setConfigEditor(InputConfigEditor) - .setQueryEditor(InputQueryEditor); diff --git a/plugins-bundled/internal/input-datasource/src/plugin.json b/plugins-bundled/internal/input-datasource/src/plugin.json deleted file mode 100644 index 5cd72d9f1c7..00000000000 --- a/plugins-bundled/internal/input-datasource/src/plugin.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "datasource", - "name": "Direct Input", - "id": "input", - "state": "alpha", - - "metrics": true, - - "info": { - "version": "1.0.0", - "description": "Data source that supports manual table & CSV input", - "author": { - "name": "Grafana Labs", - "url": "https://grafana.com" - }, - "logos": { - "small": "img/input.svg", - "large": "img/input.svg" - } - } -} diff --git a/plugins-bundled/internal/input-datasource/src/testHelpers.ts b/plugins-bundled/internal/input-datasource/src/testHelpers.ts deleted file mode 100644 index d4f0902542c..00000000000 --- a/plugins-bundled/internal/input-datasource/src/testHelpers.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { DataQueryRequest, DataQuery, CoreApp, dateTime } from '@grafana/data'; - -export function getQueryOptions( - options: Partial> -): DataQueryRequest { - const raw = { from: 'now', to: 'now-1h' }; - const range = { from: dateTime(), to: dateTime(), raw: raw }; - - const defaults: DataQueryRequest = { - requestId: 'TEST', - app: CoreApp.Dashboard, - range: range, - targets: [], - scopedVars: {}, - timezone: 'browser', - panelId: 1, - dashboardUID: 'test-uid-1', - interval: '60s', - intervalMs: 60000, - maxDataPoints: 500, - startTime: 0, - }; - - Object.assign(defaults, options); - - return defaults; -} diff --git a/plugins-bundled/internal/input-datasource/src/types.ts b/plugins-bundled/internal/input-datasource/src/types.ts deleted file mode 100644 index 9dc0164a32a..00000000000 --- a/plugins-bundled/internal/input-datasource/src/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { DataQuery, DataSourceJsonData, DataFrameDTO } from '@grafana/data'; - -export interface InputQuery extends DataQuery { - // Data saved in the panel - data?: DataFrameDTO[]; -} - -export interface InputOptions extends DataSourceJsonData { - // Saved in the datasource and download with bootData - data?: DataFrameDTO[]; -} diff --git a/plugins-bundled/internal/input-datasource/src/utils.ts b/plugins-bundled/internal/input-datasource/src/utils.ts deleted file mode 100644 index 7ca7393a8a1..00000000000 --- a/plugins-bundled/internal/input-datasource/src/utils.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { toDataFrame, DataFrameDTO, toCSV } from '@grafana/data'; - -export function dataFrameToCSV(dto?: DataFrameDTO[]) { - if (!dto || !dto.length) { - return ''; - } - return toCSV(dto.map((v) => toDataFrame(v))); -} diff --git a/plugins-bundled/internal/input-datasource/tsconfig.json b/plugins-bundled/internal/input-datasource/tsconfig.json deleted file mode 100644 index 78788d15d84..00000000000 --- a/plugins-bundled/internal/input-datasource/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "@grafana/tsconfig", - "include": ["src", "types"], - "compilerOptions": { - "declaration": false, - "rootDir": "./src", - "baseUrl": "./src" - }, - "ts-node": { - "compilerOptions": { - "module": "commonjs", - "target": "es5", - "esModuleInterop": true - }, - "transpileOnly": true - } -} diff --git a/plugins-bundled/internal/input-datasource/webpack.config.ts b/plugins-bundled/internal/input-datasource/webpack.config.ts deleted file mode 100644 index 6f938cade38..00000000000 --- a/plugins-bundled/internal/input-datasource/webpack.config.ts +++ /dev/null @@ -1,159 +0,0 @@ -import CopyWebpackPlugin from 'copy-webpack-plugin'; -import ESLintPlugin from 'eslint-webpack-plugin'; -import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; -import path from 'path'; -import { Configuration } from 'webpack'; - -const SOURCE_DIR = path.resolve(__dirname, 'src'); -const DIST_DIR = path.resolve(__dirname, 'dist'); -const PLUGIN_ID = require(path.join(SOURCE_DIR, 'plugin.json')).id; - -const config = async (env: Record): Promise => ({ - cache: { - type: 'filesystem', - buildDependencies: { - config: [__filename], - }, - }, - - context: path.join(process.cwd(), SOURCE_DIR), - - devtool: env.production ? 'source-map' : 'eval-source-map', - - entry: { - module: path.join(SOURCE_DIR, 'module.ts'), - }, - - externals: [ - 'lodash', - 'jquery', - 'moment', - 'slate', - 'emotion', - '@emotion/react', - '@emotion/css', - 'prismjs', - 'slate-plain-serializer', - '@grafana/slate-react', - 'react', - 'react-dom', - 'react-redux', - 'redux', - 'rxjs', - 'react-router', - 'react-router-dom', - 'd3', - 'angular', - '@grafana/ui', - '@grafana/runtime', - '@grafana/data', - - // Mark legacy SDK imports as external if their name starts with the "grafana/" prefix - ({ request }, callback) => { - const prefix = 'grafana/'; - const hasPrefix = (request: string) => request.indexOf(prefix) === 0; - const stripPrefix = (request: string) => request.substring(prefix.length); - - if (request && hasPrefix(request)) { - return callback(undefined, stripPrefix(request)); - } - - callback(); - }, - ], - - mode: env.production ? 'production' : 'development', - - module: { - rules: [ - { - exclude: /(node_modules)/, - test: /\.[tj]sx?$/, - use: { - loader: 'swc-loader', - options: { - jsc: { - baseUrl: path.resolve(__dirname), - target: 'es2015', - loose: false, - parser: { - syntax: 'typescript', - tsx: true, - decorators: false, - dynamicImport: true, - }, - }, - }, - }, - }, - { - test: /\.(png|jpe?g|gif|svg)$/, - type: 'asset/resource', - generator: { - // Keep publicPath relative for host.com/grafana/ deployments - publicPath: `public/plugins/${PLUGIN_ID}/img/`, - outputPath: 'img/', - filename: Boolean(env.production) ? '[hash][ext]' : '[name][ext]', - }, - }, - { - test: /\.(woff|woff2|eot|ttf|otf)(\?v=\d+\.\d+\.\d+)?$/, - type: 'asset/resource', - generator: { - // Keep publicPath relative for host.com/grafana/ deployments - publicPath: `public/plugins/${PLUGIN_ID}/fonts`, - outputPath: 'fonts/', - filename: Boolean(env.production) ? '[hash][ext]' : '[name][ext]', - }, - }, - ], - }, - - output: { - clean: { - keep: new RegExp(`.*?_(amd64|arm(64)?)(.exe)?`), - }, - filename: '[name].js', - library: { - type: 'amd', - }, - path: DIST_DIR, - publicPath: '/', - }, - - plugins: [ - new CopyWebpackPlugin({ - patterns: [ - { from: '../README.md', to: '.', force: true, context: SOURCE_DIR }, - { from: 'plugin.json', to: '.', context: SOURCE_DIR }, - { from: '**/*.json', to: '.', context: SOURCE_DIR }, - { from: '**/*.svg', to: '.', noErrorOnMissing: true, context: SOURCE_DIR }, // Optional - { from: '**/*.png', to: '.', noErrorOnMissing: true, context: SOURCE_DIR }, // Optional - { from: '**/*.html', to: '.', noErrorOnMissing: true, context: SOURCE_DIR }, // Optional - { from: 'img/**/*', to: '.', noErrorOnMissing: true, context: SOURCE_DIR }, // Optional - { from: 'libs/**/*', to: '.', noErrorOnMissing: true, context: SOURCE_DIR }, // Optional - { from: 'static/**/*', to: '.', noErrorOnMissing: true, context: SOURCE_DIR }, // Optional - ], - }), - new ForkTsCheckerWebpackPlugin({ - async: Boolean(env.development), - issue: { - include: [{ file: '**/*.{ts,tsx}' }], - }, - typescript: { configFile: path.join(process.cwd(), 'tsconfig.json') }, - }), - new ESLintPlugin({ - extensions: ['.ts', '.tsx'], - lintDirtyModulesOnly: Boolean(env.development), // don't lint on start, only lint changed files - }), - ], - - resolve: { - extensions: ['.js', '.jsx', '.ts', '.tsx'], - // handle resolving "rootDir" paths - modules: [path.resolve(process.cwd(), 'src'), 'node_modules'], - unsafeCache: true, - }, -}); - -export default config; diff --git a/project.json b/project.json new file mode 100644 index 00000000000..fe31d5b90dd --- /dev/null +++ b/project.json @@ -0,0 +1,35 @@ +{ + "name": "grafana", + "$schema": "node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "targets": { + "start": { + "dependsOn": [ + "themes-generate", + { + "projects": ["@grafana-plugins/**"], + "target": "build" + } + ] + }, + "build": { + "dependsOn": [ + "themes-generate", + { + "projects": ["@grafana-plugins/**"], + "target": "build" + } + ], + "outputs": ["{workspaceRoot}/public/build"], + "cache": true + }, + "themes-generate": { + "outputs": [ + "{workspaceRoot}/public/sass/_variables.generated.scss", + "{workspaceRoot}/public/sass/_variables.dark.generated.scss", + "{workspaceRoot}/public/sass/_variables.light.generated.scss" + ], + "cache": true + } + } +} diff --git a/public/api-enterprise-spec.json b/public/api-enterprise-spec.json index 097d24e5705..427770b9e9e 100644 --- a/public/api-enterprise-spec.json +++ b/public/api-enterprise-spec.json @@ -1330,74 +1330,6 @@ } } }, - "/reports/render/pdf/{dashboardID}": { - "get": { - "description": "Please refer to [reports enterprise](#/reports/renderReportPDFs) instead. This will be removed in Grafana 10.", - "produces": [ - "application/pdf" - ], - "tags": [ - "reports", - "enterprise" - ], - "summary": "Render report for dashboard.", - "operationId": "renderReportPDF", - "deprecated": true, - "parameters": [ - { - "type": "integer", - "format": "int64", - "name": "dashboardID", - "in": "path", - "required": true - }, - { - "type": "string", - "name": "title", - "in": "query" - }, - { - "type": "string", - "name": "variables", - "in": "query" - }, - { - "type": "string", - "name": "from", - "in": "query" - }, - { - "type": "string", - "name": "to", - "in": "query" - }, - { - "type": "string", - "name": "orientation", - "in": "query" - }, - { - "type": "string", - "name": "layout", - "in": "query" - } - ], - "responses": { - "200": { - "$ref": "#/responses/contentResponse" - }, - "400": { - "$ref": "#/responses/badRequestError" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, "/reports/render/pdfs": { "get": { "description": "Available to all users and with a valid license.", @@ -2280,200 +2212,6 @@ } } }, - "AlertListItemDTO": { - "type": "object", - "properties": { - "dashboardId": { - "type": "integer", - "format": "int64" - }, - "dashboardSlug": { - "type": "string" - }, - "dashboardUid": { - "type": "string" - }, - "evalData": { - "$ref": "#/definitions/Json" - }, - "evalDate": { - "type": "string", - "format": "date-time" - }, - "executionError": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "newStateDate": { - "type": "string", - "format": "date-time" - }, - "panelId": { - "type": "integer", - "format": "int64" - }, - "state": { - "$ref": "#/definitions/AlertStateType" - }, - "url": { - "type": "string" - } - } - }, - "AlertNotification": { - "type": "object", - "properties": { - "created": { - "type": "string", - "format": "date-time" - }, - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "secureFields": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - }, - "updated": { - "type": "string", - "format": "date-time" - } - } - }, - "AlertNotificationLookup": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - } - } - }, - "AlertStateInfoDTO": { - "type": "object", - "properties": { - "dashboardId": { - "type": "integer", - "format": "int64" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "newStateDate": { - "type": "string", - "format": "date-time" - }, - "panelId": { - "type": "integer", - "format": "int64" - }, - "state": { - "$ref": "#/definitions/AlertStateType" - } - } - }, - "AlertStateType": { - "type": "string" - }, - "AlertTestCommand": { - "type": "object", - "properties": { - "dashboard": { - "$ref": "#/definitions/Json" - }, - "panelId": { - "type": "integer", - "format": "int64" - } - } - }, - "AlertTestResult": { - "type": "object", - "properties": { - "conditionEvals": { - "type": "string" - }, - "error": { - "type": "string" - }, - "firing": { - "type": "boolean" - }, - "logs": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertTestResultLog" - } - }, - "matches": { - "type": "array", - "items": { - "$ref": "#/definitions/EvalMatch" - } - }, - "state": { - "$ref": "#/definitions/AlertStateType" - }, - "timeMs": { - "type": "string" - } - } - }, - "AlertTestResultLog": { - "type": "object", - "properties": { - "data": {}, - "message": { - "type": "string" - } - } - }, "Annotation": { "type": "object", "properties": { @@ -3169,41 +2907,6 @@ } } }, - "CreateAlertNotificationCommand": { - "type": "object", - "properties": { - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "secureSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - } - } - }, "CreateCorrelationCommand": { "description": "CreateCorrelationCommand is the command for creating a correlation", "type": "object", @@ -3343,13 +3046,6 @@ "CreateOrUpdateReportConfig": { "type": "object", "properties": { - "dashboardId": { - "type": "integer", - "format": "int64" - }, - "dashboardUid": { - "type": "string" - }, "dashboards": { "type": "array", "items": { @@ -3392,9 +3088,6 @@ }, "state": { "$ref": "#/definitions/State" - }, - "templateVars": { - "type": "object" } } }, @@ -4178,23 +3871,6 @@ "description": "ErrorSource type defines the source of the error", "type": "string" }, - "EvalMatch": { - "type": "object", - "properties": { - "metric": { - "type": "string" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "value": { - "type": "string" - } - } - }, "ExplorePanelsState": { "description": "This is an object constructed with the keys as the values of the enum VisType and the value being a bag of properties" }, @@ -4538,7 +4214,7 @@ } }, "FrameType": { - "description": "A FrameType string, when present in a frame's metadata, asserts that the\nframe's structure conforms to the FrameType's specification.\nThis property is currently optional, so FrameType may be FrameTypeUnknown even if the properties of\nthe Frame correspond to a defined FrameType.", + "description": "A FrameType string, when present in a frame's metadata, asserts that the\nframe's structure conforms to the FrameType's specification.\nThis property is currently optional, so FrameType may be FrameTypeUnknown even if the properties of\nthe Frame correspond to a defined FrameType.\n+enum", "type": "string" }, "FrameTypeVersion": { @@ -4814,8 +4490,8 @@ } }, "JSONWebKey": { + "description": "JSONWebKey represents a public or private key in JWK format. It can be\nmarshaled into JSON and unmarshaled from JSON.", "type": "object", - "title": "JSONWebKey represents a public or private key in JWK format.", "properties": { "Algorithm": { "description": "Key algorithm, parsed from `alg` header.", @@ -4847,103 +4523,27 @@ "CertificatesURL": { "$ref": "#/definitions/URL" }, - "Key": { - "description": "Cryptographic key, can be a symmetric or asymmetric key." - }, - "KeyID": { - "description": "Key identifier, parsed from `kid` header.", - "type": "string" - }, - "Use": { - "description": "Key use, parsed from `use` header.", - "type": "string" - } - } - }, - "Json": { - "type": "object" - }, - "KeyUsage": { - "description": "KeyUsage represents the set of actions that are valid for a given key. It's\na bitmap of the KeyUsage* constants.", - "type": "integer", - "format": "int64" - }, - "LegacyAlert": { - "type": "object", - "properties": { - "Created": { - "type": "string", - "format": "date-time" - }, - "DashboardID": { - "type": "integer", - "format": "int64" - }, - "EvalData": { - "$ref": "#/definitions/Json" - }, - "ExecutionError": { - "type": "string" - }, - "For": { - "$ref": "#/definitions/Duration" - }, - "Frequency": { - "type": "integer", - "format": "int64" - }, - "Handler": { - "type": "integer", - "format": "int64" - }, - "ID": { - "type": "integer", - "format": "int64" - }, - "Message": { - "type": "string" - }, - "Name": { - "type": "string" - }, - "NewStateDate": { - "type": "string", - "format": "date-time" - }, - "OrgID": { - "type": "integer", - "format": "int64" - }, - "PanelID": { - "type": "integer", - "format": "int64" - }, - "Settings": { - "$ref": "#/definitions/Json" - }, - "Severity": { - "type": "string" - }, - "Silenced": { - "type": "boolean" - }, - "State": { - "$ref": "#/definitions/AlertStateType" - }, - "StateChanges": { - "type": "integer", - "format": "int64" - }, - "Updated": { - "type": "string", - "format": "date-time" + "Key": { + "description": "Key is the Go in-memory representation of this key. It must have one\nof these types:\ned25519.PublicKey\ned25519.PrivateKey\necdsa.PublicKey\necdsa.PrivateKey\nrsa.PublicKey\nrsa.PrivateKey\n[]byte (a symmetric key)\n\nWhen marshaling this JSONWebKey into JSON, the \"kty\" header parameter\nwill be automatically set based on the type of this field." }, - "Version": { - "type": "integer", - "format": "int64" + "KeyID": { + "description": "Key identifier, parsed from `kid` header.", + "type": "string" + }, + "Use": { + "description": "Key use, parsed from `use` header.", + "type": "string" } } }, + "Json": { + "type": "object" + }, + "KeyUsage": { + "description": "KeyUsage represents the set of actions that are valid for a given key. It's\na bitmap of the KeyUsage* constants.", + "type": "integer", + "format": "int64" + }, "LibraryElementArrayResponse": { "type": "object", "title": "LibraryElementArrayResponse is a response struct for an array of LibraryElementDTO.", @@ -5319,39 +4919,6 @@ "format": "int64", "title": "NoticeSeverity is a type for the Severity property of a Notice." }, - "NotificationTestCommand": { - "type": "object", - "properties": { - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "secureSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - } - } - }, "ObjectIdentifier": { "type": "array", "title": "An ObjectIdentifier represents an ASN.1 OBJECT IDENTIFIER.", @@ -5360,6 +4927,20 @@ "format": "int64" } }, + "ObjectMatcher": { + "type": "array", + "title": "ObjectMatcher is a matcher that can be used to filter alerts.", + "items": { + "type": "string" + } + }, + "ObjectMatchers": { + "type": "array", + "title": "ObjectMatchers is a list of matchers that can be used to filter alerts.", + "items": { + "$ref": "#/definitions/ObjectMatcher" + } + }, "OrgDTO": { "type": "object", "properties": { @@ -5565,26 +5146,6 @@ } } }, - "PauseAlertCommand": { - "type": "object", - "properties": { - "alertId": { - "type": "integer", - "format": "int64" - }, - "paused": { - "type": "boolean" - } - } - }, - "PauseAllAlertsCommand": { - "type": "object", - "properties": { - "paused": { - "type": "boolean" - } - } - }, "Permission": { "type": "object", "title": "Permission is the model for access control permissions.", @@ -5959,7 +5520,7 @@ "type": "object", "title": "QueryDataResponse contains the results from a QueryDataRequest.", "properties": { - "Responses": { + "results": { "$ref": "#/definitions/Responses" } } @@ -6216,16 +5777,6 @@ "type": "string", "format": "date-time" }, - "dashboardId": { - "type": "integer", - "format": "int64" - }, - "dashboardName": { - "type": "string" - }, - "dashboardUid": { - "type": "string" - }, "dashboards": { "type": "array", "items": { @@ -6277,8 +5828,8 @@ "state": { "$ref": "#/definitions/State" }, - "templateVars": { - "type": "object" + "uid": { + "type": "string" }, "updated": { "type": "string", @@ -6342,9 +5893,6 @@ "ReportEmail": { "type": "object", "properties": { - "email": { - "type": "string" - }, "emails": { "description": "Comma-separated list of emails to which to send the report to.", "type": "string" @@ -6377,9 +5925,6 @@ "ReportSchedule": { "type": "object", "properties": { - "day": { - "type": "string" - }, "dayOfMonth": { "type": "string" }, @@ -6390,10 +5935,6 @@ "frequency": { "type": "string" }, - "hour": { - "type": "integer", - "format": "int64" - }, "intervalAmount": { "type": "integer", "format": "int64" @@ -6401,10 +5942,6 @@ "intervalFrequency": { "type": "string" }, - "minute": { - "type": "integer", - "format": "int64" - }, "startDate": { "type": "string", "format": "date-time" @@ -7485,80 +7022,6 @@ } } }, - "UpdateAlertNotificationCommand": { - "type": "object", - "properties": { - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "secureSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - } - } - }, - "UpdateAlertNotificationWithUidCommand": { - "type": "object", - "properties": { - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "secureSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - } - } - }, "UpdateAnnotationsCmd": { "type": "object", "properties": { @@ -8512,28 +7975,6 @@ } } }, - "deleteAlertNotificationChannelResponse": { - "description": "", - "schema": { - "type": "object", - "required": [ - "id", - "message" - ], - "properties": { - "id": { - "description": "ID Identifier of the deleted notification channel.", - "type": "integer", - "format": "int64", - "example": 65 - }, - "message": { - "description": "Message Message of the deleted notificatiton channel.", - "type": "string" - } - } - } - }, "deleteCorrelationResponse": { "description": "", "schema": { @@ -8675,45 +8116,6 @@ "$ref": "#/definitions/Status" } }, - "getAlertNotificationChannelResponse": { - "description": "", - "schema": { - "$ref": "#/definitions/AlertNotification" - } - }, - "getAlertNotificationChannelsResponse": { - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertNotification" - } - } - }, - "getAlertNotificationLookupResponse": { - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertNotificationLookup" - } - } - }, - "getAlertResponse": { - "description": "", - "schema": { - "$ref": "#/definitions/LegacyAlert" - } - }, - "getAlertsResponse": { - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertListItemDTO" - } - } - }, "getAllRolesResponse": { "description": "", "schema": { @@ -8786,15 +8188,6 @@ "getDashboardSnapshotResponse": { "description": "" }, - "getDashboardStatesResponse": { - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertStateInfoDTO" - } - } - }, "getDashboardsTagsResponse": { "description": "", "schema": { @@ -9346,53 +8739,6 @@ "$ref": "#/definitions/SuccessResponseBody" } }, - "pauseAlertResponse": { - "description": "", - "schema": { - "type": "object", - "required": [ - "alertId", - "message" - ], - "properties": { - "alertId": { - "type": "integer", - "format": "int64" - }, - "message": { - "type": "string" - }, - "state": { - "description": "Alert result state\nrequired true", - "type": "string" - } - } - } - }, - "pauseAlertsResponse": { - "description": "", - "schema": { - "type": "object", - "required": [ - "alertsAffected", - "message" - ], - "properties": { - "alertsAffected": { - "description": "AlertsAffected is the number of the affected alerts.", - "type": "integer", - "format": "int64" - }, - "message": { - "type": "string" - }, - "state": { - "description": "Alert result state\nrequired true", - "type": "string" - } - } - } - }, "postAPIkeyResponse": { "description": "", "schema": { @@ -9605,12 +8951,6 @@ "$ref": "#/definitions/RoleAssignmentsDTO" } }, - "testAlertResponse": { - "description": "", - "schema": { - "$ref": "#/definitions/AlertTestResult" - } - }, "unauthorisedError": { "description": "UnauthorizedError is returned when the request is not authenticated.", "schema": { diff --git a/public/api-merged.json b/public/api-merged.json index 6126a8e3b3f..038827f26b1 100644 --- a/public/api-merged.json +++ b/public/api-merged.json @@ -1146,44 +1146,6 @@ } } }, - "/admin/pause-all-alerts": { - "post": { - "security": [ - { - "basic": [] - } - ], - "tags": [ - "admin" - ], - "summary": "Pause/unpause all (legacy) alerts.", - "operationId": "pauseAllAlerts", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/PauseAllAlertsCommand" - } - } - ], - "responses": { - "200": { - "$ref": "#/responses/pauseAlertsResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, "/admin/provisioning/access-control/reload": { "post": { "tags": [ @@ -1263,35 +1225,6 @@ } } }, - "/admin/provisioning/notifications/reload": { - "post": { - "security": [ - { - "basic": [] - } - ], - "description": "Reloads the provisioning config files for legacy alert notifiers again. It won’t return until the new provisioned entities are already stored in the database. In case of dashboards, it will stop polling for changes in dashboard files and then restart it with new configurations after returning.\nIf you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `provisioning:reload` and scope `provisioners:notifications`.", - "tags": [ - "admin_provisioning" - ], - "summary": "Reload legacy alert notifier provisioning configurations.", - "operationId": "adminProvisioningReloadNotifications", - "responses": { - "200": { - "$ref": "#/responses/okResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, "/admin/provisioning/plugins/reload": { "post": { "security": [ @@ -1758,665 +1691,94 @@ "/admin/users/{user_id}/quotas/{quota_target}": { "put": { "security": [ - { - "basic": [] - } - ], - "description": "If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.quotas:update` and scope `global.users:1` (userIDScope).", - "tags": [ - "admin_users" - ], - "summary": "Update user quota.", - "operationId": "updateUserQuota", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateQuotaCmd" - } - }, - { - "type": "string", - "name": "quota_target", - "in": "path", - "required": true - }, - { - "type": "integer", - "format": "int64", - "name": "user_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/okResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "404": { - "$ref": "#/responses/notFoundError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/admin/users/{user_id}/revoke-auth-token": { - "post": { - "security": [ - { - "basic": [] - } - ], - "description": "Revokes the given auth token (device) for the user. User of issued auth token (device) will no longer be logged in and will be required to authenticate again upon next activity.\nIf you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.authtoken:update` and scope `global.users:*`.", - "tags": [ - "admin_users" - ], - "summary": "Revoke auth token for user.", - "operationId": "adminRevokeUserAuthToken", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/RevokeAuthTokenCmd" - } - }, - { - "type": "integer", - "format": "int64", - "name": "user_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/okResponse" - }, - "400": { - "$ref": "#/responses/badRequestError" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "404": { - "$ref": "#/responses/notFoundError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alert-notifications": { - "get": { - "description": "Returns all notification channels that the authenticated user has permission to view.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Get all notification channels.", - "operationId": "getAlertNotificationChannels", - "responses": { - "200": { - "$ref": "#/responses/getAlertNotificationChannelsResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - }, - "post": { - "description": "You can find the full list of [supported notifiers](https://grafana.com/docs/grafana/latest/alerting/old-alerting/notifications/#list-of-supported-notifiers) on the alert notifiers page.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Create notification channel.", - "operationId": "createAlertNotificationChannel", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateAlertNotificationCommand" - } - } - ], - "responses": { - "200": { - "$ref": "#/responses/getAlertNotificationChannelResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "409": { - "$ref": "#/responses/conflictError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alert-notifications/lookup": { - "get": { - "description": "Returns all notification channels, but with less detailed information. Accessible by any authenticated user and is mainly used by providing alert notification channels in Grafana UI when configuring alert rule.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Get all notification channels (lookup).", - "operationId": "getAlertNotificationLookup", - "responses": { - "200": { - "$ref": "#/responses/getAlertNotificationLookupResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alert-notifications/test": { - "post": { - "description": "Sends a test notification to the channel.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Test notification channel.", - "operationId": "notificationChannelTest", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/NotificationTestCommand" - } - } - ], - "responses": { - "200": { - "$ref": "#/responses/okResponse" - }, - "400": { - "$ref": "#/responses/badRequestError" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "412": { - "$ref": "#/responses/SMTPNotEnabledError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alert-notifications/uid/{notification_channel_uid}": { - "get": { - "description": "Returns the notification channel given the notification channel UID.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Get notification channel by UID.", - "operationId": "getAlertNotificationChannelByUID", - "parameters": [ - { - "type": "string", - "name": "notification_channel_uid", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/getAlertNotificationChannelResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "404": { - "$ref": "#/responses/notFoundError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - }, - "put": { - "description": "Updates an existing notification channel identified by uid.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Update notification channel by UID.", - "operationId": "updateAlertNotificationChannelByUID", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateAlertNotificationWithUidCommand" - } - }, - { - "type": "string", - "name": "notification_channel_uid", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/getAlertNotificationChannelResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "404": { - "$ref": "#/responses/notFoundError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - }, - "delete": { - "description": "Deletes an existing notification channel identified by UID.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Delete alert notification by UID.", - "operationId": "deleteAlertNotificationChannelByUID", - "parameters": [ - { - "type": "string", - "name": "notification_channel_uid", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/deleteAlertNotificationChannelResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "404": { - "$ref": "#/responses/notFoundError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alert-notifications/{notification_channel_id}": { - "get": { - "description": "Returns the notification channel given the notification channel ID.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Get notification channel by ID.", - "operationId": "getAlertNotificationChannelByID", - "parameters": [ - { - "type": "integer", - "format": "int64", - "name": "notification_channel_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/getAlertNotificationChannelResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "404": { - "$ref": "#/responses/notFoundError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - }, - "put": { - "description": "Updates an existing notification channel identified by ID.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Update notification channel by ID.", - "operationId": "updateAlertNotificationChannel", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateAlertNotificationCommand" - } - }, - { - "type": "integer", - "format": "int64", - "name": "notification_channel_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/getAlertNotificationChannelResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "404": { - "$ref": "#/responses/notFoundError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - }, - "delete": { - "description": "Deletes an existing notification channel identified by ID.", - "tags": [ - "legacy_alerts_notification_channels" - ], - "summary": "Delete alert notification by ID.", - "operationId": "deleteAlertNotificationChannel", - "parameters": [ - { - "type": "integer", - "format": "int64", - "name": "notification_channel_id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/okResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "404": { - "$ref": "#/responses/notFoundError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alerts": { - "get": { - "tags": [ - "legacy_alerts" - ], - "summary": "Get legacy alerts.", - "operationId": "getAlerts", - "parameters": [ - { - "type": "array", - "items": { - "type": "string" - }, - "description": "Limit response to alerts in specified dashboard(s). You can specify multiple dashboards.", - "name": "dashboardId", - "in": "query" - }, - { - "type": "integer", - "format": "int64", - "description": "Limit response to alert for a specified panel on a dashboard.", - "name": "panelId", - "in": "query" - }, - { - "type": "string", - "description": "Limit response to alerts having a name like this value.", - "name": "query", - "in": "query" - }, - { - "enum": [ - "all", - "no_data", - "paused", - "alerting", - "ok", - "pending", - "unknown" - ], - "type": "string", - "description": "Return alerts with one or more of the following alert states", - "name": "state", - "in": "query" - }, - { - "type": "integer", - "format": "int64", - "description": "Limit response to X number of alerts.", - "name": "limit", - "in": "query" - }, - { - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi", - "description": "Limit response to alerts of dashboards in specified folder(s). You can specify multiple folders", - "name": "folderId", - "in": "query" - }, - { - "type": "string", - "description": "Limit response to alerts having a dashboard name like this value./ Limit response to alerts having a dashboard name like this value.", - "name": "dashboardQuery", - "in": "query" - }, - { - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi", - "description": "Limit response to alerts of dashboards with specified tags. To do an “AND” filtering with multiple tags, specify the tags parameter multiple times", - "name": "dashboardTag", - "in": "query" - } - ], - "responses": { - "200": { - "$ref": "#/responses/getAlertsResponse" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alerts/states-for-dashboard": { - "get": { - "tags": [ - "legacy_alerts" - ], - "summary": "Get alert states for a dashboard.", - "operationId": "getDashboardStates", - "parameters": [ - { - "type": "integer", - "format": "int64", - "name": "dashboardId", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/getDashboardStatesResponse" - }, - "400": { - "$ref": "#/responses/badRequestError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alerts/test": { - "post": { - "tags": [ - "legacy_alerts" - ], - "summary": "Test alert.", - "operationId": "testAlert", - "parameters": [ - { - "name": "body", - "in": "body", - "schema": { - "$ref": "#/definitions/AlertTestCommand" - } - } - ], - "responses": { - "200": { - "$ref": "#/responses/testAlertResponse" - }, - "400": { - "$ref": "#/responses/badRequestError" - }, - "403": { - "$ref": "#/responses/forbiddenError" - }, - "422": { - "$ref": "#/responses/unprocessableEntityError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, - "/alerts/{alert_id}": { - "get": { - "description": "“evalMatches” data in the response is cached in the db when and only when the state of the alert changes (e.g. transitioning from “ok” to “alerting” state).\nIf data from one server triggers the alert first and, before that server is seen leaving alerting state, a second server also enters a state that would trigger the alert, the second server will not be visible in “evalMatches” data.", + { + "basic": [] + } + ], + "description": "If you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.quotas:update` and scope `global.users:1` (userIDScope).", "tags": [ - "legacy_alerts" + "admin_users" ], - "summary": "Get alert by ID.", - "operationId": "getAlertByID", + "summary": "Update user quota.", + "operationId": "updateUserQuota", "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateQuotaCmd" + } + }, { "type": "string", - "name": "alert_id", + "name": "quota_target", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "name": "user_id", "in": "path", "required": true } ], "responses": { "200": { - "$ref": "#/responses/getAlertResponse" + "$ref": "#/responses/okResponse" }, "401": { "$ref": "#/responses/unauthorisedError" }, + "403": { + "$ref": "#/responses/forbiddenError" + }, + "404": { + "$ref": "#/responses/notFoundError" + }, "500": { "$ref": "#/responses/internalServerError" } } } }, - "/alerts/{alert_id}/pause": { + "/admin/users/{user_id}/revoke-auth-token": { "post": { + "security": [ + { + "basic": [] + } + ], + "description": "Revokes the given auth token (device) for the user. User of issued auth token (device) will no longer be logged in and will be required to authenticate again upon next activity.\nIf you are running Grafana Enterprise and have Fine-grained access control enabled, you need to have a permission with action `users.authtoken:update` and scope `global.users:*`.", "tags": [ - "legacy_alerts" + "admin_users" ], - "summary": "Pause/unpause alert by id.", - "operationId": "pauseAlert", + "summary": "Revoke auth token for user.", + "operationId": "adminRevokeUserAuthToken", "parameters": [ - { - "type": "string", - "name": "alert_id", - "in": "path", - "required": true - }, { "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/PauseAlertCommand" + "$ref": "#/definitions/RevokeAuthTokenCmd" } + }, + { + "type": "integer", + "format": "int64", + "name": "user_id", + "in": "path", + "required": true } ], "responses": { "200": { - "$ref": "#/responses/pauseAlertResponse" + "$ref": "#/responses/okResponse" + }, + "400": { + "$ref": "#/responses/badRequestError" }, "401": { "$ref": "#/responses/unauthorisedError" @@ -4926,7 +4288,7 @@ }, "/folders": { "get": { - "description": "Returns all folders that the authenticated user has permission to view.\nIf nested folders are enabled, it expects an additional query parameter with the parent folder UID\nand returns the immediate subfolders that the authenticated user has permission to view.\nIf the parameter is not supplied then it returns immediate subfolders under the root\nthat the authenticated user has permission to view.", + "description": "It returns all folders that the authenticated user has permission to view.\nIf nested folders are enabled, it expects an additional query parameter with the parent folder UID\nand returns the immediate subfolders that the authenticated user has permission to view.\nIf the parameter is not supplied then it returns immediate subfolders under the root\nthat the authenticated user has permission to view.", "tags": [ "folders" ], @@ -4954,6 +4316,17 @@ "description": "The parent folder UID", "name": "parentUid", "in": "query" + }, + { + "enum": [ + "Edit", + "View" + ], + "type": "string", + "default": "View", + "description": "Set to `Edit` to return folders that the user can edit", + "name": "permission", + "in": "query" } ], "responses": { @@ -7836,74 +7209,6 @@ } } }, - "/reports/render/pdf/{dashboardID}": { - "get": { - "description": "Please refer to [reports enterprise](#/reports/renderReportPDFs) instead. This will be removed in Grafana 10.", - "produces": [ - "application/pdf" - ], - "tags": [ - "reports", - "enterprise" - ], - "summary": "Render report for dashboard.", - "operationId": "renderReportPDF", - "deprecated": true, - "parameters": [ - { - "type": "integer", - "format": "int64", - "name": "dashboardID", - "in": "path", - "required": true - }, - { - "type": "string", - "name": "title", - "in": "query" - }, - { - "type": "string", - "name": "variables", - "in": "query" - }, - { - "type": "string", - "name": "from", - "in": "query" - }, - { - "type": "string", - "name": "to", - "in": "query" - }, - { - "type": "string", - "name": "orientation", - "in": "query" - }, - { - "type": "string", - "name": "layout", - "in": "query" - } - ], - "responses": { - "200": { - "$ref": "#/responses/contentResponse" - }, - "400": { - "$ref": "#/responses/badRequestError" - }, - "401": { - "$ref": "#/responses/unauthorisedError" - }, - "500": { - "$ref": "#/responses/internalServerError" - } - } - } - }, "/reports/render/pdfs": { "get": { "description": "Available to all users and with a valid license.", @@ -10433,6 +9738,13 @@ }, "/v1/provisioning/alert-rules/export": { "get": { + "produces": [ + "application/json", + "application/yaml", + "application/terraform+hcl", + "text/yaml", + "text/hcl" + ], "tags": [ "provisioning" ], @@ -10447,9 +9759,14 @@ "in": "query" }, { + "enum": [ + "yaml", + "json", + "hcl" + ], "type": "string", "default": "yaml", - "description": "Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence.", + "description": "Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence.", "name": "format", "in": "query" }, @@ -10593,7 +9910,9 @@ "produces": [ "application/json", "application/yaml", - "text/yaml" + "application/terraform+hcl", + "text/yaml", + "text/hcl" ], "tags": [ "provisioning" @@ -10609,9 +9928,14 @@ "in": "query" }, { + "enum": [ + "yaml", + "json", + "hcl" + ], "type": "string", "default": "yaml", - "description": "Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence.", + "description": "Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence.", "name": "format", "in": "query" }, @@ -10701,6 +10025,13 @@ }, "/v1/provisioning/contact-points/export": { "get": { + "produces": [ + "application/json", + "application/yaml", + "application/terraform+hcl", + "text/yaml", + "text/hcl" + ], "tags": [ "provisioning" ], @@ -10715,9 +10046,14 @@ "in": "query" }, { + "enum": [ + "yaml", + "json", + "hcl" + ], "type": "string", "default": "yaml", - "description": "Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence.", + "description": "Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence.", "name": "format", "in": "query" }, @@ -10862,7 +10198,7 @@ "tags": [ "provisioning" ], - "summary": "Update the interval of a rule group.", + "summary": "Create or update alert rule group.", "operationId": "RoutePutAlertRuleGroup", "parameters": [ { @@ -10904,6 +10240,44 @@ } } } + }, + "delete": { + "description": "Delete rule group", + "tags": [ + "provisioning" + ], + "operationId": "RouteDeleteAlertRuleGroup", + "parameters": [ + { + "type": "string", + "name": "FolderUID", + "in": "path", + "required": true + }, + { + "type": "string", + "name": "Group", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": " The alert rule group was deleted successfully." + }, + "403": { + "description": "ForbiddenError", + "schema": { + "$ref": "#/definitions/ForbiddenError" + } + }, + "404": { + "description": "NotFound", + "schema": { + "$ref": "#/definitions/NotFound" + } + } + } } }, "/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}/export": { @@ -10911,7 +10285,9 @@ "produces": [ "application/json", "application/yaml", - "text/yaml" + "application/terraform+hcl", + "text/yaml", + "text/hcl" ], "tags": [ "provisioning" @@ -10927,9 +10303,14 @@ "in": "query" }, { + "enum": [ + "yaml", + "json", + "hcl" + ], "type": "string", "default": "yaml", - "description": "Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence.", + "description": "Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence.", "name": "format", "in": "query" }, @@ -11016,6 +10397,13 @@ }, "/v1/provisioning/mute-timings/export": { "get": { + "produces": [ + "application/json", + "application/yaml", + "application/terraform+hcl", + "text/yaml", + "text/hcl" + ], "tags": [ "provisioning" ], @@ -11030,9 +10418,14 @@ "in": "query" }, { + "enum": [ + "yaml", + "json", + "hcl" + ], "type": "string", "default": "yaml", - "description": "Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence.", + "description": "Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence.", "name": "format", "in": "query" } @@ -11156,6 +10549,13 @@ }, "/v1/provisioning/mute-timings/{name}/export": { "get": { + "produces": [ + "application/json", + "application/yaml", + "application/terraform+hcl", + "text/yaml", + "text/hcl" + ], "tags": [ "provisioning" ], @@ -11170,9 +10570,14 @@ "in": "query" }, { + "enum": [ + "yaml", + "json", + "hcl" + ], "type": "string", "default": "yaml", - "description": "Format of the downloaded file, either yaml or json. Accept header can also be used, but the query parameter will take precedence.", + "description": "Format of the downloaded file. Supported yaml, json or hcl. Accept header can also be used, but the query parameter will take precedence.", "name": "format", "in": "query" }, @@ -11276,6 +10681,13 @@ }, "/v1/provisioning/policies/export": { "get": { + "produces": [ + "application/json", + "application/yaml", + "application/terraform+hcl", + "text/yaml", + "text/hcl" + ], "tags": [ "provisioning" ], @@ -11962,73 +11374,27 @@ "alerts" ], "properties": { - "alerts": { - "type": "array", - "items": { - "$ref": "#/definitions/Alert" - } - } - } - }, - "AlertInstancesResponse": { - "type": "object", - "properties": { - "instances": { - "description": "Instances is an array of arrow encoded dataframes\neach frame has a single row, and a column for each instance (alert identified by unique labels) with a boolean value (firing/not firing)", - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8" - } - } - } - } - }, - "AlertListItemDTO": { - "type": "object", - "properties": { - "dashboardId": { - "type": "integer", - "format": "int64" - }, - "dashboardSlug": { - "type": "string" - }, - "dashboardUid": { - "type": "string" - }, - "evalData": { - "$ref": "#/definitions/Json" - }, - "evalDate": { - "type": "string", - "format": "date-time" - }, - "executionError": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "newStateDate": { - "type": "string", - "format": "date-time" - }, - "panelId": { - "type": "integer", - "format": "int64" - }, - "state": { - "$ref": "#/definitions/AlertStateType" - }, - "url": { - "type": "string" + "alerts": { + "type": "array", + "items": { + "$ref": "#/definitions/Alert" + } + } + } + }, + "AlertInstancesResponse": { + "type": "object", + "properties": { + "instances": { + "description": "Instances is an array of arrow encoded dataframes\neach frame has a single row, and a column for each instance (alert identified by unique labels) with a boolean value (firing/not firing)", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8" + } + } } } }, @@ -12062,88 +11428,6 @@ } } }, - "AlertNotification": { - "type": "object", - "properties": { - "created": { - "type": "string", - "format": "date-time" - }, - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "secureFields": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - }, - "updated": { - "type": "string", - "format": "date-time" - } - } - }, - "AlertNotificationLookup": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - } - } - }, - "AlertPair": { - "type": "object", - "properties": { - "alertRule": { - "$ref": "#/definitions/AlertRuleUpgrade" - }, - "error": { - "type": "string" - }, - "legacyAlert": { - "$ref": "#/definitions/LegacyAlert" - } - } - }, "AlertQuery": { "type": "object", "title": "AlertQuery represents a single query associated with an alert definition.", @@ -12261,6 +11545,9 @@ "OK" ] }, + "notification_settings": { + "$ref": "#/definitions/AlertRuleNotificationSettingsExport" + }, "panelId": { "type": "integer", "format": "int64" @@ -12328,99 +11615,86 @@ } } }, - "AlertRuleUpgrade": { + "AlertRuleNotificationSettings": { "type": "object", + "required": [ + "receiver" + ], "properties": { - "sendsTo": { + "group_by": { + "description": "Override the labels by which incoming alerts are grouped together. For example, multiple alerts coming in for\ncluster=A and alertname=LatencyHigh would be batched into a single group. To aggregate by all possible labels\nuse the special value '...' as the sole label name.\nThis effectively disables aggregation entirely, passing through all alerts as-is. This is unlikely to be what\nyou want, unless you have a very low alert volume or your upstream notification system performs its own grouping.\nMust include 'alertname' and 'grafana_folder' if not using '...'.", "type": "array", + "default": [ + "alertname", + "grafana_folder" + ], "items": { "type": "string" - } + }, + "example": [ + "alertname", + "grafana_folder", + "cluster" + ] }, - "title": { - "type": "string" + "group_interval": { + "description": "Override how long to wait before sending a notification about new alerts that are added to a group of alerts for\nwhich an initial notification has already been sent. (Usually ~5m or more.)", + "type": "string", + "example": "5m" }, - "uid": { - "type": "string" - } - } - }, - "AlertStateInfoDTO": { - "type": "object", - "properties": { - "dashboardId": { - "type": "integer", - "format": "int64" + "group_wait": { + "description": "Override how long to initially wait to send a notification for a group of alerts. Allows to wait for an\ninhibiting alert to arrive or collect more initial alerts for the same group. (Usually ~0s to few minutes.)", + "type": "string", + "example": "30s" }, - "id": { - "type": "integer", - "format": "int64" + "mute_time_intervals": { + "description": "Override the times when notifications should be muted. These must match the name of a mute time interval defined\nin the alertmanager configuration mute_time_intervals section. When muted it will not send any notifications, but\notherwise acts normally.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "maintenance" + ] }, - "newStateDate": { + "receiver": { + "description": "Name of the receiver to send notifications to.", "type": "string", - "format": "date-time" - }, - "panelId": { - "type": "integer", - "format": "int64" + "example": "grafana-default-email" }, - "state": { - "$ref": "#/definitions/AlertStateType" + "repeat_interval": { + "description": "Override how long to wait before sending a notification again if it has already been sent successfully for an\nalert. (Usually ~3h or more).\nNote that this parameter is implicitly bound by Alertmanager's `--data.retention` configuration flag.\nNotifications will be resent after either repeat_interval or the data retention period have passed, whichever\noccurs first. `repeat_interval` should not be less than `group_interval`.", + "type": "string", + "example": "4h" } } }, - "AlertStateType": { - "type": "string" - }, - "AlertTestCommand": { + "AlertRuleNotificationSettingsExport": { "type": "object", + "title": "AlertRuleNotificationSettingsExport is the provisioned export of models.NotificationSettings.", "properties": { - "dashboard": { - "$ref": "#/definitions/Json" + "group_by": { + "type": "array", + "items": { + "type": "string" + } }, - "panelId": { - "type": "integer", - "format": "int64" - } - } - }, - "AlertTestResult": { - "type": "object", - "properties": { - "conditionEvals": { + "group_interval": { "type": "string" }, - "error": { + "group_wait": { "type": "string" }, - "firing": { - "type": "boolean" - }, - "logs": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertTestResultLog" - } - }, - "matches": { + "mute_time_intervals": { "type": "array", "items": { - "$ref": "#/definitions/EvalMatch" + "type": "string" } }, - "state": { - "$ref": "#/definitions/AlertStateType" - }, - "timeMs": { + "receiver": { "type": "string" - } - } - }, - "AlertTestResultLog": { - "type": "object", - "properties": { - "data": {}, - "message": { + }, + "repeat_interval": { "type": "string" } } @@ -13243,6 +12517,7 @@ } }, "mute_time_intervals": { + "description": "MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0.", "type": "array", "items": { "$ref": "#/definitions/MuteTimeInterval" @@ -13256,20 +12531,12 @@ "items": { "type": "string" } - } - } - }, - "ContactPair": { - "type": "object", - "properties": { - "contactPoint": { - "$ref": "#/definitions/ContactPointUpgrade" }, - "error": { - "type": "string" - }, - "legacyChannel": { - "$ref": "#/definitions/LegacyChannel" + "time_intervals": { + "type": "array", + "items": { + "$ref": "#/definitions/TimeInterval" + } } } }, @@ -13292,20 +12559,6 @@ } } }, - "ContactPointUpgrade": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "routeMatchers": { - "$ref": "#/definitions/ObjectMatchers" - }, - "type": { - "type": "string" - } - } - }, "ContactPoints": { "type": "array", "items": { @@ -13427,69 +12680,34 @@ "prop2": "value" } }, - "transformations": { - "description": "Source data transformations", - "type": "array", - "items": { - "$ref": "#/definitions/Transformation" - }, - "example": [ - { - "type": "logfmt" - }, - { - "expression": "(Superman|Batman)", - "type": "regex", - "variable": "name" - } - ] - }, - "type": { - "$ref": "#/definitions/CorrelationConfigType" - } - } - }, - "CounterResetHint": { - "description": "or alternatively that we are dealing with a gauge histogram, where counter resets do not apply.", - "type": "integer", - "format": "uint8", - "title": "CounterResetHint contains the known information about a counter reset," - }, - "CreateAlertNotificationCommand": { - "type": "object", - "properties": { - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "secureSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" + "transformations": { + "description": "Source data transformations", + "type": "array", + "items": { + "$ref": "#/definitions/Transformation" + }, + "example": [ + { + "type": "logfmt" + }, + { + "expression": "(Superman|Batman)", + "type": "regex", + "variable": "name" + } + ] }, "type": { - "type": "string" - }, - "uid": { - "type": "string" + "$ref": "#/definitions/CorrelationConfigType" } } }, + "CounterResetHint": { + "description": "or alternatively that we are dealing with a gauge histogram, where counter resets do not apply.", + "type": "integer", + "format": "uint8", + "title": "CounterResetHint contains the known information about a counter reset," + }, "CreateCorrelationCommand": { "description": "CreateCorrelationCommand is the command for creating a correlation", "type": "object", @@ -13629,13 +12847,6 @@ "CreateOrUpdateReportConfig": { "type": "object", "properties": { - "dashboardId": { - "type": "integer", - "format": "int64" - }, - "dashboardUid": { - "type": "string" - }, "dashboards": { "type": "array", "items": { @@ -13678,9 +12889,6 @@ }, "state": { "$ref": "#/definitions/State" - }, - "templateVars": { - "type": "object" } } }, @@ -14093,48 +13301,6 @@ } } }, - "DashboardUpgrade": { - "type": "object", - "properties": { - "dashboardId": { - "type": "integer", - "format": "int64" - }, - "dashboardName": { - "type": "string" - }, - "dashboardUid": { - "type": "string" - }, - "error": { - "type": "string" - }, - "folderName": { - "type": "string" - }, - "folderUid": { - "type": "string" - }, - "migratedAlerts": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertPair" - } - }, - "newFolderName": { - "type": "string" - }, - "newFolderUid": { - "type": "string" - }, - "provisioned": { - "type": "boolean" - }, - "warning": { - "type": "string" - } - } - }, "DashboardVersionMeta": { "description": "DashboardVersionMeta extends the DashboardVersionDTO with the names\nassociated with the UserIds, overriding the field with the same name from\nthe DashboardVersionDTO model.", "type": "object", @@ -14442,6 +13608,9 @@ }, "webhook_url": { "$ref": "#/definitions/SecretURL" + }, + "webhook_url_file": { + "type": "string" } } }, @@ -14680,23 +13849,6 @@ } } }, - "EvalMatch": { - "type": "object", - "properties": { - "metric": { - "type": "string" - }, - "tags": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "value": { - "type": "string" - } - } - }, "EvalQueriesPayload": { "type": "object", "properties": { @@ -15242,6 +14394,7 @@ } }, "mute_time_intervals": { + "description": "MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0.", "type": "array", "items": { "$ref": "#/definitions/MuteTimeInterval" @@ -15262,6 +14415,12 @@ "items": { "type": "string" } + }, + "time_intervals": { + "type": "array", + "items": { + "$ref": "#/definitions/TimeInterval" + } } } }, @@ -15475,6 +14634,9 @@ "OK" ] }, + "notification_settings": { + "$ref": "#/definitions/AlertRuleNotificationSettings" + }, "orgId": { "type": "integer", "format": "int64" @@ -16127,97 +15289,6 @@ "$ref": "#/definitions/Label" } }, - "LegacyAlert": { - "type": "object", - "properties": { - "Created": { - "type": "string", - "format": "date-time" - }, - "DashboardID": { - "type": "integer", - "format": "int64" - }, - "EvalData": { - "$ref": "#/definitions/Json" - }, - "ExecutionError": { - "type": "string" - }, - "For": { - "$ref": "#/definitions/Duration" - }, - "Frequency": { - "type": "integer", - "format": "int64" - }, - "Handler": { - "type": "integer", - "format": "int64" - }, - "ID": { - "type": "integer", - "format": "int64" - }, - "Message": { - "type": "string" - }, - "Name": { - "type": "string" - }, - "NewStateDate": { - "type": "string", - "format": "date-time" - }, - "OrgID": { - "type": "integer", - "format": "int64" - }, - "PanelID": { - "type": "integer", - "format": "int64" - }, - "Settings": { - "$ref": "#/definitions/Json" - }, - "Severity": { - "type": "string" - }, - "Silenced": { - "type": "boolean" - }, - "State": { - "$ref": "#/definitions/AlertStateType" - }, - "StateChanges": { - "type": "integer", - "format": "int64" - }, - "Updated": { - "type": "string", - "format": "date-time" - }, - "Version": { - "type": "integer", - "format": "int64" - } - } - }, - "LegacyChannel": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string" - } - } - }, "LibraryElementArrayResponse": { "type": "object", "title": "LibraryElementArrayResponse is a response struct for an array of LibraryElementDTO.", @@ -16440,6 +15511,9 @@ "send_resolved": { "type": "boolean" }, + "summary": { + "type": "string" + }, "text": { "type": "string" }, @@ -16448,6 +15522,9 @@ }, "webhook_url": { "$ref": "#/definitions/SecretURL" + }, + "webhook_url_file": { + "type": "string" } } }, @@ -16788,39 +15865,6 @@ "$ref": "#/definitions/NotificationTemplate" } }, - "NotificationTestCommand": { - "type": "object", - "properties": { - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "secureSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - } - } - }, "NotifierConfig": { "type": "object", "title": "NotifierConfig contains base options common across all notifier configurations.", @@ -16894,6 +15938,7 @@ }, "ObjectMatchers": { "type": "array", + "title": "ObjectMatchers is a list of matchers that can be used to filter alerts.", "items": { "$ref": "#/definitions/ObjectMatcher" } @@ -17004,50 +16049,6 @@ } } }, - "OrgMigrationState": { - "type": "object", - "properties": { - "migratedChannels": { - "type": "array", - "items": { - "$ref": "#/definitions/ContactPair" - } - }, - "migratedDashboards": { - "type": "array", - "items": { - "$ref": "#/definitions/DashboardUpgrade" - } - }, - "orgId": { - "type": "integer", - "format": "int64" - } - } - }, - "OrgMigrationSummary": { - "type": "object", - "properties": { - "hasErrors": { - "type": "boolean" - }, - "newAlerts": { - "type": "integer", - "format": "int64" - }, - "newChannels": { - "type": "integer", - "format": "int64" - }, - "newDashboards": { - "type": "integer", - "format": "int64" - }, - "removed": { - "type": "boolean" - } - } - }, "OrgUserDTO": { "type": "object", "properties": { @@ -17307,38 +16308,18 @@ "browser" ] }, - "weekStart": { - "type": "string" - } - } - }, - "PatchQueryCommentInQueryHistoryCommand": { - "description": "PatchQueryCommentInQueryHistoryCommand is the command for updating comment for query in query history", - "type": "object", - "properties": { - "comment": { - "description": "Updated comment", - "type": "string" - } - } - }, - "PauseAlertCommand": { - "type": "object", - "properties": { - "alertId": { - "type": "integer", - "format": "int64" - }, - "paused": { - "type": "boolean" + "weekStart": { + "type": "string" } } }, - "PauseAllAlertsCommand": { + "PatchQueryCommentInQueryHistoryCommand": { + "description": "PatchQueryCommentInQueryHistoryCommand is the command for updating comment for query in query history", "type": "object", "properties": { - "paused": { - "type": "boolean" + "comment": { + "description": "Updated comment", + "type": "string" } } }, @@ -17492,24 +16473,6 @@ "$ref": "#/definitions/Playlist" } }, - "Point": { - "description": "If H is not nil, then this is a histogram point and only (T, H) is valid.\nIf H is nil, then only (T, V) is valid.", - "type": "object", - "title": "Point represents a single data point for a given timestamp.", - "properties": { - "H": { - "$ref": "#/definitions/FloatHistogram" - }, - "T": { - "type": "integer", - "format": "int64" - }, - "V": { - "type": "number", - "format": "double" - } - } - }, "PostAnnotationsCmd": { "type": "object", "required": [ @@ -17566,6 +16529,7 @@ } }, "PostableApiAlertingConfig": { + "description": "nolint:revive", "type": "object", "properties": { "global": { @@ -17578,6 +16542,7 @@ } }, "mute_time_intervals": { + "description": "MuteTimeIntervals is deprecated and will be removed before Alertmanager 1.0.", "type": "array", "items": { "$ref": "#/definitions/MuteTimeInterval" @@ -17598,10 +16563,17 @@ "items": { "type": "string" } + }, + "time_intervals": { + "type": "array", + "items": { + "$ref": "#/definitions/TimeInterval" + } } } }, "PostableApiReceiver": { + "description": "nolint:revive", "type": "object", "properties": { "discord_configs": { @@ -17820,6 +16792,9 @@ "OK" ] }, + "notification_settings": { + "$ref": "#/definitions/AlertRuleNotificationSettings" + }, "title": { "type": "string" }, @@ -18053,6 +17028,9 @@ "OK" ] }, + "notification_settings": { + "$ref": "#/definitions/AlertRuleNotificationSettings" + }, "orgID": { "type": "integer", "format": "int64" @@ -18703,16 +17681,6 @@ "type": "string", "format": "date-time" }, - "dashboardId": { - "type": "integer", - "format": "int64" - }, - "dashboardName": { - "type": "string" - }, - "dashboardUid": { - "type": "string" - }, "dashboards": { "type": "array", "items": { @@ -18764,8 +17732,8 @@ "state": { "$ref": "#/definitions/State" }, - "templateVars": { - "type": "object" + "uid": { + "type": "string" }, "updated": { "type": "string", @@ -18829,9 +17797,6 @@ "ReportEmail": { "type": "object", "properties": { - "email": { - "type": "string" - }, "emails": { "description": "Comma-separated list of emails to which to send the report to.", "type": "string" @@ -18864,9 +17829,6 @@ "ReportSchedule": { "type": "object", "properties": { - "day": { - "type": "string" - }, "dayOfMonth": { "type": "string" }, @@ -18877,10 +17839,6 @@ "frequency": { "type": "string" }, - "hour": { - "type": "integer", - "format": "int64" - }, "intervalAmount": { "type": "integer", "format": "int64" @@ -18888,10 +17846,6 @@ "intervalFrequency": { "type": "string" }, - "minute": { - "type": "integer", - "format": "int64" - }, "startDate": { "type": "string", "format": "date-time" @@ -19372,9 +18326,13 @@ } }, "Sample": { + "description": "Sample is a single sample belonging to a metric. It represents either a float\nsample or a histogram sample. If H is nil, it is a float sample. Otherwise,\nit is a histogram sample.", "type": "object", - "title": "Sample is a single sample belonging to a metric.", "properties": { + "F": { + "type": "number", + "format": "double" + }, "H": { "$ref": "#/definitions/FloatHistogram" }, @@ -19384,10 +18342,6 @@ "T": { "type": "integer", "format": "int64" - }, - "V": { - "type": "number", - "format": "double" } } }, @@ -20501,40 +19455,16 @@ "type": "string" }, "TimeInterval": { - "description": "TimeInterval describes intervals of time. ContainsTime will tell you if a golang time is contained\nwithin the interval.", "type": "object", + "title": "TimeInterval represents a named set of time intervals for which a route should be muted.", "properties": { - "days_of_month": { - "type": "array", - "items": { - "type": "string" - } - }, - "location": { + "name": { "type": "string" }, - "months": { - "type": "array", - "items": { - "type": "string" - } - }, - "times": { - "type": "array", - "items": { - "$ref": "#/definitions/TimeRange" - } - }, - "weekdays": { - "type": "array", - "items": { - "type": "string" - } - }, - "years": { + "time_intervals": { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/TimeInterval" } } } @@ -20835,80 +19765,6 @@ } } }, - "UpdateAlertNotificationCommand": { - "type": "object", - "properties": { - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "secureSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - } - } - }, - "UpdateAlertNotificationWithUidCommand": { - "type": "object", - "properties": { - "disableResolveMessage": { - "type": "boolean" - }, - "frequency": { - "type": "string" - }, - "isDefault": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "secureSettings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "sendReminder": { - "type": "boolean" - }, - "settings": { - "$ref": "#/definitions/Json" - }, - "type": { - "type": "string" - }, - "uid": { - "type": "string" - } - } - }, "UpdateAnnotationsCmd": { "type": "object", "properties": { @@ -21520,7 +20376,7 @@ } }, "Vector": { - "description": "Vector is basically only an alias for model.Samples, but the\ncontract is that in a Vector, all Samples have the same timestamp.", + "description": "Vector is basically only an alias for []Sample, but the contract is that\nin a Vector, all Samples have the same timestamp.", "type": "array", "items": { "$ref": "#/definitions/Sample" @@ -21673,6 +20529,7 @@ } }, "alertGroup": { + "description": "AlertGroup alert group", "type": "object", "required": [ "alerts", @@ -21696,6 +20553,7 @@ } }, "alertGroups": { + "description": "AlertGroups alert groups", "type": "array", "items": { "$ref": "#/definitions/alertGroup" @@ -21828,6 +20686,7 @@ } }, "gettableAlert": { + "description": "GettableAlert gettable alert", "type": "object", "required": [ "labels", @@ -21883,7 +20742,6 @@ } }, "gettableAlerts": { - "description": "GettableAlerts gettable alerts", "type": "array", "items": { "$ref": "#/definitions/gettableAlert" @@ -22089,6 +20947,7 @@ } }, "postableSilence": { + "description": "PostableSilence postable silence", "type": "object", "required": [ "comment", @@ -22638,28 +21497,6 @@ } } }, - "deleteAlertNotificationChannelResponse": { - "description": "(empty)", - "schema": { - "type": "object", - "required": [ - "id", - "message" - ], - "properties": { - "id": { - "description": "ID Identifier of the deleted notification channel.", - "type": "integer", - "format": "int64", - "example": 65 - }, - "message": { - "description": "Message Message of the deleted notificatiton channel.", - "type": "string" - } - } - } - }, "deleteCorrelationResponse": { "description": "(empty)", "schema": { @@ -22801,45 +21638,6 @@ "$ref": "#/definitions/Status" } }, - "getAlertNotificationChannelResponse": { - "description": "(empty)", - "schema": { - "$ref": "#/definitions/AlertNotification" - } - }, - "getAlertNotificationChannelsResponse": { - "description": "(empty)", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertNotification" - } - } - }, - "getAlertNotificationLookupResponse": { - "description": "(empty)", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertNotificationLookup" - } - } - }, - "getAlertResponse": { - "description": "(empty)", - "schema": { - "$ref": "#/definitions/LegacyAlert" - } - }, - "getAlertsResponse": { - "description": "(empty)", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertListItemDTO" - } - } - }, "getAllRolesResponse": { "description": "(empty)", "schema": { @@ -22912,15 +21710,6 @@ "getDashboardSnapshotResponse": { "description": "(empty)" }, - "getDashboardStatesResponse": { - "description": "(empty)", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AlertStateInfoDTO" - } - } - }, "getDashboardsTagsResponse": { "description": "(empty)", "schema": { @@ -23472,53 +22261,6 @@ "$ref": "#/definitions/SuccessResponseBody" } }, - "pauseAlertResponse": { - "description": "(empty)", - "schema": { - "type": "object", - "required": [ - "alertId", - "message" - ], - "properties": { - "alertId": { - "type": "integer", - "format": "int64" - }, - "message": { - "type": "string" - }, - "state": { - "description": "Alert result state\nrequired true", - "type": "string" - } - } - } - }, - "pauseAlertsResponse": { - "description": "(empty)", - "schema": { - "type": "object", - "required": [ - "alertsAffected", - "message" - ], - "properties": { - "alertsAffected": { - "description": "AlertsAffected is the number of the affected alerts.", - "type": "integer", - "format": "int64" - }, - "message": { - "type": "string" - }, - "state": { - "description": "Alert result state\nrequired true", - "type": "string" - } - } - } - }, "postAPIkeyResponse": { "description": "(empty)", "schema": { @@ -23740,12 +22482,6 @@ "$ref": "#/definitions/RoleAssignmentsDTO" } }, - "testAlertResponse": { - "description": "(empty)", - "schema": { - "$ref": "#/definitions/AlertTestResult" - } - }, "unauthorisedError": { "description": "UnauthorizedError is returned when the request is not authenticated.", "schema": { diff --git a/public/app/AppWrapper.tsx b/public/app/AppWrapper.tsx index 9cf0b4d0aaf..6a527baa769 100644 --- a/public/app/AppWrapper.tsx +++ b/public/app/AppWrapper.tsx @@ -5,7 +5,7 @@ import { Router, Redirect, Switch, RouteComponentProps } from 'react-router-dom' import { CompatRouter, CompatRoute } from 'react-router-dom-v5-compat'; import { config, locationService, navigationLogger, reportInteraction } from '@grafana/runtime'; -import { ErrorBoundaryAlert, GlobalStyles, ModalRoot, ModalsProvider, PortalContainer } from '@grafana/ui'; +import { ErrorBoundaryAlert, GlobalStyles, ModalRoot, PortalContainer } from '@grafana/ui'; import { getAppRoutes } from 'app/routes/routes'; import { store } from 'app/store/store'; @@ -15,6 +15,7 @@ import { GrafanaApp } from './app'; import { AppChrome } from './core/components/AppChrome/AppChrome'; import { AppNotificationList } from './core/components/AppNotifications/AppNotificationList'; import { GrafanaContext } from './core/context/GrafanaContext'; +import { ModalsContextProvider } from './core/context/ModalsContextProvider'; import { GrafanaRoute } from './core/navigation/GrafanaRoute'; import { RouteDescriptor } from './core/navigation/types'; import { contextSrv } from './core/services/context_srv'; @@ -102,11 +103,11 @@ export class AppWrapper extends React.Component - - -
- - + + + + +
{pageBanners.map((Banner, index) => ( @@ -118,13 +119,13 @@ export class AppWrapper extends React.Component ))} - - -
- - - - +
+ + + + + + diff --git a/public/app/angular/AngularApp.ts b/public/app/angular/AngularApp.ts index 264a891fb1b..d0f2bcff4d8 100644 --- a/public/app/angular/AngularApp.ts +++ b/public/app/angular/AngularApp.ts @@ -6,7 +6,7 @@ import 'angular-bindonce'; import angular from 'angular'; // eslint-disable-line no-duplicate-imports import { extend } from 'lodash'; -import { getTemplateSrv, SystemJS } from '@grafana/runtime'; +import { getTemplateSrv } from '@grafana/runtime'; import { coreModule, angularModules } from 'app/angular/core_module'; import appEvents from 'app/core/app_events'; import { config } from 'app/core/config'; @@ -14,6 +14,7 @@ import { contextSrv } from 'app/core/services/context_srv'; import { DashboardLoaderSrv } from 'app/features/dashboard/services/DashboardLoaderSrv'; import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { setAngularPanelReactWrapper } from 'app/features/plugins/importPanelPlugin'; +import { SystemJS } from 'app/features/plugins/loader/systemjs'; import { buildImportMap } from 'app/features/plugins/loader/utils'; import * as sdk from 'app/plugins/sdk'; diff --git a/public/app/app.ts b/public/app/app.ts index cb31f9c58f9..5796b18c21e 100644 --- a/public/app/app.ts +++ b/public/app/app.ts @@ -42,7 +42,7 @@ import { setPanelDataErrorView } from '@grafana/runtime/src/components/PanelData import { setPanelRenderer } from '@grafana/runtime/src/components/PanelRenderer'; import { setPluginPage } from '@grafana/runtime/src/components/PluginPage'; import { getScrollbarWidth } from '@grafana/ui'; -import config from 'app/core/config'; +import config, { updateConfig } from 'app/core/config'; import { arrayMove } from 'app/core/utils/arrayMove'; import { getStandardTransformers } from 'app/features/transformers/standardTransformers'; @@ -56,8 +56,8 @@ import { PluginPage } from './core/components/Page/PluginPage'; import { GrafanaContextType, useReturnToPreviousInternal } from './core/context/GrafanaContext'; import { initIconCache } from './core/icons/iconBundle'; import { initializeI18n } from './core/internationalization'; +import { setMonacoEnv } from './core/monacoEnv'; import { interceptLinkClicks } from './core/navigation/patch/interceptLinkClicks'; -import { ModalManager } from './core/services/ModalManager'; import { NewFrontendAssetsChecker } from './core/services/NewFrontendAssetsChecker'; import { backendSrv } from './core/services/backend_srv'; import { contextSrv } from './core/services/context_srv'; @@ -125,13 +125,18 @@ export class GrafanaApp { parent.postMessage('GrafanaAppInit', '*'); const initI18nPromise = initializeI18n(config.bootData.user.language); + initI18nPromise.then(({ language }) => updateConfig({ language })); setBackendSrv(backendSrv); initEchoSrv(); initIconCache(); // This needs to be done after the `initEchoSrv` since it is being used under the hood. startMeasure('frontend_app_init'); - addClassIfNoOverlayScrollbar(); + + if (!config.featureToggles.betterPageScrolling) { + addClassIfNoOverlayScrollbar(); + } + setLocale(config.bootData.user.locale); setWeekStart(config.bootData.user.weekStart); setPanelRenderer(PanelRenderer); @@ -170,7 +175,9 @@ export class GrafanaApp { createAdHocVariableAdapter(), createSystemVariableAdapter(), ]); + monacoLanguageRegistry.setInit(getDefaultMonacoLanguages); + setMonacoEnv(); setQueryRunnerFactory(() => new QueryRunner()); setVariableQueryRunner(new VariableQueryRunner()); @@ -199,10 +206,6 @@ export class GrafanaApp { setDataSourceSrv(dataSourceSrv); initWindowRuntime(); - // init modal manager - const modalManager = new ModalManager(); - modalManager.init(); - let preloadResults: PluginPreloadResult[] = []; if (contextSrv.user.orgRole !== '') { diff --git a/public/app/core/actions/index.ts b/public/app/core/actions/index.ts index 88c6c68ab2e..d73c489b33e 100644 --- a/public/app/core/actions/index.ts +++ b/public/app/core/actions/index.ts @@ -1,3 +1,4 @@ import { hideAppNotification, notifyApp } from '../reducers/appNotification'; import { updateNavIndex, updateConfigurationSubtitle } from '../reducers/navModel'; + export { updateNavIndex, updateConfigurationSubtitle, notifyApp, hideAppNotification }; diff --git a/public/app/core/components/AccessControl/Permissions.tsx b/public/app/core/components/AccessControl/Permissions.tsx index 56180466695..d84e03031e7 100644 --- a/public/app/core/components/AccessControl/Permissions.tsx +++ b/public/app/core/components/AccessControl/Permissions.tsx @@ -37,6 +37,7 @@ export type Props = { resourceId: ResourceId; canSetPermissions: boolean; getWarnings?: (items: ResourcePermission[]) => ResourcePermission[]; + epilogue?: (items: ResourcePermission[]) => React.ReactNode; }; export const Permissions = ({ @@ -48,6 +49,7 @@ export const Permissions = ({ canSetPermissions, addPermissionTitle, getWarnings, + epilogue, }: Props) => { const styles = useStyles2(getStyles); const [isAdding, setIsAdding] = useState(false); @@ -157,87 +159,90 @@ export const Permissions = ({ const titleTeam = t('access-control.permissions.team', 'Team'); return ( -
- {canSetPermissions && resource === 'folders' && ( - <> - - This will change permissions for this folder and all its descendants. In total, this will affect: - - - - - )} - {items.length === 0 && ( - - {emptyLabel} - - )} - - - - - {canSetPermissions && ( - <> - - - setIsAdding(false)} + <> +
+ {canSetPermissions && resource === 'folders' && ( + <> + + This will change permissions for this folder and all its descendants. In total, this will affect: + + - - - )} -
+ + + )} + {items.length === 0 && ( + + {emptyLabel} + + )} + + + + + {canSetPermissions && ( + <> + + + setIsAdding(false)} + /> + + + )} +
+ {epilogue && epilogue(items)} + ); }; diff --git a/public/app/core/components/AppChrome/AppChrome.tsx b/public/app/core/components/AppChrome/AppChrome.tsx index b47c655188b..dc7492db630 100644 --- a/public/app/core/components/AppChrome/AppChrome.tsx +++ b/public/app/core/components/AppChrome/AppChrome.tsx @@ -3,7 +3,7 @@ import classNames from 'classnames'; import React, { PropsWithChildren, useEffect } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; -import { locationService } from '@grafana/runtime'; +import { locationSearchToObject, locationService } from '@grafana/runtime'; import { useStyles2, LinkButton, useTheme2 } from '@grafana/ui'; import config from 'app/core/config'; import { useGrafana } from 'app/core/context/GrafanaContext'; @@ -67,6 +67,12 @@ export function AppChrome({ children }: Props) { // eslint-disable-next-line react-hooks/exhaustive-deps }, [chrome, url]); + // Sync updates from kiosk mode query string back into app chrome + useEffect(() => { + const queryParams = locationSearchToObject(search); + chrome.setKioskModeFromUrl(queryParams.kiosk); + }, [chrome, search]); + // Chromeless routes are without topNav, mega menu, search & command palette // We check chromeless twice here instead of having a separate path so {children} // doesn't get re-mounted when chromeless goes from true to false. @@ -82,7 +88,7 @@ export function AppChrome({ children }: Props) { Skip to main content -
+
{!searchBarHidden && } -
+ )} -
+
{!state.chromeless && state.megaMenuDocked && state.megaMenuOpen && ( chrome.setMegaMenuOpen(false)} /> )} -
+
{children} -
+
- +
{!state.chromeless && !state.megaMenuDocked && } {!state.chromeless && } {shouldShowReturnToPrevious && state.returnToPrevious && ( diff --git a/public/app/core/components/AppChrome/AppChromeService.tsx b/public/app/core/components/AppChrome/AppChromeService.tsx index 810ce5336c3..647e21bb638 100644 --- a/public/app/core/components/AppChrome/AppChromeService.tsx +++ b/public/app/core/components/AppChrome/AppChromeService.tsx @@ -90,6 +90,10 @@ export class AppChromeService { } public setReturnToPrevious = (returnToPrevious: ReturnToPreviousProps) => { + const isReturnToPreviousEnabled = config.featureToggles.returnToPrevious; + if (!isReturnToPreviousEnabled) { + return; + } const previousPage = this.state.getValue().returnToPrevious; reportInteraction('grafana_return_to_previous_button_created', { page: returnToPrevious.href, @@ -101,6 +105,10 @@ export class AppChromeService { }; public clearReturnToPrevious = (interactionAction: 'clicked' | 'dismissed' | 'auto_dismissed') => { + const isReturnToPreviousEnabled = config.featureToggles.returnToPrevious; + if (!isReturnToPreviousEnabled) { + return; + } const existingRtp = this.state.getValue().returnToPrevious; if (existingRtp) { reportInteraction('grafana_return_to_previous_button_dismissed', { @@ -183,13 +191,19 @@ export class AppChromeService { } public setKioskModeFromUrl(kiosk: UrlQueryValue) { + let newKioskMode: KioskMode | undefined; + switch (kiosk) { case 'tv': - this.update({ kioskMode: KioskMode.TV }); + newKioskMode = KioskMode.TV; break; case '1': case true: - this.update({ kioskMode: KioskMode.Full }); + newKioskMode = KioskMode.Full; + } + + if (newKioskMode && newKioskMode !== this.state.getValue().kioskMode) { + this.update({ kioskMode: newKioskMode }); } } diff --git a/public/app/core/components/AppChrome/MegaMenu/MegaMenuItem.tsx b/public/app/core/components/AppChrome/MegaMenu/MegaMenuItem.tsx index d91514f8787..528c0c9a04f 100644 --- a/public/app/core/components/AppChrome/MegaMenu/MegaMenuItem.tsx +++ b/public/app/core/components/AppChrome/MegaMenu/MegaMenuItem.tsx @@ -48,12 +48,12 @@ export function MegaMenuItem({ link, activeItem, level = 0, onClick }: Props) { // scroll active element into center if it's offscreen useEffect(() => { - if (menuIsDocked && isActive && item.current && isElementOffscreen(item.current)) { + if (isActive && item.current && isElementOffscreen(item.current)) { item.current.scrollIntoView({ block: 'center', }); } - }, [isActive, menuIsDocked]); + }, [isActive]); if (!link.url) { return null; diff --git a/public/app/core/components/AppChrome/ReturnToPrevious/DismissableButton.tsx b/public/app/core/components/AppChrome/ReturnToPrevious/DismissableButton.tsx index 765dfed5306..a9fe92cdb24 100644 --- a/public/app/core/components/AppChrome/ReturnToPrevious/DismissableButton.tsx +++ b/public/app/core/components/AppChrome/ReturnToPrevious/DismissableButton.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import React from 'react'; import { GrafanaTheme2 } from '@grafana/data'; +import { selectors } from '@grafana/e2e-selectors'; import { Button, ButtonGroup, useStyles2 } from '@grafana/ui'; import { t } from 'app/core/internationalization'; @@ -24,6 +25,7 @@ export const DismissableButton = ({ label, onClick, onDismiss }: DismissableButt onClick={onClick} title={label} className={styles.mainDismissableButton} + data-testid={selectors.components.ReturnToPrevious.backButton} > {label} @@ -34,6 +36,7 @@ export const DismissableButton = ({ label, onClick, onDismiss }: DismissableButt fill="outline" size="sm" onClick={onDismiss} + data-testid={selectors.components.ReturnToPrevious.dismissButton} /> ); diff --git a/public/app/core/components/AppChrome/ReturnToPrevious/ReturnToPrevious.test.tsx b/public/app/core/components/AppChrome/ReturnToPrevious/ReturnToPrevious.test.tsx new file mode 100644 index 00000000000..0f9b5d62c94 --- /dev/null +++ b/public/app/core/components/AppChrome/ReturnToPrevious/ReturnToPrevious.test.tsx @@ -0,0 +1,76 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import React from 'react'; +import { TestProvider } from 'test/helpers/TestProvider'; +import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock'; + +import { config, reportInteraction } from '@grafana/runtime'; + +import { ReturnToPrevious, ReturnToPreviousProps } from './ReturnToPrevious'; + +const mockReturnToPreviousProps: ReturnToPreviousProps = { + title: 'Dashboards Page', + href: '/dashboards', +}; +const reportInteractionMock = jest.mocked(reportInteraction); +jest.mock('@grafana/runtime', () => { + return { + ...jest.requireActual('@grafana/runtime'), + reportInteraction: reportInteractionMock, + }; +}); +jest.mock('@grafana/runtime', () => { + return { + ...jest.requireActual('@grafana/runtime'), + reportInteraction: jest.fn(), + }; +}); +const setup = () => { + const grafanaContext = getGrafanaContextMock(); + grafanaContext.chrome.setReturnToPrevious(mockReturnToPreviousProps); + return render( + + + + ); +}; + +describe('ReturnToPrevious', () => { + beforeEach(() => { + /* We enabled the feature toggle */ + config.featureToggles.returnToPrevious = true; + }); + afterEach(() => { + window.sessionStorage.clear(); + jest.resetAllMocks(); + config.featureToggles.returnToPrevious = false; + }); + it('should render component', async () => { + setup(); + expect(await screen.findByTitle('Back to Dashboards Page')).toBeInTheDocument(); + }); + + it('should trigger event once when clicking on the RTP button', async () => { + setup(); + const returnButton = await screen.findByTitle('Back to Dashboards Page'); + expect(returnButton).toBeInTheDocument(); + await userEvent.click(returnButton); + const mockCalls = reportInteractionMock.mock.calls; + /* The report is called 'grafana_return_to_previous_button_dismissed' but the action is 'clicked' */ + const mockReturn = mockCalls.filter((call) => call[0] === 'grafana_return_to_previous_button_dismissed'); + expect(mockReturn).toHaveLength(1); + expect(mockReturn[0][1]).toEqual({ action: 'clicked', page: '/dashboards' }); + }); + + it('should trigger event once when clicking on the Close button', async () => { + setup(); + const closeBtn = await screen.findByRole('button', { name: 'Close' }); + expect(closeBtn).toBeInTheDocument(); + await userEvent.click(closeBtn); + const mockCalls = reportInteractionMock.mock.calls; + /* The report is called 'grafana_return_to_previous_button_dismissed' but the action is 'dismissed' */ + const mockDismissed = mockCalls.filter((call) => call[0] === 'grafana_return_to_previous_button_dismissed'); + expect(mockDismissed).toHaveLength(1); + expect(mockDismissed[0][1]).toEqual({ action: 'dismissed', page: '/dashboards' }); + }); +}); diff --git a/public/app/core/components/AppChrome/ReturnToPrevious/ReturnToPrevious.tsx b/public/app/core/components/AppChrome/ReturnToPrevious/ReturnToPrevious.tsx index 58d7dbf654a..8d9ca18eabc 100644 --- a/public/app/core/components/AppChrome/ReturnToPrevious/ReturnToPrevious.tsx +++ b/public/app/core/components/AppChrome/ReturnToPrevious/ReturnToPrevious.tsx @@ -2,7 +2,8 @@ import { css } from '@emotion/css'; import React, { useCallback } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; -import { locationService, reportInteraction } from '@grafana/runtime'; +import { selectors } from '@grafana/e2e-selectors'; +import { locationService } from '@grafana/runtime'; import { useStyles2 } from '@grafana/ui'; import { useGrafana } from 'app/core/context/GrafanaContext'; import { t } from 'app/core/internationalization'; @@ -24,12 +25,11 @@ export const ReturnToPrevious = ({ href, title }: ReturnToPreviousProps) => { }, [href, chrome]); const handleOnDismiss = useCallback(() => { - reportInteraction('grafana_return_to_previous_button_dismissed', { action: 'dismissed', page: href }); chrome.clearReturnToPrevious('dismissed'); - }, [href, chrome]); + }, [chrome]); return ( -
+
- {modKey}+k + {modKey}+k
@@ -91,9 +91,6 @@ const getStyles = (theme: GrafanaTheme2) => { gap: theme.spacing(0.5), }, ]), - shortcut: css({ - fontSize: theme.typography.bodySmall.fontSize, - }), fakeInput: css([ baseStyles.input, { diff --git a/public/app/core/components/FlaggedScroller.tsx b/public/app/core/components/FlaggedScroller.tsx new file mode 100644 index 00000000000..f7dbdd85dca --- /dev/null +++ b/public/app/core/components/FlaggedScroller.tsx @@ -0,0 +1,54 @@ +import { css, cx } from '@emotion/css'; +import React, { useEffect, useRef } from 'react'; + +import { config } from '@grafana/runtime'; +import { CustomScrollbar, useStyles2 } from '@grafana/ui'; + +type FlaggedScrollerProps = Parameters[0]; + +export default function FlaggedScrollbar(props: FlaggedScrollerProps) { + if (config.featureToggles.betterPageScrolling) { + return {props.children}; + } + + return ; +} + +// Shim to provide API-compatibility for Page's scroll-related props +function NativeScrollbar({ children, scrollRefCallback, scrollTop }: FlaggedScrollerProps) { + const styles = useStyles2(getStyles); + const ref = useRef(null); + + useEffect(() => { + if (ref.current && scrollRefCallback) { + scrollRefCallback(ref.current); + } + }, [ref, scrollRefCallback]); + + useEffect(() => { + if (ref.current && scrollTop != null) { + ref.current?.scrollTo(0, scrollTop); + } + }, [scrollTop]); + + return ( + // Set the .scrollbar-view class to help e2e tests find this, like in CustomScrollbar +
+ {children} +
+ ); +} + +function getStyles() { + return { + nativeScrollbars: css({ + label: 'native-scroll-container', + minHeight: `calc(100% + 0px)`, // I don't know, just copied from custom scrollbars + maxHeight: `calc(100% + 0px)`, // I don't know, just copied from custom scrollbars + display: 'flex', + flexDirection: 'column', + flexGrow: 1, + overflow: 'auto', + }), + }; +} diff --git a/public/app/core/components/Footer/Footer.tsx b/public/app/core/components/Footer/Footer.tsx index 62739518c0c..16ffb45dc84 100644 --- a/public/app/core/components/Footer/Footer.tsx +++ b/public/app/core/components/Footer/Footer.tsx @@ -71,7 +71,7 @@ export function getVersionLinks(hideEdition?: boolean): FooterLink[] { links.push({ target: '_blank', id: 'version', - text: `v${buildInfo.version} (${buildInfo.commit})`, + text: buildInfo.versionString, url: hasReleaseNotes ? `https://github.com/grafana/grafana/blob/main/CHANGELOG.md` : undefined, }); @@ -105,8 +105,8 @@ export const Footer = React.memo(({ customLinks, hideEdition }: Props) => {